diff options
author | sahlberg <sahlberg@f5534014-38df-0310-8fa8-9805f1628bb7> | 2005-06-19 11:51:23 +0000 |
---|---|---|
committer | sahlberg <sahlberg@f5534014-38df-0310-8fa8-9805f1628bb7> | 2005-06-19 11:51:23 +0000 |
commit | 002202be368d26aec9376f5c9ecb103f27302b64 (patch) | |
tree | 5a3e9c063958dddfd338661b47b3a77c131f73c4 /asn1 | |
parent | 988f27d8f7e5ade456c3c54493b17a60d02cd7f2 (diff) |
New autogenerated ACSE dissector.
There is a bug in ASN2ETH which means one can not do make copy_files
instead one needs to change two bugs in the generated code manually.
These two changes are in the comment at the top of the template/generated file
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@14698 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'asn1')
-rw-r--r-- | asn1/acse/Makefile | 19 | ||||
-rw-r--r-- | asn1/acse/Makefile.nmake | 42 | ||||
-rw-r--r-- | asn1/acse/acse.asn | 425 | ||||
-rw-r--r-- | asn1/acse/acse.cnf | 60 | ||||
-rw-r--r-- | asn1/acse/packet-acse-template.c | 311 | ||||
-rw-r--r-- | asn1/acse/packet-acse-template.h | 32 |
6 files changed, 889 insertions, 0 deletions
diff --git a/asn1/acse/Makefile b/asn1/acse/Makefile new file mode 100644 index 0000000000..af24ddd4d7 --- /dev/null +++ b/asn1/acse/Makefile @@ -0,0 +1,19 @@ +# $Id: Makefile 13071 2005-01-16 10:19:21Z guy $ + +DISSECTOR_FILES=packet-acse.c packet-acse.h + +all: generate_dissector + +generate_dissector: $(DISSECTOR_FILES) + +$(DISSECTOR_FILES): ../../tools/asn2eth.py acse.asn packet-acse-template.c packet-acse-template.h acse.cnf + python ../../tools/asn2eth.py -X -b -e -p acse -c acse.cnf -s packet-acse-template acse.asn + +clean: + rm -f parsetab.py $(DISSECTOR_FILES) + +copy_files: generate_dissector +# cp $(DISSECTOR_FILES) ../../epan/dissectors + echo "Dont use this dissector yet, there are two bugs in it you will" + echo "have to fix manually first. See packet-acse.c comment at top " + diff --git a/asn1/acse/Makefile.nmake b/asn1/acse/Makefile.nmake new file mode 100644 index 0000000000..eb2104bd5f --- /dev/null +++ b/asn1/acse/Makefile.nmake @@ -0,0 +1,42 @@ +## Use: $(MAKE) /$(MAKEFLAGS) -f makefile.nmake +# +# $Id: Makefile.nmake 13077 2005-01-16 23:26:02Z lroland $ + +include ../../config.nmake + +UNIX2DOS=$(PERL) ../../tools/unix2dos.pl + +PROTOCOL_NAME=acse +DISSECTOR_FILES=packet-$(PROTOCOL_NAME).c packet-$(PROTOCOL_NAME).h + +all: generate_dissector + +generate_dissector: $(DISSECTOR_FILES) + +$(DISSECTOR_FILES): ../../tools/asn2eth.py acse.asn packet-$(PROTOCOL_NAME)-template.c packet-$(PROTOCOL_NAME)-template.h $(PROTOCOL_NAME).cnf +!IFDEF PYTHON + $(PYTHON) ../../tools/asn2eth.py -X -b -e -p $(PROTOCOL_NAME) -c $(PROTOCOL_NAME).cnf -s packet-$(PROTOCOL_NAME)-template acse.asn +!ELSE + @echo Error: You need Python to use asn2eth.py + @exit 1 +!ENDIF + +clean: + rm -f parsetab.py $(DISSECTOR_FILES) + +# Fix EOL in generated dissectors. Cygwin's python generates files with +# mixed EOL styles, which can't be commited to the SVN repository. +# Stuff included from template and "cnf" files has "\r\n" on windows, while +# the generated stuff has "\n". + +fix_eol: generate_dissector + move packet-$(PROTOCOL_NAME).c packet-$(PROTOCOL_NAME).c.tmp + move packet-$(PROTOCOL_NAME).h packet-$(PROTOCOL_NAME).h.tmp + $(UNIX2DOS) < packet-$(PROTOCOL_NAME).c.tmp > packet-$(PROTOCOL_NAME).c + $(UNIX2DOS) < packet-$(PROTOCOL_NAME).h.tmp > packet-$(PROTOCOL_NAME).h + del /f packet-$(PROTOCOL_NAME).c.tmp packet-$(PROTOCOL_NAME).h.tmp + +copy_files: generate_dissector fix_eol + xcopy packet-$(PROTOCOL_NAME).c ..\..\epan\dissectors /d /y + xcopy packet-$(PROTOCOL_NAME).h ..\..\epan\dissectors /d /y + diff --git a/asn1/acse/acse.asn b/asn1/acse/acse.asn new file mode 100644 index 0000000000..ab2cbe6388 --- /dev/null +++ b/asn1/acse/acse.asn @@ -0,0 +1,425 @@ +-- ACSE definition from +-- http://www.itu.int/ITU-T/asn1/database/itu-t/x/x227bis/1998/ACSE-1.html +-- and modified to pass through ASN2ETH +-- +-- +-- Module ACSE-1 (X.227bis:09/1998) +ACSE-1 {joint-iso-itu-t association-control(2) modules(0) acse1(1) version1(1)} +-- ACSE-1 refers to ACSE version 1 +DEFINITIONS ::= +BEGIN + +IMPORTS + Name, RelativeDistinguishedName + FROM InformationFramework {joint-iso-itu-t ds(5) module(1) + informationFramework(1) 3}; + +-- The data types Name and RelativeDistinguishedName are imported from +-- ITU-T Rec. X.501 | ISO/IEC 9594-2. + + + +EXTERNAL ::= [UNIVERSAL 8] IMPLICIT SEQUENCE + { + direct-reference OBJECT IDENTIFIER OPTIONAL, + indirect-reference INTEGER OPTIONAL, + data-value-descriptor ObjectDescriptor OPTIONAL, + encoding CHOICE + {single-ASN1-type [0] ANY, + octet-aligned [1] IMPLICIT OCTET STRING, + arbitrary [2] IMPLICIT BIT STRING} + } + +-- object identifier assignments +acse-as-id OBJECT IDENTIFIER ::= + {joint-iso-itu-t association-control(2) abstract-syntax(1) apdus(0) + version1(1)} + +-- may be used to reference the abstract syntax of the ACSE APDUs. +aCSE-id OBJECT IDENTIFIER ::= + {joint-iso-itu-t association-control(2) ase-id(3) acse-ase(1) version(1)} + +-- may be used to identify the Association Control ASE. +-- top level CHOICE +ACSE-apdu ::= CHOICE { +--ASN2ETH bug +-- aarq AARQ-apdu, + aarq [APPLICATION 0] IMPLICIT AARQ-apdu, +--ASN2ETH bug +-- aare AARE-apdu, + aare [APPLICATION 1] IMPLICIT AARE-apdu, +--ASN2ETH bug +-- rlrq RLRQ-apdu, + rlrq [APPLICATION 2] IMPLICIT RLRQ-apdu, +--ASN2ETH bug +-- rlre RLRE-apdu, + rlre [APPLICATION 3] IMPLICIT RLRE-apdu, +--ASN2ETH bug +-- abrt ABRT-apdu, + abrt [APPLICATION 4] IMPLICIT ABRT-apdu, + ..., + -- Extensions for higher level association FU +--ASN2ETH bug +-- adt A-DT-apdu, + adt [APPLICATION 5] IMPLICIT A-DT-apdu, +--ASN2ETH bug +-- acrq ACRQ-apdu, + acrq [APPLICATION 6] IMPLICIT ACRQ-apdu, +--ASN2ETH bug +-- acrp ACRP-apdu + acrp [APPLICATION 7] IMPLICIT ACRP-apdu +} + +AARQ-apdu ::= [APPLICATION 0] IMPLICIT SEQUENCE { + protocol-version + [0] IMPLICIT BIT STRING {version1(0)} DEFAULT {version1}, + aSO-context-name [1] ASO-context-name, + called-AP-title [2] AP-title OPTIONAL, + called-AE-qualifier [3] AE-qualifier OPTIONAL, + called-AP-invocation-identifier [4] AP-invocation-identifier OPTIONAL, + called-AE-invocation-identifier [5] AE-invocation-identifier OPTIONAL, + calling-AP-title [6] AP-title OPTIONAL, + calling-AE-qualifier [7] AE-qualifier OPTIONAL, + calling-AP-invocation-identifier [8] AP-invocation-identifier OPTIONAL, + calling-AE-invocation-identifier [9] AE-invocation-identifier OPTIONAL, + -- The following field shall not be present if only the Kernel is used. + sender-acse-requirements [10] IMPLICIT ACSE-requirements OPTIONAL, + -- The following field shall only be present if the Authentication functional unit is selected. + mechanism-name [11] IMPLICIT Mechanism-name OPTIONAL, + -- The following field shall only be present if the Authentication functional unit is selected. + calling-authentication-value [12] EXPLICIT Authentication-value OPTIONAL, + aSO-context-name-list + [13] IMPLICIT ASO-context-name-list OPTIONAL, + -- The above field shall only be present if the Application Context Negotiation functional unit is selected. + implementation-information [29] IMPLICIT Implementation-data OPTIONAL, + ..., + -- Extensions for higher level association FU + p-context-definition-list [14] Syntactic-context-list OPTIONAL, + called-asoi-tag [15] IMPLICIT ASOI-tag OPTIONAL, + calling-asoi-tag [16] IMPLICIT ASOI-tag OPTIONAL, + -- End of extensions for higher level association FU +-- ..., + user-information [30] IMPLICIT Association-data OPTIONAL +} + +AARE-apdu ::= [APPLICATION 1] IMPLICIT SEQUENCE { + protocol-version + [0] IMPLICIT BIT STRING {version1(0)} DEFAULT {version1}, + aSO-context-name [1] ASO-context-name, + result [2] Associate-result, + result-source-diagnostic [3] Associate-source-diagnostic, + responding-AP-title [4] AP-title OPTIONAL, + responding-AE-qualifier [5] AE-qualifier OPTIONAL, + responding-AP-invocation-identifier [6] AP-invocation-identifier OPTIONAL, + responding-AE-invocation-identifier [7] AE-invocation-identifier OPTIONAL, + -- The following field shall not be present if only the Kernel is used. + responder-acse-requirements [8] IMPLICIT ACSE-requirements OPTIONAL, + -- The following field shall only be present if the Authentication functional unit is selected. + mechanism-name [9] IMPLICIT Mechanism-name OPTIONAL, + -- This following field shall only be present if the Authentication functional unit is selected. + responding-authentication-value + [10] EXPLICIT Authentication-value OPTIONAL, + aSO-context-name-list + [11] IMPLICIT ASO-context-name-list OPTIONAL, + -- The above field shall only be present if the Application Context Negotiation functional unit is selected. + implementation-information + [29] IMPLICIT Implementation-data OPTIONAL, + ..., + -- Extensions for higher level association FU + p-context-result-list + [12] IMPLICIT P-context-result-list OPTIONAL, + called-asoi-tag [13] IMPLICIT ASOI-tag OPTIONAL, + calling-asoi-tag [14] IMPLICIT ASOI-tag OPTIONAL, + -- End of extensions for higher level association FU +-- ..., + user-information [30] IMPLICIT Association-data OPTIONAL +} + +RLRQ-apdu ::= [APPLICATION 2] IMPLICIT SEQUENCE { + reason [0] IMPLICIT Release-request-reason OPTIONAL, + ..., + -- Extensions for higher level association FU + aso-qualifier [13] ASO-qualifier OPTIONAL, + asoi-identifier [14] IMPLICIT ASOI-identifier OPTIONAL, + -- End of extensions for higher level association FU +-- ..., + user-information [30] IMPLICIT Association-data OPTIONAL +} + +RLRE-apdu ::= [APPLICATION 3] IMPLICIT SEQUENCE { + reason [0] IMPLICIT Release-response-reason OPTIONAL, + ..., + -- Extensions for higher level association FU + aso-qualifier [13] ASO-qualifier OPTIONAL, + asoi-identifier [14] IMPLICIT ASOI-identifier OPTIONAL, + -- End of extensions for higher level association FU +-- ..., + user-information [30] IMPLICIT Association-data OPTIONAL +} + +ABRT-apdu ::= [APPLICATION 4] IMPLICIT SEQUENCE { + abort-source [0] IMPLICIT ABRT-source, + abort-diagnostic [1] IMPLICIT ABRT-diagnostic OPTIONAL, + -- This field shall not be present if only the Kernel is used. + ..., + -- Extensions for higher level association FU + aso-qualifier [13] ASO-qualifier OPTIONAL, + asoi-identifier [14] IMPLICIT ASOI-identifier OPTIONAL, + -- End of extensions for higher level association FU +-- ..., + user-information [30] IMPLICIT Association-data OPTIONAL +} + +A-DT-apdu ::= [APPLICATION 5] IMPLICIT SEQUENCE { + aso-qualifier [0] ASO-qualifier OPTIONAL, + asoi-identifier [1] IMPLICIT ASOI-identifier OPTIONAL, + ..., +-- ..., + a-user-data [30] User-Data +} + +ACRQ-apdu ::= [APPLICATION 6] IMPLICIT SEQUENCE { + aso-qualifier [0] ASO-qualifier OPTIONAL, + asoi-identifier [1] IMPLICIT ASOI-identifier OPTIONAL, + aSO-context-name [3] IMPLICIT ASO-context-name OPTIONAL, + aSO-context-name-list [4] IMPLICIT ASO-context-name-list OPTIONAL, + p-context-definition-list [5] Syntactic-context-list OPTIONAL, + ..., +-- ..., + user-information [30] IMPLICIT User-information OPTIONAL +} + +ACRP-apdu ::= [APPLICATION 7] IMPLICIT SEQUENCE { + aso-qualifier [0] ASO-qualifier OPTIONAL, + asoi-identifier [1] IMPLICIT ASOI-identifier OPTIONAL, + aSO-context-name [3] IMPLICIT ASO-context-name-list OPTIONAL, + p-context-result-list [4] IMPLICIT P-context-result-list OPTIONAL, + ..., +-- ..., + user-information [30] IMPLICIT User-information OPTIONAL +} + +ABRT-diagnostic ::= ENUMERATED { + no-reason-given(1), protocol-error(2), + authentication-mechanism-name-not-recognized(3), + authentication-mechanism-name-required(4), authentication-failure(5), + authentication-required(6), ... + } + +ABRT-source ::= INTEGER {acse-service-user(0), acse-service-provider(1) +}(0..1, ...) + +ACSE-requirements ::= BIT STRING { + authentication(0), aSO-context-negotiation(1), higher-level-association(2), + nested-association(3)} + +Application-context-name ::= ASO-context-name + +ASO-context-name ::= OBJECT IDENTIFIER + +-- Application-entity title productions follow (not in alphabetical order). +AP-title ::= CHOICE { + ap-title-form1 AP-title-form1, + ap-title-form2 AP-title-form2, + ..., + ap-title-form3 AP-title-form3 +} + +AE-qualifier ::= ASO-qualifier + +ASO-qualifier ::= CHOICE { + aso-qualifier-form1 ASO-qualifier-form1, + aso-qualifier-form2 ASO-qualifier-form2, + ..., + aso-qualifier-form3 ASO-qualifier-form3 +} + +-- When both AP-title and AE-qualifier data values are present in an AARQ or AARE APDU, both must +-- have the same form to allow the construction of an AE-title as discussed in itu-t Rec. X.665 | +-- ISO/IEC 9834-6 +AP-title-form1 ::= + Name + +-- The value assigned to AP-title-form1 is The Directory Name of an application-process title. +ASO-qualifier-form1 ::= + RelativeDistinguishedName + +-- The value assigned to AE-qualifier-form1 is the relative distinguished name of a particular +-- application-entity of the application-process identified by AP-title-form1. +AP-title-form2 ::= OBJECT IDENTIFIER + +ASO-qualifier-form2 ::= INTEGER + +AP-title-form3 ::= PrintableString + +ASO-qualifier-form3 ::= PrintableString + +AE-title ::= CHOICE { + ae-title-form1 AE-title-form1, + ae-title-form2 AE-title-form2, + ... +} + +-- As defined in ITU-T Rec. X.650 | ISO/IEC 7498-3, an application-entity title is composed of an application process +-- title and an application-entity qualifier. The ACSE protocol provides for the transfer of an application-entity title +-- value by the transfer of its component values. However, the following data type is provided for International +-- Standards that reference a single syntactic structure for AE titles. +AE-title-form1 ::= + Name + +-- For access to The Directory (see ITU-T Rec. X.500 series | ISO/IEC 9594), an AE title has AE-title-form1. This value +-- can be constructed from AP-title-form1 and AE-qualifier-form1 values contained in an AARQ or AARE APDU. +-- A discussion of forming an AE-title-form1 from AP-title-form1 and AE-qualifier form1 may be found in itu-t +-- Rec X.665 | ISO/IEC 9834-6. +AE-title-form2 ::= OBJECT IDENTIFIER + +-- A discussion of forming an AE-title-form2 from AP-title-form2 and AE-qualifier-form2 may be found in +-- itu-t Rec. X.665 | ISO/IEC 9834-6. +AE-invocation-identifier ::= INTEGER + +AP-invocation-identifier ::= INTEGER + +ASOI-identifier ::= INTEGER(1..128, ...) + +ASOI-tag ::= + SEQUENCE SIZE (0..7, ...) OF + SEQUENCE {qualifier [0] ASO-qualifier OPTIONAL, + identifier [1] ASOI-identifier OPTIONAL} + +-- End of Application-entity title productions +ASO-context-name-list ::= SEQUENCE OF ASO-context-name + +Syntactic-context-list ::= CHOICE { + context-list [0] Context-list, + default-contact-list [1] Default-Context-List +} + +Context-list ::= + SEQUENCE OF + SEQUENCE {pci Presentation-context-identifier, + abstract-syntax Abstract-syntax-name, +-- bug in ASN2ETH +-- transfer-syntaxes SEQUENCE OF Transfer-syntax-name} + transfer-syntaxes SEQUENCE OF TransferSyntaxName} + +Default-Context-List ::= + SEQUENCE OF + SEQUENCE {abstract-syntax-name [0] IMPLICIT Abstract-syntax-name OPTIONAL, +-- bug in ASN2ETH +-- transfer-syntax-name [1] IMPLICIT Transfer-syntax-name + transfer-syntax-name [1] IMPLICIT TransferSyntaxName + } + +Abstract-syntax-name ::= OBJECT IDENTIFIER + +P-context-result-list ::= + SEQUENCE OF + SEQUENCE {result [0] IMPLICIT Result, + concrete-syntax-name [1] IMPLICIT Concrete-syntax-name OPTIONAL, + provider-reason + [2] IMPLICIT INTEGER {reason-not-specified(0), + abstract-syntax-not-supported(1), + proposed-transfer-syntaxes-not-supported(2), + local-limit-on-DCS-exceeded(3)} OPTIONAL + } + +Result ::= INTEGER {acceptance(0), user-rejection(1), provider-rejection(2)} + +--bug in ASN2ETH +--Concrete-syntax-name ::= Transfer-syntax-name +Concrete-syntax-name ::= TransferSyntaxName + +--bug in ASN2ETH +--Transfer-syntax-name ::= OBJECT IDENTIFIER +TransferSyntaxName ::= OBJECT IDENTIFIER + +Associate-result ::= INTEGER { + accepted(0), rejected-permanent(1), rejected-transient(2)}(0..2, ...) + +Associate-source-diagnostic ::= CHOICE { + acse-service-user + [1] INTEGER {null(0), no-reason-given(1), + application-context-name-not-supported(2), + calling-AP-title-not-recognized(3), + calling-AP-invocation-identifier-not-recognized(4), + calling-AE-qualifier-not-recognized(5), + calling-AE-invocation-identifier-not-recognized(6), + called-AP-title-not-recognized(7), + called-AP-invocation-identifier-not-recognized(8), + called-AE-qualifier-not-recognized(9), + called-AE-invocation-identifier-not-recognized(10), + authentication-mechanism-name-not-recognized(11), + authentication-mechanism-name-required(12), + authentication-failure(13), authentication-required(14)} + (0..14, ...), + acse-service-provider + [2] INTEGER {null(0), no-reason-given(1), no-common-acse-version(2)} + (0..2, ...) +} + +User-information ::= Association-data + +Association-data ::= SEQUENCE OF EXTERNAL + +Simply-encoded-data ::= OCTET STRING + +User-Data ::= CHOICE { + user-information User-information, + simply-encoded-data Simply-encoded-data, + fully-encoded-data [0] PDV-list +} + +-- see ITU-T Rec. X.226 | ISO/IEC 8823-1. +PDV-list ::= SEQUENCE { +--bug in ASN2ETH +-- transfer-syntax-name Transfer-syntax-name OPTIONAL, + transfer-syntax-name TransferSyntaxName OPTIONAL, + presentation-context-identifier Presentation-context-identifier, + presentation-data-values + CHOICE {simple-ASN1-type + [0] ANY + (CONSTRAINED BY { + + -- Type corresponding to presentation context identifier + }), + octet-aligned [1] IMPLICIT OCTET STRING, + arbitrary [2] IMPLICIT BIT STRING} + -- see ITU-T Rec. X.226 | ISO/IEC 8823-1. +} + +Presentation-context-identifier ::= INTEGER + +Authentication-value-other ::= SEQUENCE { + other-mechanism-name OBJECT IDENTIFIER, + other-mechanism-value ANY +} + +Authentication-value ::= CHOICE { + charstring [0] IMPLICIT GraphicString, + bitstring [1] IMPLICIT BIT STRING, + external [2] IMPLICIT EXTERNAL, + other + [3] IMPLICIT Authentication-value-other +} + +-- The abstract syntax of (calling/responding) authentication-value is determined by the authentication mechanism used +-- during association establishment. The authentication mechanism is either explicitly denoted by the &id field (of type +-- OBJECT IDENTIFIER) for a mechanism belonging to the class MECHANISM-NAME, or it is known implicitly by +-- prior agreement between the communicating partners. If the "other" component is chosen, then the +-- "mechanism-name" component must be present in accordance with ITU-T Rec. X.680 | ISO/IEC 8824-1. If the value +-- "mechanism-name" occurs in the AARQ-apdu or the AARE-apdu, then that value must be the same as the value for +-- "other-mechanism-name". +Implementation-data ::= GraphicString + +Mechanism-name ::= OBJECT IDENTIFIER + +Release-request-reason ::= INTEGER {normal(0), urgent(1), user-defined(30) +} + +Release-response-reason ::= INTEGER { + normal(0), not-finished(1), user-defined(30)} + +END + +-- Generated by Asnp, the ASN.1 pretty-printer of France Telecom R&D + diff --git a/asn1/acse/acse.cnf b/asn1/acse/acse.cnf new file mode 100644 index 0000000000..8ed7c9d569 --- /dev/null +++ b/asn1/acse/acse.cnf @@ -0,0 +1,60 @@ +#.MODULE_IMPORT +InformationFramework x509if + +#.INCLUDE ../x509if/x509if-exp.cnf + +#.TYPE_RENAME +AARQ-apdu/protocol-version T_AARQ_protocol_version +AARE-apdu/protocol-version T_AARE_protocol_version + +#.FIELD_RENAME +AARQ-apdu/user-information AARQ_user_information +AARE-apdu/user-information AARE_user_information +ABRT-apdu/user-information ABRT_user_information +RLRE-apdu/user-information RLRE_user_information +RLRQ-apdu/user-information RLRQ_user_information +AARE-apdu/result AARE_result +P-context-result-list/_item/result Pcontext_result +RLRE-apdu/reason RLRE_reason +RLRQ-apdu/reason RLRQ_reason +AARQ-apdu/protocol-version AARQ_protocol_version +AARE-apdu/protocol-version AARE_protocol_version +AARQ-apdu/aSO-context-name AARQ_aSO_context_name +AARE-apdu/aSO-context-name AARE_aSO_context_name +ACRQ-apdu/aSO-context-name ACRQ_aSO_context_name + +#.FN_BODY Authentication-value-other/other-mechanism-name + offset = dissect_ber_object_identifier(FALSE, pinfo, tree, tvb, offset, + hf_index, object_identifier_id); + +#.FN_BODY Authentication-value-other/other-mechanism-value + offset=call_ber_oid_callback(object_identifier_id, tvb, offset, pinfo, top_tree); + +#.FN_BODY PDV-list/presentation-data-values/simple-ASN1-type +/*XXX not implemented yet */ + +#.FN_BODY AARQ-apdu/aSO-context-name + offset = dissect_ber_object_identifier(FALSE, pinfo, tree, tvb, offset, + hf_index, object_identifier_id); + +#.FN_BODY AARE-apdu/aSO-context-name + offset = dissect_ber_object_identifier(FALSE, pinfo, tree, tvb, offset, + hf_index, object_identifier_id); + +#.FN_BODY ACRQ-apdu/aSO-context-name + offset = dissect_ber_object_identifier(FALSE, pinfo, tree, tvb, offset, + hf_index, object_identifier_id); + +#.FN_BODY ACRP-apdu/aSO-context-name + offset = dissect_ber_object_identifier(FALSE, pinfo, tree, tvb, offset, + hf_index, object_identifier_id); + +#.FN_BODY EXTERNAL/indirect-reference + offset = dissect_ber_integer(FALSE, pinfo, tree, tvb, offset, + hf_acse_indirect_reference, + &indir_ref); + +#.FN_BODY EXTERNAL/encoding/single-ASN1-type + offset=call_ber_oid_callback(object_identifier_id, tvb, offset, pinfo, top_tree); + +#.END diff --git a/asn1/acse/packet-acse-template.c b/asn1/acse/packet-acse-template.c new file mode 100644 index 0000000000..e9e007a4c0 --- /dev/null +++ b/asn1/acse/packet-acse-template.c @@ -0,0 +1,311 @@ +/*XXX + there is a bug in the generated code + static const ber_sequence_t Association_data_sequence_of[1] = { + { BER_CLASS_UNI, 8, BER_FLAGS_NOOWNTAG, dissect_Association_data_item }, + }; + must be changed into + static const ber_sequence_t Association_data_sequence_of[1] = { + { BER_CLASS_UNI, 8, NULL, dissect_Association_data_item }, + }; + + and + static int dissect_Association_data_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { + int ret; + ret=dissect_acse_EXTERNAL(FALSE, tvb, offset, pinfo, tree, hf_acse_Association_data_item); + return ret; + } + must be changed into + static int dissect_Association_data_item(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) { + int ret; + ret=dissect_acse_EXTERNAL(TRUE, tvb, offset, pinfo, tree, hf_acse_Association_data_item); + return ret; + } +*/ + +/* packet-acse.c + * Routines for ACSE packet dissection + * Ronnie Sahlberg 2005 + * dissect_acse() from original handwritten dissector by Sid + * + * $Id: packet-acse-template.c 12740 2004-12-13 08:15:34Z sahlberg $ + * + * Ethereal - Network traffic analyzer + * By Gerald Combs <gerald@ethereal.com> + * 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 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <glib.h> +#include <epan/packet.h> +#include <epan/conversation.h> + +#include <stdio.h> +#include <string.h> + +#include "packet-ber.h" +#include "packet-acse.h" +#include "packet-ses.h" +#include "packet-x509if.h" + +#define PNAME "ACSE" +#define PSNAME "ACSE" +#define PFNAME "acse" + +/* Initialize the protocol and registered fields */ +int proto_acse = -1; +#include "packet-acse-hf.c" + +/* Initialize the subtree pointers */ +static gint ett_acse = -1; +#include "packet-acse-ett.c" + +static struct SESSION_DATA_STRUCTURE* session = NULL; + +static char object_identifier_id[64]; /*64 chars should be long enough? */ +/* indirect_reference, used to pick up the signalling so we know what + kind of data is transferred in SES_DATA_TRANSFER_PDUs */ +static guint32 indir_ref=0; + +static proto_tree *top_tree=NULL; + +/* to keep track of presentation context identifiers and protocol-oids */ +static GMemChunk *acse_ctx_oid_chunk = NULL; +static int acse_ctx_oid_count = 500; +typedef struct _acse_ctx_oid_t { + /* XXX here we should keep track of ADDRESS/PORT as well */ + guint32 ctx_id; + char *oid; +} acse_ctx_oid_t; +static GHashTable *acse_ctx_oid_table = NULL; + +static gboolean +free_all_ctx_oid_strings(gpointer key_arg, gpointer value _U_, gpointer user_data _U_) +{ + acse_ctx_oid_t *aco=(acse_ctx_oid_t *)key_arg; + if(aco->oid){ + g_free(aco->oid); + aco->oid=NULL; + } + return TRUE; +} +static guint +acse_ctx_oid_hash(gconstpointer k) +{ + acse_ctx_oid_t *aco=(acse_ctx_oid_t *)k; + return aco->ctx_id; +} +/* XXX this one should be made ADDRESS/PORT aware */ +static gint +acse_ctx_oid_equal(gconstpointer k1, gconstpointer k2) +{ + acse_ctx_oid_t *aco1=(acse_ctx_oid_t *)k1; + acse_ctx_oid_t *aco2=(acse_ctx_oid_t *)k2; + return aco1->ctx_id==aco2->ctx_id; +} + +static void +acse_init(void) +{ + if( acse_ctx_oid_table ){ + g_hash_table_foreach_remove(acse_ctx_oid_table, + free_all_ctx_oid_strings, NULL); + g_hash_table_destroy(acse_ctx_oid_table); + acse_ctx_oid_table = NULL; + } + acse_ctx_oid_table = g_hash_table_new(acse_ctx_oid_hash, + acse_ctx_oid_equal); + + if (acse_ctx_oid_chunk) { + g_mem_chunk_destroy(acse_ctx_oid_chunk); + acse_ctx_oid_chunk = NULL; + } + acse_ctx_oid_chunk = g_mem_chunk_new("acse_ctx_oid_chunk", + sizeof(acse_ctx_oid_t), + acse_ctx_oid_count * sizeof(acse_ctx_oid_t), + G_ALLOC_ONLY); +} + +static void +register_ctx_id_and_oid(packet_info *pinfo _U_, guint32 idx, char *oid) +{ + acse_ctx_oid_t *aco, *tmpaco; + aco=g_mem_chunk_alloc(acse_ctx_oid_chunk); + aco->ctx_id=idx; + aco->oid=g_strdup(oid); + + /* if this ctx already exists, remove the old one first */ + tmpaco=(acse_ctx_oid_t *)g_hash_table_lookup(acse_ctx_oid_table, aco); + if(tmpaco){ + g_hash_table_remove(acse_ctx_oid_table, tmpaco); + g_free(tmpaco->oid); + tmpaco->oid=NULL; + g_mem_chunk_free(acse_ctx_oid_chunk, tmpaco); + } + g_hash_table_insert(acse_ctx_oid_table, aco, aco); +} +static char * +find_oid_by_ctx_id(packet_info *pinfo _U_, guint32 idx) +{ + acse_ctx_oid_t aco, *tmpaco; + aco.ctx_id=idx; + tmpaco=(acse_ctx_oid_t *)g_hash_table_lookup(acse_ctx_oid_table, &aco); + if(tmpaco){ + return tmpaco->oid; + } + return NULL; +} + + +#include "packet-acse-fn.c" + + +/* +* Dissect ACSE PDUs inside a PPDU. +*/ +static void +dissect_acse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree) +{ + int offset = 0; + proto_item *item=NULL; + proto_tree *tree=NULL; + char *oid; + + /* save parent_tree so subdissectors can create new top nodes */ + top_tree=parent_tree; + + /* create display subtree for the protocol */ + if(parent_tree){ + item = proto_tree_add_item(parent_tree, proto_acse, tvb, 0, -1, FALSE); + tree = proto_item_add_subtree(item, ett_acse); + } + if (check_col(pinfo->cinfo, COL_PROTOCOL)) + col_set_str(pinfo->cinfo, COL_PROTOCOL, "ACSE"); + if (check_col(pinfo->cinfo, COL_INFO)) + col_clear(pinfo->cinfo, COL_INFO); + + + /* first, try to check length */ + /* do we have at least 2 bytes */ + if (!tvb_bytes_exist(tvb, 0, 2)){ + proto_tree_add_text(tree, tvb, offset, + tvb_reported_length_remaining(tvb,offset), + "User data"); + return; /* no, it isn't a ACSE PDU */ + } + /* do we have spdu type from the session dissector? */ + if( !pinfo->private_data ){ + if(tree){ + proto_tree_add_text(tree, tvb, offset, -1, + "Internal error:can't get spdu type from session dissector."); + } + return ; + } else { + session = ( (struct SESSION_DATA_STRUCTURE*)(pinfo->private_data) ); + if(session->spdu_type == 0 ) { + if(tree){ + proto_tree_add_text(tree, tvb, offset, -1, + "Internal error:wrong spdu type %x from session dissector.",session->spdu_type); + return ; + } + } + } + /* ACSE has only AARQ,AARE,RLRQ,RLRE,ABRT type of pdu */ + /* reject everything else */ + /* data pdu is not ACSE pdu and has to go directly to app dissector */ + switch(session->spdu_type){ + case SES_CONNECTION_REQUEST: /* AARQ */ + case SES_CONNECTION_ACCEPT: /* AARE */ + case SES_REFUSE: /* RLRE */ + case SES_DISCONNECT: /* RLRQ */ + case SES_FINISH: /* RLRE */ + case SES_ABORT: /* ABRT */ + break; + case SES_DATA_TRANSFER: + oid=find_oid_by_ctx_id(pinfo, indir_ref); + if(oid){ + call_ber_oid_callback(oid, tvb, offset, pinfo, top_tree); + } else { + proto_tree_add_text(tree, tvb, offset, -1, + "dissector is not available"); + } + return; + default: + return; + } + + /* we can't make any additional checking here */ + /* postpone it before dissector will have more information */ + while (tvb_reported_length_remaining(tvb, offset) > 0){ + offset = dissect_acse_ACSE_apdu(FALSE, tvb, offset, pinfo, tree, -1); + if(offset == FALSE ){ + proto_tree_add_text(tree, tvb, offset, -1,"Internal error"); + offset = tvb_length(tvb); + break; + } + } + + switch(session->spdu_type){ + case SES_CONNECTION_REQUEST: /* AARQ */ + case SES_CONNECTION_ACCEPT: /* AARE */ + /* these two functions are used to set up the association + between a presentation identifier (indir_ref) and + a protocol identified by a oid. + it is ugly to handle it with global variables but + better than nothing. + */ + register_ctx_id_and_oid(pinfo, indir_ref, object_identifier_id); + break; + } +} + +/*--- proto_register_acse ----------------------------------------------*/ +void proto_register_acse(void) { + + /* List of fields */ + static hf_register_info hf[] = { +#include "packet-acse-hfarr.c" + }; + + /* List of subtrees */ + static gint *ett[] = { + &ett_acse, +#include "packet-acse-ettarr.c" + }; + + /* Register protocol */ + proto_acse = proto_register_protocol(PNAME, PSNAME, PFNAME); + register_dissector("acse", dissect_acse, proto_acse); + + /* Register fields and subtrees */ + proto_register_field_array(proto_acse, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + +/*XXX remove later just to keep the other dissectors happy */ +register_dissector_table("acse.application_context", "Application context OID", FT_STRING, BASE_NONE); + + register_init_routine(acse_init); +} + + +/*--- proto_reg_handoff_acse -------------------------------------------*/ +void proto_reg_handoff_acse(void) { +/*#include "packet-acse-dis-tab.c"*/ +} + diff --git a/asn1/acse/packet-acse-template.h b/asn1/acse/packet-acse-template.h new file mode 100644 index 0000000000..c18b3be1fb --- /dev/null +++ b/asn1/acse/packet-acse-template.h @@ -0,0 +1,32 @@ +/* packet-acse.h + * Routines for ACSE packet dissection + * Ronnie Sahlberg 2005 + * + * $Id: packet-acse-template.h 12573 2004-11-22 03:36:26Z sahlberg $ + * + * Ethereal - Network traffic analyzer + * By Gerald Combs <gerald@ethereal.com> + * 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 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef PACKET_ACSE_H +#define PACKET_ACSE_H + +/*#include "packet-acse-exp.h"*/ + +#endif /* PACKET_ACSE_H */ + |