2005-06-07 05:49:06 +00:00
|
|
|
/* Do not modify this file. */
|
2006-05-24 12:24:54 +00:00
|
|
|
/* It is created automatically by the ASN.1 to Wireshark dissector compiler */
|
2007-03-21 10:22:22 +00:00
|
|
|
/* ./packet-tcap.c */
|
2006-05-24 12:24:54 +00:00
|
|
|
/* ../../tools/asn2wrs.py -b -e -p tcap -c tcap.cnf -s packet-tcap-template tcap.asn */
|
2005-06-07 05:49:06 +00:00
|
|
|
|
|
|
|
/* Input file: packet-tcap-template.c */
|
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
#line 1 "packet-tcap-template.c"
|
2005-06-07 05:49:06 +00:00
|
|
|
/* packet-tcap-template.c
|
|
|
|
* Routines for TCAP
|
|
|
|
* Copyright 2004 - 2005, Tim Endean <endeant@hotmail.com>
|
|
|
|
* Built from the gsm-map dissector Copyright 2004 - 2005, Anders Broman <anders.broman@ericsson.com>
|
2003-10-02 06:13:29 +00:00
|
|
|
*
|
2004-07-18 00:24:25 +00:00
|
|
|
* $Id$
|
2006-05-21 04:49:01 +00:00
|
|
|
* Wireshark - Network traffic analyzer
|
|
|
|
* By Gerald Combs <gerald@wireshark.org>
|
2003-10-02 06:13:29 +00:00
|
|
|
* Copyright 1998 Gerald Combs
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
2005-06-07 05:49:06 +00:00
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
* References: ETSI 300 374
|
2003-10-02 06:13:29 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
#include <glib.h>
|
|
|
|
#include <epan/packet.h>
|
|
|
|
#include <epan/prefs.h>
|
|
|
|
#include <epan/conversation.h>
|
2006-06-28 14:19:08 +00:00
|
|
|
#include <epan/oid_resolv.h>
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
#include <epan/emem.h>
|
2005-06-07 05:49:06 +00:00
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
2005-06-07 05:49:06 +00:00
|
|
|
#include "packet-ber.h"
|
|
|
|
#include "packet-tcap.h"
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
#include "epan/tcap-persistentdata.h"
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
#define PNAME "Transaction Capabilities Application Part"
|
|
|
|
#define PSNAME "TCAP"
|
|
|
|
#define PFNAME "tcap"
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
/* Initialize the protocol and registered fields */
|
|
|
|
int proto_tcap = -1;
|
2005-06-16 07:46:03 +00:00
|
|
|
static int hf_tcap_tag = -1;
|
|
|
|
static int hf_tcap_length = -1;
|
2005-06-07 05:49:06 +00:00
|
|
|
static int hf_tcap_data = -1;
|
2005-08-18 21:36:59 +00:00
|
|
|
static int hf_tcap_tid = -1;
|
2005-06-07 05:49:06 +00:00
|
|
|
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
int hf_tcapsrt_SessionId=-1;
|
|
|
|
int hf_tcapsrt_Duplicate=-1;
|
|
|
|
int hf_tcapsrt_BeginSession=-1;
|
|
|
|
int hf_tcapsrt_EndSession=-1;
|
|
|
|
int hf_tcapsrt_SessionTime=-1;
|
|
|
|
|
2005-12-17 16:55:45 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
/*--- Included file: packet-tcap-hf.c ---*/
|
2005-12-08 23:29:21 +00:00
|
|
|
#line 1 "packet-tcap-hf.c"
|
2005-06-07 05:49:06 +00:00
|
|
|
static int hf_tcap_dialogueRequest = -1; /* AARQ_apdu */
|
|
|
|
static int hf_tcap_dialogueResponse = -1; /* AARE_apdu */
|
|
|
|
static int hf_tcap_dialogueAbort = -1; /* ABRT_apdu */
|
|
|
|
static int hf_tcap_oid = -1; /* OBJECT_IDENTIFIER */
|
|
|
|
static int hf_tcap_dialog = -1; /* Dialog1 */
|
|
|
|
static int hf_tcap_useroid = -1; /* UserInfoOID */
|
|
|
|
static int hf_tcap_externuserinfo = -1; /* ExternUserInfo */
|
|
|
|
static int hf_tcap_protocol_versionrq = -1; /* T_protocol_versionrq */
|
|
|
|
static int hf_tcap_application_context_name = -1; /* Applicationcontext */
|
|
|
|
static int hf_tcap_user_information = -1; /* User_information */
|
|
|
|
static int hf_tcap_protocol_versionre = -1; /* T_protocol_versionre */
|
|
|
|
static int hf_tcap_result = -1; /* Associate_result */
|
|
|
|
static int hf_tcap_result_source_diagnostic = -1; /* Associate_source_diagnostic */
|
|
|
|
static int hf_tcap_reasonrq = -1; /* Release_request_reason */
|
|
|
|
static int hf_tcap_reasonre = -1; /* Release_response_reason */
|
|
|
|
static int hf_tcap_abort_source = -1; /* ABRT_source */
|
|
|
|
static int hf_tcap_dialogue_service_user = -1; /* T_dialogue_service_user */
|
|
|
|
static int hf_tcap_dialogue_service_provider = -1; /* T_dialogue_service_provider */
|
|
|
|
static int hf_tcap_unidialoguePDU = -1; /* AUDT_apdu */
|
|
|
|
static int hf_tcap_protocol_version3 = -1; /* T_protocol_version3 */
|
|
|
|
static int hf_tcap_unidirectional = -1; /* Unidirectional */
|
|
|
|
static int hf_tcap_begin = -1; /* Begin */
|
|
|
|
static int hf_tcap_end = -1; /* End */
|
|
|
|
static int hf_tcap_continue = -1; /* Continue */
|
|
|
|
static int hf_tcap_abort = -1; /* Abort */
|
|
|
|
static int hf_tcap_ansiunidirectional = -1; /* UniTransactionPDU */
|
|
|
|
static int hf_tcap_ansiqueryWithPerm = -1; /* TransactionPDU */
|
|
|
|
static int hf_tcap_ansiqueryWithoutPerm = -1; /* TransactionPDU */
|
|
|
|
static int hf_tcap_ansiresponse = -1; /* TransactionPDU */
|
|
|
|
static int hf_tcap_ansiconversationWithPerm = -1; /* TransactionPDU */
|
|
|
|
static int hf_tcap_ansiconversationWithoutPerm = -1; /* TransactionPDU */
|
|
|
|
static int hf_tcap_ansiabort = -1; /* AbortPDU */
|
|
|
|
static int hf_tcap_dialoguePortion = -1; /* DialoguePortion */
|
|
|
|
static int hf_tcap_components = -1; /* ComponentPortion */
|
|
|
|
static int hf_tcap_otid = -1; /* OrigTransactionID */
|
|
|
|
static int hf_tcap_dtid = -1; /* DestTransactionID */
|
|
|
|
static int hf_tcap_reason = -1; /* Reason */
|
|
|
|
static int hf_tcap_p_abortCause = -1; /* P_AbortCause */
|
|
|
|
static int hf_tcap_u_abortCause = -1; /* DialoguePortion */
|
|
|
|
static int hf_tcap_ComponentPortion_item = -1; /* Component */
|
|
|
|
static int hf_tcap_invoke = -1; /* Invoke */
|
|
|
|
static int hf_tcap_returnResultLast = -1; /* ReturnResult */
|
|
|
|
static int hf_tcap_returnError = -1; /* ReturnError */
|
|
|
|
static int hf_tcap_reject = -1; /* Reject */
|
|
|
|
static int hf_tcap_returnResultNotLast = -1; /* ReturnResult */
|
|
|
|
static int hf_tcap_invokeID = -1; /* InvokeIdType */
|
|
|
|
static int hf_tcap_linkedID = -1; /* InvokeIdType */
|
2005-06-07 20:29:23 +00:00
|
|
|
static int hf_tcap_opCode = -1; /* OPERATION */
|
2005-06-07 05:49:06 +00:00
|
|
|
static int hf_tcap_parameter = -1; /* Parameter */
|
|
|
|
static int hf_tcap_resultretres = -1; /* T_resultretres */
|
|
|
|
static int hf_tcap_errorCode = -1; /* ErrorCode */
|
|
|
|
static int hf_tcap_invokeIDRej = -1; /* T_invokeIDRej */
|
|
|
|
static int hf_tcap_derivable = -1; /* InvokeIdType */
|
|
|
|
static int hf_tcap_not_derivable = -1; /* NULL */
|
|
|
|
static int hf_tcap_problem = -1; /* T_problem */
|
|
|
|
static int hf_tcap_generalProblem = -1; /* GeneralProblem */
|
|
|
|
static int hf_tcap_invokeProblem = -1; /* InvokeProblem */
|
|
|
|
static int hf_tcap_returnResultProblem = -1; /* ReturnResultProblem */
|
|
|
|
static int hf_tcap_returnErrorProblem = -1; /* ReturnErrorProblem */
|
|
|
|
static int hf_tcap_localValue = -1; /* INTEGER */
|
|
|
|
static int hf_tcap_globalValue = -1; /* OBJECT_IDENTIFIER */
|
|
|
|
static int hf_tcap_identifier = -1; /* TransactionID */
|
|
|
|
static int hf_tcap_dialoguePortionansi = -1; /* DialoguePortionANSI */
|
|
|
|
static int hf_tcap_componentPortion = -1; /* ComponentSequence */
|
|
|
|
static int hf_tcap_causeInformation = -1; /* T_causeInformation */
|
|
|
|
static int hf_tcap_abortCause = -1; /* P_Abort_cause */
|
|
|
|
static int hf_tcap_userInformation = -1; /* UserInformation */
|
|
|
|
static int hf_tcap_version = -1; /* ProtocolVersion */
|
|
|
|
static int hf_tcap_applicationContext = -1; /* T_applicationContext */
|
|
|
|
static int hf_tcap_integerApplicationId = -1; /* IntegerApplicationContext */
|
|
|
|
static int hf_tcap_objectApplicationId = -1; /* ObjectIDApplicationContext */
|
|
|
|
static int hf_tcap_securityContext = -1; /* T_securityContext */
|
|
|
|
static int hf_tcap_integerSecurityId = -1; /* INTEGER */
|
|
|
|
static int hf_tcap_objectSecurityId = -1; /* OBJECT_IDENTIFIER */
|
|
|
|
static int hf_tcap_confidentiality = -1; /* Confidentiality */
|
|
|
|
static int hf_tcap_confidentialityId = -1; /* T_confidentialityId */
|
|
|
|
static int hf_tcap_integerConfidentialityId = -1; /* INTEGER */
|
|
|
|
static int hf_tcap_objectConfidentialityId = -1; /* OBJECT_IDENTIFIER */
|
|
|
|
static int hf_tcap_ComponentSequence_item = -1; /* ComponentPDU */
|
|
|
|
static int hf_tcap_invokeLastansi = -1; /* InvokePDU */
|
|
|
|
static int hf_tcap_returnResultLastansi = -1; /* ReturnResultPDU */
|
|
|
|
static int hf_tcap_returnErroransi = -1; /* ReturnErrorPDU */
|
|
|
|
static int hf_tcap_rejectansi = -1; /* RejectPDU */
|
|
|
|
static int hf_tcap_invokeNotLastansi = -1; /* InvokePDU */
|
|
|
|
static int hf_tcap_returnResultNotLastansi = -1; /* ReturnResultPDU */
|
|
|
|
static int hf_tcap_componentIDs = -1; /* OCTET_STRING_SIZE_0_2 */
|
2005-06-07 20:29:23 +00:00
|
|
|
static int hf_tcap_operationCode = -1; /* OperationCode */
|
2005-06-07 05:49:06 +00:00
|
|
|
static int hf_tcap_parameterinv = -1; /* ANSIparamch */
|
|
|
|
static int hf_tcap_ansiparams = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams1 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams2 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams3 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams4 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams5 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams6 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams7 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams8 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams9 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams10 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams11 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams12 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams13 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams14 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams15 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams16 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams17 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams18 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams19 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams20 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_ansiparams21 = -1; /* ANSIParameters */
|
|
|
|
static int hf_tcap_componentID = -1; /* ComponentID */
|
|
|
|
static int hf_tcap_parameterrr = -1; /* ANSIparamch */
|
|
|
|
static int hf_tcap_parameterre = -1; /* ANSIparamch */
|
|
|
|
static int hf_tcap_rejectProblem = -1; /* ProblemPDU */
|
|
|
|
static int hf_tcap_parameterrj = -1; /* ANSIparamch */
|
|
|
|
static int hf_tcap_national = -1; /* INTEGER_M32768_32767 */
|
|
|
|
static int hf_tcap_private = -1; /* INTEGER */
|
|
|
|
static int hf_tcap_nationaler = -1; /* INTEGER_M32768_32767 */
|
|
|
|
static int hf_tcap_privateer = -1; /* INTEGER */
|
|
|
|
/* named bits */
|
|
|
|
static int hf_tcap_T_protocol_versionrq_version1 = -1;
|
|
|
|
static int hf_tcap_T_protocol_versionre_version1 = -1;
|
|
|
|
static int hf_tcap_T_protocol_version3_version1 = -1;
|
|
|
|
|
|
|
|
/*--- End of included file: packet-tcap-hf.c ---*/
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
#line 62 "packet-tcap-template.c"
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
/* Initialize the subtree pointers */
|
|
|
|
static gint ett_tcap = -1;
|
|
|
|
static gint ett_param = -1;
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
static gint ett_otid = -1;
|
|
|
|
static gint ett_dtid = -1;
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
gint ett_tcap_stat = -1;
|
2005-08-18 21:36:59 +00:00
|
|
|
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
static struct tcapsrt_info_t * gp_tcapsrt_info;
|
|
|
|
static gboolean tcap_subdissector_used=FALSE;
|
|
|
|
static struct tcaphash_context_t * gp_tcap_context=NULL;
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
/*--- Included file: packet-tcap-ett.c ---*/
|
2005-12-08 23:29:21 +00:00
|
|
|
#line 1 "packet-tcap-ett.c"
|
2005-06-07 05:49:06 +00:00
|
|
|
static gint ett_tcap_DialoguePDU = -1;
|
|
|
|
static gint ett_tcap_ExternalPDU = -1;
|
|
|
|
static gint ett_tcap_UserInformation = -1;
|
|
|
|
static gint ett_tcap_AARQ_apdu = -1;
|
|
|
|
static gint ett_tcap_T_protocol_versionrq = -1;
|
|
|
|
static gint ett_tcap_AARE_apdu = -1;
|
|
|
|
static gint ett_tcap_T_protocol_versionre = -1;
|
|
|
|
static gint ett_tcap_RLRQ_apdu = -1;
|
|
|
|
static gint ett_tcap_RLRE_apdu = -1;
|
|
|
|
static gint ett_tcap_ABRT_apdu = -1;
|
|
|
|
static gint ett_tcap_Associate_source_diagnostic = -1;
|
|
|
|
static gint ett_tcap_UniDialoguePDU = -1;
|
|
|
|
static gint ett_tcap_AUDT_apdu = -1;
|
|
|
|
static gint ett_tcap_T_protocol_version3 = -1;
|
|
|
|
static gint ett_tcap_MessageType = -1;
|
|
|
|
static gint ett_tcap_Unidirectional = -1;
|
|
|
|
static gint ett_tcap_Begin = -1;
|
|
|
|
static gint ett_tcap_End = -1;
|
|
|
|
static gint ett_tcap_Continue = -1;
|
|
|
|
static gint ett_tcap_Abort = -1;
|
|
|
|
static gint ett_tcap_Reason = -1;
|
|
|
|
static gint ett_tcap_ComponentPortion = -1;
|
|
|
|
static gint ett_tcap_Component = -1;
|
|
|
|
static gint ett_tcap_Invoke = -1;
|
|
|
|
static gint ett_tcap_ReturnResult = -1;
|
|
|
|
static gint ett_tcap_T_resultretres = -1;
|
|
|
|
static gint ett_tcap_ReturnError = -1;
|
|
|
|
static gint ett_tcap_Reject = -1;
|
|
|
|
static gint ett_tcap_T_invokeIDRej = -1;
|
|
|
|
static gint ett_tcap_T_problem = -1;
|
|
|
|
static gint ett_tcap_OPERATION = -1;
|
|
|
|
static gint ett_tcap_ERROR = -1;
|
|
|
|
static gint ett_tcap_UniTransactionPDU = -1;
|
|
|
|
static gint ett_tcap_TransactionPDU = -1;
|
|
|
|
static gint ett_tcap_AbortPDU = -1;
|
|
|
|
static gint ett_tcap_T_causeInformation = -1;
|
|
|
|
static gint ett_tcap_DialoguePortionANSI = -1;
|
|
|
|
static gint ett_tcap_T_applicationContext = -1;
|
|
|
|
static gint ett_tcap_T_securityContext = -1;
|
|
|
|
static gint ett_tcap_Confidentiality = -1;
|
|
|
|
static gint ett_tcap_T_confidentialityId = -1;
|
|
|
|
static gint ett_tcap_ComponentSequence = -1;
|
|
|
|
static gint ett_tcap_ComponentPDU = -1;
|
|
|
|
static gint ett_tcap_InvokePDU = -1;
|
|
|
|
static gint ett_tcap_ANSIparamch = -1;
|
|
|
|
static gint ett_tcap_ReturnResultPDU = -1;
|
|
|
|
static gint ett_tcap_ReturnErrorPDU = -1;
|
|
|
|
static gint ett_tcap_RejectPDU = -1;
|
|
|
|
static gint ett_tcap_OperationCode = -1;
|
|
|
|
static gint ett_tcap_ErrorCode = -1;
|
|
|
|
|
|
|
|
/*--- End of included file: packet-tcap-ett.c ---*/
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
#line 76 "packet-tcap-template.c"
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2004-10-14 23:45:09 +00:00
|
|
|
#define MAX_SSN 254
|
2004-10-16 23:32:24 +00:00
|
|
|
static range_t *global_ssn_range;
|
|
|
|
static range_t *ssn_range;
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
struct tcap_private_t tcap_private;
|
|
|
|
|
|
|
|
gboolean gtcap_HandleSRT=FALSE;
|
|
|
|
extern gboolean gtcap_PersistentSRT;
|
|
|
|
extern gboolean gtcap_DisplaySRT;
|
|
|
|
extern guint gtcap_RepetitionTimeout;
|
|
|
|
extern guint gtcap_LostTimeout;
|
2004-10-14 23:45:09 +00:00
|
|
|
|
2006-12-07 20:34:08 +00:00
|
|
|
static dissector_handle_t tcap_handle = NULL;
|
2005-06-07 05:49:06 +00:00
|
|
|
static dissector_table_t ber_oid_dissector_table=NULL;
|
2005-11-14 10:02:31 +00:00
|
|
|
static const char * cur_oid;
|
|
|
|
static const char * tcapext_oid;
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
static proto_tree * tcap_top_tree=NULL;
|
|
|
|
static proto_tree * tcap_stat_tree=NULL;
|
|
|
|
static proto_item * tcap_stat_item=NULL;
|
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
static dissector_handle_t data_handle;
|
|
|
|
|
2005-12-17 16:55:45 +00:00
|
|
|
static dissector_table_t sccp_ssn_table;
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
|
|
|
|
static void raz_tcap_private(struct tcap_private_t * p_tcap_private);
|
2005-06-07 05:49:06 +00:00
|
|
|
static int dissect_tcap_param(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset);
|
|
|
|
static int dissect_tcap_UserInformation(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_);
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
static int dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_);
|
|
|
|
static int dissect_tcap_TheExternUserInfo(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-12-17 16:55:45 +00:00
|
|
|
static GHashTable* ansi_sub_dissectors = NULL;
|
|
|
|
static GHashTable* itu_sub_dissectors = NULL;
|
|
|
|
|
|
|
|
static void dissect_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree);
|
|
|
|
|
|
|
|
extern void add_ansi_tcap_subdissector(guint32 ssn, dissector_handle_t dissector) {
|
|
|
|
g_hash_table_insert(ansi_sub_dissectors,GUINT_TO_POINTER(ssn),dissector);
|
|
|
|
dissector_add("sccp.ssn",ssn,tcap_handle);
|
|
|
|
}
|
|
|
|
|
|
|
|
extern void add_itu_tcap_subdissector(guint32 ssn, dissector_handle_t dissector) {
|
|
|
|
g_hash_table_insert(itu_sub_dissectors,GUINT_TO_POINTER(ssn),dissector);
|
|
|
|
dissector_add("sccp.ssn",ssn,tcap_handle);
|
|
|
|
}
|
|
|
|
|
|
|
|
extern void delete_ansi_tcap_subdissector(guint32 ssn, dissector_handle_t dissector _U_) {
|
|
|
|
g_hash_table_remove(ansi_sub_dissectors,GUINT_TO_POINTER(ssn));
|
|
|
|
dissector_delete("sccp.ssn",ssn,tcap_handle);
|
|
|
|
}
|
|
|
|
extern void delete_itu_tcap_subdissector(guint32 ssn, dissector_handle_t dissector _U_) {
|
|
|
|
g_hash_table_remove(itu_sub_dissectors,GUINT_TO_POINTER(ssn));
|
|
|
|
dissector_delete("sccp.ssn", ssn,tcap_handle);
|
|
|
|
}
|
|
|
|
|
2006-12-07 20:53:32 +00:00
|
|
|
dissector_handle_t get_ansi_tcap_subdissector(guint32 ssn) {
|
2005-12-17 16:55:45 +00:00
|
|
|
return g_hash_table_lookup(ansi_sub_dissectors,GUINT_TO_POINTER(ssn));
|
|
|
|
}
|
|
|
|
|
2006-12-07 20:53:32 +00:00
|
|
|
dissector_handle_t get_itu_tcap_subdissector(guint32 ssn) {
|
2005-12-17 16:55:45 +00:00
|
|
|
return g_hash_table_lookup(itu_sub_dissectors,GUINT_TO_POINTER(ssn));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2003-10-16 18:15:54 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
/*--- Included file: packet-tcap-fn.c ---*/
|
2005-12-08 23:29:21 +00:00
|
|
|
#line 1 "packet-tcap-fn.c"
|
2005-06-07 05:49:06 +00:00
|
|
|
/*--- Fields for imported types ---*/
|
2004-02-20 10:43:12 +00:00
|
|
|
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const asn_namedbit T_protocol_versionrq_bits[] = {
|
2005-06-07 20:29:23 +00:00
|
|
|
{ 0, &hf_tcap_T_protocol_versionrq_version1, -1, -1, "version1", NULL },
|
2005-06-07 05:49:06 +00:00
|
|
|
{ 0, NULL, 0, 0, NULL, NULL }
|
|
|
|
};
|
2004-02-20 10:43:12 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_T_protocol_versionrq(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
T_protocol_versionrq_bits, hf_index, ett_tcap_T_protocol_versionrq,
|
|
|
|
NULL);
|
2004-02-20 10:43:12 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_protocol_versionrq_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_T_protocol_versionrq(TRUE, tvb, offset, pinfo, tree, hf_tcap_protocol_versionrq);
|
2004-02-20 10:43:12 +00:00
|
|
|
}
|
|
|
|
|
2004-03-19 07:54:58 +00:00
|
|
|
|
2005-06-07 20:29:23 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_Applicationcontext(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 99 "tcap.cnf"
|
2005-11-14 10:02:31 +00:00
|
|
|
offset = dissect_ber_object_identifier_str(implicit_tag, pinfo, tree, tvb, offset, hf_index, &cur_oid);
|
|
|
|
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
tcap_private.oid= (void*) cur_oid;
|
|
|
|
tcap_private.acv=TRUE;
|
2004-03-19 07:54:58 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_application_context_name(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_Applicationcontext(FALSE, tvb, offset, pinfo, tree, hf_tcap_application_context_name);
|
2004-03-19 07:54:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_User_information(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 78 "tcap.cnf"
|
2005-06-07 05:49:06 +00:00
|
|
|
tvbuff_t *next_tvb;
|
2005-12-17 16:55:45 +00:00
|
|
|
gint8 class;
|
2005-06-07 05:49:06 +00:00
|
|
|
gboolean pc;
|
2005-12-17 16:55:45 +00:00
|
|
|
gint tag;
|
2005-06-07 05:49:06 +00:00
|
|
|
guint32 len;
|
2005-12-17 16:55:45 +00:00
|
|
|
gint ind_field;
|
2005-06-07 05:49:06 +00:00
|
|
|
|
|
|
|
|
|
|
|
offset = get_ber_identifier(tvb, offset, &class, &pc, &tag);
|
|
|
|
offset = get_ber_length(tree, tvb, offset, &len, &ind_field);
|
2005-08-18 21:36:59 +00:00
|
|
|
next_tvb = tvb_new_subset(tvb, offset, len-(2*ind_field), len-(2*ind_field));
|
|
|
|
if (!next_tvb)
|
|
|
|
return offset+len;
|
|
|
|
dissect_tcap_UserInformation(TRUE, next_tvb, 0, pinfo, tree, -1);
|
2005-06-07 05:49:06 +00:00
|
|
|
|
|
|
|
|
|
|
|
return offset+len;
|
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_user_information_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_User_information(TRUE, tvb, offset, pinfo, tree, hf_tcap_user_information);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t AARQ_apdu_sequence[] = {
|
|
|
|
{ BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_protocol_versionrq_impl },
|
|
|
|
{ BER_CLASS_CON, 1, 0, dissect_application_context_name },
|
|
|
|
{ BER_CLASS_CON, 30, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_user_information_impl },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_AARQ_apdu(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
AARQ_apdu_sequence, hf_index, ett_tcap_AARQ_apdu);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_dialogueRequest(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_AARQ_apdu(FALSE, tvb, offset, pinfo, tree, hf_tcap_dialogueRequest);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const asn_namedbit T_protocol_versionre_bits[] = {
|
2005-06-07 20:29:23 +00:00
|
|
|
{ 0, &hf_tcap_T_protocol_versionre_version1, -1, -1, "version1", NULL },
|
2005-06-07 05:49:06 +00:00
|
|
|
{ 0, NULL, 0, 0, NULL, NULL }
|
|
|
|
};
|
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_T_protocol_versionre(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
T_protocol_versionre_bits, hf_index, ett_tcap_T_protocol_versionre,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_protocol_versionre_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_T_protocol_versionre(TRUE, tvb, offset, pinfo, tree, hf_tcap_protocol_versionre);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_Associate_result_vals[] = {
|
|
|
|
{ 0, "accepted" },
|
|
|
|
{ 1, "reject-permanent" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_Associate_result(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_result(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_Associate_result(FALSE, tvb, offset, pinfo, tree, hf_tcap_result);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static const value_string tcap_T_dialogue_service_user_vals[] = {
|
|
|
|
{ 0, "null" },
|
|
|
|
{ 1, "no-reason-given" },
|
|
|
|
{ 2, "application-context-name-not-supported" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_T_dialogue_service_user(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_dialogue_service_user(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_T_dialogue_service_user(FALSE, tvb, offset, pinfo, tree, hf_tcap_dialogue_service_user);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
|
|
|
|
static const value_string tcap_T_dialogue_service_provider_vals[] = {
|
|
|
|
{ 0, "null" },
|
|
|
|
{ 1, "no-reason-given" },
|
|
|
|
{ 2, "no-common-dialogue-portion" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_T_dialogue_service_provider(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_dialogue_service_provider(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_T_dialogue_service_provider(FALSE, tvb, offset, pinfo, tree, hf_tcap_dialogue_service_provider);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static const value_string tcap_Associate_source_diagnostic_vals[] = {
|
|
|
|
{ 1, "dialogue-service-user" },
|
|
|
|
{ 2, "dialogue-service-provider" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
|
|
|
|
|
|
|
static const ber_choice_t Associate_source_diagnostic_choice[] = {
|
|
|
|
{ 1, BER_CLASS_CON, 1, 0, dissect_dialogue_service_user },
|
|
|
|
{ 2, BER_CLASS_CON, 2, 0, dissect_dialogue_service_provider },
|
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_Associate_source_diagnostic(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-07-21 21:12:09 +00:00
|
|
|
offset = dissect_ber_choice(pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
Associate_source_diagnostic_choice, hf_index, ett_tcap_Associate_source_diagnostic,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_result_source_diagnostic(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_Associate_source_diagnostic(FALSE, tvb, offset, pinfo, tree, hf_tcap_result_source_diagnostic);
|
|
|
|
}
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t AARE_apdu_sequence[] = {
|
|
|
|
{ BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_protocol_versionre_impl },
|
|
|
|
{ BER_CLASS_CON, 1, 0, dissect_application_context_name },
|
|
|
|
{ BER_CLASS_CON, 2, 0, dissect_result },
|
|
|
|
{ BER_CLASS_CON, 3, BER_FLAGS_NOTCHKTAG, dissect_result_source_diagnostic },
|
|
|
|
{ BER_CLASS_CON, 30, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_user_information_impl },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_AARE_apdu(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
AARE_apdu_sequence, hf_index, ett_tcap_AARE_apdu);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_dialogueResponse(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_AARE_apdu(FALSE, tvb, offset, pinfo, tree, hf_tcap_dialogueResponse);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_ABRT_source_vals[] = {
|
|
|
|
{ 0, "dialogue-service-user" },
|
|
|
|
{ 1, "dialogue-service-provider" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ABRT_source(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_abort_source_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ABRT_source(TRUE, tvb, offset, pinfo, tree, hf_tcap_abort_source);
|
|
|
|
}
|
2004-03-20 07:26:41 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t ABRT_apdu_sequence[] = {
|
|
|
|
{ BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_abort_source_impl },
|
|
|
|
{ BER_CLASS_CON, 30, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_user_information_impl },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ABRT_apdu(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
ABRT_apdu_sequence, hf_index, ett_tcap_ABRT_apdu);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_dialogueAbort(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ABRT_apdu(FALSE, tvb, offset, pinfo, tree, hf_tcap_dialogueAbort);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_DialoguePDU_vals[] = {
|
|
|
|
{ 0, "dialogueRequest" },
|
|
|
|
{ 1, "dialogueResponse" },
|
|
|
|
{ 4, "dialogueAbort" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_choice_t DialoguePDU_choice[] = {
|
|
|
|
{ 0, BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_dialogueRequest },
|
|
|
|
{ 1, BER_CLASS_APP, 1, BER_FLAGS_NOOWNTAG, dissect_dialogueResponse },
|
|
|
|
{ 4, BER_CLASS_APP, 4, BER_FLAGS_NOOWNTAG, dissect_dialogueAbort },
|
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_DialoguePDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-07-21 21:12:09 +00:00
|
|
|
offset = dissect_ber_choice(pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
DialoguePDU_choice, hf_index, ett_tcap_DialoguePDU,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-06-07 20:29:23 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_OBJECT_IDENTIFIER(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-11-14 10:02:31 +00:00
|
|
|
offset = dissect_ber_object_identifier(implicit_tag, pinfo, tree, tvb, offset, hf_index, NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_oid(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_OBJECT_IDENTIFIER(FALSE, tvb, offset, pinfo, tree, hf_tcap_oid);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_globalValue(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_OBJECT_IDENTIFIER(FALSE, tvb, offset, pinfo, tree, hf_tcap_globalValue);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_objectSecurityId_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_OBJECT_IDENTIFIER(TRUE, tvb, offset, pinfo, tree, hf_tcap_objectSecurityId);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_objectConfidentialityId_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_OBJECT_IDENTIFIER(TRUE, tvb, offset, pinfo, tree, hf_tcap_objectConfidentialityId);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_Dialog1(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 44 "tcap.cnf"
|
2005-12-17 16:55:45 +00:00
|
|
|
gint8 class;
|
2005-06-07 05:49:06 +00:00
|
|
|
gboolean pc;
|
2005-12-17 16:55:45 +00:00
|
|
|
gint tag;
|
2005-06-07 05:49:06 +00:00
|
|
|
guint32 len;
|
2005-12-17 16:55:45 +00:00
|
|
|
gint ind_field;
|
2005-06-07 05:49:06 +00:00
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = get_ber_identifier(tvb, offset, &class, &pc, &tag);
|
|
|
|
offset = get_ber_length(tree, tvb, offset, &len, &ind_field);
|
2005-08-18 21:36:59 +00:00
|
|
|
dissect_tcap_DialoguePDU(TRUE, tvb, 0, pinfo, tree, -1);
|
|
|
|
|
|
|
|
return offset+len;
|
2005-06-07 05:49:06 +00:00
|
|
|
|
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_dialog_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_Dialog1(TRUE, tvb, offset, pinfo, tree, hf_tcap_dialog);
|
|
|
|
}
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t ExternalPDU_sequence[] = {
|
|
|
|
{ BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_oid },
|
|
|
|
{ BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_dialog_impl },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ExternalPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
ExternalPDU_sequence, hf_index, ett_tcap_ExternalPDU);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
|
2005-06-07 20:29:23 +00:00
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_UserInfoOID(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 104 "tcap.cnf"
|
2005-11-14 10:02:31 +00:00
|
|
|
offset = dissect_ber_object_identifier_str(implicit_tag, pinfo, tree, tvb, offset, hf_index, &tcapext_oid);
|
|
|
|
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
tcap_private.oid= (void*)tcapext_oid;
|
|
|
|
tcap_private.acv=TRUE;
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_useroid(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_UserInfoOID(FALSE, tvb, offset, pinfo, tree, hf_tcap_useroid);
|
|
|
|
}
|
2004-02-20 10:43:12 +00:00
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ExternUserInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 109 "tcap.cnf"
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
dissect_tcap_TheExternUserInfo(implicit_tag, tvb, offset, pinfo, tree, hf_index);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_externuserinfo_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ExternUserInfo(TRUE, tvb, offset, pinfo, tree, hf_tcap_externuserinfo);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t UserInformation_sequence[] = {
|
|
|
|
{ BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_useroid },
|
|
|
|
{ BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_externuserinfo_impl },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_UserInformation(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
UserInformation_sequence, hf_index, ett_tcap_UserInformation);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_userInformation(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_UserInformation(FALSE, tvb, offset, pinfo, tree, hf_tcap_userInformation);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_Release_request_reason_vals[] = {
|
|
|
|
{ 0, "normal" },
|
|
|
|
{ 1, "urgent" },
|
|
|
|
{ 30, "user-defined" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2004-02-20 10:43:12 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_Release_request_reason(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_reasonrq_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_Release_request_reason(TRUE, tvb, offset, pinfo, tree, hf_tcap_reasonrq);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t RLRQ_apdu_sequence[] = {
|
|
|
|
{ BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_reasonrq_impl },
|
|
|
|
{ BER_CLASS_CON, 30, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_user_information_impl },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_RLRQ_apdu(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
RLRQ_apdu_sequence, hf_index, ett_tcap_RLRQ_apdu);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_Release_response_reason_vals[] = {
|
|
|
|
{ 0, "normal" },
|
|
|
|
{ 1, "not-finished" },
|
|
|
|
{ 30, "user-defined" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_Release_response_reason(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_reasonre_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_Release_response_reason(TRUE, tvb, offset, pinfo, tree, hf_tcap_reasonre);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t RLRE_apdu_sequence[] = {
|
|
|
|
{ BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_reasonre_impl },
|
|
|
|
{ BER_CLASS_CON, 30, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_user_information_impl },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_RLRE_apdu(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
RLRE_apdu_sequence, hf_index, ett_tcap_RLRE_apdu);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2004-02-20 10:43:12 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const asn_namedbit T_protocol_version3_bits[] = {
|
2005-06-07 20:29:23 +00:00
|
|
|
{ 0, &hf_tcap_T_protocol_version3_version1, -1, -1, "version1", NULL },
|
2005-06-07 05:49:06 +00:00
|
|
|
{ 0, NULL, 0, 0, NULL, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_T_protocol_version3(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_bitstring(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
T_protocol_version3_bits, hf_index, ett_tcap_T_protocol_version3,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_protocol_version3_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_T_protocol_version3(TRUE, tvb, offset, pinfo, tree, hf_tcap_protocol_version3);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t AUDT_apdu_sequence[] = {
|
|
|
|
{ BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_protocol_version3_impl },
|
|
|
|
{ BER_CLASS_CON, 1, 0, dissect_application_context_name },
|
|
|
|
{ BER_CLASS_CON, 30, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_user_information_impl },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2004-02-20 10:43:12 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_AUDT_apdu(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
AUDT_apdu_sequence, hf_index, ett_tcap_AUDT_apdu);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_unidialoguePDU(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_AUDT_apdu(FALSE, tvb, offset, pinfo, tree, hf_tcap_unidialoguePDU);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_UniDialoguePDU_vals[] = {
|
|
|
|
{ 0, "unidialoguePDU" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_choice_t UniDialoguePDU_choice[] = {
|
|
|
|
{ 0, BER_CLASS_APP, 0, BER_FLAGS_NOOWNTAG, dissect_unidialoguePDU },
|
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_UniDialoguePDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-07-21 21:12:09 +00:00
|
|
|
offset = dissect_ber_choice(pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
UniDialoguePDU_choice, hf_index, ett_tcap_UniDialoguePDU,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_DialogueOC(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 22 "tcap.cnf"
|
2005-06-07 05:49:06 +00:00
|
|
|
tvbuff_t *next_tvb;
|
2005-12-17 16:55:45 +00:00
|
|
|
gint8 class;
|
2005-06-07 05:49:06 +00:00
|
|
|
gboolean pc;
|
2005-12-17 16:55:45 +00:00
|
|
|
gint tag;
|
2005-06-07 05:49:06 +00:00
|
|
|
guint32 len;
|
2005-12-17 16:55:45 +00:00
|
|
|
gint ind_field;
|
2005-06-07 05:49:06 +00:00
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = get_ber_identifier(tvb, offset, &class, &pc, &tag);
|
|
|
|
offset = get_ber_length(tree, tvb, offset, &len, &ind_field);
|
2005-08-18 21:36:59 +00:00
|
|
|
next_tvb = tvb_new_subset(tvb, offset, len-(2*ind_field), len-(2*ind_field));
|
2005-06-07 05:49:06 +00:00
|
|
|
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
if (!next_tvb)
|
|
|
|
return offset;
|
|
|
|
|
|
|
|
dissect_tcap_ExternalPDU(TRUE, next_tvb, 2, pinfo, tree, -1);
|
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
return offset+len;
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_DialoguePortion(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_tcap_DialogueOC(implicit_tag, tvb, offset, pinfo, tree, hf_index);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_dialoguePortion(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_DialoguePortion(FALSE, tvb, offset, pinfo, tree, hf_tcap_dialoguePortion);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_u_abortCause(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_DialoguePortion(FALSE, tvb, offset, pinfo, tree, hf_tcap_u_abortCause);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_InvokeIdType(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_invokeID(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_InvokeIdType(FALSE, tvb, offset, pinfo, tree, hf_tcap_invokeID);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_linkedID_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_InvokeIdType(TRUE, tvb, offset, pinfo, tree, hf_tcap_linkedID);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_derivable(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_InvokeIdType(FALSE, tvb, offset, pinfo, tree, hf_tcap_derivable);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_INTEGER(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_localValue(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_INTEGER(FALSE, tvb, offset, pinfo, tree, hf_tcap_localValue);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_integerSecurityId_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_INTEGER(TRUE, tvb, offset, pinfo, tree, hf_tcap_integerSecurityId);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_integerConfidentialityId_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_INTEGER(TRUE, tvb, offset, pinfo, tree, hf_tcap_integerConfidentialityId);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_private_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_INTEGER(TRUE, tvb, offset, pinfo, tree, hf_tcap_private);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_privateer_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_INTEGER(TRUE, tvb, offset, pinfo, tree, hf_tcap_privateer);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-06-07 20:29:23 +00:00
|
|
|
static const value_string tcap_OPERATION_vals[] = {
|
|
|
|
{ 0, "localValue" },
|
|
|
|
{ 1, "globalValue" },
|
2005-06-07 05:49:06 +00:00
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 20:29:23 +00:00
|
|
|
static const ber_choice_t OPERATION_choice[] = {
|
|
|
|
{ 0, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_localValue },
|
|
|
|
{ 1, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_globalValue },
|
2005-06-07 05:49:06 +00:00
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_OPERATION(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-07-21 21:12:09 +00:00
|
|
|
offset = dissect_ber_choice(pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
OPERATION_choice, hf_index, ett_tcap_OPERATION,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_opCode(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
return dissect_tcap_OPERATION(FALSE, tvb, offset, pinfo, tree, hf_tcap_opCode);
|
2005-06-07 05:49:06 +00:00
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 20:29:23 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_Parameter(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 58 "tcap.cnf"
|
2005-06-07 05:49:06 +00:00
|
|
|
tvbuff_t *next_tvb;
|
2005-12-17 16:55:45 +00:00
|
|
|
gint8 class;
|
2005-06-07 05:49:06 +00:00
|
|
|
gboolean pc;
|
2005-12-17 16:55:45 +00:00
|
|
|
gint tag;
|
2005-06-07 05:49:06 +00:00
|
|
|
guint32 len;
|
2005-12-17 16:55:45 +00:00
|
|
|
gint ind_field;
|
2005-06-07 05:49:06 +00:00
|
|
|
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
offset = get_ber_identifier(tvb, offset, &class, &pc, &tag);
|
|
|
|
offset = get_ber_length(tree, tvb, offset, &len, &ind_field);
|
|
|
|
/* need to strip the EOC off the next_tvb */
|
|
|
|
next_tvb = tvb_new_subset(tvb, offset, len-(2*ind_field), len-(2*ind_field));
|
|
|
|
|
|
|
|
if (!next_tvb)
|
|
|
|
return offset;
|
|
|
|
dissect_tcap_param(pinfo,tree,tvb,0);
|
|
|
|
offset += len;
|
|
|
|
return offset;
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 20:29:23 +00:00
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_parameter(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_Parameter(FALSE, tvb, offset, pinfo, tree, hf_tcap_parameter);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t Invoke_sequence[] = {
|
|
|
|
{ BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_invokeID },
|
|
|
|
{ BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_linkedID_impl },
|
2005-08-18 21:36:59 +00:00
|
|
|
{ BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_opCode },
|
2005-06-07 20:29:23 +00:00
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_parameter },
|
2005-06-07 05:49:06 +00:00
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_Invoke(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
Invoke_sequence, hf_index, ett_tcap_Invoke);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_invoke_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_Invoke(TRUE, tvb, offset, pinfo, tree, hf_tcap_invoke);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t T_resultretres_sequence[] = {
|
2005-08-18 21:36:59 +00:00
|
|
|
{ BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_opCode },
|
2005-06-07 20:29:23 +00:00
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_parameter },
|
2005-06-07 05:49:06 +00:00
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_T_resultretres(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
T_resultretres_sequence, hf_index, ett_tcap_T_resultretres);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_resultretres(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_T_resultretres(FALSE, tvb, offset, pinfo, tree, hf_tcap_resultretres);
|
|
|
|
}
|
2004-10-27 20:04:56 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t ReturnResult_sequence[] = {
|
|
|
|
{ BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_invokeID },
|
|
|
|
{ BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_resultretres },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2004-10-27 20:04:56 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ReturnResult(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
ReturnResult_sequence, hf_index, ett_tcap_ReturnResult);
|
2004-10-27 20:04:56 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_returnResultLast_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ReturnResult(TRUE, tvb, offset, pinfo, tree, hf_tcap_returnResultLast);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_returnResultNotLast_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ReturnResult(TRUE, tvb, offset, pinfo, tree, hf_tcap_returnResultNotLast);
|
|
|
|
}
|
2004-10-27 20:04:56 +00:00
|
|
|
|
|
|
|
|
2005-06-07 20:29:23 +00:00
|
|
|
|
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_INTEGER_M32768_32767(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_national_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
return dissect_tcap_INTEGER_M32768_32767(TRUE, tvb, offset, pinfo, tree, hf_tcap_national);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_nationaler_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
return dissect_tcap_INTEGER_M32768_32767(TRUE, tvb, offset, pinfo, tree, hf_tcap_nationaler);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_ErrorCode_vals[] = {
|
|
|
|
{ 19, "nationaler" },
|
|
|
|
{ 20, "privateer" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_choice_t ErrorCode_choice[] = {
|
|
|
|
{ 19, BER_CLASS_PRI, 19, BER_FLAGS_IMPLTAG, dissect_nationaler_impl },
|
|
|
|
{ 20, BER_CLASS_PRI, 20, BER_FLAGS_IMPLTAG, dissect_privateer_impl },
|
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ErrorCode(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-07-21 21:12:09 +00:00
|
|
|
offset = dissect_ber_choice(pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
ErrorCode_choice, hf_index, ett_tcap_ErrorCode,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_errorCode(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ErrorCode(FALSE, tvb, offset, pinfo, tree, hf_tcap_errorCode);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t ReturnError_sequence[] = {
|
|
|
|
{ BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_invokeID },
|
2005-08-18 21:36:59 +00:00
|
|
|
{ BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_errorCode },
|
2005-06-07 20:29:23 +00:00
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_parameter },
|
2005-06-07 05:49:06 +00:00
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ReturnError(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
ReturnError_sequence, hf_index, ett_tcap_ReturnError);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_returnError_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ReturnError(TRUE, tvb, offset, pinfo, tree, hf_tcap_returnError);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 20:29:23 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_NULL(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_null(implicit_tag, pinfo, tree, tvb, offset, hf_index);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_not_derivable(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_NULL(FALSE, tvb, offset, pinfo, tree, hf_tcap_not_derivable);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_T_invokeIDRej_vals[] = {
|
|
|
|
{ 0, "derivable" },
|
|
|
|
{ 1, "not-derivable" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
|
|
|
|
|
|
|
static const ber_choice_t T_invokeIDRej_choice[] = {
|
|
|
|
{ 0, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_derivable },
|
|
|
|
{ 1, BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_NOOWNTAG, dissect_not_derivable },
|
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_T_invokeIDRej(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-07-21 21:12:09 +00:00
|
|
|
offset = dissect_ber_choice(pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
T_invokeIDRej_choice, hf_index, ett_tcap_T_invokeIDRej,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_invokeIDRej(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_T_invokeIDRej(FALSE, tvb, offset, pinfo, tree, hf_tcap_invokeIDRej);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_GeneralProblem_vals[] = {
|
|
|
|
{ 0, "unrecognizedComponent" },
|
|
|
|
{ 1, "mistypedComponent" },
|
|
|
|
{ 2, "badlyStructuredComponent" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_GeneralProblem(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_generalProblem_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_GeneralProblem(TRUE, tvb, offset, pinfo, tree, hf_tcap_generalProblem);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_InvokeProblem_vals[] = {
|
|
|
|
{ 0, "duplicateInvokeID" },
|
|
|
|
{ 1, "unrecognizedOperation" },
|
|
|
|
{ 2, "mistypedParameter" },
|
|
|
|
{ 3, "resourceLimitation" },
|
|
|
|
{ 4, "initiatingRelease" },
|
|
|
|
{ 5, "unrecognizedLinkedID" },
|
|
|
|
{ 6, "linkedResponseUnexpected" },
|
|
|
|
{ 7, "unexpectedLinkedOperation" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_InvokeProblem(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_invokeProblem_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_InvokeProblem(TRUE, tvb, offset, pinfo, tree, hf_tcap_invokeProblem);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_ReturnResultProblem_vals[] = {
|
|
|
|
{ 0, "unrecognizedInvokeID" },
|
|
|
|
{ 1, "returnResultUnexpected" },
|
|
|
|
{ 2, "mistypedParameter" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ReturnResultProblem(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_returnResultProblem_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ReturnResultProblem(TRUE, tvb, offset, pinfo, tree, hf_tcap_returnResultProblem);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_ReturnErrorProblem_vals[] = {
|
|
|
|
{ 0, "unrecognizedInvokeID" },
|
|
|
|
{ 1, "returnErrorUnexpected" },
|
|
|
|
{ 2, "unrecognizedError" },
|
|
|
|
{ 3, "unexpectedError" },
|
|
|
|
{ 4, "mistypedParameter" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ReturnErrorProblem(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
2005-06-07 05:49:06 +00:00
|
|
|
|
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_returnErrorProblem_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ReturnErrorProblem(TRUE, tvb, offset, pinfo, tree, hf_tcap_returnErrorProblem);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_T_problem_vals[] = {
|
|
|
|
{ 0, "generalProblem" },
|
|
|
|
{ 1, "invokeProblem" },
|
|
|
|
{ 2, "returnResultProblem" },
|
|
|
|
{ 3, "returnErrorProblem" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_choice_t T_problem_choice[] = {
|
|
|
|
{ 0, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_generalProblem_impl },
|
|
|
|
{ 1, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_invokeProblem_impl },
|
|
|
|
{ 2, BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_returnResultProblem_impl },
|
|
|
|
{ 3, BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_returnErrorProblem_impl },
|
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_T_problem(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-07-21 21:12:09 +00:00
|
|
|
offset = dissect_ber_choice(pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
T_problem_choice, hf_index, ett_tcap_T_problem,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_problem(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_T_problem(FALSE, tvb, offset, pinfo, tree, hf_tcap_problem);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t Reject_sequence[] = {
|
2005-08-18 21:36:59 +00:00
|
|
|
{ BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_invokeIDRej },
|
|
|
|
{ BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_problem },
|
2005-06-07 05:49:06 +00:00
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_Reject(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
Reject_sequence, hf_index, ett_tcap_Reject);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_reject_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_Reject(TRUE, tvb, offset, pinfo, tree, hf_tcap_reject);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_Component_vals[] = {
|
|
|
|
{ 1, "invoke" },
|
|
|
|
{ 2, "returnResultLast" },
|
|
|
|
{ 3, "returnError" },
|
|
|
|
{ 4, "reject" },
|
|
|
|
{ 7, "returnResultNotLast" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_choice_t Component_choice[] = {
|
|
|
|
{ 1, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_invoke_impl },
|
|
|
|
{ 2, BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_returnResultLast_impl },
|
|
|
|
{ 3, BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_returnError_impl },
|
|
|
|
{ 4, BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_reject_impl },
|
|
|
|
{ 7, BER_CLASS_CON, 7, BER_FLAGS_IMPLTAG, dissect_returnResultNotLast_impl },
|
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_Component(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 96 "tcap.cnf"
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
dissect_tcap_TheComponent(implicit_tag, tvb, offset, pinfo, tree, hf_index);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ComponentPortion_item(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_Component(FALSE, tvb, offset, pinfo, tree, hf_tcap_ComponentPortion_item);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t ComponentPortion_sequence_of[1] = {
|
2005-08-18 21:36:59 +00:00
|
|
|
{ BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_ComponentPortion_item },
|
2005-06-07 05:49:06 +00:00
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ComponentPortion(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
ComponentPortion_sequence_of, hf_index, ett_tcap_ComponentPortion);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_components(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ComponentPortion(FALSE, tvb, offset, pinfo, tree, hf_tcap_components);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t Unidirectional_sequence[] = {
|
|
|
|
{ BER_CLASS_APP, 11, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_dialoguePortion },
|
|
|
|
{ BER_CLASS_APP, 12, BER_FLAGS_NOOWNTAG, dissect_components },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_Unidirectional(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
Unidirectional_sequence, hf_index, ett_tcap_Unidirectional);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_unidirectional_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_Unidirectional(TRUE, tvb, offset, pinfo, tree, hf_tcap_unidirectional);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_OrigTransactionID(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 140 "tcap.cnf"
|
2005-06-07 05:49:06 +00:00
|
|
|
tvbuff_t *parameter_tvb;
|
|
|
|
guint8 len, i;
|
2005-08-18 21:36:59 +00:00
|
|
|
proto_item *tid_item;
|
|
|
|
proto_tree *subtree;
|
|
|
|
tid_item = proto_tree_add_text(tree, tvb, offset, -1, "Source Transaction ID");
|
|
|
|
subtree = proto_item_add_subtree(tid_item, ett_otid);
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
offset = dissect_ber_octet_string(implicit_tag, pinfo, subtree, tvb, offset, hf_tcap_tid,
|
2005-06-07 05:49:06 +00:00
|
|
|
¶meter_tvb);
|
2005-06-08 18:52:34 +00:00
|
|
|
|
|
|
|
if (parameter_tvb){
|
|
|
|
len = tvb_length_remaining(parameter_tvb, 0);
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
switch(len) {
|
|
|
|
case 1:
|
|
|
|
gp_tcapsrt_info->src_tid=tvb_get_guint8(parameter_tvb, 0);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
gp_tcapsrt_info->src_tid=tvb_get_ntohs(parameter_tvb, 0);
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
gp_tcapsrt_info->src_tid=tvb_get_ntohl(parameter_tvb, 0);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
gp_tcapsrt_info->src_tid=0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2005-06-08 18:52:34 +00:00
|
|
|
if ((len)&&(check_col(pinfo->cinfo, COL_INFO))){
|
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, "otid(");
|
2005-06-07 05:49:06 +00:00
|
|
|
for(i=0;i<len;i++)
|
2005-06-08 18:52:34 +00:00
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, "%02x",tvb_get_guint8(parameter_tvb,i));
|
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, ") ");
|
|
|
|
}
|
2005-06-07 05:49:06 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_otid(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_OrigTransactionID(FALSE, tvb, offset, pinfo, tree, hf_tcap_otid);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t Begin_sequence[] = {
|
|
|
|
{ BER_CLASS_APP, 8, BER_FLAGS_NOOWNTAG, dissect_otid },
|
|
|
|
{ BER_CLASS_APP, 11, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_dialoguePortion },
|
|
|
|
{ BER_CLASS_APP, 12, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_components },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_Begin(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 213 "tcap.cnf"
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
gp_tcapsrt_info->ope=TC_BEGIN;
|
|
|
|
|
2005-06-07 20:29:23 +00:00
|
|
|
if (check_col(pinfo->cinfo, COL_INFO))
|
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Begin ");
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
|
|
|
Begin_sequence, hf_index, ett_tcap_Begin);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_begin_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_Begin(TRUE, tvb, offset, pinfo, tree, hf_tcap_begin);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_DestTransactionID(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 178 "tcap.cnf"
|
2005-06-07 05:49:06 +00:00
|
|
|
tvbuff_t *parameter_tvb;
|
|
|
|
guint8 len , i;
|
2005-08-18 21:36:59 +00:00
|
|
|
proto_item *tid_item;
|
|
|
|
proto_tree *subtree;
|
|
|
|
tid_item = proto_tree_add_text(tree, tvb, offset, -1, "Destination Transaction ID");
|
|
|
|
subtree = proto_item_add_subtree(tid_item, ett_otid);
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
offset = dissect_ber_octet_string(implicit_tag, pinfo, subtree, tvb, offset, hf_tcap_tid,
|
2005-06-07 05:49:06 +00:00
|
|
|
¶meter_tvb);
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-08 18:52:34 +00:00
|
|
|
if (parameter_tvb){
|
|
|
|
len = tvb_length_remaining(parameter_tvb, 0);
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
switch(len) {
|
|
|
|
case 1:
|
|
|
|
gp_tcapsrt_info->dst_tid=tvb_get_guint8(parameter_tvb, 0);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
gp_tcapsrt_info->dst_tid=tvb_get_ntohs(parameter_tvb, 0);
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
gp_tcapsrt_info->dst_tid=tvb_get_ntohl(parameter_tvb, 0);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
gp_tcapsrt_info->dst_tid=0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2005-06-08 18:52:34 +00:00
|
|
|
if ((len)&&(check_col(pinfo->cinfo, COL_INFO))){
|
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, "dtid(");
|
|
|
|
for(i=0;i<len;i++)
|
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, "%02x",tvb_get_guint8(parameter_tvb,i));
|
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, ") ");
|
|
|
|
}
|
|
|
|
}
|
2005-06-07 05:49:06 +00:00
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_dtid(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_DestTransactionID(FALSE, tvb, offset, pinfo, tree, hf_tcap_dtid);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t End_sequence[] = {
|
|
|
|
{ BER_CLASS_APP, 9, BER_FLAGS_NOOWNTAG, dissect_dtid },
|
|
|
|
{ BER_CLASS_APP, 11, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_dialoguePortion },
|
|
|
|
{ BER_CLASS_APP, 12, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_components },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_End(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 220 "tcap.cnf"
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
gp_tcapsrt_info->ope=TC_END;
|
|
|
|
|
2005-06-07 20:29:23 +00:00
|
|
|
if (check_col(pinfo->cinfo, COL_INFO))
|
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, " End ");
|
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-06-07 05:49:06 +00:00
|
|
|
End_sequence, hf_index, ett_tcap_End);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_end_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_End(TRUE, tvb, offset, pinfo, tree, hf_tcap_end);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t Continue_sequence[] = {
|
|
|
|
{ BER_CLASS_APP, 8, BER_FLAGS_NOOWNTAG, dissect_otid },
|
|
|
|
{ BER_CLASS_APP, 9, BER_FLAGS_NOOWNTAG, dissect_dtid },
|
|
|
|
{ BER_CLASS_APP, 11, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_dialoguePortion },
|
|
|
|
{ BER_CLASS_APP, 12, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_components },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_Continue(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 227 "tcap.cnf"
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
gp_tcapsrt_info->ope=TC_CONT;
|
|
|
|
|
2005-06-07 20:29:23 +00:00
|
|
|
if (check_col(pinfo->cinfo, COL_INFO))
|
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Continue ");
|
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-06-07 05:49:06 +00:00
|
|
|
Continue_sequence, hf_index, ett_tcap_Continue);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_continue_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_Continue(TRUE, tvb, offset, pinfo, tree, hf_tcap_continue);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_P_AbortCause_vals[] = {
|
|
|
|
{ 0, "unrecognizedMessageType" },
|
|
|
|
{ 1, "unrecognizedTransactionID" },
|
|
|
|
{ 2, "badlyFormattedTransactionPortion" },
|
|
|
|
{ 3, "incorrectTransactionPortion" },
|
|
|
|
{ 4, "resourceLimitation" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_P_AbortCause(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
2005-06-07 05:49:06 +00:00
|
|
|
|
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_p_abortCause(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_P_AbortCause(FALSE, tvb, offset, pinfo, tree, hf_tcap_p_abortCause);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_Reason_vals[] = {
|
|
|
|
{ 10, "p-abortCause" },
|
|
|
|
{ 11, "u-abortCause" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
|
|
|
|
|
|
|
static const ber_choice_t Reason_choice[] = {
|
|
|
|
{ 10, BER_CLASS_APP, 10, BER_FLAGS_NOOWNTAG, dissect_p_abortCause },
|
|
|
|
{ 11, BER_CLASS_APP, 11, BER_FLAGS_NOOWNTAG, dissect_u_abortCause },
|
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_Reason(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-07-21 21:12:09 +00:00
|
|
|
offset = dissect_ber_choice(pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
Reason_choice, hf_index, ett_tcap_Reason,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_reason(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_Reason(FALSE, tvb, offset, pinfo, tree, hf_tcap_reason);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t Abort_sequence[] = {
|
|
|
|
{ BER_CLASS_APP, 9, BER_FLAGS_NOOWNTAG, dissect_dtid },
|
2005-08-18 21:36:59 +00:00
|
|
|
{ BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_reason },
|
2005-06-07 05:49:06 +00:00
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_Abort(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 234 "tcap.cnf"
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
gp_tcapsrt_info->ope=TC_ABORT;
|
|
|
|
|
2005-06-07 20:29:23 +00:00
|
|
|
if (check_col(pinfo->cinfo, COL_INFO))
|
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Abort ");
|
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
|
|
|
Abort_sequence, hf_index, ett_tcap_Abort);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_abort_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_Abort(TRUE, tvb, offset, pinfo, tree, hf_tcap_abort);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_TransactionID(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 265 "tcap.cnf"
|
|
|
|
|
|
|
|
tvbuff_t *next_tvb;
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
2007-01-01 22:03:01 +00:00
|
|
|
&next_tvb);
|
|
|
|
|
|
|
|
|
|
|
|
if(next_tvb)
|
|
|
|
tcap_private.TransactionID_str = tvb_bytes_to_str(next_tvb, 0,tvb_length(next_tvb));
|
|
|
|
|
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_identifier(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_TransactionID(FALSE, tvb, offset, pinfo, tree, hf_tcap_identifier);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ProtocolVersion(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
2005-08-18 21:36:59 +00:00
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_version(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ProtocolVersion(FALSE, tvb, offset, pinfo, tree, hf_tcap_version);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_IntegerApplicationContext(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_integerApplicationId(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_IntegerApplicationContext(FALSE, tvb, offset, pinfo, tree, hf_tcap_integerApplicationId);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-06-07 20:29:23 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ObjectIDApplicationContext(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-11-14 10:02:31 +00:00
|
|
|
offset = dissect_ber_object_identifier(implicit_tag, pinfo, tree, tvb, offset, hf_index, NULL);
|
2005-06-07 05:49:06 +00:00
|
|
|
|
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_objectApplicationId(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ObjectIDApplicationContext(FALSE, tvb, offset, pinfo, tree, hf_tcap_objectApplicationId);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_T_applicationContext_vals[] = {
|
|
|
|
{ 27, "integerApplicationId" },
|
|
|
|
{ 28, "objectApplicationId" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_choice_t T_applicationContext_choice[] = {
|
|
|
|
{ 27, BER_CLASS_PRI, 27, BER_FLAGS_NOOWNTAG, dissect_integerApplicationId },
|
|
|
|
{ 28, BER_CLASS_PRI, 28, BER_FLAGS_NOOWNTAG, dissect_objectApplicationId },
|
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_T_applicationContext(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-07-21 21:12:09 +00:00
|
|
|
offset = dissect_ber_choice(pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
T_applicationContext_choice, hf_index, ett_tcap_T_applicationContext,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_applicationContext(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_T_applicationContext(FALSE, tvb, offset, pinfo, tree, hf_tcap_applicationContext);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_T_securityContext_vals[] = {
|
|
|
|
{ 0, "integerSecurityId" },
|
|
|
|
{ 1, "objectSecurityId" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_choice_t T_securityContext_choice[] = {
|
|
|
|
{ 0, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_integerSecurityId_impl },
|
|
|
|
{ 1, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_objectSecurityId_impl },
|
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_T_securityContext(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-07-21 21:12:09 +00:00
|
|
|
offset = dissect_ber_choice(pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
T_securityContext_choice, hf_index, ett_tcap_T_securityContext,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_securityContext(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_T_securityContext(FALSE, tvb, offset, pinfo, tree, hf_tcap_securityContext);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_T_confidentialityId_vals[] = {
|
|
|
|
{ 0, "integerConfidentialityId" },
|
|
|
|
{ 1, "objectConfidentialityId" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_choice_t T_confidentialityId_choice[] = {
|
|
|
|
{ 0, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_integerConfidentialityId_impl },
|
|
|
|
{ 1, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_objectConfidentialityId_impl },
|
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_T_confidentialityId(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-07-21 21:12:09 +00:00
|
|
|
offset = dissect_ber_choice(pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
T_confidentialityId_choice, hf_index, ett_tcap_T_confidentialityId,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_confidentialityId(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_T_confidentialityId(FALSE, tvb, offset, pinfo, tree, hf_tcap_confidentialityId);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t Confidentiality_sequence[] = {
|
2005-08-18 21:36:59 +00:00
|
|
|
{ BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_confidentialityId },
|
2005-06-07 05:49:06 +00:00
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_Confidentiality(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
Confidentiality_sequence, hf_index, ett_tcap_Confidentiality);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_confidentiality_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_Confidentiality(TRUE, tvb, offset, pinfo, tree, hf_tcap_confidentiality);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t DialoguePortionANSI_sequence[] = {
|
|
|
|
{ BER_CLASS_PRI, 26, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_version },
|
|
|
|
{ BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL, dissect_applicationContext },
|
|
|
|
{ BER_CLASS_UNI, 8, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_userInformation },
|
2005-08-18 21:36:59 +00:00
|
|
|
{ BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_securityContext },
|
2005-06-07 05:49:06 +00:00
|
|
|
{ BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_confidentiality_impl },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_DialoguePortionANSI(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
DialoguePortionANSI_sequence, hf_index, ett_tcap_DialoguePortionANSI);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_dialoguePortionansi(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_DialoguePortionANSI(FALSE, tvb, offset, pinfo, tree, hf_tcap_dialoguePortionansi);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_OCTET_STRING_SIZE_0_2(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
2005-08-18 21:36:59 +00:00
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_componentIDs_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_OCTET_STRING_SIZE_0_2(TRUE, tvb, offset, pinfo, tree, hf_tcap_componentIDs);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 20:29:23 +00:00
|
|
|
static const value_string tcap_OperationCode_vals[] = {
|
|
|
|
{ 16, "national" },
|
|
|
|
{ 17, "private" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
|
|
|
|
|
|
|
static const ber_choice_t OperationCode_choice[] = {
|
|
|
|
{ 16, BER_CLASS_PRI, 16, BER_FLAGS_IMPLTAG, dissect_national_impl },
|
|
|
|
{ 17, BER_CLASS_PRI, 17, BER_FLAGS_IMPLTAG, dissect_private_impl },
|
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
|
|
|
|
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_OperationCode(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-07-21 21:12:09 +00:00
|
|
|
offset = dissect_ber_choice(pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
OperationCode_choice, hf_index, ett_tcap_OperationCode,
|
|
|
|
NULL);
|
2005-06-07 20:29:23 +00:00
|
|
|
|
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_operationCode(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
return dissect_tcap_OperationCode(FALSE, tvb, offset, pinfo, tree, hf_tcap_operationCode);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ANSIParameters(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 112 "tcap.cnf"
|
2005-06-07 05:49:06 +00:00
|
|
|
/* we are doing the ParamSet here so need to look at the tags*/
|
|
|
|
guint32 len;
|
|
|
|
len = tvb_length_remaining(tvb, offset);
|
|
|
|
if (len > 2) /* arghhh I dont know whether this is constructed or not! */
|
|
|
|
offset = dissect_tcap_param(pinfo,tree,tvb,offset);
|
|
|
|
else
|
|
|
|
offset = dissect_ber_octet_string(TRUE, pinfo, tree, tvb, 0, hf_index,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams1(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams1);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams2(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams2);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams3(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams3);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams4(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams4);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams5(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams5);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams6(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams6);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams7(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams7);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams8(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams8);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams9(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams9);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams10(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams10);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams11(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams11);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams12(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams12);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams13(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams13);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams14(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams14);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams15(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams15);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams16(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams16);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams17(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams17);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams18(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams18);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams19(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams19);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams20(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams20);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiparams21(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIParameters(FALSE, tvb, offset, pinfo, tree, hf_tcap_ansiparams21);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t ANSIparamch_sequence[] = {
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams1 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams2 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams3 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams4 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams5 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams6 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams7 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams8 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams9 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams10 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams11 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams12 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams13 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams14 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams15 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams16 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams17 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams18 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams19 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams20 },
|
|
|
|
{ BER_CLASS_ANY, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_ansiparams21 },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ANSIparamch(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
ANSIparamch_sequence, hf_index, ett_tcap_ANSIparamch);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_parameterinv(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIparamch(FALSE, tvb, offset, pinfo, tree, hf_tcap_parameterinv);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_parameterrr(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIparamch(FALSE, tvb, offset, pinfo, tree, hf_tcap_parameterrr);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_parameterre(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIparamch(FALSE, tvb, offset, pinfo, tree, hf_tcap_parameterre);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_parameterrj(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ANSIparamch(FALSE, tvb, offset, pinfo, tree, hf_tcap_parameterrj);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t InvokePDU_sequence[] = {
|
|
|
|
{ BER_CLASS_PRI, 15, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_componentIDs_impl },
|
2005-08-18 21:36:59 +00:00
|
|
|
{ BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_operationCode },
|
2005-06-07 05:49:06 +00:00
|
|
|
{ BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_parameterinv },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_InvokePDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
InvokePDU_sequence, hf_index, ett_tcap_InvokePDU);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_invokeLastansi_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_InvokePDU(TRUE, tvb, offset, pinfo, tree, hf_tcap_invokeLastansi);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_invokeNotLastansi_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_InvokePDU(TRUE, tvb, offset, pinfo, tree, hf_tcap_invokeNotLastansi);
|
|
|
|
}
|
2003-10-16 18:15:54 +00:00
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ComponentID(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_octet_string(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
2005-08-18 21:36:59 +00:00
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_componentID(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ComponentID(FALSE, tvb, offset, pinfo, tree, hf_tcap_componentID);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t ReturnResultPDU_sequence[] = {
|
|
|
|
{ BER_CLASS_PRI, 15, BER_FLAGS_NOOWNTAG, dissect_componentID },
|
|
|
|
{ BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_parameterrr },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ReturnResultPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
ReturnResultPDU_sequence, hf_index, ett_tcap_ReturnResultPDU);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_returnResultLastansi_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ReturnResultPDU(TRUE, tvb, offset, pinfo, tree, hf_tcap_returnResultLastansi);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_returnResultNotLastansi_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ReturnResultPDU(TRUE, tvb, offset, pinfo, tree, hf_tcap_returnResultNotLastansi);
|
|
|
|
}
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t ReturnErrorPDU_sequence[] = {
|
|
|
|
{ BER_CLASS_PRI, 15, BER_FLAGS_NOOWNTAG, dissect_componentID },
|
2005-08-18 21:36:59 +00:00
|
|
|
{ BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_errorCode },
|
2005-06-07 05:49:06 +00:00
|
|
|
{ BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_parameterre },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ReturnErrorPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
ReturnErrorPDU_sequence, hf_index, ett_tcap_ReturnErrorPDU);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_returnErroransi_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ReturnErrorPDU(TRUE, tvb, offset, pinfo, tree, hf_tcap_returnErroransi);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_ProblemPDU_vals[] = {
|
|
|
|
{ 257, "general-unrecognisedComponentType" },
|
|
|
|
{ 258, "general-incorrectComponentPortion" },
|
|
|
|
{ 259, "general-badlyStructuredCompPortion" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-11-14 01:35:08 +00:00
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ProblemPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_rejectProblem_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ProblemPDU(TRUE, tvb, offset, pinfo, tree, hf_tcap_rejectProblem);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t RejectPDU_sequence[] = {
|
|
|
|
{ BER_CLASS_PRI, 15, BER_FLAGS_NOOWNTAG, dissect_componentID },
|
|
|
|
{ BER_CLASS_PRI, 21, BER_FLAGS_IMPLTAG, dissect_rejectProblem_impl },
|
|
|
|
{ BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_parameterrj },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_RejectPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
RejectPDU_sequence, hf_index, ett_tcap_RejectPDU);
|
2003-11-14 01:35:08 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_rejectansi_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_RejectPDU(TRUE, tvb, offset, pinfo, tree, hf_tcap_rejectansi);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_ComponentPDU_vals[] = {
|
|
|
|
{ 9, "invokeLastansi" },
|
|
|
|
{ 10, "returnResultLastansi" },
|
|
|
|
{ 11, "returnErroransi" },
|
|
|
|
{ 12, "rejectansi" },
|
|
|
|
{ 13, "invokeNotLastansi" },
|
|
|
|
{ 14, "returnResultNotLastansi" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_choice_t ComponentPDU_choice[] = {
|
|
|
|
{ 9, BER_CLASS_PRI, 9, BER_FLAGS_IMPLTAG, dissect_invokeLastansi_impl },
|
|
|
|
{ 10, BER_CLASS_PRI, 10, BER_FLAGS_IMPLTAG, dissect_returnResultLastansi_impl },
|
|
|
|
{ 11, BER_CLASS_PRI, 11, BER_FLAGS_IMPLTAG, dissect_returnErroransi_impl },
|
|
|
|
{ 12, BER_CLASS_PRI, 12, BER_FLAGS_IMPLTAG, dissect_rejectansi_impl },
|
|
|
|
{ 13, BER_CLASS_PRI, 13, BER_FLAGS_IMPLTAG, dissect_invokeNotLastansi_impl },
|
|
|
|
{ 14, BER_CLASS_PRI, 14, BER_FLAGS_IMPLTAG, dissect_returnResultNotLastansi_impl },
|
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
2003-11-14 01:35:08 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ComponentPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 123 "tcap.cnf"
|
2005-06-07 05:49:06 +00:00
|
|
|
tvbuff_t *next_tvb;
|
2005-12-17 16:55:45 +00:00
|
|
|
dissector_handle_t subdissector_handle;
|
2003-11-14 01:35:08 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
next_tvb = tvb_new_subset(tvb, offset, tvb_length_remaining(tvb, offset), tvb_length_remaining(tvb, offset));
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-12-17 16:55:45 +00:00
|
|
|
if (! (subdissector_handle = get_ansi_tcap_subdissector(pinfo->match_port))) {
|
|
|
|
subdissector_handle = data_handle;
|
|
|
|
}
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
|
|
|
|
tcap_subdissector_used=TRUE;
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-12-17 16:55:45 +00:00
|
|
|
call_dissector(subdissector_handle, next_tvb, pinfo, tcap_top_tree);
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
offset = dissect_ber_choice(pinfo, tree, tvb, offset,
|
|
|
|
ComponentPDU_choice, hf_index, ett_tcap_ComponentPDU,NULL);
|
2005-06-07 05:49:06 +00:00
|
|
|
|
2003-11-14 01:35:08 +00:00
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ComponentSequence_item(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ComponentPDU(FALSE, tvb, offset, pinfo, tree, hf_tcap_ComponentSequence_item);
|
|
|
|
}
|
2003-11-14 01:35:08 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t ComponentSequence_sequence_of[1] = {
|
2005-08-18 21:36:59 +00:00
|
|
|
{ BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_ComponentSequence_item },
|
2005-06-07 05:49:06 +00:00
|
|
|
};
|
2003-11-14 01:35:08 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ComponentSequence(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence_of(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
ComponentSequence_sequence_of, hf_index, ett_tcap_ComponentSequence);
|
2003-11-14 01:35:08 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_componentPortion(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_ComponentSequence(FALSE, tvb, offset, pinfo, tree, hf_tcap_componentPortion);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t UniTransactionPDU_sequence[] = {
|
|
|
|
{ BER_CLASS_PRI, 7, BER_FLAGS_NOOWNTAG, dissect_identifier },
|
|
|
|
{ BER_CLASS_PRI, 25, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_dialoguePortionansi },
|
|
|
|
{ BER_CLASS_PRI, 8, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_componentPortion },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-11-14 01:35:08 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_UniTransactionPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
UniTransactionPDU_sequence, hf_index, ett_tcap_UniTransactionPDU);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiunidirectional_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_UniTransactionPDU(TRUE, tvb, offset, pinfo, tree, hf_tcap_ansiunidirectional);
|
|
|
|
}
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t TransactionPDU_sequence[] = {
|
|
|
|
{ BER_CLASS_PRI, 7, BER_FLAGS_NOOWNTAG, dissect_identifier },
|
|
|
|
{ BER_CLASS_PRI, 25, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_dialoguePortionansi },
|
|
|
|
{ BER_CLASS_PRI, 8, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_componentPortion },
|
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_TransactionPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 246 "tcap.cnf"
|
2005-06-07 20:29:23 +00:00
|
|
|
if ((hf_index == hf_tcap_ansiqueryWithPerm)&&(check_col(pinfo->cinfo, COL_INFO)))
|
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, " QueryWithPerm");
|
|
|
|
|
|
|
|
if ((hf_index == hf_tcap_ansiqueryWithoutPerm)&&(check_col(pinfo->cinfo, COL_INFO)))
|
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, " QueryWithOutPerm");
|
|
|
|
|
|
|
|
if ((hf_index == hf_tcap_ansiresponse)&&(check_col(pinfo->cinfo, COL_INFO)))
|
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Response");
|
|
|
|
|
|
|
|
if ((hf_index == hf_tcap_ansiconversationWithPerm)&&(check_col(pinfo->cinfo, COL_INFO)))
|
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, " ConversationWithPerm");
|
|
|
|
|
|
|
|
if ((hf_index == hf_tcap_ansiconversationWithoutPerm)&&(check_col(pinfo->cinfo, COL_INFO)))
|
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, " ConversationWithoutPerm");
|
|
|
|
|
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
|
|
|
TransactionPDU_sequence, hf_index, ett_tcap_TransactionPDU);
|
2007-01-01 22:03:01 +00:00
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiqueryWithPerm_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_TransactionPDU(TRUE, tvb, offset, pinfo, tree, hf_tcap_ansiqueryWithPerm);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiqueryWithoutPerm_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_TransactionPDU(TRUE, tvb, offset, pinfo, tree, hf_tcap_ansiqueryWithoutPerm);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiresponse_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_TransactionPDU(TRUE, tvb, offset, pinfo, tree, hf_tcap_ansiresponse);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiconversationWithPerm_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_TransactionPDU(TRUE, tvb, offset, pinfo, tree, hf_tcap_ansiconversationWithPerm);
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiconversationWithoutPerm_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_TransactionPDU(TRUE, tvb, offset, pinfo, tree, hf_tcap_ansiconversationWithoutPerm);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_P_Abort_cause_vals[] = {
|
|
|
|
{ 1, "unrecognizedPackageType" },
|
|
|
|
{ 2, "incorrestTransactionPortion" },
|
|
|
|
{ 3, "badlyStructuredTransactionPortion" },
|
|
|
|
{ 4, "unassignedRespondingTransactionID" },
|
|
|
|
{ 5, "permissionToReleaseProblem" },
|
|
|
|
{ 6, "resourceUnavilable" },
|
|
|
|
{ 7, "unrecognizedDialoguePortionID" },
|
|
|
|
{ 8, "badlyStructuredDialoguePortion" },
|
|
|
|
{ 9, "missingDialoguePortion" },
|
|
|
|
{ 10, "inconsistentDialoguePortion" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_P_Abort_cause(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-06-07 20:29:23 +00:00
|
|
|
offset = dissect_ber_integer(implicit_tag, pinfo, tree, tvb, offset, hf_index,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_abortCause(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_P_Abort_cause(FALSE, tvb, offset, pinfo, tree, hf_tcap_abortCause);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_T_causeInformation_vals[] = {
|
|
|
|
{ 0, "abortCause" },
|
|
|
|
{ 1, "userInformation" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_choice_t T_causeInformation_choice[] = {
|
|
|
|
{ 0, BER_CLASS_PRI, 23, BER_FLAGS_NOOWNTAG, dissect_abortCause },
|
|
|
|
{ 1, BER_CLASS_UNI, 8, BER_FLAGS_NOOWNTAG, dissect_userInformation },
|
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_T_causeInformation(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-07-21 21:12:09 +00:00
|
|
|
offset = dissect_ber_choice(pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
T_causeInformation_choice, hf_index, ett_tcap_T_causeInformation,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_causeInformation(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_T_causeInformation(FALSE, tvb, offset, pinfo, tree, hf_tcap_causeInformation);
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_sequence_t AbortPDU_sequence[] = {
|
|
|
|
{ BER_CLASS_PRI, 7, BER_FLAGS_NOOWNTAG, dissect_identifier },
|
|
|
|
{ BER_CLASS_PRI, 25, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_dialoguePortionansi },
|
2005-08-18 21:36:59 +00:00
|
|
|
{ BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_causeInformation },
|
2005-06-07 05:49:06 +00:00
|
|
|
{ 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_AbortPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2007-01-01 22:03:01 +00:00
|
|
|
#line 241 "tcap.cnf"
|
2005-06-07 20:29:23 +00:00
|
|
|
if (check_col(pinfo->cinfo, COL_INFO))
|
|
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, " Abort ");
|
|
|
|
offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset,
|
2005-06-07 05:49:06 +00:00
|
|
|
AbortPDU_sequence, hf_index, ett_tcap_AbortPDU);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-12-08 23:29:21 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2007-03-21 10:22:22 +00:00
|
|
|
static int dissect_ansiabort_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) {
|
2005-06-07 05:49:06 +00:00
|
|
|
return dissect_tcap_AbortPDU(TRUE, tvb, offset, pinfo, tree, hf_tcap_ansiabort);
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_MessageType_vals[] = {
|
|
|
|
{ 0, "unidirectional" },
|
|
|
|
{ 1, "begin" },
|
|
|
|
{ 2, "end" },
|
|
|
|
{ 3, "continue" },
|
|
|
|
{ 4, "abort" },
|
|
|
|
{ 5, "ansiunidirectional" },
|
|
|
|
{ 6, "ansiqueryWithPerm" },
|
|
|
|
{ 7, "ansiqueryWithoutPerm" },
|
|
|
|
{ 8, "ansiresponse" },
|
|
|
|
{ 9, "ansiconversationWithPerm" },
|
|
|
|
{ 10, "ansiconversationWithoutPerm" },
|
|
|
|
{ 11, "ansiabort" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_choice_t MessageType_choice[] = {
|
|
|
|
{ 0, BER_CLASS_APP, 1, BER_FLAGS_IMPLTAG, dissect_unidirectional_impl },
|
|
|
|
{ 1, BER_CLASS_APP, 2, BER_FLAGS_IMPLTAG, dissect_begin_impl },
|
|
|
|
{ 2, BER_CLASS_APP, 4, BER_FLAGS_IMPLTAG, dissect_end_impl },
|
|
|
|
{ 3, BER_CLASS_APP, 5, BER_FLAGS_IMPLTAG, dissect_continue_impl },
|
|
|
|
{ 4, BER_CLASS_APP, 7, BER_FLAGS_IMPLTAG, dissect_abort_impl },
|
|
|
|
{ 5, BER_CLASS_PRI, 1, BER_FLAGS_IMPLTAG, dissect_ansiunidirectional_impl },
|
|
|
|
{ 6, BER_CLASS_PRI, 2, BER_FLAGS_IMPLTAG, dissect_ansiqueryWithPerm_impl },
|
|
|
|
{ 7, BER_CLASS_PRI, 3, BER_FLAGS_IMPLTAG, dissect_ansiqueryWithoutPerm_impl },
|
|
|
|
{ 8, BER_CLASS_PRI, 4, BER_FLAGS_IMPLTAG, dissect_ansiresponse_impl },
|
|
|
|
{ 9, BER_CLASS_PRI, 5, BER_FLAGS_IMPLTAG, dissect_ansiconversationWithPerm_impl },
|
|
|
|
{ 10, BER_CLASS_PRI, 6, BER_FLAGS_IMPLTAG, dissect_ansiconversationWithoutPerm_impl },
|
|
|
|
{ 11, BER_CLASS_PRI, 22, BER_FLAGS_IMPLTAG, dissect_ansiabort_impl },
|
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_MessageType(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-07-21 21:12:09 +00:00
|
|
|
offset = dissect_ber_choice(pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
MessageType_choice, hf_index, ett_tcap_MessageType,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const value_string tcap_ERROR_vals[] = {
|
|
|
|
{ 0, "localValue" },
|
|
|
|
{ 1, "globalValue" },
|
|
|
|
{ 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static const ber_choice_t ERROR_choice[] = {
|
|
|
|
{ 0, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_localValue },
|
|
|
|
{ 1, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_globalValue },
|
|
|
|
{ 0, 0, 0, 0, NULL }
|
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
static int
|
2007-03-21 10:22:22 +00:00
|
|
|
dissect_tcap_ERROR(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) {
|
2005-07-21 21:12:09 +00:00
|
|
|
offset = dissect_ber_choice(pinfo, tree, tvb, offset,
|
2005-08-18 21:36:59 +00:00
|
|
|
ERROR_choice, hf_index, ett_tcap_ERROR,
|
|
|
|
NULL);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
return offset;
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
/*--- End of included file: packet-tcap-fn.c ---*/
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
#line 141 "packet-tcap-template.c"
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
const value_string tcap_component_type_str[] = {
|
|
|
|
{ TCAP_COMP_INVOKE, "Invoke" },
|
|
|
|
{ TCAP_COMP_RRL, "Return Result(L)" },
|
|
|
|
{ TCAP_COMP_RE, "Return Error" },
|
|
|
|
{ TCAP_COMP_REJECT, "Reject" },
|
|
|
|
{ TCAP_COMP_RRN, "Return Result(NL)" },
|
|
|
|
{ 0, NULL } };
|
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
static void
|
2005-06-07 05:49:06 +00:00
|
|
|
dissect_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
|
2003-10-02 06:13:29 +00:00
|
|
|
{
|
2005-06-07 05:49:06 +00:00
|
|
|
proto_item *item=NULL;
|
|
|
|
proto_tree *tree=NULL;
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
proto_item *stat_item=NULL;
|
|
|
|
proto_tree *stat_tree=NULL;
|
|
|
|
struct tcaphash_context_t * p_tcap_context;
|
2006-10-03 19:24:22 +00:00
|
|
|
dissector_handle_t subdissector_handle;
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-16 07:46:03 +00:00
|
|
|
tcap_top_tree = parent_tree;
|
2003-10-02 06:13:29 +00:00
|
|
|
if (check_col(pinfo->cinfo, COL_PROTOCOL))
|
2004-09-04 21:20:08 +00:00
|
|
|
{
|
2005-06-07 05:49:06 +00:00
|
|
|
col_set_str(pinfo->cinfo, COL_PROTOCOL, "TCAP");
|
2004-09-04 21:20:08 +00:00
|
|
|
}
|
2005-06-07 05:49:06 +00:00
|
|
|
|
|
|
|
/* create display subtree for the protocol */
|
|
|
|
if(parent_tree){
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
item = proto_tree_add_item(parent_tree, proto_tcap, tvb, 0, -1, FALSE);
|
|
|
|
tree = proto_item_add_subtree(item, ett_tcap);
|
|
|
|
tcap_stat_item=item;
|
|
|
|
tcap_stat_tree=tree;
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
2005-06-16 07:46:03 +00:00
|
|
|
cur_oid = NULL;
|
|
|
|
tcapext_oid = NULL;
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
raz_tcap_private(&tcap_private);
|
|
|
|
|
|
|
|
pinfo->private_data = &tcap_private;
|
|
|
|
gp_tcapsrt_info=tcapsrt_razinfo();
|
|
|
|
tcap_subdissector_used=FALSE;
|
|
|
|
gp_tcap_context=NULL;
|
|
|
|
dissect_tcap_MessageType(FALSE, tvb, 0, pinfo, tree, -1);
|
|
|
|
|
|
|
|
if (gtcap_HandleSRT &&
|
|
|
|
!tcap_subdissector_used ) {
|
|
|
|
if (gtcap_DisplaySRT && tree) {
|
|
|
|
stat_item = proto_tree_add_text(tree, tvb, 0, 0, "Stat");
|
|
|
|
stat_tree = proto_item_add_subtree(stat_item, ett_tcap_stat);
|
|
|
|
}
|
|
|
|
p_tcap_context=tcapsrt_call_matching(tvb, pinfo, stat_tree, gp_tcapsrt_info);
|
|
|
|
tcap_private.context=p_tcap_context;
|
2006-10-03 19:24:22 +00:00
|
|
|
|
|
|
|
/* If the current message is TCAP only,
|
|
|
|
save the Application contexte name for the next messages */
|
|
|
|
if ( p_tcap_context &&
|
|
|
|
cur_oid &&
|
|
|
|
!p_tcap_context->oid_present ) {
|
|
|
|
/* Save the application context and the sub dissector */
|
|
|
|
ber_oid_dissector_table = find_dissector_table("ber.oid");
|
|
|
|
strncpy(p_tcap_context->oid,cur_oid, LENGTH_OID);
|
|
|
|
if ( (subdissector_handle
|
|
|
|
= dissector_get_string_handle(ber_oid_dissector_table, cur_oid)) ) {
|
|
|
|
p_tcap_context->subdissector_handle=subdissector_handle;
|
|
|
|
p_tcap_context->oid_present=TRUE;
|
|
|
|
}
|
|
|
|
}
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
|
|
|
|
if (gtcap_HandleSRT &&
|
|
|
|
p_tcap_context &&
|
|
|
|
p_tcap_context->callback) {
|
|
|
|
/* Callback fonction for the upper layer */
|
|
|
|
(p_tcap_context->callback)(tvb, pinfo, stat_tree, p_tcap_context);
|
|
|
|
}
|
|
|
|
}
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-12-17 16:55:45 +00:00
|
|
|
void
|
|
|
|
proto_reg_handoff_tcap(void)
|
|
|
|
{
|
|
|
|
|
|
|
|
static gboolean prefs_initialized = FALSE;
|
|
|
|
|
|
|
|
if (! prefs_initialized) {
|
|
|
|
sccp_ssn_table = find_dissector_table("sccp.ssn");
|
|
|
|
prefs_initialized = TRUE;
|
|
|
|
}
|
|
|
|
|
2006-06-28 14:19:08 +00:00
|
|
|
add_oid_str_name("0.0.17.773.1.1.1",
|
2005-12-17 16:55:45 +00:00
|
|
|
"itu-t(0) recommendation(0) q(17) 773 as(1) dialogue-as(1) version1(1)");
|
2005-12-18 11:19:25 +00:00
|
|
|
|
|
|
|
data_handle = find_dissector("data");
|
2005-12-17 16:55:45 +00:00
|
|
|
}
|
2005-06-07 05:49:06 +00:00
|
|
|
|
2005-12-17 16:55:45 +00:00
|
|
|
static void init_tcap(void);
|
2005-08-18 21:36:59 +00:00
|
|
|
|
2003-10-02 06:13:29 +00:00
|
|
|
void
|
|
|
|
proto_register_tcap(void)
|
|
|
|
{
|
|
|
|
|
|
|
|
/* Setup list of header fields See Section 1.6.1 for details*/
|
2003-10-16 18:15:54 +00:00
|
|
|
static hf_register_info hf[] = {
|
|
|
|
{ &hf_tcap_tag,
|
|
|
|
{ "Tag", "tcap.msgtype",
|
|
|
|
FT_UINT8, BASE_HEX, NULL, 0,
|
|
|
|
"", HFILL }
|
|
|
|
},
|
|
|
|
{ &hf_tcap_length,
|
|
|
|
{ "Length", "tcap.len",
|
|
|
|
FT_UINT8, BASE_HEX, NULL, 0,
|
|
|
|
"", HFILL }
|
|
|
|
},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_data,
|
|
|
|
{ "Data", "tcap.data",
|
|
|
|
FT_BYTES, BASE_HEX, NULL, 0,
|
2004-10-27 20:04:56 +00:00
|
|
|
"", HFILL }
|
|
|
|
},
|
2005-08-18 21:36:59 +00:00
|
|
|
{ &hf_tcap_tid,
|
|
|
|
{ "Transaction Id", "tcap.tid",
|
|
|
|
FT_BYTES, BASE_HEX, NULL, 0,
|
|
|
|
"", HFILL }
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
},
|
|
|
|
/* Tcap Service Response Time */
|
|
|
|
{ &hf_tcapsrt_SessionId,
|
|
|
|
{ "Session Id",
|
|
|
|
"tcap.srt.session_id",
|
|
|
|
FT_UINT32, BASE_DEC, NULL, 0x0,
|
|
|
|
"", HFILL }
|
|
|
|
},
|
|
|
|
{ &hf_tcapsrt_BeginSession,
|
|
|
|
{ "Begin Session",
|
|
|
|
"tcap.srt.begin",
|
|
|
|
FT_FRAMENUM, BASE_NONE, NULL, 0x0,
|
|
|
|
"SRT Begin of Session", HFILL }
|
|
|
|
},
|
|
|
|
{ &hf_tcapsrt_EndSession,
|
|
|
|
{ "End Session",
|
|
|
|
"tcap.srt.end",
|
|
|
|
FT_FRAMENUM, BASE_NONE, NULL, 0x0,
|
|
|
|
"SRT End of Session", HFILL }
|
|
|
|
},
|
|
|
|
{ &hf_tcapsrt_SessionTime,
|
|
|
|
{ "Session duration",
|
|
|
|
"tcap.srt.sessiontime",
|
|
|
|
FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0,
|
|
|
|
"Duration of the TCAP session", HFILL }
|
|
|
|
},
|
|
|
|
{ &hf_tcapsrt_Duplicate,
|
|
|
|
{ "Request Duplicate",
|
|
|
|
"tcap.srt.duplicate",
|
|
|
|
FT_UINT32, BASE_DEC, NULL, 0x0,
|
|
|
|
"", HFILL }
|
2005-08-18 21:36:59 +00:00
|
|
|
},
|
2005-06-07 05:49:06 +00:00
|
|
|
|
|
|
|
/*--- Included file: packet-tcap-hfarr.c ---*/
|
2005-12-08 23:29:21 +00:00
|
|
|
#line 1 "packet-tcap-hfarr.c"
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_dialogueRequest,
|
|
|
|
{ "dialogueRequest", "tcap.dialogueRequest",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.AARQ_apdu", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_dialogueResponse,
|
|
|
|
{ "dialogueResponse", "tcap.dialogueResponse",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.AARE_apdu", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_dialogueAbort,
|
|
|
|
{ "dialogueAbort", "tcap.dialogueAbort",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ABRT_apdu", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_oid,
|
|
|
|
{ "oid", "tcap.oid",
|
2005-12-08 23:29:21 +00:00
|
|
|
FT_OID, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.OBJECT_IDENTIFIER", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_dialog,
|
|
|
|
{ "dialog", "tcap.dialog",
|
|
|
|
FT_BYTES, BASE_HEX, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.Dialog1", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_useroid,
|
|
|
|
{ "useroid", "tcap.useroid",
|
2005-12-08 23:29:21 +00:00
|
|
|
FT_OID, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.UserInfoOID", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_externuserinfo,
|
|
|
|
{ "externuserinfo", "tcap.externuserinfo",
|
|
|
|
FT_BYTES, BASE_HEX, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ExternUserInfo", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_protocol_versionrq,
|
|
|
|
{ "protocol-versionrq", "tcap.protocol_versionrq",
|
|
|
|
FT_BYTES, BASE_HEX, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.T_protocol_versionrq", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_application_context_name,
|
|
|
|
{ "application-context-name", "tcap.application_context_name",
|
2005-12-08 23:29:21 +00:00
|
|
|
FT_OID, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.Applicationcontext", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_user_information,
|
|
|
|
{ "user-information", "tcap.user_information",
|
|
|
|
FT_BYTES, BASE_HEX, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.User_information", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_protocol_versionre,
|
|
|
|
{ "protocol-versionre", "tcap.protocol_versionre",
|
|
|
|
FT_BYTES, BASE_HEX, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.T_protocol_versionre", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_result,
|
|
|
|
{ "result", "tcap.result",
|
|
|
|
FT_INT32, BASE_DEC, VALS(tcap_Associate_result_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.Associate_result", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_result_source_diagnostic,
|
|
|
|
{ "result-source-diagnostic", "tcap.result_source_diagnostic",
|
|
|
|
FT_UINT32, BASE_DEC, VALS(tcap_Associate_source_diagnostic_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.Associate_source_diagnostic", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_reasonrq,
|
|
|
|
{ "reasonrq", "tcap.reasonrq",
|
|
|
|
FT_INT32, BASE_DEC, VALS(tcap_Release_request_reason_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.Release_request_reason", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_reasonre,
|
|
|
|
{ "reasonre", "tcap.reasonre",
|
|
|
|
FT_INT32, BASE_DEC, VALS(tcap_Release_response_reason_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.Release_response_reason", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_abort_source,
|
|
|
|
{ "abort-source", "tcap.abort_source",
|
|
|
|
FT_INT32, BASE_DEC, VALS(tcap_ABRT_source_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ABRT_source", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_dialogue_service_user,
|
|
|
|
{ "dialogue-service-user", "tcap.dialogue_service_user",
|
|
|
|
FT_INT32, BASE_DEC, VALS(tcap_T_dialogue_service_user_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.T_dialogue_service_user", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_dialogue_service_provider,
|
|
|
|
{ "dialogue-service-provider", "tcap.dialogue_service_provider",
|
|
|
|
FT_INT32, BASE_DEC, VALS(tcap_T_dialogue_service_provider_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.T_dialogue_service_provider", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_unidialoguePDU,
|
|
|
|
{ "unidialoguePDU", "tcap.unidialoguePDU",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.AUDT_apdu", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_protocol_version3,
|
|
|
|
{ "protocol-version3", "tcap.protocol_version3",
|
|
|
|
FT_BYTES, BASE_HEX, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.T_protocol_version3", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_unidirectional,
|
|
|
|
{ "unidirectional", "tcap.unidirectional",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.Unidirectional", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_begin,
|
|
|
|
{ "begin", "tcap.begin",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.Begin", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_end,
|
|
|
|
{ "end", "tcap.end",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.End", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_continue,
|
|
|
|
{ "continue", "tcap.continue",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.Continue", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_abort,
|
|
|
|
{ "abort", "tcap.abort",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.Abort", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiunidirectional,
|
|
|
|
{ "ansiunidirectional", "tcap.ansiunidirectional",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.UniTransactionPDU", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiqueryWithPerm,
|
|
|
|
{ "ansiqueryWithPerm", "tcap.ansiqueryWithPerm",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.TransactionPDU", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiqueryWithoutPerm,
|
|
|
|
{ "ansiqueryWithoutPerm", "tcap.ansiqueryWithoutPerm",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.TransactionPDU", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiresponse,
|
|
|
|
{ "ansiresponse", "tcap.ansiresponse",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.TransactionPDU", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiconversationWithPerm,
|
|
|
|
{ "ansiconversationWithPerm", "tcap.ansiconversationWithPerm",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.TransactionPDU", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiconversationWithoutPerm,
|
|
|
|
{ "ansiconversationWithoutPerm", "tcap.ansiconversationWithoutPerm",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.TransactionPDU", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiabort,
|
|
|
|
{ "ansiabort", "tcap.ansiabort",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.AbortPDU", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_dialoguePortion,
|
|
|
|
{ "dialoguePortion", "tcap.dialoguePortion",
|
|
|
|
FT_BYTES, BASE_HEX, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.DialoguePortion", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_components,
|
|
|
|
{ "components", "tcap.components",
|
2005-08-18 21:36:59 +00:00
|
|
|
FT_UINT32, BASE_DEC, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ComponentPortion", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_otid,
|
|
|
|
{ "otid", "tcap.otid",
|
|
|
|
FT_BYTES, BASE_HEX, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.OrigTransactionID", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_dtid,
|
|
|
|
{ "dtid", "tcap.dtid",
|
|
|
|
FT_BYTES, BASE_HEX, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.DestTransactionID", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_reason,
|
|
|
|
{ "reason", "tcap.reason",
|
|
|
|
FT_UINT32, BASE_DEC, VALS(tcap_Reason_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.Reason", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_p_abortCause,
|
|
|
|
{ "p-abortCause", "tcap.p_abortCause",
|
|
|
|
FT_INT32, BASE_DEC, VALS(tcap_P_AbortCause_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.P_AbortCause", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_u_abortCause,
|
|
|
|
{ "u-abortCause", "tcap.u_abortCause",
|
|
|
|
FT_BYTES, BASE_HEX, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.DialoguePortion", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ComponentPortion_item,
|
|
|
|
{ "Item", "tcap.ComponentPortion_item",
|
|
|
|
FT_UINT32, BASE_DEC, VALS(tcap_Component_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.Component", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_invoke,
|
|
|
|
{ "invoke", "tcap.invoke",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.Invoke", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_returnResultLast,
|
|
|
|
{ "returnResultLast", "tcap.returnResultLast",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ReturnResult", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_returnError,
|
|
|
|
{ "returnError", "tcap.returnError",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ReturnError", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_reject,
|
|
|
|
{ "reject", "tcap.reject",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.Reject", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_returnResultNotLast,
|
|
|
|
{ "returnResultNotLast", "tcap.returnResultNotLast",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ReturnResult", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_invokeID,
|
|
|
|
{ "invokeID", "tcap.invokeID",
|
2005-11-26 03:09:40 +00:00
|
|
|
FT_INT32, BASE_DEC, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.InvokeIdType", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_linkedID,
|
|
|
|
{ "linkedID", "tcap.linkedID",
|
2005-11-26 03:09:40 +00:00
|
|
|
FT_INT32, BASE_DEC, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.InvokeIdType", HFILL }},
|
2005-06-07 20:29:23 +00:00
|
|
|
{ &hf_tcap_opCode,
|
|
|
|
{ "opCode", "tcap.opCode",
|
|
|
|
FT_UINT32, BASE_DEC, VALS(tcap_OPERATION_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.OPERATION", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_parameter,
|
|
|
|
{ "parameter", "tcap.parameter",
|
2005-06-07 20:29:23 +00:00
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.Parameter", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_resultretres,
|
|
|
|
{ "resultretres", "tcap.resultretres",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.T_resultretres", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_errorCode,
|
|
|
|
{ "errorCode", "tcap.errorCode",
|
|
|
|
FT_UINT32, BASE_DEC, VALS(tcap_ErrorCode_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ErrorCode", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_invokeIDRej,
|
|
|
|
{ "invokeIDRej", "tcap.invokeIDRej",
|
|
|
|
FT_UINT32, BASE_DEC, VALS(tcap_T_invokeIDRej_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.T_invokeIDRej", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_derivable,
|
|
|
|
{ "derivable", "tcap.derivable",
|
2005-11-26 03:09:40 +00:00
|
|
|
FT_INT32, BASE_DEC, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.InvokeIdType", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_not_derivable,
|
|
|
|
{ "not-derivable", "tcap.not_derivable",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.NULL", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_problem,
|
|
|
|
{ "problem", "tcap.problem",
|
|
|
|
FT_UINT32, BASE_DEC, VALS(tcap_T_problem_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.T_problem", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_generalProblem,
|
|
|
|
{ "generalProblem", "tcap.generalProblem",
|
|
|
|
FT_INT32, BASE_DEC, VALS(tcap_GeneralProblem_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.GeneralProblem", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_invokeProblem,
|
|
|
|
{ "invokeProblem", "tcap.invokeProblem",
|
|
|
|
FT_INT32, BASE_DEC, VALS(tcap_InvokeProblem_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.InvokeProblem", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_returnResultProblem,
|
|
|
|
{ "returnResultProblem", "tcap.returnResultProblem",
|
|
|
|
FT_INT32, BASE_DEC, VALS(tcap_ReturnResultProblem_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ReturnResultProblem", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_returnErrorProblem,
|
|
|
|
{ "returnErrorProblem", "tcap.returnErrorProblem",
|
|
|
|
FT_INT32, BASE_DEC, VALS(tcap_ReturnErrorProblem_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ReturnErrorProblem", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_localValue,
|
|
|
|
{ "localValue", "tcap.localValue",
|
|
|
|
FT_INT32, BASE_DEC, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.INTEGER", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_globalValue,
|
|
|
|
{ "globalValue", "tcap.globalValue",
|
2005-12-08 23:29:21 +00:00
|
|
|
FT_OID, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.OBJECT_IDENTIFIER", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_identifier,
|
|
|
|
{ "identifier", "tcap.identifier",
|
|
|
|
FT_BYTES, BASE_HEX, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.TransactionID", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_dialoguePortionansi,
|
|
|
|
{ "dialoguePortionansi", "tcap.dialoguePortionansi",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.DialoguePortionANSI", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_componentPortion,
|
|
|
|
{ "componentPortion", "tcap.componentPortion",
|
2005-08-18 21:36:59 +00:00
|
|
|
FT_UINT32, BASE_DEC, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ComponentSequence", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_causeInformation,
|
|
|
|
{ "causeInformation", "tcap.causeInformation",
|
|
|
|
FT_UINT32, BASE_DEC, VALS(tcap_T_causeInformation_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.T_causeInformation", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_abortCause,
|
|
|
|
{ "abortCause", "tcap.abortCause",
|
|
|
|
FT_INT32, BASE_DEC, VALS(tcap_P_Abort_cause_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.P_Abort_cause", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_userInformation,
|
|
|
|
{ "userInformation", "tcap.userInformation",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.UserInformation", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_version,
|
|
|
|
{ "version", "tcap.version",
|
|
|
|
FT_BYTES, BASE_HEX, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ProtocolVersion", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_applicationContext,
|
|
|
|
{ "applicationContext", "tcap.applicationContext",
|
|
|
|
FT_UINT32, BASE_DEC, VALS(tcap_T_applicationContext_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.T_applicationContext", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_integerApplicationId,
|
|
|
|
{ "integerApplicationId", "tcap.integerApplicationId",
|
|
|
|
FT_INT32, BASE_DEC, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.IntegerApplicationContext", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_objectApplicationId,
|
|
|
|
{ "objectApplicationId", "tcap.objectApplicationId",
|
2005-12-08 23:29:21 +00:00
|
|
|
FT_OID, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ObjectIDApplicationContext", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_securityContext,
|
|
|
|
{ "securityContext", "tcap.securityContext",
|
|
|
|
FT_UINT32, BASE_DEC, VALS(tcap_T_securityContext_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.T_securityContext", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_integerSecurityId,
|
|
|
|
{ "integerSecurityId", "tcap.integerSecurityId",
|
|
|
|
FT_INT32, BASE_DEC, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.INTEGER", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_objectSecurityId,
|
|
|
|
{ "objectSecurityId", "tcap.objectSecurityId",
|
2005-12-08 23:29:21 +00:00
|
|
|
FT_OID, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.OBJECT_IDENTIFIER", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_confidentiality,
|
|
|
|
{ "confidentiality", "tcap.confidentiality",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.Confidentiality", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_confidentialityId,
|
|
|
|
{ "confidentialityId", "tcap.confidentialityId",
|
|
|
|
FT_UINT32, BASE_DEC, VALS(tcap_T_confidentialityId_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.T_confidentialityId", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_integerConfidentialityId,
|
|
|
|
{ "integerConfidentialityId", "tcap.integerConfidentialityId",
|
|
|
|
FT_INT32, BASE_DEC, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.INTEGER", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_objectConfidentialityId,
|
|
|
|
{ "objectConfidentialityId", "tcap.objectConfidentialityId",
|
2005-12-08 23:29:21 +00:00
|
|
|
FT_OID, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.OBJECT_IDENTIFIER", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ComponentSequence_item,
|
|
|
|
{ "Item", "tcap.ComponentSequence_item",
|
|
|
|
FT_UINT32, BASE_DEC, VALS(tcap_ComponentPDU_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ComponentPDU", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_invokeLastansi,
|
|
|
|
{ "invokeLastansi", "tcap.invokeLastansi",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.InvokePDU", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_returnResultLastansi,
|
|
|
|
{ "returnResultLastansi", "tcap.returnResultLastansi",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ReturnResultPDU", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_returnErroransi,
|
|
|
|
{ "returnErroransi", "tcap.returnErroransi",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ReturnErrorPDU", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_rejectansi,
|
|
|
|
{ "rejectansi", "tcap.rejectansi",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.RejectPDU", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_invokeNotLastansi,
|
|
|
|
{ "invokeNotLastansi", "tcap.invokeNotLastansi",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.InvokePDU", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_returnResultNotLastansi,
|
|
|
|
{ "returnResultNotLastansi", "tcap.returnResultNotLastansi",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ReturnResultPDU", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_componentIDs,
|
|
|
|
{ "componentIDs", "tcap.componentIDs",
|
|
|
|
FT_BYTES, BASE_HEX, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.OCTET_STRING_SIZE_0_2", HFILL }},
|
2005-06-07 20:29:23 +00:00
|
|
|
{ &hf_tcap_operationCode,
|
|
|
|
{ "operationCode", "tcap.operationCode",
|
|
|
|
FT_UINT32, BASE_DEC, VALS(tcap_OperationCode_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.OperationCode", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_parameterinv,
|
|
|
|
{ "parameterinv", "tcap.parameterinv",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIparamch", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams,
|
|
|
|
{ "ansiparams", "tcap.ansiparams",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams1,
|
|
|
|
{ "ansiparams1", "tcap.ansiparams1",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams2,
|
|
|
|
{ "ansiparams2", "tcap.ansiparams2",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams3,
|
|
|
|
{ "ansiparams3", "tcap.ansiparams3",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams4,
|
|
|
|
{ "ansiparams4", "tcap.ansiparams4",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams5,
|
|
|
|
{ "ansiparams5", "tcap.ansiparams5",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams6,
|
|
|
|
{ "ansiparams6", "tcap.ansiparams6",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams7,
|
|
|
|
{ "ansiparams7", "tcap.ansiparams7",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams8,
|
|
|
|
{ "ansiparams8", "tcap.ansiparams8",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams9,
|
|
|
|
{ "ansiparams9", "tcap.ansiparams9",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams10,
|
|
|
|
{ "ansiparams10", "tcap.ansiparams10",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams11,
|
|
|
|
{ "ansiparams11", "tcap.ansiparams11",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams12,
|
|
|
|
{ "ansiparams12", "tcap.ansiparams12",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams13,
|
|
|
|
{ "ansiparams13", "tcap.ansiparams13",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams14,
|
|
|
|
{ "ansiparams14", "tcap.ansiparams14",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams15,
|
|
|
|
{ "ansiparams15", "tcap.ansiparams15",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams16,
|
|
|
|
{ "ansiparams16", "tcap.ansiparams16",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams17,
|
|
|
|
{ "ansiparams17", "tcap.ansiparams17",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams18,
|
|
|
|
{ "ansiparams18", "tcap.ansiparams18",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams19,
|
|
|
|
{ "ansiparams19", "tcap.ansiparams19",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams20,
|
|
|
|
{ "ansiparams20", "tcap.ansiparams20",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_ansiparams21,
|
|
|
|
{ "ansiparams21", "tcap.ansiparams21",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIParameters", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_componentID,
|
|
|
|
{ "componentID", "tcap.componentID",
|
|
|
|
FT_BYTES, BASE_HEX, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ComponentID", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_parameterrr,
|
|
|
|
{ "parameterrr", "tcap.parameterrr",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIparamch", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_parameterre,
|
|
|
|
{ "parameterre", "tcap.parameterre",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIparamch", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_rejectProblem,
|
|
|
|
{ "rejectProblem", "tcap.rejectProblem",
|
|
|
|
FT_INT32, BASE_DEC, VALS(tcap_ProblemPDU_vals), 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ProblemPDU", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_parameterrj,
|
|
|
|
{ "parameterrj", "tcap.parameterrj",
|
|
|
|
FT_NONE, BASE_NONE, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.ANSIparamch", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_national,
|
|
|
|
{ "national", "tcap.national",
|
2005-11-26 03:09:40 +00:00
|
|
|
FT_INT32, BASE_DEC, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.INTEGER_M32768_32767", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_private,
|
|
|
|
{ "private", "tcap.private",
|
|
|
|
FT_INT32, BASE_DEC, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.INTEGER", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_nationaler,
|
|
|
|
{ "nationaler", "tcap.nationaler",
|
2005-11-26 03:09:40 +00:00
|
|
|
FT_INT32, BASE_DEC, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.INTEGER_M32768_32767", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_privateer,
|
|
|
|
{ "privateer", "tcap.privateer",
|
|
|
|
FT_INT32, BASE_DEC, NULL, 0,
|
2006-08-16 05:58:39 +00:00
|
|
|
"tcap.INTEGER", HFILL }},
|
2005-06-07 05:49:06 +00:00
|
|
|
{ &hf_tcap_T_protocol_versionrq_version1,
|
|
|
|
{ "version1", "tcap.version1",
|
|
|
|
FT_BOOLEAN, 8, NULL, 0x80,
|
|
|
|
"", HFILL }},
|
|
|
|
{ &hf_tcap_T_protocol_versionre_version1,
|
|
|
|
{ "version1", "tcap.version1",
|
|
|
|
FT_BOOLEAN, 8, NULL, 0x80,
|
|
|
|
"", HFILL }},
|
|
|
|
{ &hf_tcap_T_protocol_version3_version1,
|
|
|
|
{ "version1", "tcap.version1",
|
|
|
|
FT_BOOLEAN, 8, NULL, 0x80,
|
|
|
|
"", HFILL }},
|
|
|
|
|
|
|
|
/*--- End of included file: packet-tcap-hfarr.c ---*/
|
2006-10-03 19:24:22 +00:00
|
|
|
#line 297 "packet-tcap-template.c"
|
2003-10-16 18:15:54 +00:00
|
|
|
};
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
/* Setup protocol subtree array */
|
2003-10-16 18:15:54 +00:00
|
|
|
static gint *ett[] = {
|
|
|
|
&ett_tcap,
|
|
|
|
&ett_param,
|
2005-08-18 21:36:59 +00:00
|
|
|
&ett_otid,
|
|
|
|
&ett_dtid,
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
&ett_tcap_stat,
|
2005-06-07 05:49:06 +00:00
|
|
|
|
|
|
|
/*--- Included file: packet-tcap-ettarr.c ---*/
|
2005-12-08 23:29:21 +00:00
|
|
|
#line 1 "packet-tcap-ettarr.c"
|
2005-06-07 05:49:06 +00:00
|
|
|
&ett_tcap_DialoguePDU,
|
|
|
|
&ett_tcap_ExternalPDU,
|
|
|
|
&ett_tcap_UserInformation,
|
|
|
|
&ett_tcap_AARQ_apdu,
|
|
|
|
&ett_tcap_T_protocol_versionrq,
|
|
|
|
&ett_tcap_AARE_apdu,
|
|
|
|
&ett_tcap_T_protocol_versionre,
|
|
|
|
&ett_tcap_RLRQ_apdu,
|
|
|
|
&ett_tcap_RLRE_apdu,
|
|
|
|
&ett_tcap_ABRT_apdu,
|
|
|
|
&ett_tcap_Associate_source_diagnostic,
|
|
|
|
&ett_tcap_UniDialoguePDU,
|
|
|
|
&ett_tcap_AUDT_apdu,
|
|
|
|
&ett_tcap_T_protocol_version3,
|
|
|
|
&ett_tcap_MessageType,
|
|
|
|
&ett_tcap_Unidirectional,
|
|
|
|
&ett_tcap_Begin,
|
|
|
|
&ett_tcap_End,
|
|
|
|
&ett_tcap_Continue,
|
|
|
|
&ett_tcap_Abort,
|
|
|
|
&ett_tcap_Reason,
|
|
|
|
&ett_tcap_ComponentPortion,
|
|
|
|
&ett_tcap_Component,
|
|
|
|
&ett_tcap_Invoke,
|
|
|
|
&ett_tcap_ReturnResult,
|
|
|
|
&ett_tcap_T_resultretres,
|
|
|
|
&ett_tcap_ReturnError,
|
|
|
|
&ett_tcap_Reject,
|
|
|
|
&ett_tcap_T_invokeIDRej,
|
|
|
|
&ett_tcap_T_problem,
|
|
|
|
&ett_tcap_OPERATION,
|
|
|
|
&ett_tcap_ERROR,
|
|
|
|
&ett_tcap_UniTransactionPDU,
|
|
|
|
&ett_tcap_TransactionPDU,
|
|
|
|
&ett_tcap_AbortPDU,
|
|
|
|
&ett_tcap_T_causeInformation,
|
|
|
|
&ett_tcap_DialoguePortionANSI,
|
|
|
|
&ett_tcap_T_applicationContext,
|
|
|
|
&ett_tcap_T_securityContext,
|
|
|
|
&ett_tcap_Confidentiality,
|
|
|
|
&ett_tcap_T_confidentialityId,
|
|
|
|
&ett_tcap_ComponentSequence,
|
|
|
|
&ett_tcap_ComponentPDU,
|
|
|
|
&ett_tcap_InvokePDU,
|
|
|
|
&ett_tcap_ANSIparamch,
|
|
|
|
&ett_tcap_ReturnResultPDU,
|
|
|
|
&ett_tcap_ReturnErrorPDU,
|
|
|
|
&ett_tcap_RejectPDU,
|
|
|
|
&ett_tcap_OperationCode,
|
|
|
|
&ett_tcap_ErrorCode,
|
|
|
|
|
|
|
|
/*--- End of included file: packet-tcap-ettarr.c ---*/
|
2006-10-03 19:24:22 +00:00
|
|
|
#line 307 "packet-tcap-template.c"
|
2003-10-16 18:15:54 +00:00
|
|
|
};
|
|
|
|
|
2005-06-07 05:49:06 +00:00
|
|
|
/*static enum_val_t tcap_options[] = {
|
2004-05-24 02:25:21 +00:00
|
|
|
{ "itu", "ITU", ITU_TCAP_STANDARD },
|
|
|
|
{ "ansi", "ANSI", ANSI_TCAP_STANDARD },
|
|
|
|
{ NULL, NULL, 0 }
|
2005-06-07 05:49:06 +00:00
|
|
|
};*/
|
2003-10-16 18:15:54 +00:00
|
|
|
|
|
|
|
module_t *tcap_module;
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
/* Register the protocol name and description */
|
2005-06-07 05:49:06 +00:00
|
|
|
proto_tcap = proto_register_protocol(PNAME, PSNAME, PFNAME);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
|
|
|
/* Required function calls to register the header fields and subtrees used */
|
2003-10-16 18:15:54 +00:00
|
|
|
proto_register_field_array(proto_tcap, hf, array_length(hf));
|
|
|
|
proto_register_subtree_array(ett, array_length(ett));
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2004-10-14 23:45:09 +00:00
|
|
|
tcap_module = prefs_register_protocol(proto_tcap, proto_reg_handoff_tcap);
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-16 07:46:03 +00:00
|
|
|
#if 0
|
|
|
|
prefs_register_enum_preference(tcap_module, "standard", "ITU TCAP standard",
|
2005-06-07 05:49:06 +00:00
|
|
|
"The SS7 standard used in ITU TCAP packets",
|
2005-06-16 07:46:03 +00:00
|
|
|
&tcap_standard, tcap_options, FALSE);
|
|
|
|
#else
|
|
|
|
prefs_register_obsolete_preference(tcap_module, "standard");
|
|
|
|
#endif
|
2003-10-02 06:13:29 +00:00
|
|
|
|
2005-06-16 07:46:03 +00:00
|
|
|
#if 0
|
|
|
|
prefs_register_bool_preference(tcap_module, "lock_info_col", "Lock Info column",
|
2003-10-16 18:15:54 +00:00
|
|
|
"Always show TCAP in Info column",
|
|
|
|
&lock_info_col);
|
2005-06-16 07:46:03 +00:00
|
|
|
#else
|
|
|
|
prefs_register_obsolete_preference(tcap_module, "lock_info_col");
|
|
|
|
#endif
|
|
|
|
|
2004-10-14 23:45:09 +00:00
|
|
|
/* Set default SSNs */
|
2005-12-17 16:55:45 +00:00
|
|
|
range_convert_str(&global_ssn_range, "", MAX_SSN);
|
2004-10-16 23:32:24 +00:00
|
|
|
ssn_range = range_empty();
|
2004-10-14 23:45:09 +00:00
|
|
|
|
|
|
|
prefs_register_range_preference(tcap_module, "ssn", "SCCP SSNs",
|
|
|
|
"SCCP (and SUA) SSNs to decode as TCAP",
|
|
|
|
&global_ssn_range, MAX_SSN);
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
|
|
|
|
prefs_register_bool_preference(tcap_module, "srt",
|
|
|
|
"Service Response Time Analyse",
|
|
|
|
"Activate the analyse for Response Time",
|
|
|
|
>cap_HandleSRT);
|
|
|
|
|
|
|
|
prefs_register_bool_preference(tcap_module, "persistentsrt",
|
|
|
|
"Persistent stats for SRT",
|
|
|
|
"Statistics for Response Time",
|
|
|
|
>cap_PersistentSRT);
|
|
|
|
|
|
|
|
prefs_register_uint_preference(tcap_module, "repetitiontimeout",
|
|
|
|
"Repetition timeout",
|
|
|
|
"Maximal delay for message repetion",
|
|
|
|
10, >cap_RepetitionTimeout);
|
|
|
|
|
|
|
|
prefs_register_uint_preference(tcap_module, "losttimeout",
|
|
|
|
"lost timeout",
|
|
|
|
"Maximal delay for message lost",
|
|
|
|
10, >cap_LostTimeout);
|
2005-12-17 16:55:45 +00:00
|
|
|
|
|
|
|
ansi_sub_dissectors = g_hash_table_new(g_direct_hash,g_direct_equal);
|
|
|
|
itu_sub_dissectors = g_hash_table_new(g_direct_hash,g_direct_equal);
|
2005-06-23 22:17:03 +00:00
|
|
|
|
|
|
|
/* 'globally' register dissector */
|
|
|
|
register_dissector("tcap", dissect_tcap, proto_tcap);
|
|
|
|
|
2005-12-17 16:55:45 +00:00
|
|
|
tcap_handle = create_dissector_handle(dissect_tcap, proto_tcap);
|
2005-06-07 05:49:06 +00:00
|
|
|
|
2005-12-17 16:55:45 +00:00
|
|
|
register_init_routine(&init_tcap);
|
|
|
|
}
|
2005-06-07 05:49:06 +00:00
|
|
|
|
2004-10-15 05:54:33 +00:00
|
|
|
|
|
|
|
static void range_delete_callback(guint32 ssn)
|
|
|
|
{
|
2005-12-17 16:55:45 +00:00
|
|
|
if ( ssn && !get_ansi_tcap_subdissector(ssn) && !get_itu_tcap_subdissector(ssn) ) {
|
|
|
|
dissector_delete("sccp.ssn", ssn, tcap_handle);
|
2004-10-15 05:54:33 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void range_add_callback(guint32 ssn)
|
|
|
|
{
|
2005-12-17 16:55:45 +00:00
|
|
|
if (ssn && !get_ansi_tcap_subdissector(ssn) && !get_itu_tcap_subdissector(ssn) ) {
|
|
|
|
dissector_add("sccp.ssn", ssn, tcap_handle);
|
2004-10-15 05:54:33 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-10-14 23:45:09 +00:00
|
|
|
|
2005-12-17 16:55:45 +00:00
|
|
|
static void init_tcap(void) {
|
|
|
|
if (ssn_range) {
|
|
|
|
range_foreach(ssn_range, range_delete_callback);
|
|
|
|
g_free(ssn_range);
|
2004-10-14 23:45:09 +00:00
|
|
|
}
|
2005-12-17 16:55:45 +00:00
|
|
|
|
2004-10-17 00:48:37 +00:00
|
|
|
ssn_range = range_copy(global_ssn_range);
|
2004-10-16 23:32:24 +00:00
|
|
|
range_foreach(ssn_range, range_add_callback);
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
tcapsrt_init_routine();
|
2003-10-02 06:13:29 +00:00
|
|
|
}
|
2005-06-07 05:49:06 +00:00
|
|
|
|
|
|
|
static int
|
|
|
|
dissect_tcap_param(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset)
|
|
|
|
{
|
2005-06-16 07:46:03 +00:00
|
|
|
gint tag_offset, saved_offset, len_offset;
|
2005-06-07 05:49:06 +00:00
|
|
|
tvbuff_t *next_tvb;
|
|
|
|
proto_tree *subtree;
|
2005-06-16 07:46:03 +00:00
|
|
|
proto_item *pi;
|
2005-07-12 01:01:19 +00:00
|
|
|
gint8 class;
|
2005-06-16 07:46:03 +00:00
|
|
|
gboolean pc;
|
2005-07-12 01:01:19 +00:00
|
|
|
gint32 tag;
|
2005-06-16 07:46:03 +00:00
|
|
|
guint32 len;
|
2005-07-12 01:01:19 +00:00
|
|
|
gboolean ind_field;
|
2005-06-16 07:46:03 +00:00
|
|
|
|
|
|
|
while (tvb_reported_length_remaining(tvb, offset) > 0)
|
2005-06-07 05:49:06 +00:00
|
|
|
{
|
2005-06-16 07:46:03 +00:00
|
|
|
saved_offset = offset;
|
|
|
|
|
|
|
|
offset = get_ber_identifier(tvb, offset, &class, &pc, &tag);
|
|
|
|
tag_offset = offset;
|
2005-06-07 05:49:06 +00:00
|
|
|
offset = get_ber_length(tree, tvb, offset, &len, &ind_field);
|
|
|
|
len_offset = offset;
|
|
|
|
|
|
|
|
if (pc)
|
|
|
|
{
|
|
|
|
pi =
|
2005-06-08 18:52:34 +00:00
|
|
|
proto_tree_add_text(tree, tvb, saved_offset, len + (len_offset - saved_offset), "CONSTRUCTOR");
|
2005-06-07 05:49:06 +00:00
|
|
|
subtree = proto_item_add_subtree(pi, ett_param);
|
|
|
|
proto_tree_add_uint_format(subtree, hf_tcap_tag, tvb,
|
|
|
|
saved_offset, tag_offset-saved_offset, tag, "CONSTRUCTOR Tag");
|
|
|
|
proto_tree_add_uint(subtree, hf_tcap_tag, tvb,
|
|
|
|
saved_offset, tag_offset-saved_offset, class);
|
|
|
|
|
2005-06-16 07:46:03 +00:00
|
|
|
proto_tree_add_uint(subtree, hf_tcap_length, tvb,
|
|
|
|
tag_offset, len_offset-tag_offset, len);
|
2005-08-18 21:36:59 +00:00
|
|
|
if (len-(2*ind_field)) /*should always be positive unless we get an empty contructor pointless? */
|
|
|
|
{
|
|
|
|
next_tvb = tvb_new_subset(tvb, offset, len-(2*ind_field), len-(2*ind_field));
|
|
|
|
dissect_tcap_param(pinfo, subtree,next_tvb,0);
|
|
|
|
}
|
|
|
|
if (ind_field)
|
|
|
|
proto_tree_add_text(subtree, tvb, offset+len-2, 2, "CONSTRUCTOR EOC");
|
2005-06-16 07:46:03 +00:00
|
|
|
offset += len;
|
2005-06-07 05:49:06 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2005-06-16 07:46:03 +00:00
|
|
|
pi = proto_tree_add_text(tree, tvb,
|
2005-06-08 18:52:34 +00:00
|
|
|
saved_offset, len + (len_offset - saved_offset), "Parameter (0x%.2x)", tag);
|
2005-06-07 05:49:06 +00:00
|
|
|
|
2005-06-16 07:46:03 +00:00
|
|
|
subtree = proto_item_add_subtree(pi, ett_param);
|
2005-06-07 05:49:06 +00:00
|
|
|
|
2005-06-16 07:46:03 +00:00
|
|
|
proto_tree_add_uint(subtree, hf_tcap_tag, tvb,
|
|
|
|
saved_offset, 1, tag);
|
2005-06-07 05:49:06 +00:00
|
|
|
|
2005-06-16 07:46:03 +00:00
|
|
|
proto_tree_add_uint(subtree, hf_tcap_length, tvb,
|
|
|
|
saved_offset+1, 1, len);
|
2005-08-18 21:36:59 +00:00
|
|
|
if (len) /* check for NULLS */
|
|
|
|
{
|
|
|
|
next_tvb = tvb_new_subset(tvb, offset, len, len);
|
|
|
|
dissect_ber_octet_string(TRUE, pinfo, tree, next_tvb, 0, hf_tcap_data,
|
|
|
|
NULL);
|
|
|
|
}
|
2005-06-16 07:46:03 +00:00
|
|
|
offset += len;
|
2005-06-07 05:49:06 +00:00
|
|
|
}
|
|
|
|
}
|
2005-06-16 07:46:03 +00:00
|
|
|
return offset;
|
|
|
|
}
|
From Florent Drouin:
Here are some patches and a new module to introduce the notion of Tcap context for a Tcap transaction. For each Tcap transaction, several parameters, like session identifier, start time or OID, will be saved in a hash table, to keep these informations available for the next messages. This context is then given to the upper layer, and can be used, for example, to generate transaction-associated statistics.
Moreover, the Upper protocol, detected in the Begin of the TCAP transaction ( according to the OID ), is saved in the context, and will be reused for the next messages of the transaction. This help the decoding of SS7 messages, without any SSN configuration in the "wireshark preferences".
You will have too, the possibility to apply a filter to see only the messages related to a TCAP transaction. (tcap.srt.session_id=XXX)
To enable the use of the Tcap context, you have 2 new parameters in the preferences,
- SRT, enable search for a Tcap context for any TCAP messages
- persistentSRT, keep the Tcap context, even after the transaction has been closed. This is mandatory with Wireshark, to have a clean display of the stats.
There is 2 new timers in the preferences for the statistics, to tune the retransmission timeout, and messages lost timeout.
svn path=/trunk/; revision=19341
2006-09-27 20:06:06 +00:00
|
|
|
|
|
|
|
static void raz_tcap_private(struct tcap_private_t * p_tcap_private)
|
|
|
|
{
|
|
|
|
memset(p_tcap_private,0,sizeof(struct tcap_private_t) );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
dissect_tcap_TheComponent(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_)
|
|
|
|
{
|
|
|
|
tvbuff_t * next_tvb;
|
|
|
|
dissector_handle_t subdissector_handle;
|
|
|
|
gboolean is_subdissector=FALSE;
|
|
|
|
struct tcaphash_context_t * p_tcap_context=NULL;
|
|
|
|
|
|
|
|
gint8 class;
|
|
|
|
gboolean pc;
|
|
|
|
gint tag;
|
|
|
|
guint32 len, s_offset;
|
|
|
|
gint ind_field;
|
|
|
|
proto_tree * stat_tree=NULL;
|
|
|
|
proto_item * stat_item=NULL;
|
|
|
|
/*
|
|
|
|
* ok lets look at the oid and ssn and try and find a dissector, otherwise lets decode it.
|
|
|
|
*/
|
|
|
|
ber_oid_dissector_table = find_dissector_table("ber.oid");
|
|
|
|
s_offset = offset;
|
|
|
|
offset = get_ber_identifier(tvb, offset, &class, &pc, &tag);
|
|
|
|
offset = get_ber_length(tree, tvb, offset, &len, &ind_field);
|
|
|
|
/* we can believe the length now */
|
|
|
|
next_tvb = tvb_new_subset(tvb, s_offset, len+(offset-s_offset), len+(offset-s_offset));
|
|
|
|
if (!next_tvb)
|
|
|
|
return offset+len;
|
|
|
|
|
|
|
|
dissect_ber_choice(pinfo, tree, next_tvb, 0,
|
|
|
|
Component_choice, hf_index, ett_tcap_Component,NULL);
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Handle The TCAP Service Response Time
|
|
|
|
*/
|
|
|
|
if ( gtcap_HandleSRT ) {
|
|
|
|
if (!tcap_subdissector_used) {
|
|
|
|
/* Create TCAP context and tree for display */
|
|
|
|
if (gtcap_DisplaySRT && tree) {
|
|
|
|
stat_item = proto_tree_add_text(tcap_stat_tree, tvb, offset, -1, "Stat");
|
|
|
|
stat_tree = proto_item_add_subtree(stat_item, ett_tcap_stat);
|
|
|
|
}
|
|
|
|
p_tcap_context=tcapsrt_call_matching(tvb, pinfo, stat_tree, gp_tcapsrt_info);
|
|
|
|
tcap_subdissector_used=TRUE;
|
|
|
|
gp_tcap_context=p_tcap_context;
|
|
|
|
tcap_private.context=p_tcap_context;
|
|
|
|
} else {
|
|
|
|
/* Take the last TCAP context */
|
|
|
|
p_tcap_context = gp_tcap_context;
|
|
|
|
tcap_private.context=p_tcap_context;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (p_tcap_context) {
|
|
|
|
if (cur_oid) {
|
|
|
|
if (p_tcap_context->oid_present) {
|
|
|
|
/* We have already an Application Context, check if we have
|
|
|
|
to fallback to a lower version */
|
|
|
|
if ( strncmp(p_tcap_context->oid,cur_oid, LENGTH_OID)!=0) {
|
|
|
|
/* ACN, changed, Fallback to lower version */
|
|
|
|
/* and update the subdissector (purely formal) */
|
|
|
|
strncpy(p_tcap_context->oid,cur_oid, LENGTH_OID);
|
|
|
|
if ( (subdissector_handle
|
|
|
|
= dissector_get_string_handle(ber_oid_dissector_table, cur_oid)) ) {
|
|
|
|
p_tcap_context->subdissector_handle=subdissector_handle;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
/* We do not have the OID in the TCAP context, so store it */
|
|
|
|
strncpy(p_tcap_context->oid,cur_oid, LENGTH_OID);
|
|
|
|
if ( (subdissector_handle
|
|
|
|
= dissector_get_string_handle(ber_oid_dissector_table, cur_oid)) ) {
|
|
|
|
p_tcap_context->subdissector_handle=subdissector_handle;
|
|
|
|
p_tcap_context->oid_present=TRUE;
|
|
|
|
}
|
|
|
|
} /* context OID */
|
|
|
|
} else {
|
|
|
|
/* Copy the OID from the TCAP context to the current oid */
|
|
|
|
if (p_tcap_context->oid_present) {
|
|
|
|
tcap_private.oid= (void*) p_tcap_context->oid;
|
|
|
|
tcap_private.acv=TRUE;
|
|
|
|
}
|
|
|
|
} /* no OID */
|
|
|
|
} /* no TCAP context */
|
|
|
|
|
|
|
|
if ( p_tcap_context
|
|
|
|
&& p_tcap_context->oid_present) {
|
|
|
|
/* Take the subdissector from the context */
|
|
|
|
subdissector_handle=p_tcap_context->subdissector_handle;
|
|
|
|
is_subdissector=TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!is_subdissector) {
|
|
|
|
/*
|
|
|
|
* If we do not currently know the subdissector, we have to find it
|
|
|
|
* - first, according to the OID
|
|
|
|
* - then according to the SSN
|
|
|
|
* - and at least, take the default Data handler
|
|
|
|
*/
|
|
|
|
if (ber_oid_dissector_table && cur_oid) {
|
|
|
|
/* Search if we can find the sub protocol according to the A.C.N */
|
|
|
|
if ( (subdissector_handle
|
|
|
|
= dissector_get_string_handle(ber_oid_dissector_table, cur_oid)) ) {
|
|
|
|
/* found */
|
|
|
|
is_subdissector=TRUE;
|
|
|
|
} else {
|
|
|
|
/* Search if we can found the sub protocol according to the SSN table */
|
|
|
|
if ( (subdissector_handle
|
|
|
|
= get_itu_tcap_subdissector(pinfo->match_port))) {
|
|
|
|
/* Found according to SSN */
|
|
|
|
is_subdissector=TRUE;
|
|
|
|
} else {
|
|
|
|
/* Nothing found, take the Data handler */
|
|
|
|
subdissector_handle = data_handle;
|
|
|
|
is_subdissector=TRUE;
|
|
|
|
} /* SSN */
|
|
|
|
} /* ACN */
|
|
|
|
} else {
|
|
|
|
/* There is no A.C.N for this transaction, so search in the SSN table */
|
|
|
|
if ( (subdissector_handle = get_itu_tcap_subdissector(pinfo->match_port))) {
|
|
|
|
/* Found according to SSN */
|
|
|
|
is_subdissector=TRUE;
|
|
|
|
} else {
|
|
|
|
subdissector_handle = data_handle;
|
|
|
|
is_subdissector=TRUE;
|
|
|
|
}
|
|
|
|
} /* OID */
|
|
|
|
} else {
|
|
|
|
/* We have it already */
|
|
|
|
}
|
|
|
|
/* Call the sub dissector if present, and not already called */
|
|
|
|
if (is_subdissector)
|
|
|
|
call_dissector(subdissector_handle, next_tvb, pinfo, tcap_top_tree);
|
|
|
|
|
|
|
|
return offset+len;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
dissect_tcap_TheExternUserInfo(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int hf_index _U_)
|
|
|
|
{
|
|
|
|
tvbuff_t *next_tvb;
|
|
|
|
gint8 class;
|
|
|
|
gboolean pc;
|
|
|
|
gint tag;
|
|
|
|
guint32 len, start_offset;
|
|
|
|
gint ind_field;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* ok lets look at the oid and ssn and try and find a dissector, otherwise lets decode it.
|
|
|
|
*/
|
|
|
|
ber_oid_dissector_table = find_dissector_table("ber.oid");
|
|
|
|
start_offset = offset;
|
|
|
|
offset = get_ber_identifier(tvb, offset, &class, &pc, &tag);
|
|
|
|
offset = get_ber_length(tree, tvb, offset, &len, &ind_field);
|
|
|
|
|
|
|
|
next_tvb = tvb_new_subset(tvb, start_offset, len +(offset - start_offset), len+(offset - start_offset));
|
|
|
|
if (!next_tvb)
|
|
|
|
return offset+len;
|
|
|
|
|
|
|
|
if (ber_oid_dissector_table && tcapext_oid){
|
|
|
|
if(!dissector_try_string(ber_oid_dissector_table, tcapext_oid, next_tvb, pinfo, tcap_top_tree))
|
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dissect_tcap_param(pinfo,tree,next_tvb,0);
|
|
|
|
offset+=len;
|
|
|
|
|
|
|
|
return offset;
|
|
|
|
}
|