Revert "TODO epan/dissectors/asn1/kerberos/packet-kerberos-template.c new GSS flags"
[wireshark-sm.git] / epan / dissectors / packet-acse.c
blobf225f654b7438363ca2ab75dcdd2f4d801ff9b8d
1 /* Do not modify this file. Changes will be overwritten. */
2 /* Generated automatically by the ASN.1 to Wireshark dissector compiler */
3 /* packet-acse.c */
4 /* asn2wrs.py -b -C -q -L -p acse -c ./acse.cnf -s ./packet-acse-template -D . -O ../.. acse.asn */
6 /*XXX
7 There is a bug in asn2wrs that it can not yet handle tagged assignments such
8 as EXTERNAL ::= [UNIVERSAL 8] IMPLICIT SEQUENCE {
10 This bug is workedaround by some .cnf magic but this should be cleaned up
11 once asn2wrs learns how to deal with tagged assignments
14 /* packet-acse.c
15 * Routines for ACSE packet dissection
16 * Ronnie Sahlberg 2005
17 * dissect_acse() based original handwritten dissector by Sid
18 * Yuriy Sidelnikov <YSidelnikov@hotmail.com>
20 * Wireshark - Network traffic analyzer
21 * By Gerald Combs <gerald@wireshark.org>
22 * Copyright 1998 Gerald Combs
24 * SPDX-License-Identifier: GPL-2.0-or-later
27 #include "config.h"
29 #include <epan/packet.h>
30 #include <epan/exceptions.h>
31 #include <epan/expert.h>
32 #include <epan/oids.h>
33 #include <epan/asn1.h>
34 #include <wsutil/array.h>
36 #include "packet-ber.h"
37 #include "packet-acse.h"
38 #include "packet-ses.h"
39 #include "packet-pres.h"
40 #include "packet-x509if.h"
42 #define PNAME "ISO 8650-1 OSI Association Control Service"
43 #define PSNAME "ACSE"
44 #define PFNAME "acse"
46 #define CLPNAME "ISO 10035-1 OSI Connectionless Association Control Service"
47 #define CLPSNAME "CLACSE"
48 #define CLPFNAME "clacse"
50 #define ACSE_APDU_OID "2.2.1.0.1"
52 void proto_register_acse(void);
53 void proto_reg_handoff_acse(void);
55 /* Initialize the protocol and registered fields */
56 int proto_acse;
57 int proto_clacse;
61 static int hf_acse_direct_reference; /* T_direct_reference */
62 static int hf_acse_indirect_reference; /* T_indirect_reference */
63 static int hf_acse_data_value_descriptor; /* ObjectDescriptor */
64 static int hf_acse_encoding; /* T_encoding */
65 static int hf_acse_single_ASN1_type; /* T_single_ASN1_type */
66 static int hf_acse_octet_aligned; /* T_octet_aligned */
67 static int hf_acse_arbitrary; /* BIT_STRING */
68 static int hf_acse_aarq; /* AARQ_apdu */
69 static int hf_acse_aare; /* AARE_apdu */
70 static int hf_acse_rlrq; /* RLRQ_apdu */
71 static int hf_acse_rlre; /* RLRE_apdu */
72 static int hf_acse_abrt; /* ABRT_apdu */
73 static int hf_acse_adt; /* A_DT_apdu */
74 static int hf_acse_acrq; /* ACRQ_apdu */
75 static int hf_acse_acrp; /* ACRP_apdu */
76 static int hf_acse_aARQ_protocol_version; /* T_AARQ_protocol_version */
77 static int hf_acse_aARQ_aSO_context_name; /* T_AARQ_aSO_context_name */
78 static int hf_acse_called_AP_title; /* AP_title */
79 static int hf_acse_called_AE_qualifier; /* AE_qualifier */
80 static int hf_acse_called_AP_invocation_identifier; /* AP_invocation_identifier */
81 static int hf_acse_called_AE_invocation_identifier; /* AE_invocation_identifier */
82 static int hf_acse_calling_AP_title; /* AP_title */
83 static int hf_acse_calling_AE_qualifier; /* AE_qualifier */
84 static int hf_acse_calling_AP_invocation_identifier; /* AP_invocation_identifier */
85 static int hf_acse_calling_AE_invocation_identifier; /* AE_invocation_identifier */
86 static int hf_acse_sender_acse_requirements; /* ACSE_requirements */
87 static int hf_acse_mechanism_name; /* Mechanism_name */
88 static int hf_acse_calling_authentication_value; /* Authentication_value */
89 static int hf_acse_aSO_context_name_list; /* ASO_context_name_list */
90 static int hf_acse_implementation_information; /* Implementation_data */
91 static int hf_acse_p_context_definition_list; /* Syntactic_context_list */
92 static int hf_acse_called_asoi_tag; /* ASOI_tag */
93 static int hf_acse_calling_asoi_tag; /* ASOI_tag */
94 static int hf_acse_aARQ_user_information; /* Association_data */
95 static int hf_acse_aARE_protocol_version; /* T_AARE_protocol_version */
96 static int hf_acse_aARE_aSO_context_name; /* T_AARE_aSO_context_name */
97 static int hf_acse_result; /* Associate_result */
98 static int hf_acse_result_source_diagnostic; /* Associate_source_diagnostic */
99 static int hf_acse_responding_AP_title; /* AP_title */
100 static int hf_acse_responding_AE_qualifier; /* AE_qualifier */
101 static int hf_acse_responding_AP_invocation_identifier; /* AP_invocation_identifier */
102 static int hf_acse_responding_AE_invocation_identifier; /* AE_invocation_identifier */
103 static int hf_acse_responder_acse_requirements; /* ACSE_requirements */
104 static int hf_acse_responding_authentication_value; /* Authentication_value */
105 static int hf_acse_p_context_result_list; /* P_context_result_list */
106 static int hf_acse_aARE_user_information; /* Association_data */
107 static int hf_acse_rLRQ_reason; /* Release_request_reason */
108 static int hf_acse_aso_qualifier; /* ASO_qualifier */
109 static int hf_acse_asoi_identifier; /* ASOI_identifier */
110 static int hf_acse_rLRQ_user_information; /* Association_data */
111 static int hf_acse_rLRE_reason; /* Release_response_reason */
112 static int hf_acse_rLRE_user_information; /* Association_data */
113 static int hf_acse_abort_source; /* ABRT_source */
114 static int hf_acse_abort_diagnostic; /* ABRT_diagnostic */
115 static int hf_acse_aBRT_user_information; /* Association_data */
116 static int hf_acse_a_user_data; /* User_Data */
117 static int hf_acse_aCRQ_aSO_context_name; /* T_ACRQ_aSO_context_name */
118 static int hf_acse_user_information; /* User_information */
119 static int hf_acse_aSO_context_name; /* T_ACRP_aSO_context_name */
120 static int hf_acse_ap_title_form1; /* AP_title_form1 */
121 static int hf_acse_ap_title_form2; /* AP_title_form2 */
122 static int hf_acse_ap_title_form3; /* AP_title_form3 */
123 static int hf_acse_aso_qualifier_form1; /* ASO_qualifier_form1 */
124 static int hf_acse_aso_qualifier_form2; /* ASO_qualifier_form2 */
125 static int hf_acse_aso_qualifier_form3; /* ASO_qualifier_form3 */
126 static int hf_acse_aso_qualifier_form_any_octets; /* ASO_qualifier_form_octets */
127 static int hf_acse_ae_title_form1; /* AE_title_form1 */
128 static int hf_acse_ae_title_form2; /* AE_title_form2 */
129 static int hf_acse_ASOI_tag_item; /* ASOI_tag_item */
130 static int hf_acse_qualifier; /* ASO_qualifier */
131 static int hf_acse_identifier; /* ASOI_identifier */
132 static int hf_acse_ASO_context_name_list_item; /* ASO_context_name */
133 static int hf_acse_context_list; /* Context_list */
134 static int hf_acse_default_contact_list; /* Default_Context_List */
135 static int hf_acse_Context_list_item; /* Context_list_item */
136 static int hf_acse_pci; /* Presentation_context_identifier */
137 static int hf_acse_abstract_syntax; /* Abstract_syntax_name */
138 static int hf_acse_transfer_syntaxes; /* SEQUENCE_OF_TransferSyntaxName */
139 static int hf_acse_transfer_syntaxes_item; /* TransferSyntaxName */
140 static int hf_acse_Default_Context_List_item; /* Default_Context_List_item */
141 static int hf_acse_abstract_syntax_name; /* Abstract_syntax_name */
142 static int hf_acse_transfer_syntax_name; /* TransferSyntaxName */
143 static int hf_acse_P_context_result_list_item; /* P_context_result_list_item */
144 static int hf_acse_pcontext_result; /* Result */
145 static int hf_acse_concrete_syntax_name; /* Concrete_syntax_name */
146 static int hf_acse_provider_reason; /* T_provider_reason */
147 static int hf_acse_service_user; /* T_service_user */
148 static int hf_acse_service_provider; /* T_service_provider */
149 static int hf_acse_Association_data_item; /* EXTERNALt */
150 static int hf_acse_simply_encoded_data; /* Simply_encoded_data */
151 static int hf_acse_fully_encoded_data; /* PDV_list */
152 static int hf_acse_presentation_context_identifier; /* Presentation_context_identifier */
153 static int hf_acse_presentation_data_values; /* T_presentation_data_values */
154 static int hf_acse_simple_ASN1_type; /* T_simple_ASN1_type */
155 static int hf_acse_pDVList_octet_aligned; /* OCTET_STRING */
156 static int hf_acse_other_mechanism_name; /* T_other_mechanism_name */
157 static int hf_acse_other_mechanism_value; /* T_other_mechanism_value */
158 static int hf_acse_charstring; /* GraphicString */
159 static int hf_acse_bitstring; /* BIT_STRING */
160 static int hf_acse_external; /* EXTERNALt */
161 static int hf_acse_other; /* Authentication_value_other */
162 /* named bits */
163 static int hf_acse_T_AARQ_protocol_version_version1;
164 static int hf_acse_T_AARE_protocol_version_version1;
165 static int hf_acse_ACSE_requirements_authentication;
166 static int hf_acse_ACSE_requirements_aSO_context_negotiation;
167 static int hf_acse_ACSE_requirements_higher_level_association;
168 static int hf_acse_ACSE_requirements_nested_association;
169 static int hf_acse_user_data;
171 /* Initialize the subtree pointers */
172 static int ett_acse;
173 static int ett_acse_EXTERNALt_U;
174 static int ett_acse_T_encoding;
175 static int ett_acse_ACSE_apdu;
176 static int ett_acse_AARQ_apdu_U;
177 static int ett_acse_T_AARQ_protocol_version;
178 static int ett_acse_AARE_apdu_U;
179 static int ett_acse_T_AARE_protocol_version;
180 static int ett_acse_RLRQ_apdu_U;
181 static int ett_acse_RLRE_apdu_U;
182 static int ett_acse_ABRT_apdu_U;
183 static int ett_acse_A_DT_apdu_U;
184 static int ett_acse_ACRQ_apdu_U;
185 static int ett_acse_ACRP_apdu_U;
186 static int ett_acse_ACSE_requirements;
187 static int ett_acse_AP_title;
188 static int ett_acse_ASO_qualifier;
189 static int ett_acse_AE_title;
190 static int ett_acse_ASOI_tag;
191 static int ett_acse_ASOI_tag_item;
192 static int ett_acse_ASO_context_name_list;
193 static int ett_acse_Syntactic_context_list;
194 static int ett_acse_Context_list;
195 static int ett_acse_Context_list_item;
196 static int ett_acse_SEQUENCE_OF_TransferSyntaxName;
197 static int ett_acse_Default_Context_List;
198 static int ett_acse_Default_Context_List_item;
199 static int ett_acse_P_context_result_list;
200 static int ett_acse_P_context_result_list_item;
201 static int ett_acse_Associate_source_diagnostic;
202 static int ett_acse_Association_data;
203 static int ett_acse_User_Data;
204 static int ett_acse_PDV_list;
205 static int ett_acse_T_presentation_data_values;
206 static int ett_acse_Authentication_value_other;
207 static int ett_acse_Authentication_value;
209 static expert_field ei_acse_dissector_not_available;
210 static expert_field ei_acse_malformed;
211 static expert_field ei_acse_invalid_oid;
213 static dissector_handle_t acse_handle;
215 /* indirect_reference, used to pick up the signalling so we know what
216 kind of data is transferred in SES_DATA_TRANSFER_PDUs */
217 static uint32_t indir_ref=0;
219 #if NOT_NEEDED
220 /* to keep track of presentation context identifiers and protocol-oids */
221 typedef struct _acse_ctx_oid_t {
222 /* XXX here we should keep track of ADDRESS/PORT as well */
223 uint32_t ctx_id;
224 char *oid;
225 } acse_ctx_oid_t;
226 static wmem_map_t *acse_ctx_oid_table;
228 static unsigned
229 acse_ctx_oid_hash(const void *k)
231 acse_ctx_oid_t *aco=(acse_ctx_oid_t *)k;
232 return aco->ctx_id;
234 /* XXX this one should be made ADDRESS/PORT aware */
235 static int
236 acse_ctx_oid_equal(const void *k1, const void *k2)
238 acse_ctx_oid_t *aco1=(acse_ctx_oid_t *)k1;
239 acse_ctx_oid_t *aco2=(acse_ctx_oid_t *)k2;
240 return aco1->ctx_id==aco2->ctx_id;
243 static void
244 register_ctx_id_and_oid(packet_info *pinfo _U_, uint32_t idx, char *oid)
246 acse_ctx_oid_t *aco, *tmpaco;
247 aco=wmem_new(wmem_file_scope(), acse_ctx_oid_t);
248 aco->ctx_id=idx;
249 aco->oid=wmem_strdup(wmem_file_scope(), oid);
251 /* if this ctx already exists, remove the old one first */
252 tmpaco=(acse_ctx_oid_t *)wmem_map_lookup(acse_ctx_oid_table, aco);
253 if (tmpaco) {
254 wmem_map_remove(acse_ctx_oid_table, tmpaco);
256 wmem_map_insert(acse_ctx_oid_table, aco, aco);
258 static char *
259 find_oid_by_ctx_id(packet_info *pinfo _U_, uint32_t idx)
261 acse_ctx_oid_t aco, *tmpaco;
262 aco.ctx_id=idx;
263 tmpaco=(acse_ctx_oid_t *)wmem_map_lookup(acse_ctx_oid_table, &aco);
264 if (tmpaco) {
265 return tmpaco->oid;
267 return NULL;
270 # endif /* NOT_NEEDED */
274 static int
275 dissect_acse_T_direct_reference(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
276 offset = dissect_ber_object_identifier_str(implicit_tag, actx, tree, tvb, offset, hf_index, &actx->external.direct_reference);
278 actx->external.direct_ref_present = (actx->external.direct_reference != NULL) ? true : false;
281 return offset;
286 static int
287 dissect_acse_T_indirect_reference(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
288 char *oid;
289 struct SESSION_DATA_STRUCTURE* session = (struct SESSION_DATA_STRUCTURE*) actx->private_data;
291 offset = dissect_ber_integer(false, actx, tree, tvb, offset,
292 hf_acse_indirect_reference,
293 &indir_ref);
295 /* look up the indirect reference */
296 if((oid = find_oid_by_pres_ctx_id(actx->pinfo, indir_ref)) != NULL) {
297 actx->external.direct_reference = wmem_strdup(actx->pinfo->pool, oid);
298 actx->external.direct_ref_present = true;
301 if(session)
302 session->pres_ctx_id = indir_ref;
305 return offset;
310 static int
311 dissect_acse_ObjectDescriptor(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
312 offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_ObjectDescriptor,
313 actx, tree, tvb, offset, hf_index,
314 NULL);
316 return offset;
321 static int
322 dissect_acse_T_single_ASN1_type(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
323 if (actx->external.direct_ref_present) {
324 offset=call_ber_oid_callback(actx->external.direct_reference, tvb, offset, actx->pinfo, actx->subtree.top_tree ? actx->subtree.top_tree : tree, actx->private_data);
328 return offset;
333 static int
334 dissect_acse_T_octet_aligned(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
335 if (actx->external.direct_ref_present) {
336 offset=call_ber_oid_callback(actx->external.direct_reference, tvb, offset, actx->pinfo, actx->subtree.top_tree ? actx->subtree.top_tree : tree, actx->private_data);
340 return offset;
345 static int
346 dissect_acse_BIT_STRING(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
347 offset = dissect_ber_bitstring(implicit_tag, actx, tree, tvb, offset,
348 NULL, 0, hf_index, -1,
349 NULL);
351 return offset;
355 static const value_string acse_T_encoding_vals[] = {
356 { 0, "single-ASN1-type" },
357 { 1, "octet-aligned" },
358 { 2, "arbitrary" },
359 { 0, NULL }
362 static const ber_choice_t T_encoding_choice[] = {
363 { 0, &hf_acse_single_ASN1_type, BER_CLASS_CON, 0, 0, dissect_acse_T_single_ASN1_type },
364 { 1, &hf_acse_octet_aligned , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_acse_T_octet_aligned },
365 { 2, &hf_acse_arbitrary , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_acse_BIT_STRING },
366 { 0, NULL, 0, 0, 0, NULL }
369 static int
370 dissect_acse_T_encoding(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
371 offset = dissect_ber_choice(actx, tree, tvb, offset,
372 T_encoding_choice, hf_index, ett_acse_T_encoding,
373 NULL);
375 return offset;
379 static const ber_sequence_t EXTERNALt_U_sequence[] = {
380 { &hf_acse_direct_reference, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_acse_T_direct_reference },
381 { &hf_acse_indirect_reference, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_acse_T_indirect_reference },
382 { &hf_acse_data_value_descriptor, BER_CLASS_UNI, BER_UNI_TAG_ObjectDescriptor, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_acse_ObjectDescriptor },
383 { &hf_acse_encoding , BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_acse_T_encoding },
384 { NULL, 0, 0, 0, NULL }
387 static int
388 dissect_acse_EXTERNALt_U(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
389 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
390 EXTERNALt_U_sequence, hf_index, ett_acse_EXTERNALt_U);
392 return offset;
398 dissect_acse_EXTERNALt(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
399 offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
400 hf_index, BER_CLASS_UNI, 8, true, dissect_acse_EXTERNALt_U);
402 return offset;
406 static int * const T_AARQ_protocol_version_bits[] = {
407 &hf_acse_T_AARQ_protocol_version_version1,
408 NULL
411 static int
412 dissect_acse_T_AARQ_protocol_version(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
413 offset = dissect_ber_bitstring(implicit_tag, actx, tree, tvb, offset,
414 T_AARQ_protocol_version_bits, 1, hf_index, ett_acse_T_AARQ_protocol_version,
415 NULL);
417 return offset;
422 static int
423 dissect_acse_ASO_context_name(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
424 offset = dissect_ber_object_identifier(implicit_tag, actx, tree, tvb, offset, hf_index, NULL);
426 return offset;
431 static int
432 dissect_acse_T_AARQ_aSO_context_name(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
433 offset = dissect_ber_object_identifier_str(false, actx, tree, tvb, offset,
434 hf_index, &actx->external.direct_reference);
435 actx->external.direct_ref_present = (actx->external.direct_reference != NULL) ? true : false;
438 return offset;
443 static int
444 dissect_acse_AP_title_form1(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
445 offset = dissect_x509if_Name(implicit_tag, tvb, offset, actx, tree, hf_index);
447 return offset;
452 static int
453 dissect_acse_AP_title_form2(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
454 offset = dissect_ber_object_identifier(implicit_tag, actx, tree, tvb, offset, hf_index, NULL);
456 return offset;
461 static int
462 dissect_acse_AP_title_form3(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
463 offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_PrintableString,
464 actx, tree, tvb, offset, hf_index,
465 NULL);
467 return offset;
471 const value_string acse_AP_title_vals[] = {
472 { 0, "ap-title-form1" },
473 { 1, "ap-title-form2" },
474 { 2, "ap-title-form3" },
475 { 0, NULL }
478 static const ber_choice_t AP_title_choice[] = {
479 { 0, &hf_acse_ap_title_form1 , BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG, dissect_acse_AP_title_form1 },
480 { 1, &hf_acse_ap_title_form2 , BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_acse_AP_title_form2 },
481 { 2, &hf_acse_ap_title_form3 , BER_CLASS_UNI, BER_UNI_TAG_PrintableString, BER_FLAGS_NOOWNTAG, dissect_acse_AP_title_form3 },
482 { 0, NULL, 0, 0, 0, NULL }
486 dissect_acse_AP_title(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
487 offset = dissect_ber_choice(actx, tree, tvb, offset,
488 AP_title_choice, hf_index, ett_acse_AP_title,
489 NULL);
491 return offset;
496 static int
497 dissect_acse_ASO_qualifier_form1(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
498 offset = dissect_x509if_RelativeDistinguishedName(implicit_tag, tvb, offset, actx, tree, hf_index);
500 return offset;
505 static int
506 dissect_acse_ASO_qualifier_form2(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
507 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
508 NULL);
510 return offset;
515 static int
516 dissect_acse_ASO_qualifier_form3(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
517 offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_PrintableString,
518 actx, tree, tvb, offset, hf_index,
519 NULL);
521 return offset;
526 static int
527 dissect_acse_ASO_qualifier_form_octets(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
528 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
529 NULL);
531 return offset;
535 const value_string acse_ASO_qualifier_vals[] = {
536 { 0, "aso-qualifier-form1" },
537 { 1, "aso-qualifier-form2" },
538 { 2, "aso-qualifier-form3" },
539 { 3, "aso-qualifier-form-any-octets" },
540 { 0, NULL }
543 static const ber_choice_t ASO_qualifier_choice[] = {
544 { 0, &hf_acse_aso_qualifier_form1, BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_acse_ASO_qualifier_form1 },
545 { 1, &hf_acse_aso_qualifier_form2, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_acse_ASO_qualifier_form2 },
546 { 2, &hf_acse_aso_qualifier_form3, BER_CLASS_UNI, BER_UNI_TAG_PrintableString, BER_FLAGS_NOOWNTAG, dissect_acse_ASO_qualifier_form3 },
547 { 3, &hf_acse_aso_qualifier_form_any_octets, BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_acse_ASO_qualifier_form_octets },
548 { 0, NULL, 0, 0, 0, NULL }
552 dissect_acse_ASO_qualifier(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
553 offset = dissect_ber_choice(actx, tree, tvb, offset,
554 ASO_qualifier_choice, hf_index, ett_acse_ASO_qualifier,
555 NULL);
557 return offset;
563 dissect_acse_AE_qualifier(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
564 offset = dissect_acse_ASO_qualifier(implicit_tag, tvb, offset, actx, tree, hf_index);
566 return offset;
572 dissect_acse_AP_invocation_identifier(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
573 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
574 NULL);
576 return offset;
582 dissect_acse_AE_invocation_identifier(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
583 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
584 NULL);
586 return offset;
590 static int * const ACSE_requirements_bits[] = {
591 &hf_acse_ACSE_requirements_authentication,
592 &hf_acse_ACSE_requirements_aSO_context_negotiation,
593 &hf_acse_ACSE_requirements_higher_level_association,
594 &hf_acse_ACSE_requirements_nested_association,
595 NULL
598 static int
599 dissect_acse_ACSE_requirements(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
600 offset = dissect_ber_bitstring(implicit_tag, actx, tree, tvb, offset,
601 ACSE_requirements_bits, 4, hf_index, ett_acse_ACSE_requirements,
602 NULL);
604 return offset;
609 static int
610 dissect_acse_Mechanism_name(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
611 offset = dissect_ber_object_identifier(implicit_tag, actx, tree, tvb, offset, hf_index, NULL);
613 return offset;
618 static int
619 dissect_acse_GraphicString(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
620 offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_GraphicString,
621 actx, tree, tvb, offset, hf_index,
622 NULL);
624 return offset;
629 static int
630 dissect_acse_T_other_mechanism_name(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
631 offset = dissect_ber_object_identifier_str(implicit_tag, actx, tree, tvb, offset, hf_index, &actx->external.direct_reference);
633 actx->external.direct_ref_present = (actx->external.direct_reference != NULL) ? true : false;
636 return offset;
641 static int
642 dissect_acse_T_other_mechanism_value(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
643 if (actx->external.direct_ref_present) {
644 offset=call_ber_oid_callback(actx->external.direct_reference, tvb, offset, actx->pinfo, actx->subtree.top_tree, actx->private_data);
648 return offset;
652 static const ber_sequence_t Authentication_value_other_sequence[] = {
653 { &hf_acse_other_mechanism_name, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_acse_T_other_mechanism_name },
654 { &hf_acse_other_mechanism_value, BER_CLASS_ANY, 0, BER_FLAGS_NOOWNTAG, dissect_acse_T_other_mechanism_value },
655 { NULL, 0, 0, 0, NULL }
658 static int
659 dissect_acse_Authentication_value_other(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
660 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
661 Authentication_value_other_sequence, hf_index, ett_acse_Authentication_value_other);
663 return offset;
667 static const value_string acse_Authentication_value_vals[] = {
668 { 0, "charstring" },
669 { 1, "bitstring" },
670 { 2, "external" },
671 { 3, "other" },
672 { 0, NULL }
675 static const ber_choice_t Authentication_value_choice[] = {
676 { 0, &hf_acse_charstring , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_acse_GraphicString },
677 { 1, &hf_acse_bitstring , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_acse_BIT_STRING },
678 { 2, &hf_acse_external , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_acse_EXTERNALt },
679 { 3, &hf_acse_other , BER_CLASS_CON, 3, BER_FLAGS_IMPLTAG, dissect_acse_Authentication_value_other },
680 { 0, NULL, 0, 0, 0, NULL }
683 static int
684 dissect_acse_Authentication_value(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
685 offset = dissect_ber_choice(actx, tree, tvb, offset,
686 Authentication_value_choice, hf_index, ett_acse_Authentication_value,
687 NULL);
689 return offset;
693 static const ber_sequence_t ASO_context_name_list_sequence_of[1] = {
694 { &hf_acse_ASO_context_name_list_item, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_acse_ASO_context_name },
697 static int
698 dissect_acse_ASO_context_name_list(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
699 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
700 ASO_context_name_list_sequence_of, hf_index, ett_acse_ASO_context_name_list);
702 return offset;
707 static int
708 dissect_acse_Implementation_data(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
709 offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_GraphicString,
710 actx, tree, tvb, offset, hf_index,
711 NULL);
713 return offset;
718 static int
719 dissect_acse_Presentation_context_identifier(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
720 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
721 NULL);
723 return offset;
728 static int
729 dissect_acse_Abstract_syntax_name(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
730 offset = dissect_ber_object_identifier(implicit_tag, actx, tree, tvb, offset, hf_index, NULL);
732 return offset;
737 static int
738 dissect_acse_TransferSyntaxName(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
739 offset = dissect_ber_object_identifier(implicit_tag, actx, tree, tvb, offset, hf_index, NULL);
741 return offset;
745 static const ber_sequence_t SEQUENCE_OF_TransferSyntaxName_sequence_of[1] = {
746 { &hf_acse_transfer_syntaxes_item, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_acse_TransferSyntaxName },
749 static int
750 dissect_acse_SEQUENCE_OF_TransferSyntaxName(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
751 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
752 SEQUENCE_OF_TransferSyntaxName_sequence_of, hf_index, ett_acse_SEQUENCE_OF_TransferSyntaxName);
754 return offset;
758 static const ber_sequence_t Context_list_item_sequence[] = {
759 { &hf_acse_pci , BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_acse_Presentation_context_identifier },
760 { &hf_acse_abstract_syntax, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_acse_Abstract_syntax_name },
761 { &hf_acse_transfer_syntaxes, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_acse_SEQUENCE_OF_TransferSyntaxName },
762 { NULL, 0, 0, 0, NULL }
765 static int
766 dissect_acse_Context_list_item(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
767 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
768 Context_list_item_sequence, hf_index, ett_acse_Context_list_item);
770 return offset;
774 static const ber_sequence_t Context_list_sequence_of[1] = {
775 { &hf_acse_Context_list_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_acse_Context_list_item },
778 static int
779 dissect_acse_Context_list(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
780 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
781 Context_list_sequence_of, hf_index, ett_acse_Context_list);
783 return offset;
787 static const ber_sequence_t Default_Context_List_item_sequence[] = {
788 { &hf_acse_abstract_syntax_name, BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_Abstract_syntax_name },
789 { &hf_acse_transfer_syntax_name, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_acse_TransferSyntaxName },
790 { NULL, 0, 0, 0, NULL }
793 static int
794 dissect_acse_Default_Context_List_item(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
795 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
796 Default_Context_List_item_sequence, hf_index, ett_acse_Default_Context_List_item);
798 return offset;
802 static const ber_sequence_t Default_Context_List_sequence_of[1] = {
803 { &hf_acse_Default_Context_List_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_acse_Default_Context_List_item },
806 static int
807 dissect_acse_Default_Context_List(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
808 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
809 Default_Context_List_sequence_of, hf_index, ett_acse_Default_Context_List);
811 return offset;
815 static const value_string acse_Syntactic_context_list_vals[] = {
816 { 0, "context-list" },
817 { 1, "default-contact-list" },
818 { 0, NULL }
821 static const ber_choice_t Syntactic_context_list_choice[] = {
822 { 0, &hf_acse_context_list , BER_CLASS_CON, 0, 0, dissect_acse_Context_list },
823 { 1, &hf_acse_default_contact_list, BER_CLASS_CON, 1, 0, dissect_acse_Default_Context_List },
824 { 0, NULL, 0, 0, 0, NULL }
827 static int
828 dissect_acse_Syntactic_context_list(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
829 offset = dissect_ber_choice(actx, tree, tvb, offset,
830 Syntactic_context_list_choice, hf_index, ett_acse_Syntactic_context_list,
831 NULL);
833 return offset;
838 static int
839 dissect_acse_ASOI_identifier(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
840 offset = dissect_ber_constrained_integer(implicit_tag, actx, tree, tvb, offset,
841 1U, 128U, hf_index, NULL);
843 return offset;
847 static const ber_sequence_t ASOI_tag_item_sequence[] = {
848 { &hf_acse_qualifier , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_ASO_qualifier },
849 { &hf_acse_identifier , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL, dissect_acse_ASOI_identifier },
850 { NULL, 0, 0, 0, NULL }
853 static int
854 dissect_acse_ASOI_tag_item(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
855 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
856 ASOI_tag_item_sequence, hf_index, ett_acse_ASOI_tag_item);
858 return offset;
862 static const ber_sequence_t ASOI_tag_sequence_of[1] = {
863 { &hf_acse_ASOI_tag_item , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_acse_ASOI_tag_item },
866 static int
867 dissect_acse_ASOI_tag(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
868 offset = dissect_ber_constrained_sequence_of(implicit_tag, actx, tree, tvb, offset,
869 0, 7, ASOI_tag_sequence_of, hf_index, ett_acse_ASOI_tag);
871 return offset;
875 static const ber_sequence_t Association_data_sequence_of[1] = {
876 { &hf_acse_Association_data_item, BER_CLASS_UNI, 8, BER_FLAGS_NOOWNTAG, dissect_acse_EXTERNALt },
879 static int
880 dissect_acse_Association_data(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
881 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
882 Association_data_sequence_of, hf_index, ett_acse_Association_data);
884 return offset;
888 static const ber_sequence_t AARQ_apdu_U_sequence[] = {
889 { &hf_acse_aARQ_protocol_version, BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_T_AARQ_protocol_version },
890 { &hf_acse_aARQ_aSO_context_name, BER_CLASS_CON, 1, 0, dissect_acse_T_AARQ_aSO_context_name },
891 { &hf_acse_called_AP_title, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_AP_title },
892 { &hf_acse_called_AE_qualifier, BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_AE_qualifier },
893 { &hf_acse_called_AP_invocation_identifier, BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL, dissect_acse_AP_invocation_identifier },
894 { &hf_acse_called_AE_invocation_identifier, BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL, dissect_acse_AE_invocation_identifier },
895 { &hf_acse_calling_AP_title, BER_CLASS_CON, 6, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_AP_title },
896 { &hf_acse_calling_AE_qualifier, BER_CLASS_CON, 7, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_AE_qualifier },
897 { &hf_acse_calling_AP_invocation_identifier, BER_CLASS_CON, 8, BER_FLAGS_OPTIONAL, dissect_acse_AP_invocation_identifier },
898 { &hf_acse_calling_AE_invocation_identifier, BER_CLASS_CON, 9, BER_FLAGS_OPTIONAL, dissect_acse_AE_invocation_identifier },
899 { &hf_acse_sender_acse_requirements, BER_CLASS_CON, 10, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_ACSE_requirements },
900 { &hf_acse_mechanism_name , BER_CLASS_CON, 11, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_Mechanism_name },
901 { &hf_acse_calling_authentication_value, BER_CLASS_CON, 12, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_Authentication_value },
902 { &hf_acse_aSO_context_name_list, BER_CLASS_CON, 13, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_ASO_context_name_list },
903 { &hf_acse_implementation_information, BER_CLASS_CON, 29, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_Implementation_data },
904 { &hf_acse_p_context_definition_list, BER_CLASS_CON, 14, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_Syntactic_context_list },
905 { &hf_acse_called_asoi_tag, BER_CLASS_CON, 15, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_ASOI_tag },
906 { &hf_acse_calling_asoi_tag, BER_CLASS_CON, 16, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_ASOI_tag },
907 { &hf_acse_aARQ_user_information, BER_CLASS_CON, 30, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_Association_data },
908 { NULL, 0, 0, 0, NULL }
911 static int
912 dissect_acse_AARQ_apdu_U(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
913 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
914 AARQ_apdu_U_sequence, hf_index, ett_acse_AARQ_apdu_U);
916 return offset;
921 static int
922 dissect_acse_AARQ_apdu(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
923 col_append_str(actx->pinfo->cinfo, COL_INFO, "A-Associate-Request");
925 offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
926 hf_index, BER_CLASS_APP, 0, true, dissect_acse_AARQ_apdu_U);
930 return offset;
934 static int * const T_AARE_protocol_version_bits[] = {
935 &hf_acse_T_AARE_protocol_version_version1,
936 NULL
939 static int
940 dissect_acse_T_AARE_protocol_version(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
941 offset = dissect_ber_bitstring(implicit_tag, actx, tree, tvb, offset,
942 T_AARE_protocol_version_bits, 1, hf_index, ett_acse_T_AARE_protocol_version,
943 NULL);
945 return offset;
950 static int
951 dissect_acse_T_AARE_aSO_context_name(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
952 offset = dissect_ber_object_identifier_str(false, actx, tree, tvb, offset,
953 hf_index, &actx->external.direct_reference);
954 actx->external.direct_ref_present = (actx->external.direct_reference != NULL) ? true : false;
957 return offset;
961 static const value_string acse_Associate_result_vals[] = {
962 { 0, "accepted" },
963 { 1, "rejected-permanent" },
964 { 2, "rejected-transient" },
965 { 0, NULL }
969 static int
970 dissect_acse_Associate_result(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
971 offset = dissect_ber_constrained_integer(implicit_tag, actx, tree, tvb, offset,
972 0U, 2U, hf_index, NULL);
974 return offset;
978 static const value_string acse_T_service_user_vals[] = {
979 { 0, "null" },
980 { 1, "no-reason-given" },
981 { 2, "application-context-name-not-supported" },
982 { 3, "calling-AP-title-not-recognized" },
983 { 4, "calling-AP-invocation-identifier-not-recognized" },
984 { 5, "calling-AE-qualifier-not-recognized" },
985 { 6, "calling-AE-invocation-identifier-not-recognized" },
986 { 7, "called-AP-title-not-recognized" },
987 { 8, "called-AP-invocation-identifier-not-recognized" },
988 { 9, "called-AE-qualifier-not-recognized" },
989 { 10, "called-AE-invocation-identifier-not-recognized" },
990 { 11, "authentication-mechanism-name-not-recognized" },
991 { 12, "authentication-mechanism-name-required" },
992 { 13, "authentication-failure" },
993 { 14, "authentication-required" },
994 { 0, NULL }
998 static int
999 dissect_acse_T_service_user(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1000 offset = dissect_ber_constrained_integer(implicit_tag, actx, tree, tvb, offset,
1001 0U, 14U, hf_index, NULL);
1003 return offset;
1007 static const value_string acse_T_service_provider_vals[] = {
1008 { 0, "null" },
1009 { 1, "no-reason-given" },
1010 { 2, "no-common-acse-version" },
1011 { 0, NULL }
1015 static int
1016 dissect_acse_T_service_provider(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1017 offset = dissect_ber_constrained_integer(implicit_tag, actx, tree, tvb, offset,
1018 0U, 2U, hf_index, NULL);
1020 return offset;
1024 static const value_string acse_Associate_source_diagnostic_vals[] = {
1025 { 1, "service-user" },
1026 { 2, "service-provider" },
1027 { 0, NULL }
1030 static const ber_choice_t Associate_source_diagnostic_choice[] = {
1031 { 1, &hf_acse_service_user , BER_CLASS_CON, 1, 0, dissect_acse_T_service_user },
1032 { 2, &hf_acse_service_provider, BER_CLASS_CON, 2, 0, dissect_acse_T_service_provider },
1033 { 0, NULL, 0, 0, 0, NULL }
1036 static int
1037 dissect_acse_Associate_source_diagnostic(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1038 offset = dissect_ber_choice(actx, tree, tvb, offset,
1039 Associate_source_diagnostic_choice, hf_index, ett_acse_Associate_source_diagnostic,
1040 NULL);
1042 return offset;
1046 static const value_string acse_Result_vals[] = {
1047 { 0, "acceptance" },
1048 { 1, "user-rejection" },
1049 { 2, "provider-rejection" },
1050 { 0, NULL }
1054 static int
1055 dissect_acse_Result(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1056 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
1057 NULL);
1059 return offset;
1064 static int
1065 dissect_acse_Concrete_syntax_name(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1066 offset = dissect_acse_TransferSyntaxName(implicit_tag, tvb, offset, actx, tree, hf_index);
1068 return offset;
1072 static const value_string acse_T_provider_reason_vals[] = {
1073 { 0, "reason-not-specified" },
1074 { 1, "abstract-syntax-not-supported" },
1075 { 2, "proposed-transfer-syntaxes-not-supported" },
1076 { 3, "local-limit-on-DCS-exceeded" },
1077 { 0, NULL }
1081 static int
1082 dissect_acse_T_provider_reason(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1083 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
1084 NULL);
1086 return offset;
1090 static const ber_sequence_t P_context_result_list_item_sequence[] = {
1091 { &hf_acse_pcontext_result, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_acse_Result },
1092 { &hf_acse_concrete_syntax_name, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_Concrete_syntax_name },
1093 { &hf_acse_provider_reason, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_T_provider_reason },
1094 { NULL, 0, 0, 0, NULL }
1097 static int
1098 dissect_acse_P_context_result_list_item(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1099 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1100 P_context_result_list_item_sequence, hf_index, ett_acse_P_context_result_list_item);
1102 return offset;
1106 static const ber_sequence_t P_context_result_list_sequence_of[1] = {
1107 { &hf_acse_P_context_result_list_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_acse_P_context_result_list_item },
1110 static int
1111 dissect_acse_P_context_result_list(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1112 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
1113 P_context_result_list_sequence_of, hf_index, ett_acse_P_context_result_list);
1115 return offset;
1119 static const ber_sequence_t AARE_apdu_U_sequence[] = {
1120 { &hf_acse_aARE_protocol_version, BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_T_AARE_protocol_version },
1121 { &hf_acse_aARE_aSO_context_name, BER_CLASS_CON, 1, 0, dissect_acse_T_AARE_aSO_context_name },
1122 { &hf_acse_result , BER_CLASS_CON, 2, 0, dissect_acse_Associate_result },
1123 { &hf_acse_result_source_diagnostic, BER_CLASS_CON, 3, BER_FLAGS_NOTCHKTAG, dissect_acse_Associate_source_diagnostic },
1124 { &hf_acse_responding_AP_title, BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_AP_title },
1125 { &hf_acse_responding_AE_qualifier, BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_AE_qualifier },
1126 { &hf_acse_responding_AP_invocation_identifier, BER_CLASS_CON, 6, BER_FLAGS_OPTIONAL, dissect_acse_AP_invocation_identifier },
1127 { &hf_acse_responding_AE_invocation_identifier, BER_CLASS_CON, 7, BER_FLAGS_OPTIONAL, dissect_acse_AE_invocation_identifier },
1128 { &hf_acse_responder_acse_requirements, BER_CLASS_CON, 8, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_ACSE_requirements },
1129 { &hf_acse_mechanism_name , BER_CLASS_CON, 9, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_Mechanism_name },
1130 { &hf_acse_responding_authentication_value, BER_CLASS_CON, 10, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_Authentication_value },
1131 { &hf_acse_aSO_context_name_list, BER_CLASS_CON, 11, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_ASO_context_name_list },
1132 { &hf_acse_implementation_information, BER_CLASS_CON, 29, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_Implementation_data },
1133 { &hf_acse_p_context_result_list, BER_CLASS_CON, 12, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_P_context_result_list },
1134 { &hf_acse_called_asoi_tag, BER_CLASS_CON, 13, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_ASOI_tag },
1135 { &hf_acse_calling_asoi_tag, BER_CLASS_CON, 14, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_ASOI_tag },
1136 { &hf_acse_aARE_user_information, BER_CLASS_CON, 30, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_Association_data },
1137 { NULL, 0, 0, 0, NULL }
1140 static int
1141 dissect_acse_AARE_apdu_U(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1142 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1143 AARE_apdu_U_sequence, hf_index, ett_acse_AARE_apdu_U);
1145 return offset;
1150 static int
1151 dissect_acse_AARE_apdu(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1152 col_append_str(actx->pinfo->cinfo, COL_INFO, "A-Associate-Response");
1154 offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
1155 hf_index, BER_CLASS_APP, 1, true, dissect_acse_AARE_apdu_U);
1159 return offset;
1163 static const value_string acse_Release_request_reason_vals[] = {
1164 { 0, "normal" },
1165 { 1, "urgent" },
1166 { 30, "user-defined" },
1167 { 0, NULL }
1171 static int
1172 dissect_acse_Release_request_reason(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1173 int reason = -1;
1175 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
1176 &reason);
1179 if(reason != -1)
1180 col_append_fstr(actx->pinfo->cinfo, COL_INFO, " (%s)", val_to_str(reason, acse_Release_request_reason_vals, "reason(%d)"));
1183 return offset;
1187 static const ber_sequence_t RLRQ_apdu_U_sequence[] = {
1188 { &hf_acse_rLRQ_reason , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_Release_request_reason },
1189 { &hf_acse_aso_qualifier , BER_CLASS_CON, 13, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_ASO_qualifier },
1190 { &hf_acse_asoi_identifier, BER_CLASS_CON, 14, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_ASOI_identifier },
1191 { &hf_acse_rLRQ_user_information, BER_CLASS_CON, 30, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_Association_data },
1192 { NULL, 0, 0, 0, NULL }
1195 static int
1196 dissect_acse_RLRQ_apdu_U(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1197 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1198 RLRQ_apdu_U_sequence, hf_index, ett_acse_RLRQ_apdu_U);
1200 return offset;
1205 static int
1206 dissect_acse_RLRQ_apdu(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1207 col_append_str(actx->pinfo->cinfo, COL_INFO, "Release-Request");
1209 offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
1210 hf_index, BER_CLASS_APP, 2, true, dissect_acse_RLRQ_apdu_U);
1214 return offset;
1218 static const value_string acse_Release_response_reason_vals[] = {
1219 { 0, "normal" },
1220 { 1, "not-finished" },
1221 { 30, "user-defined" },
1222 { 0, NULL }
1226 static int
1227 dissect_acse_Release_response_reason(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1228 int reason = -1;
1230 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
1231 &reason);
1234 if(reason != -1)
1235 col_append_fstr(actx->pinfo->cinfo, COL_INFO, " (%s)", val_to_str(reason, acse_Release_response_reason_vals, "reason(%d)"));
1238 return offset;
1242 static const ber_sequence_t RLRE_apdu_U_sequence[] = {
1243 { &hf_acse_rLRE_reason , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_Release_response_reason },
1244 { &hf_acse_aso_qualifier , BER_CLASS_CON, 13, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_ASO_qualifier },
1245 { &hf_acse_asoi_identifier, BER_CLASS_CON, 14, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_ASOI_identifier },
1246 { &hf_acse_rLRE_user_information, BER_CLASS_CON, 30, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_Association_data },
1247 { NULL, 0, 0, 0, NULL }
1250 static int
1251 dissect_acse_RLRE_apdu_U(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1252 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1253 RLRE_apdu_U_sequence, hf_index, ett_acse_RLRE_apdu_U);
1255 return offset;
1260 static int
1261 dissect_acse_RLRE_apdu(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1262 col_append_str(actx->pinfo->cinfo, COL_INFO, "Release-Response");
1264 offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
1265 hf_index, BER_CLASS_APP, 3, true, dissect_acse_RLRE_apdu_U);
1269 return offset;
1273 static const value_string acse_ABRT_source_vals[] = {
1274 { 0, "service-user" },
1275 { 1, "service-provider" },
1276 { 0, NULL }
1280 static int
1281 dissect_acse_ABRT_source(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1282 int source = -1;
1284 offset = dissect_ber_constrained_integer(implicit_tag, actx, tree, tvb, offset,
1285 0U, 1U, hf_index, &source);
1288 if(source != -1)
1289 col_append_fstr(actx->pinfo->cinfo, COL_INFO, " (%s)", val_to_str(source, acse_ABRT_source_vals, "source(%d)"));
1292 return offset;
1296 static const value_string acse_ABRT_diagnostic_vals[] = {
1297 { 1, "no-reason-given" },
1298 { 2, "protocol-error" },
1299 { 3, "authentication-mechanism-name-not-recognized" },
1300 { 4, "authentication-mechanism-name-required" },
1301 { 5, "authentication-failure" },
1302 { 6, "authentication-required" },
1303 { 0, NULL }
1307 static int
1308 dissect_acse_ABRT_diagnostic(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1309 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
1310 NULL);
1312 return offset;
1316 static const ber_sequence_t ABRT_apdu_U_sequence[] = {
1317 { &hf_acse_abort_source , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_acse_ABRT_source },
1318 { &hf_acse_abort_diagnostic, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_ABRT_diagnostic },
1319 { &hf_acse_aso_qualifier , BER_CLASS_CON, 13, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_ASO_qualifier },
1320 { &hf_acse_asoi_identifier, BER_CLASS_CON, 14, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_ASOI_identifier },
1321 { &hf_acse_aBRT_user_information, BER_CLASS_CON, 30, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_Association_data },
1322 { NULL, 0, 0, 0, NULL }
1325 static int
1326 dissect_acse_ABRT_apdu_U(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1327 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1328 ABRT_apdu_U_sequence, hf_index, ett_acse_ABRT_apdu_U);
1330 return offset;
1335 static int
1336 dissect_acse_ABRT_apdu(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1337 col_append_str(actx->pinfo->cinfo, COL_INFO, "Abort");
1339 offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
1340 hf_index, BER_CLASS_APP, 4, true, dissect_acse_ABRT_apdu_U);
1344 return offset;
1349 static int
1350 dissect_acse_User_information(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1351 offset = dissect_acse_Association_data(implicit_tag, tvb, offset, actx, tree, hf_index);
1353 return offset;
1358 static int
1359 dissect_acse_Simply_encoded_data(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1360 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
1361 NULL);
1363 return offset;
1368 static int
1369 dissect_acse_T_simple_ASN1_type(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1370 /*XXX not implemented yet */
1373 return offset;
1378 static int
1379 dissect_acse_OCTET_STRING(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1380 offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
1381 NULL);
1383 return offset;
1387 static const value_string acse_T_presentation_data_values_vals[] = {
1388 { 0, "simple-ASN1-type" },
1389 { 1, "octet-aligned" },
1390 { 2, "arbitrary" },
1391 { 0, NULL }
1394 static const ber_choice_t T_presentation_data_values_choice[] = {
1395 { 0, &hf_acse_simple_ASN1_type, BER_CLASS_CON, 0, 0, dissect_acse_T_simple_ASN1_type },
1396 { 1, &hf_acse_pDVList_octet_aligned, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_acse_OCTET_STRING },
1397 { 2, &hf_acse_arbitrary , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_acse_BIT_STRING },
1398 { 0, NULL, 0, 0, 0, NULL }
1401 static int
1402 dissect_acse_T_presentation_data_values(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1403 offset = dissect_ber_choice(actx, tree, tvb, offset,
1404 T_presentation_data_values_choice, hf_index, ett_acse_T_presentation_data_values,
1405 NULL);
1407 return offset;
1411 static const ber_sequence_t PDV_list_sequence[] = {
1412 { &hf_acse_transfer_syntax_name, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_acse_TransferSyntaxName },
1413 { &hf_acse_presentation_context_identifier, BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_acse_Presentation_context_identifier },
1414 { &hf_acse_presentation_data_values, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_acse_T_presentation_data_values },
1415 { NULL, 0, 0, 0, NULL }
1418 static int
1419 dissect_acse_PDV_list(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1420 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1421 PDV_list_sequence, hf_index, ett_acse_PDV_list);
1423 return offset;
1427 static const value_string acse_User_Data_vals[] = {
1428 { 0, "user-information" },
1429 { 1, "simply-encoded-data" },
1430 { 2, "fully-encoded-data" },
1431 { 0, NULL }
1434 static const ber_choice_t User_Data_choice[] = {
1435 { 0, &hf_acse_user_information, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_acse_User_information },
1436 { 1, &hf_acse_simply_encoded_data, BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_acse_Simply_encoded_data },
1437 { 2, &hf_acse_fully_encoded_data, BER_CLASS_CON, 0, 0, dissect_acse_PDV_list },
1438 { 0, NULL, 0, 0, 0, NULL }
1441 static int
1442 dissect_acse_User_Data(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1443 offset = dissect_ber_choice(actx, tree, tvb, offset,
1444 User_Data_choice, hf_index, ett_acse_User_Data,
1445 NULL);
1447 return offset;
1451 static const ber_sequence_t A_DT_apdu_U_sequence[] = {
1452 { &hf_acse_aso_qualifier , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_ASO_qualifier },
1453 { &hf_acse_asoi_identifier, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_ASOI_identifier },
1454 { &hf_acse_a_user_data , BER_CLASS_CON, 30, BER_FLAGS_NOTCHKTAG, dissect_acse_User_Data },
1455 { NULL, 0, 0, 0, NULL }
1458 static int
1459 dissect_acse_A_DT_apdu_U(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1460 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1461 A_DT_apdu_U_sequence, hf_index, ett_acse_A_DT_apdu_U);
1463 return offset;
1468 static int
1469 dissect_acse_A_DT_apdu(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1470 offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
1471 hf_index, BER_CLASS_APP, 5, true, dissect_acse_A_DT_apdu_U);
1473 return offset;
1478 static int
1479 dissect_acse_T_ACRQ_aSO_context_name(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1480 offset = dissect_ber_object_identifier_str(false, actx, tree, tvb, offset,
1481 hf_index, &actx->external.direct_reference);
1482 actx->external.direct_ref_present = (actx->external.direct_reference != NULL) ? true : false;
1485 return offset;
1489 static const ber_sequence_t ACRQ_apdu_U_sequence[] = {
1490 { &hf_acse_aso_qualifier , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_ASO_qualifier },
1491 { &hf_acse_asoi_identifier, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_ASOI_identifier },
1492 { &hf_acse_aCRQ_aSO_context_name, BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_T_ACRQ_aSO_context_name },
1493 { &hf_acse_aSO_context_name_list, BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_ASO_context_name_list },
1494 { &hf_acse_p_context_definition_list, BER_CLASS_CON, 5, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_Syntactic_context_list },
1495 { &hf_acse_user_information, BER_CLASS_CON, 30, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_User_information },
1496 { NULL, 0, 0, 0, NULL }
1499 static int
1500 dissect_acse_ACRQ_apdu_U(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1501 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1502 ACRQ_apdu_U_sequence, hf_index, ett_acse_ACRQ_apdu_U);
1504 return offset;
1509 static int
1510 dissect_acse_ACRQ_apdu(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1511 offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
1512 hf_index, BER_CLASS_APP, 6, true, dissect_acse_ACRQ_apdu_U);
1514 return offset;
1519 static int
1520 dissect_acse_T_ACRP_aSO_context_name(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1521 offset = dissect_ber_object_identifier_str(false, actx, tree, tvb, offset,
1522 hf_index, &actx->external.direct_reference);
1523 actx->external.direct_ref_present = (actx->external.direct_reference != NULL) ? true : false;
1526 return offset;
1530 static const ber_sequence_t ACRP_apdu_U_sequence[] = {
1531 { &hf_acse_aso_qualifier , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_NOTCHKTAG, dissect_acse_ASO_qualifier },
1532 { &hf_acse_asoi_identifier, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_ASOI_identifier },
1533 { &hf_acse_aSO_context_name, BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_T_ACRP_aSO_context_name },
1534 { &hf_acse_p_context_result_list, BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_P_context_result_list },
1535 { &hf_acse_user_information, BER_CLASS_CON, 30, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_acse_User_information },
1536 { NULL, 0, 0, 0, NULL }
1539 static int
1540 dissect_acse_ACRP_apdu_U(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1541 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1542 ACRP_apdu_U_sequence, hf_index, ett_acse_ACRP_apdu_U);
1544 return offset;
1549 static int
1550 dissect_acse_ACRP_apdu(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1551 offset = dissect_ber_tagged_type(implicit_tag, actx, tree, tvb, offset,
1552 hf_index, BER_CLASS_APP, 7, true, dissect_acse_ACRP_apdu_U);
1554 return offset;
1558 static const ber_choice_t ACSE_apdu_choice[] = {
1559 { 0, &hf_acse_aarq , BER_CLASS_APP, 0, BER_FLAGS_IMPLTAG, dissect_acse_AARQ_apdu },
1560 { 1, &hf_acse_aare , BER_CLASS_APP, 1, BER_FLAGS_IMPLTAG, dissect_acse_AARE_apdu },
1561 { 2, &hf_acse_rlrq , BER_CLASS_APP, 2, BER_FLAGS_IMPLTAG, dissect_acse_RLRQ_apdu },
1562 { 3, &hf_acse_rlre , BER_CLASS_APP, 3, BER_FLAGS_IMPLTAG, dissect_acse_RLRE_apdu },
1563 { 4, &hf_acse_abrt , BER_CLASS_APP, 4, BER_FLAGS_IMPLTAG, dissect_acse_ABRT_apdu },
1564 { 5, &hf_acse_adt , BER_CLASS_APP, 5, BER_FLAGS_IMPLTAG, dissect_acse_A_DT_apdu },
1565 { 6, &hf_acse_acrq , BER_CLASS_APP, 6, BER_FLAGS_IMPLTAG, dissect_acse_ACRQ_apdu },
1566 { 7, &hf_acse_acrp , BER_CLASS_APP, 7, BER_FLAGS_IMPLTAG, dissect_acse_ACRP_apdu },
1567 { 0, NULL, 0, 0, 0, NULL }
1570 static int
1571 dissect_acse_ACSE_apdu(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1572 offset = dissect_ber_choice(actx, tree, tvb, offset,
1573 ACSE_apdu_choice, hf_index, ett_acse_ACSE_apdu,
1574 NULL);
1576 return offset;
1581 static int
1582 dissect_acse_AE_title_form1(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1583 offset = dissect_x509if_Name(implicit_tag, tvb, offset, actx, tree, hf_index);
1585 return offset;
1590 static int
1591 dissect_acse_AE_title_form2(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1592 offset = dissect_ber_object_identifier(implicit_tag, actx, tree, tvb, offset, hf_index, NULL);
1594 return offset;
1598 const value_string acse_AE_title_vals[] = {
1599 { 0, "ae-title-form1" },
1600 { 1, "ae-title-form2" },
1601 { 0, NULL }
1604 static const ber_choice_t AE_title_choice[] = {
1605 { 0, &hf_acse_ae_title_form1 , BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG, dissect_acse_AE_title_form1 },
1606 { 1, &hf_acse_ae_title_form2 , BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_acse_AE_title_form2 },
1607 { 0, NULL, 0, 0, 0, NULL }
1611 dissect_acse_AE_title(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1612 offset = dissect_ber_choice(actx, tree, tvb, offset,
1613 AE_title_choice, hf_index, ett_acse_AE_title,
1614 NULL);
1616 return offset;
1622 * Dissect ACSE PDUs inside a PPDU.
1624 static int
1625 dissect_acse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* data)
1627 int offset = 0;
1628 proto_item *item;
1629 proto_tree *tree;
1630 char *oid;
1631 struct SESSION_DATA_STRUCTURE* session;
1632 asn1_ctx_t asn1_ctx;
1633 asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, true, pinfo);
1635 /* do we have spdu type from the session dissector? */
1636 if (data == NULL) {
1637 return 0;
1640 /* first, try to check length */
1641 /* do we have at least 2 bytes */
1642 if (!tvb_bytes_exist(tvb, 0, 2)) {
1643 proto_tree_add_item(parent_tree, hf_acse_user_data, tvb, offset,
1644 tvb_reported_length_remaining(tvb,offset), ENC_NA);
1645 return 0; /* no, it isn't a ACSE PDU */
1648 session = ( (struct SESSION_DATA_STRUCTURE*)data);
1649 if (session->spdu_type == 0) {
1650 if (parent_tree) {
1651 REPORT_DISSECTOR_BUG("Wrong spdu type %x from session dissector.",session->spdu_type);
1652 return 0;
1656 asn1_ctx.private_data = session;
1657 /* save parent_tree so subdissectors can create new top nodes */
1658 asn1_ctx.subtree.top_tree = parent_tree;
1660 /* ACSE has only AARQ,AARE,RLRQ,RLRE,ABRT type of pdu */
1661 /* reject everything else */
1662 /* data pdu is not ACSE pdu and has to go directly to app dissector */
1663 switch (session->spdu_type) {
1664 case SES_CONNECTION_REQUEST: /* AARQ */
1665 case SES_CONNECTION_ACCEPT: /* AARE */
1666 case SES_REFUSE: /* RLRE */
1667 case SES_DISCONNECT: /* RLRQ */
1668 case SES_FINISH: /* RLRE */
1669 case SES_ABORT: /* ABRT */
1670 case CLSES_UNIT_DATA: /* AARQ Connectionless session */
1671 break;
1672 case SES_DATA_TRANSFER:
1673 oid=find_oid_by_pres_ctx_id(pinfo, indir_ref);
1674 if (oid) {
1675 if (strcmp(oid, ACSE_APDU_OID) == 0) {
1676 proto_tree_add_expert_format(parent_tree, pinfo, &ei_acse_invalid_oid, tvb, offset, -1,
1677 "Invalid OID: %s", ACSE_APDU_OID);
1679 else {
1680 call_ber_oid_callback(oid, tvb, offset, pinfo, parent_tree, NULL);
1682 } else {
1683 proto_tree_add_expert(parent_tree, pinfo, &ei_acse_dissector_not_available,
1684 tvb, offset, -1);
1686 return 0;
1687 default:
1688 return 0;
1691 if (session->spdu_type == CLSES_UNIT_DATA) {
1692 /* create display subtree for the connectionless protocol */
1693 item = proto_tree_add_item(parent_tree, proto_clacse, tvb, 0, -1, ENC_NA);
1694 tree = proto_item_add_subtree(item, ett_acse);
1696 col_set_str(pinfo->cinfo, COL_PROTOCOL, "CL-ACSE");
1697 col_clear(pinfo->cinfo, COL_INFO);
1698 } else {
1699 /* create display subtree for the protocol */
1700 item = proto_tree_add_item(parent_tree, proto_acse, tvb, 0, -1, ENC_NA);
1701 tree = proto_item_add_subtree(item, ett_acse);
1703 col_set_str(pinfo->cinfo, COL_PROTOCOL, "ACSE");
1704 col_clear(pinfo->cinfo, COL_INFO);
1707 /* we can't make any additional checking here */
1708 /* postpone it before dissector will have more information */
1709 while (tvb_reported_length_remaining(tvb, offset) > 0) {
1710 int old_offset=offset;
1711 offset = dissect_acse_ACSE_apdu(false, tvb, offset, &asn1_ctx, tree, -1);
1712 if (offset == old_offset) {
1713 proto_tree_add_expert(tree, pinfo, &ei_acse_malformed, tvb, offset, -1);
1714 break;
1718 return tvb_captured_length(tvb);
1721 /*--- proto_register_acse ----------------------------------------------*/
1722 void proto_register_acse(void) {
1724 /* List of fields */
1725 static hf_register_info hf[] = {
1726 { &hf_acse_user_data,
1727 { "User data", "acse.user_data",
1728 FT_BYTES, BASE_NONE, NULL, 0,
1729 NULL, HFILL }},
1730 { &hf_acse_direct_reference,
1731 { "direct-reference", "acse.direct_reference",
1732 FT_OID, BASE_NONE, NULL, 0,
1733 "T_direct_reference", HFILL }},
1734 { &hf_acse_indirect_reference,
1735 { "indirect-reference", "acse.indirect_reference",
1736 FT_INT32, BASE_DEC, NULL, 0,
1737 "T_indirect_reference", HFILL }},
1738 { &hf_acse_data_value_descriptor,
1739 { "data-value-descriptor", "acse.data_value_descriptor",
1740 FT_STRING, BASE_NONE, NULL, 0,
1741 "ObjectDescriptor", HFILL }},
1742 { &hf_acse_encoding,
1743 { "encoding", "acse.encoding",
1744 FT_UINT32, BASE_DEC, VALS(acse_T_encoding_vals), 0,
1745 NULL, HFILL }},
1746 { &hf_acse_single_ASN1_type,
1747 { "single-ASN1-type", "acse.single_ASN1_type_element",
1748 FT_NONE, BASE_NONE, NULL, 0,
1749 NULL, HFILL }},
1750 { &hf_acse_octet_aligned,
1751 { "octet-aligned", "acse.octet_aligned",
1752 FT_BYTES, BASE_NONE, NULL, 0,
1753 "T_octet_aligned", HFILL }},
1754 { &hf_acse_arbitrary,
1755 { "arbitrary", "acse.arbitrary",
1756 FT_BYTES, BASE_NONE, NULL, 0,
1757 "BIT_STRING", HFILL }},
1758 { &hf_acse_aarq,
1759 { "aarq", "acse.aarq_element",
1760 FT_NONE, BASE_NONE, NULL, 0,
1761 "AARQ_apdu", HFILL }},
1762 { &hf_acse_aare,
1763 { "aare", "acse.aare_element",
1764 FT_NONE, BASE_NONE, NULL, 0,
1765 "AARE_apdu", HFILL }},
1766 { &hf_acse_rlrq,
1767 { "rlrq", "acse.rlrq_element",
1768 FT_NONE, BASE_NONE, NULL, 0,
1769 "RLRQ_apdu", HFILL }},
1770 { &hf_acse_rlre,
1771 { "rlre", "acse.rlre_element",
1772 FT_NONE, BASE_NONE, NULL, 0,
1773 "RLRE_apdu", HFILL }},
1774 { &hf_acse_abrt,
1775 { "abrt", "acse.abrt_element",
1776 FT_NONE, BASE_NONE, NULL, 0,
1777 "ABRT_apdu", HFILL }},
1778 { &hf_acse_adt,
1779 { "adt", "acse.adt_element",
1780 FT_NONE, BASE_NONE, NULL, 0,
1781 "A_DT_apdu", HFILL }},
1782 { &hf_acse_acrq,
1783 { "acrq", "acse.acrq_element",
1784 FT_NONE, BASE_NONE, NULL, 0,
1785 "ACRQ_apdu", HFILL }},
1786 { &hf_acse_acrp,
1787 { "acrp", "acse.acrp_element",
1788 FT_NONE, BASE_NONE, NULL, 0,
1789 "ACRP_apdu", HFILL }},
1790 { &hf_acse_aARQ_protocol_version,
1791 { "protocol-version", "acse.aARQ_protocol_version",
1792 FT_BYTES, BASE_NONE, NULL, 0,
1793 "T_AARQ_protocol_version", HFILL }},
1794 { &hf_acse_aARQ_aSO_context_name,
1795 { "aSO-context-name", "acse.aARQ_aSO_context_name",
1796 FT_OID, BASE_NONE, NULL, 0,
1797 "T_AARQ_aSO_context_name", HFILL }},
1798 { &hf_acse_called_AP_title,
1799 { "called-AP-title", "acse.called_AP_title",
1800 FT_UINT32, BASE_DEC, VALS(acse_AP_title_vals), 0,
1801 "AP_title", HFILL }},
1802 { &hf_acse_called_AE_qualifier,
1803 { "called-AE-qualifier", "acse.called_AE_qualifier",
1804 FT_UINT32, BASE_DEC, VALS(acse_ASO_qualifier_vals), 0,
1805 "AE_qualifier", HFILL }},
1806 { &hf_acse_called_AP_invocation_identifier,
1807 { "called-AP-invocation-identifier", "acse.called_AP_invocation_identifier",
1808 FT_INT32, BASE_DEC, NULL, 0,
1809 "AP_invocation_identifier", HFILL }},
1810 { &hf_acse_called_AE_invocation_identifier,
1811 { "called-AE-invocation-identifier", "acse.called_AE_invocation_identifier",
1812 FT_INT32, BASE_DEC, NULL, 0,
1813 "AE_invocation_identifier", HFILL }},
1814 { &hf_acse_calling_AP_title,
1815 { "calling-AP-title", "acse.calling_AP_title",
1816 FT_UINT32, BASE_DEC, VALS(acse_AP_title_vals), 0,
1817 "AP_title", HFILL }},
1818 { &hf_acse_calling_AE_qualifier,
1819 { "calling-AE-qualifier", "acse.calling_AE_qualifier",
1820 FT_UINT32, BASE_DEC, VALS(acse_ASO_qualifier_vals), 0,
1821 "AE_qualifier", HFILL }},
1822 { &hf_acse_calling_AP_invocation_identifier,
1823 { "calling-AP-invocation-identifier", "acse.calling_AP_invocation_identifier",
1824 FT_INT32, BASE_DEC, NULL, 0,
1825 "AP_invocation_identifier", HFILL }},
1826 { &hf_acse_calling_AE_invocation_identifier,
1827 { "calling-AE-invocation-identifier", "acse.calling_AE_invocation_identifier",
1828 FT_INT32, BASE_DEC, NULL, 0,
1829 "AE_invocation_identifier", HFILL }},
1830 { &hf_acse_sender_acse_requirements,
1831 { "sender-acse-requirements", "acse.sender_acse_requirements",
1832 FT_BYTES, BASE_NONE, NULL, 0,
1833 "ACSE_requirements", HFILL }},
1834 { &hf_acse_mechanism_name,
1835 { "mechanism-name", "acse.mechanism_name",
1836 FT_OID, BASE_NONE, NULL, 0,
1837 NULL, HFILL }},
1838 { &hf_acse_calling_authentication_value,
1839 { "calling-authentication-value", "acse.calling_authentication_value",
1840 FT_UINT32, BASE_DEC, VALS(acse_Authentication_value_vals), 0,
1841 "Authentication_value", HFILL }},
1842 { &hf_acse_aSO_context_name_list,
1843 { "aSO-context-name-list", "acse.aSO_context_name_list",
1844 FT_UINT32, BASE_DEC, NULL, 0,
1845 NULL, HFILL }},
1846 { &hf_acse_implementation_information,
1847 { "implementation-information", "acse.implementation_information",
1848 FT_STRING, BASE_NONE, NULL, 0,
1849 "Implementation_data", HFILL }},
1850 { &hf_acse_p_context_definition_list,
1851 { "p-context-definition-list", "acse.p_context_definition_list",
1852 FT_UINT32, BASE_DEC, VALS(acse_Syntactic_context_list_vals), 0,
1853 "Syntactic_context_list", HFILL }},
1854 { &hf_acse_called_asoi_tag,
1855 { "called-asoi-tag", "acse.called_asoi_tag",
1856 FT_UINT32, BASE_DEC, NULL, 0,
1857 "ASOI_tag", HFILL }},
1858 { &hf_acse_calling_asoi_tag,
1859 { "calling-asoi-tag", "acse.calling_asoi_tag",
1860 FT_UINT32, BASE_DEC, NULL, 0,
1861 "ASOI_tag", HFILL }},
1862 { &hf_acse_aARQ_user_information,
1863 { "user-information", "acse.aARQ_user_information",
1864 FT_UINT32, BASE_DEC, NULL, 0,
1865 "Association_data", HFILL }},
1866 { &hf_acse_aARE_protocol_version,
1867 { "protocol-version", "acse.aARE_protocol_version",
1868 FT_BYTES, BASE_NONE, NULL, 0,
1869 "T_AARE_protocol_version", HFILL }},
1870 { &hf_acse_aARE_aSO_context_name,
1871 { "aSO-context-name", "acse.aARE_aSO_context_name",
1872 FT_OID, BASE_NONE, NULL, 0,
1873 "T_AARE_aSO_context_name", HFILL }},
1874 { &hf_acse_result,
1875 { "result", "acse.result",
1876 FT_UINT32, BASE_DEC, VALS(acse_Associate_result_vals), 0,
1877 "Associate_result", HFILL }},
1878 { &hf_acse_result_source_diagnostic,
1879 { "result-source-diagnostic", "acse.result_source_diagnostic",
1880 FT_UINT32, BASE_DEC, VALS(acse_Associate_source_diagnostic_vals), 0,
1881 "Associate_source_diagnostic", HFILL }},
1882 { &hf_acse_responding_AP_title,
1883 { "responding-AP-title", "acse.responding_AP_title",
1884 FT_UINT32, BASE_DEC, VALS(acse_AP_title_vals), 0,
1885 "AP_title", HFILL }},
1886 { &hf_acse_responding_AE_qualifier,
1887 { "responding-AE-qualifier", "acse.responding_AE_qualifier",
1888 FT_UINT32, BASE_DEC, VALS(acse_ASO_qualifier_vals), 0,
1889 "AE_qualifier", HFILL }},
1890 { &hf_acse_responding_AP_invocation_identifier,
1891 { "responding-AP-invocation-identifier", "acse.responding_AP_invocation_identifier",
1892 FT_INT32, BASE_DEC, NULL, 0,
1893 "AP_invocation_identifier", HFILL }},
1894 { &hf_acse_responding_AE_invocation_identifier,
1895 { "responding-AE-invocation-identifier", "acse.responding_AE_invocation_identifier",
1896 FT_INT32, BASE_DEC, NULL, 0,
1897 "AE_invocation_identifier", HFILL }},
1898 { &hf_acse_responder_acse_requirements,
1899 { "responder-acse-requirements", "acse.responder_acse_requirements",
1900 FT_BYTES, BASE_NONE, NULL, 0,
1901 "ACSE_requirements", HFILL }},
1902 { &hf_acse_responding_authentication_value,
1903 { "responding-authentication-value", "acse.responding_authentication_value",
1904 FT_UINT32, BASE_DEC, VALS(acse_Authentication_value_vals), 0,
1905 "Authentication_value", HFILL }},
1906 { &hf_acse_p_context_result_list,
1907 { "p-context-result-list", "acse.p_context_result_list",
1908 FT_UINT32, BASE_DEC, NULL, 0,
1909 NULL, HFILL }},
1910 { &hf_acse_aARE_user_information,
1911 { "user-information", "acse.aARE_user_information",
1912 FT_UINT32, BASE_DEC, NULL, 0,
1913 "Association_data", HFILL }},
1914 { &hf_acse_rLRQ_reason,
1915 { "reason", "acse.rLRQ_reason",
1916 FT_INT32, BASE_DEC, VALS(acse_Release_request_reason_vals), 0,
1917 "Release_request_reason", HFILL }},
1918 { &hf_acse_aso_qualifier,
1919 { "aso-qualifier", "acse.aso_qualifier",
1920 FT_UINT32, BASE_DEC, VALS(acse_ASO_qualifier_vals), 0,
1921 NULL, HFILL }},
1922 { &hf_acse_asoi_identifier,
1923 { "asoi-identifier", "acse.asoi_identifier",
1924 FT_UINT32, BASE_DEC, NULL, 0,
1925 NULL, HFILL }},
1926 { &hf_acse_rLRQ_user_information,
1927 { "user-information", "acse.rLRQ_user_information",
1928 FT_UINT32, BASE_DEC, NULL, 0,
1929 "Association_data", HFILL }},
1930 { &hf_acse_rLRE_reason,
1931 { "reason", "acse.rLRE_reason",
1932 FT_INT32, BASE_DEC, VALS(acse_Release_response_reason_vals), 0,
1933 "Release_response_reason", HFILL }},
1934 { &hf_acse_rLRE_user_information,
1935 { "user-information", "acse.rLRE_user_information",
1936 FT_UINT32, BASE_DEC, NULL, 0,
1937 "Association_data", HFILL }},
1938 { &hf_acse_abort_source,
1939 { "abort-source", "acse.abort_source",
1940 FT_UINT32, BASE_DEC, VALS(acse_ABRT_source_vals), 0,
1941 "ABRT_source", HFILL }},
1942 { &hf_acse_abort_diagnostic,
1943 { "abort-diagnostic", "acse.abort_diagnostic",
1944 FT_UINT32, BASE_DEC, VALS(acse_ABRT_diagnostic_vals), 0,
1945 "ABRT_diagnostic", HFILL }},
1946 { &hf_acse_aBRT_user_information,
1947 { "user-information", "acse.aBRT_user_information",
1948 FT_UINT32, BASE_DEC, NULL, 0,
1949 "Association_data", HFILL }},
1950 { &hf_acse_a_user_data,
1951 { "a-user-data", "acse.a_user_data",
1952 FT_UINT32, BASE_DEC, VALS(acse_User_Data_vals), 0,
1953 "User_Data", HFILL }},
1954 { &hf_acse_aCRQ_aSO_context_name,
1955 { "aSO-context-name", "acse.aCRQ_aSO_context_name",
1956 FT_OID, BASE_NONE, NULL, 0,
1957 "T_ACRQ_aSO_context_name", HFILL }},
1958 { &hf_acse_user_information,
1959 { "user-information", "acse.user_information",
1960 FT_UINT32, BASE_DEC, NULL, 0,
1961 NULL, HFILL }},
1962 { &hf_acse_aSO_context_name,
1963 { "aSO-context-name", "acse.aSO_context_name",
1964 FT_OID, BASE_NONE, NULL, 0,
1965 "T_ACRP_aSO_context_name", HFILL }},
1966 { &hf_acse_ap_title_form1,
1967 { "ap-title-form1", "acse.ap_title_form1",
1968 FT_UINT32, BASE_DEC, VALS(x509if_Name_vals), 0,
1969 NULL, HFILL }},
1970 { &hf_acse_ap_title_form2,
1971 { "ap-title-form2", "acse.ap_title_form2",
1972 FT_OID, BASE_NONE, NULL, 0,
1973 NULL, HFILL }},
1974 { &hf_acse_ap_title_form3,
1975 { "ap-title-form3", "acse.ap_title_form3",
1976 FT_STRING, BASE_NONE, NULL, 0,
1977 NULL, HFILL }},
1978 { &hf_acse_aso_qualifier_form1,
1979 { "aso-qualifier-form1", "acse.aso_qualifier_form1",
1980 FT_UINT32, BASE_DEC, NULL, 0,
1981 NULL, HFILL }},
1982 { &hf_acse_aso_qualifier_form2,
1983 { "aso-qualifier-form2", "acse.aso_qualifier_form2",
1984 FT_INT32, BASE_DEC, NULL, 0,
1985 NULL, HFILL }},
1986 { &hf_acse_aso_qualifier_form3,
1987 { "aso-qualifier-form3", "acse.aso_qualifier_form3",
1988 FT_STRING, BASE_NONE, NULL, 0,
1989 NULL, HFILL }},
1990 { &hf_acse_aso_qualifier_form_any_octets,
1991 { "aso-qualifier-form-any-octets", "acse.aso_qualifier_form_any_octets",
1992 FT_BYTES, BASE_NONE, NULL, 0,
1993 "ASO_qualifier_form_octets", HFILL }},
1994 { &hf_acse_ae_title_form1,
1995 { "ae-title-form1", "acse.ae_title_form1",
1996 FT_UINT32, BASE_DEC, VALS(x509if_Name_vals), 0,
1997 NULL, HFILL }},
1998 { &hf_acse_ae_title_form2,
1999 { "ae-title-form2", "acse.ae_title_form2",
2000 FT_OID, BASE_NONE, NULL, 0,
2001 NULL, HFILL }},
2002 { &hf_acse_ASOI_tag_item,
2003 { "ASOI-tag item", "acse.ASOI_tag_item_element",
2004 FT_NONE, BASE_NONE, NULL, 0,
2005 NULL, HFILL }},
2006 { &hf_acse_qualifier,
2007 { "qualifier", "acse.qualifier",
2008 FT_UINT32, BASE_DEC, VALS(acse_ASO_qualifier_vals), 0,
2009 "ASO_qualifier", HFILL }},
2010 { &hf_acse_identifier,
2011 { "identifier", "acse.identifier",
2012 FT_UINT32, BASE_DEC, NULL, 0,
2013 "ASOI_identifier", HFILL }},
2014 { &hf_acse_ASO_context_name_list_item,
2015 { "ASO-context-name", "acse.ASO_context_name",
2016 FT_OID, BASE_NONE, NULL, 0,
2017 NULL, HFILL }},
2018 { &hf_acse_context_list,
2019 { "context-list", "acse.context_list",
2020 FT_UINT32, BASE_DEC, NULL, 0,
2021 NULL, HFILL }},
2022 { &hf_acse_default_contact_list,
2023 { "default-contact-list", "acse.default_contact_list",
2024 FT_UINT32, BASE_DEC, NULL, 0,
2025 "Default_Context_List", HFILL }},
2026 { &hf_acse_Context_list_item,
2027 { "Context-list item", "acse.Context_list_item_element",
2028 FT_NONE, BASE_NONE, NULL, 0,
2029 NULL, HFILL }},
2030 { &hf_acse_pci,
2031 { "pci", "acse.pci",
2032 FT_INT32, BASE_DEC, NULL, 0,
2033 "Presentation_context_identifier", HFILL }},
2034 { &hf_acse_abstract_syntax,
2035 { "abstract-syntax", "acse.abstract_syntax",
2036 FT_OID, BASE_NONE, NULL, 0,
2037 "Abstract_syntax_name", HFILL }},
2038 { &hf_acse_transfer_syntaxes,
2039 { "transfer-syntaxes", "acse.transfer_syntaxes",
2040 FT_UINT32, BASE_DEC, NULL, 0,
2041 "SEQUENCE_OF_TransferSyntaxName", HFILL }},
2042 { &hf_acse_transfer_syntaxes_item,
2043 { "TransferSyntaxName", "acse.TransferSyntaxName",
2044 FT_OID, BASE_NONE, NULL, 0,
2045 NULL, HFILL }},
2046 { &hf_acse_Default_Context_List_item,
2047 { "Default-Context-List item", "acse.Default_Context_List_item_element",
2048 FT_NONE, BASE_NONE, NULL, 0,
2049 NULL, HFILL }},
2050 { &hf_acse_abstract_syntax_name,
2051 { "abstract-syntax-name", "acse.abstract_syntax_name",
2052 FT_OID, BASE_NONE, NULL, 0,
2053 NULL, HFILL }},
2054 { &hf_acse_transfer_syntax_name,
2055 { "transfer-syntax-name", "acse.transfer_syntax_name",
2056 FT_OID, BASE_NONE, NULL, 0,
2057 "TransferSyntaxName", HFILL }},
2058 { &hf_acse_P_context_result_list_item,
2059 { "P-context-result-list item", "acse.P_context_result_list_item_element",
2060 FT_NONE, BASE_NONE, NULL, 0,
2061 NULL, HFILL }},
2062 { &hf_acse_pcontext_result,
2063 { "result", "acse.pcontext.result",
2064 FT_INT32, BASE_DEC, VALS(acse_Result_vals), 0,
2065 NULL, HFILL }},
2066 { &hf_acse_concrete_syntax_name,
2067 { "concrete-syntax-name", "acse.concrete_syntax_name",
2068 FT_OID, BASE_NONE, NULL, 0,
2069 NULL, HFILL }},
2070 { &hf_acse_provider_reason,
2071 { "provider-reason", "acse.provider_reason",
2072 FT_INT32, BASE_DEC, VALS(acse_T_provider_reason_vals), 0,
2073 NULL, HFILL }},
2074 { &hf_acse_service_user,
2075 { "service-user", "acse.service_user",
2076 FT_UINT32, BASE_DEC, VALS(acse_T_service_user_vals), 0,
2077 NULL, HFILL }},
2078 { &hf_acse_service_provider,
2079 { "service-provider", "acse.service_provider",
2080 FT_UINT32, BASE_DEC, VALS(acse_T_service_provider_vals), 0,
2081 NULL, HFILL }},
2082 { &hf_acse_Association_data_item,
2083 { "Association-data", "acse.EXTERNALt_element",
2084 FT_NONE, BASE_NONE, NULL, 0,
2085 "EXTERNALt", HFILL }},
2086 { &hf_acse_simply_encoded_data,
2087 { "simply-encoded-data", "acse.simply_encoded_data",
2088 FT_BYTES, BASE_NONE, NULL, 0,
2089 NULL, HFILL }},
2090 { &hf_acse_fully_encoded_data,
2091 { "fully-encoded-data", "acse.fully_encoded_data_element",
2092 FT_NONE, BASE_NONE, NULL, 0,
2093 "PDV_list", HFILL }},
2094 { &hf_acse_presentation_context_identifier,
2095 { "presentation-context-identifier", "acse.presentation_context_identifier",
2096 FT_INT32, BASE_DEC, NULL, 0,
2097 NULL, HFILL }},
2098 { &hf_acse_presentation_data_values,
2099 { "presentation-data-values", "acse.presentation_data_values",
2100 FT_UINT32, BASE_DEC, VALS(acse_T_presentation_data_values_vals), 0,
2101 NULL, HFILL }},
2102 { &hf_acse_simple_ASN1_type,
2103 { "simple-ASN1-type", "acse.simple_ASN1_type_element",
2104 FT_NONE, BASE_NONE, NULL, 0,
2105 NULL, HFILL }},
2106 { &hf_acse_pDVList_octet_aligned,
2107 { "octet-aligned", "acse.pDVList_octet_aligned",
2108 FT_BYTES, BASE_NONE, NULL, 0,
2109 "OCTET_STRING", HFILL }},
2110 { &hf_acse_other_mechanism_name,
2111 { "other-mechanism-name", "acse.other_mechanism_name",
2112 FT_OID, BASE_NONE, NULL, 0,
2113 NULL, HFILL }},
2114 { &hf_acse_other_mechanism_value,
2115 { "other-mechanism-value", "acse.other_mechanism_value_element",
2116 FT_NONE, BASE_NONE, NULL, 0,
2117 NULL, HFILL }},
2118 { &hf_acse_charstring,
2119 { "charstring", "acse.charstring",
2120 FT_STRING, BASE_NONE, NULL, 0,
2121 "GraphicString", HFILL }},
2122 { &hf_acse_bitstring,
2123 { "bitstring", "acse.bitstring",
2124 FT_BYTES, BASE_NONE, NULL, 0,
2125 "BIT_STRING", HFILL }},
2126 { &hf_acse_external,
2127 { "external", "acse.external_element",
2128 FT_NONE, BASE_NONE, NULL, 0,
2129 "EXTERNALt", HFILL }},
2130 { &hf_acse_other,
2131 { "other", "acse.other_element",
2132 FT_NONE, BASE_NONE, NULL, 0,
2133 "Authentication_value_other", HFILL }},
2134 { &hf_acse_T_AARQ_protocol_version_version1,
2135 { "version1", "acse.T.AARQ.protocol.version.version1",
2136 FT_BOOLEAN, 8, NULL, 0x80,
2137 NULL, HFILL }},
2138 { &hf_acse_T_AARE_protocol_version_version1,
2139 { "version1", "acse.T.AARE.protocol.version.version1",
2140 FT_BOOLEAN, 8, NULL, 0x80,
2141 NULL, HFILL }},
2142 { &hf_acse_ACSE_requirements_authentication,
2143 { "authentication", "acse.ACSE.requirements.authentication",
2144 FT_BOOLEAN, 8, NULL, 0x80,
2145 NULL, HFILL }},
2146 { &hf_acse_ACSE_requirements_aSO_context_negotiation,
2147 { "aSO-context-negotiation", "acse.ACSE.requirements.aSO.context.negotiation",
2148 FT_BOOLEAN, 8, NULL, 0x40,
2149 NULL, HFILL }},
2150 { &hf_acse_ACSE_requirements_higher_level_association,
2151 { "higher-level-association", "acse.ACSE.requirements.higher.level.association",
2152 FT_BOOLEAN, 8, NULL, 0x20,
2153 NULL, HFILL }},
2154 { &hf_acse_ACSE_requirements_nested_association,
2155 { "nested-association", "acse.ACSE.requirements.nested.association",
2156 FT_BOOLEAN, 8, NULL, 0x10,
2157 NULL, HFILL }},
2160 /* List of subtrees */
2161 static int *ett[] = {
2162 &ett_acse,
2163 &ett_acse_EXTERNALt_U,
2164 &ett_acse_T_encoding,
2165 &ett_acse_ACSE_apdu,
2166 &ett_acse_AARQ_apdu_U,
2167 &ett_acse_T_AARQ_protocol_version,
2168 &ett_acse_AARE_apdu_U,
2169 &ett_acse_T_AARE_protocol_version,
2170 &ett_acse_RLRQ_apdu_U,
2171 &ett_acse_RLRE_apdu_U,
2172 &ett_acse_ABRT_apdu_U,
2173 &ett_acse_A_DT_apdu_U,
2174 &ett_acse_ACRQ_apdu_U,
2175 &ett_acse_ACRP_apdu_U,
2176 &ett_acse_ACSE_requirements,
2177 &ett_acse_AP_title,
2178 &ett_acse_ASO_qualifier,
2179 &ett_acse_AE_title,
2180 &ett_acse_ASOI_tag,
2181 &ett_acse_ASOI_tag_item,
2182 &ett_acse_ASO_context_name_list,
2183 &ett_acse_Syntactic_context_list,
2184 &ett_acse_Context_list,
2185 &ett_acse_Context_list_item,
2186 &ett_acse_SEQUENCE_OF_TransferSyntaxName,
2187 &ett_acse_Default_Context_List,
2188 &ett_acse_Default_Context_List_item,
2189 &ett_acse_P_context_result_list,
2190 &ett_acse_P_context_result_list_item,
2191 &ett_acse_Associate_source_diagnostic,
2192 &ett_acse_Association_data,
2193 &ett_acse_User_Data,
2194 &ett_acse_PDV_list,
2195 &ett_acse_T_presentation_data_values,
2196 &ett_acse_Authentication_value_other,
2197 &ett_acse_Authentication_value,
2200 static ei_register_info ei[] = {
2201 { &ei_acse_dissector_not_available, { "acse.dissector_not_available", PI_UNDECODED, PI_WARN, "Dissector is not available", EXPFILL }},
2202 { &ei_acse_malformed, { "acse.malformed", PI_MALFORMED, PI_ERROR, "Malformed packet", EXPFILL }},
2203 { &ei_acse_invalid_oid, { "acse.invalid_oid", PI_UNDECODED, PI_WARN, "Invalid OID", EXPFILL }},
2206 expert_module_t* expert_acse;
2208 /* Register protocol */
2209 proto_acse = proto_register_protocol(PNAME, PSNAME, PFNAME);
2210 acse_handle = register_dissector("acse", dissect_acse, proto_acse);
2212 /* Register connectionless protocol */
2213 proto_clacse = proto_register_protocol(CLPNAME, CLPSNAME, CLPFNAME);
2216 /* Register fields and subtrees */
2217 proto_register_field_array(proto_acse, hf, array_length(hf));
2218 proto_register_subtree_array(ett, array_length(ett));
2219 expert_acse = expert_register_protocol(proto_acse);
2220 expert_register_field_array(expert_acse, ei, array_length(ei));
2222 #if NOT_NEEDED
2223 acse_ctx_oid_table = wmem_map_new_autoreset(wmem_epan_scope(), wmem_file_scope(), acse_ctx_oid_hash,
2224 acse_ctx_oid_equal);
2225 #endif
2229 /*--- proto_reg_handoff_acse -------------------------------------------*/
2230 void proto_reg_handoff_acse(void) {
2231 /*#include "packet-acse-dis-tab.c"*/
2232 oid_add_from_string("id-aCSE","2.2.3.1.1");
2233 register_ber_oid_dissector_handle(ACSE_APDU_OID, acse_handle, proto_acse, "id-as-acse");