dcerpc-netlogon: maintain netlogon_auth_vars for NetrServerAuthenticateKerberos
[wireshark-sm.git] / epan / dissectors / packet-disp.c
blobdd715354befcf698734712b673ecf47dd115d494
1 /* Do not modify this file. Changes will be overwritten. */
2 /* Generated automatically by the ASN.1 to Wireshark dissector compiler */
3 /* packet-disp.c */
4 /* asn2wrs.py -b -q -L -p disp -c ./disp.cnf -s ./packet-disp-template -D . -O ../.. disp.asn */
6 /* packet-disp.c
7 * Routines for X.525 (X.500 Directory Shadow Asbtract Service) and X.519 DISP packet dissection
8 * Graeme Lunt 2005
10 * Wireshark - Network traffic analyzer
11 * By Gerald Combs <gerald@wireshark.org>
12 * Copyright 1998 Gerald Combs
14 * SPDX-License-Identifier: GPL-2.0-or-later
17 #include "config.h"
19 #include <epan/packet.h>
20 #include <epan/expert.h>
21 #include <epan/prefs.h>
22 #include <epan/oids.h>
23 #include <epan/asn1.h>
24 #include <epan/proto_data.h>
25 #include <wsutil/array.h>
27 #include "packet-ber.h"
28 #include "packet-acse.h"
29 #include "packet-ros.h"
30 #include "packet-rtse.h"
32 #include "packet-x509if.h"
33 #include "packet-x509af.h"
34 #include "packet-x509sat.h"
35 #include "packet-crmf.h"
37 #include "packet-dop.h"
38 #include "packet-dap.h"
39 #include "packet-dsp.h"
40 #include "packet-disp.h"
43 /* we don't have a separate dissector for X519 -
44 and most of DISP is defined in X525 */
45 #define PNAME "X.519 Directory Information Shadowing Protocol"
46 #define PSNAME "DISP"
47 #define PFNAME "disp"
49 void proto_register_disp(void);
50 void proto_reg_handoff_disp(void);
52 /* Initialize the protocol and registered fields */
53 static int proto_disp;
55 static int hf_disp_EstablishParameter_PDU; /* EstablishParameter */
56 static int hf_disp_ModificationParameter_PDU; /* ModificationParameter */
57 static int hf_disp_ShadowingAgreementInfo_PDU; /* ShadowingAgreementInfo */
58 static int hf_disp_modifiedSecondaryShadows; /* SET_OF_SupplierAndConsumers */
59 static int hf_disp_modifiedSecondaryShadows_item; /* SupplierAndConsumers */
60 static int hf_disp_shadowSubject; /* UnitOfReplication */
61 static int hf_disp_updateMode; /* UpdateMode */
62 static int hf_disp_master; /* AccessPoint */
63 static int hf_disp_secondaryShadows; /* BOOLEAN */
64 static int hf_disp_area; /* AreaSpecification */
65 static int hf_disp_replication_attributes; /* AttributeSelection */
66 static int hf_disp_knowledge; /* Knowledge */
67 static int hf_disp_subordinates; /* BOOLEAN */
68 static int hf_disp_contextSelection; /* ContextSelection */
69 static int hf_disp_supplyContexts; /* T_supplyContexts */
70 static int hf_disp_allContexts; /* NULL */
71 static int hf_disp_selectedContexts; /* T_selectedContexts */
72 static int hf_disp_selectedContexts_item; /* OBJECT_IDENTIFIER */
73 static int hf_disp_contextPrefix; /* DistinguishedName */
74 static int hf_disp_replicationArea; /* SubtreeSpecification */
75 static int hf_disp_knowledgeType; /* T_knowledgeType */
76 static int hf_disp_extendedKnowledge; /* BOOLEAN */
77 static int hf_disp_AttributeSelection_item; /* ClassAttributeSelection */
78 static int hf_disp_class; /* OBJECT_IDENTIFIER */
79 static int hf_disp_classAttributes; /* ClassAttributes */
80 static int hf_disp_allAttributes; /* NULL */
81 static int hf_disp_include; /* AttributeTypes */
82 static int hf_disp_exclude; /* AttributeTypes */
83 static int hf_disp_AttributeTypes_item; /* AttributeType */
84 static int hf_disp_supplierInitiated; /* SupplierUpdateMode */
85 static int hf_disp_consumerInitiated; /* ConsumerUpdateMode */
86 static int hf_disp_onChange; /* BOOLEAN */
87 static int hf_disp_scheduled; /* SchedulingParameters */
88 static int hf_disp_periodic; /* PeriodicStrategy */
89 static int hf_disp_othertimes; /* BOOLEAN */
90 static int hf_disp_beginTime; /* Time */
91 static int hf_disp_windowSize; /* INTEGER */
92 static int hf_disp_updateInterval; /* INTEGER */
93 static int hf_disp_agreementID; /* AgreementID */
94 static int hf_disp_lastUpdate; /* Time */
95 static int hf_disp_updateStrategy; /* T_updateStrategy */
96 static int hf_disp_standardUpdate; /* StandardUpdate */
97 static int hf_disp_other; /* EXTERNAL */
98 static int hf_disp_securityParameters; /* SecurityParameters */
99 static int hf_disp_unsignedCoordinateShadowUpdateArgument; /* CoordinateShadowUpdateArgumentData */
100 static int hf_disp_signedCoordinateShadowUpdateArgument; /* T_signedCoordinateShadowUpdateArgument */
101 static int hf_disp_coordinateShadowUpdateArgument; /* CoordinateShadowUpdateArgumentData */
102 static int hf_disp_algorithmIdentifier; /* AlgorithmIdentifier */
103 static int hf_disp_encrypted; /* BIT_STRING */
104 static int hf_disp_null; /* NULL */
105 static int hf_disp_information; /* Information */
106 static int hf_disp_performer; /* DistinguishedName */
107 static int hf_disp_aliasDereferenced; /* BOOLEAN */
108 static int hf_disp_notification; /* SEQUENCE_OF_Attribute */
109 static int hf_disp_notification_item; /* Attribute */
110 static int hf_disp_unsignedInformation; /* InformationData */
111 static int hf_disp_signedInformation; /* T_signedInformation */
112 static int hf_disp_information_data; /* InformationData */
113 static int hf_disp_requestedStrategy; /* T_requestedStrategy */
114 static int hf_disp_standard; /* T_standard */
115 static int hf_disp_unsignedRequestShadowUpdateArgument; /* RequestShadowUpdateArgumentData */
116 static int hf_disp_signedRequestShadowUpdateArgument; /* T_signedRequestShadowUpdateArgument */
117 static int hf_disp_requestShadowUpdateArgument; /* RequestShadowUpdateArgumentData */
118 static int hf_disp_updateTime; /* Time */
119 static int hf_disp_updateWindow; /* UpdateWindow */
120 static int hf_disp_updatedInfo; /* RefreshInformation */
121 static int hf_disp_unsignedUpdateShadowArgument; /* UpdateShadowArgumentData */
122 static int hf_disp_signedUpdateShadowArgument; /* T_signedUpdateShadowArgument */
123 static int hf_disp_updateShadowArgument; /* UpdateShadowArgumentData */
124 static int hf_disp_start; /* Time */
125 static int hf_disp_stop; /* Time */
126 static int hf_disp_noRefresh; /* NULL */
127 static int hf_disp_total; /* TotalRefresh */
128 static int hf_disp_incremental; /* IncrementalRefresh */
129 static int hf_disp_otherStrategy; /* EXTERNAL */
130 static int hf_disp_sDSE; /* SDSEContent */
131 static int hf_disp_subtree; /* SET_OF_Subtree */
132 static int hf_disp_subtree_item; /* Subtree */
133 static int hf_disp_sDSEType; /* SDSEType */
134 static int hf_disp_subComplete; /* BOOLEAN */
135 static int hf_disp_attComplete; /* BOOLEAN */
136 static int hf_disp_attributes; /* SET_OF_Attribute */
137 static int hf_disp_attributes_item; /* Attribute */
138 static int hf_disp_attValIncomplete; /* SET_OF_AttributeType */
139 static int hf_disp_attValIncomplete_item; /* AttributeType */
140 static int hf_disp_rdn; /* RelativeDistinguishedName */
141 static int hf_disp_IncrementalRefresh_item; /* IncrementalStepRefresh */
142 static int hf_disp_sDSEChanges; /* T_sDSEChanges */
143 static int hf_disp_add; /* SDSEContent */
144 static int hf_disp_remove; /* NULL */
145 static int hf_disp_modify; /* ContentChange */
146 static int hf_disp_subordinateUpdates; /* SEQUENCE_OF_SubordinateChanges */
147 static int hf_disp_subordinateUpdates_item; /* SubordinateChanges */
148 static int hf_disp_rename; /* T_rename */
149 static int hf_disp_newRDN; /* RelativeDistinguishedName */
150 static int hf_disp_newDN; /* DistinguishedName */
151 static int hf_disp_attributeChanges; /* T_attributeChanges */
152 static int hf_disp_replace; /* SET_OF_Attribute */
153 static int hf_disp_replace_item; /* Attribute */
154 static int hf_disp_changes; /* SEQUENCE_OF_EntryModification */
155 static int hf_disp_changes_item; /* EntryModification */
156 static int hf_disp_subordinate; /* RelativeDistinguishedName */
157 static int hf_disp_subordinate_changes; /* IncrementalStepRefresh */
158 static int hf_disp_problem; /* ShadowProblem */
159 static int hf_disp_unsignedShadowError; /* ShadowErrorData */
160 static int hf_disp_signedShadowError; /* T_signedShadowError */
161 static int hf_disp_shadowError; /* ShadowErrorData */
163 /* Initialize the subtree pointers */
164 static int ett_disp;
165 static int ett_disp_ModificationParameter;
166 static int ett_disp_SET_OF_SupplierAndConsumers;
167 static int ett_disp_ShadowingAgreementInfo;
168 static int ett_disp_UnitOfReplication;
169 static int ett_disp_T_supplyContexts;
170 static int ett_disp_T_selectedContexts;
171 static int ett_disp_AreaSpecification;
172 static int ett_disp_Knowledge;
173 static int ett_disp_AttributeSelection;
174 static int ett_disp_ClassAttributeSelection;
175 static int ett_disp_ClassAttributes;
176 static int ett_disp_AttributeTypes;
177 static int ett_disp_UpdateMode;
178 static int ett_disp_SupplierUpdateMode;
179 static int ett_disp_SchedulingParameters;
180 static int ett_disp_PeriodicStrategy;
181 static int ett_disp_CoordinateShadowUpdateArgumentData;
182 static int ett_disp_T_updateStrategy;
183 static int ett_disp_CoordinateShadowUpdateArgument;
184 static int ett_disp_T_signedCoordinateShadowUpdateArgument;
185 static int ett_disp_CoordinateShadowUpdateResult;
186 static int ett_disp_InformationData;
187 static int ett_disp_SEQUENCE_OF_Attribute;
188 static int ett_disp_Information;
189 static int ett_disp_T_signedInformation;
190 static int ett_disp_RequestShadowUpdateArgumentData;
191 static int ett_disp_T_requestedStrategy;
192 static int ett_disp_RequestShadowUpdateArgument;
193 static int ett_disp_T_signedRequestShadowUpdateArgument;
194 static int ett_disp_RequestShadowUpdateResult;
195 static int ett_disp_UpdateShadowArgumentData;
196 static int ett_disp_UpdateShadowArgument;
197 static int ett_disp_T_signedUpdateShadowArgument;
198 static int ett_disp_UpdateShadowResult;
199 static int ett_disp_UpdateWindow;
200 static int ett_disp_RefreshInformation;
201 static int ett_disp_TotalRefresh;
202 static int ett_disp_SET_OF_Subtree;
203 static int ett_disp_SDSEContent;
204 static int ett_disp_SET_OF_Attribute;
205 static int ett_disp_SET_OF_AttributeType;
206 static int ett_disp_Subtree;
207 static int ett_disp_IncrementalRefresh;
208 static int ett_disp_IncrementalStepRefresh;
209 static int ett_disp_T_sDSEChanges;
210 static int ett_disp_SEQUENCE_OF_SubordinateChanges;
211 static int ett_disp_ContentChange;
212 static int ett_disp_T_rename;
213 static int ett_disp_T_attributeChanges;
214 static int ett_disp_SEQUENCE_OF_EntryModification;
215 static int ett_disp_SubordinateChanges;
216 static int ett_disp_ShadowErrorData;
217 static int ett_disp_ShadowError;
218 static int ett_disp_T_signedShadowError;
220 static expert_field ei_disp_unsupported_opcode;
221 static expert_field ei_disp_unsupported_errcode;
222 static expert_field ei_disp_unsupported_pdu;
223 static expert_field ei_disp_zero_pdu;
225 static dissector_handle_t disp_handle;
227 /*--- Cyclic dependencies ---*/
229 /* Subtree -> Subtree/subtree -> Subtree */
230 static int dissect_disp_Subtree(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);
232 /* IncrementalStepRefresh -> IncrementalStepRefresh/subordinateUpdates -> SubordinateChanges -> IncrementalStepRefresh */
233 static int dissect_disp_IncrementalStepRefresh(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);
238 static int
239 dissect_disp_DSAShadowBindArgument(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
240 offset = dissect_dap_DirectoryBindArgument(implicit_tag, tvb, offset, actx, tree, hf_index);
242 return offset;
247 static int
248 dissect_disp_DSAShadowBindResult(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
249 offset = dissect_dap_DirectoryBindArgument(implicit_tag, tvb, offset, actx, tree, hf_index);
251 return offset;
256 static int
257 dissect_disp_DSAShadowBindError(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
258 offset = dissect_dap_DirectoryBindError(implicit_tag, tvb, offset, actx, tree, hf_index);
260 return offset;
265 static int
266 dissect_disp_EstablishParameter(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
267 offset = dissect_ber_null(implicit_tag, actx, tree, tvb, offset, hf_index);
269 return offset;
273 static const ber_sequence_t SET_OF_SupplierAndConsumers_set_of[1] = {
274 { &hf_disp_modifiedSecondaryShadows_item, BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_dop_SupplierAndConsumers },
277 static int
278 dissect_disp_SET_OF_SupplierAndConsumers(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
279 offset = dissect_ber_set_of(implicit_tag, actx, tree, tvb, offset,
280 SET_OF_SupplierAndConsumers_set_of, hf_index, ett_disp_SET_OF_SupplierAndConsumers);
282 return offset;
286 static const ber_sequence_t ModificationParameter_sequence[] = {
287 { &hf_disp_modifiedSecondaryShadows, BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_disp_SET_OF_SupplierAndConsumers },
288 { NULL, 0, 0, 0, NULL }
291 static int
292 dissect_disp_ModificationParameter(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
293 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
294 ModificationParameter_sequence, hf_index, ett_disp_ModificationParameter);
296 return offset;
302 dissect_disp_AgreementID(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
303 offset = dissect_dop_OperationalBindingID(implicit_tag, tvb, offset, actx, tree, hf_index);
305 return offset;
309 static const ber_sequence_t AreaSpecification_sequence[] = {
310 { &hf_disp_contextPrefix , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509if_DistinguishedName },
311 { &hf_disp_replicationArea, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509if_SubtreeSpecification },
312 { NULL, 0, 0, 0, NULL }
315 static int
316 dissect_disp_AreaSpecification(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
317 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
318 AreaSpecification_sequence, hf_index, ett_disp_AreaSpecification);
320 return offset;
325 static int
326 dissect_disp_OBJECT_IDENTIFIER(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
327 offset = dissect_ber_object_identifier(implicit_tag, actx, tree, tvb, offset, hf_index, NULL);
329 return offset;
334 static int
335 dissect_disp_NULL(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
336 offset = dissect_ber_null(implicit_tag, actx, tree, tvb, offset, hf_index);
338 return offset;
342 static const ber_sequence_t AttributeTypes_set_of[1] = {
343 { &hf_disp_AttributeTypes_item, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_x509if_AttributeType },
346 static int
347 dissect_disp_AttributeTypes(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
348 offset = dissect_ber_set_of(implicit_tag, actx, tree, tvb, offset,
349 AttributeTypes_set_of, hf_index, ett_disp_AttributeTypes);
351 return offset;
355 static const value_string disp_ClassAttributes_vals[] = {
356 { 0, "allAttributes" },
357 { 1, "include" },
358 { 2, "exclude" },
359 { 0, NULL }
362 static const ber_choice_t ClassAttributes_choice[] = {
363 { 0, &hf_disp_allAttributes , BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_NOOWNTAG, dissect_disp_NULL },
364 { 1, &hf_disp_include , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_disp_AttributeTypes },
365 { 2, &hf_disp_exclude , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_disp_AttributeTypes },
366 { 0, NULL, 0, 0, 0, NULL }
369 static int
370 dissect_disp_ClassAttributes(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 ClassAttributes_choice, hf_index, ett_disp_ClassAttributes,
373 NULL);
375 return offset;
379 static const ber_sequence_t ClassAttributeSelection_sequence[] = {
380 { &hf_disp_class , BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_OBJECT_IDENTIFIER },
381 { &hf_disp_classAttributes, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_disp_ClassAttributes },
382 { NULL, 0, 0, 0, NULL }
385 static int
386 dissect_disp_ClassAttributeSelection(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
387 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
388 ClassAttributeSelection_sequence, hf_index, ett_disp_ClassAttributeSelection);
390 return offset;
394 static const ber_sequence_t AttributeSelection_set_of[1] = {
395 { &hf_disp_AttributeSelection_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_ClassAttributeSelection },
398 static int
399 dissect_disp_AttributeSelection(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
400 offset = dissect_ber_set_of(implicit_tag, actx, tree, tvb, offset,
401 AttributeSelection_set_of, hf_index, ett_disp_AttributeSelection);
403 return offset;
407 static const value_string disp_T_knowledgeType_vals[] = {
408 { 0, "master" },
409 { 1, "shadow" },
410 { 2, "both" },
411 { 0, NULL }
415 static int
416 dissect_disp_T_knowledgeType(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
417 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
418 NULL);
420 return offset;
425 static int
426 dissect_disp_BOOLEAN(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
427 offset = dissect_ber_boolean(implicit_tag, actx, tree, tvb, offset, hf_index, NULL);
429 return offset;
433 static const ber_sequence_t Knowledge_sequence[] = {
434 { &hf_disp_knowledgeType , BER_CLASS_UNI, BER_UNI_TAG_ENUMERATED, BER_FLAGS_NOOWNTAG, dissect_disp_T_knowledgeType },
435 { &hf_disp_extendedKnowledge, BER_CLASS_UNI, BER_UNI_TAG_BOOLEAN, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_BOOLEAN },
436 { NULL, 0, 0, 0, NULL }
439 static int
440 dissect_disp_Knowledge(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
441 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
442 Knowledge_sequence, hf_index, ett_disp_Knowledge);
444 return offset;
448 static const ber_sequence_t T_selectedContexts_set_of[1] = {
449 { &hf_disp_selectedContexts_item, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_disp_OBJECT_IDENTIFIER },
452 static int
453 dissect_disp_T_selectedContexts(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_set_of(implicit_tag, actx, tree, tvb, offset,
455 T_selectedContexts_set_of, hf_index, ett_disp_T_selectedContexts);
457 return offset;
461 static const value_string disp_T_supplyContexts_vals[] = {
462 { 0, "allContexts" },
463 { 1, "selectedContexts" },
464 { 0, NULL }
467 static const ber_choice_t T_supplyContexts_choice[] = {
468 { 0, &hf_disp_allContexts , BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_NOOWNTAG, dissect_disp_NULL },
469 { 1, &hf_disp_selectedContexts, BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_disp_T_selectedContexts },
470 { 0, NULL, 0, 0, 0, NULL }
473 static int
474 dissect_disp_T_supplyContexts(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
475 offset = dissect_ber_choice(actx, tree, tvb, offset,
476 T_supplyContexts_choice, hf_index, ett_disp_T_supplyContexts,
477 NULL);
479 return offset;
483 static const ber_sequence_t UnitOfReplication_sequence[] = {
484 { &hf_disp_area , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_AreaSpecification },
485 { &hf_disp_replication_attributes, BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_disp_AttributeSelection },
486 { &hf_disp_knowledge , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_Knowledge },
487 { &hf_disp_subordinates , BER_CLASS_UNI, BER_UNI_TAG_BOOLEAN, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_BOOLEAN },
488 { &hf_disp_contextSelection, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_dap_ContextSelection },
489 { &hf_disp_supplyContexts , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_disp_T_supplyContexts },
490 { NULL, 0, 0, 0, NULL }
493 static int
494 dissect_disp_UnitOfReplication(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
495 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
496 UnitOfReplication_sequence, hf_index, ett_disp_UnitOfReplication);
498 return offset;
503 static int
504 dissect_disp_Time(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
505 offset = dissect_ber_GeneralizedTime(implicit_tag, actx, tree, tvb, offset, hf_index);
507 return offset;
512 static int
513 dissect_disp_INTEGER(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
514 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
515 NULL);
517 return offset;
521 static const ber_sequence_t PeriodicStrategy_sequence[] = {
522 { &hf_disp_beginTime , BER_CLASS_UNI, BER_UNI_TAG_GeneralizedTime, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_Time },
523 { &hf_disp_windowSize , BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_disp_INTEGER },
524 { &hf_disp_updateInterval , BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_disp_INTEGER },
525 { NULL, 0, 0, 0, NULL }
528 static int
529 dissect_disp_PeriodicStrategy(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
530 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
531 PeriodicStrategy_sequence, hf_index, ett_disp_PeriodicStrategy);
533 return offset;
537 static const ber_sequence_t SchedulingParameters_sequence[] = {
538 { &hf_disp_periodic , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_PeriodicStrategy },
539 { &hf_disp_othertimes , BER_CLASS_UNI, BER_UNI_TAG_BOOLEAN, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_BOOLEAN },
540 { NULL, 0, 0, 0, NULL }
543 static int
544 dissect_disp_SchedulingParameters(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
545 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
546 SchedulingParameters_sequence, hf_index, ett_disp_SchedulingParameters);
548 return offset;
552 static const value_string disp_SupplierUpdateMode_vals[] = {
553 { 0, "onChange" },
554 { 1, "scheduled" },
555 { 0, NULL }
558 static const ber_choice_t SupplierUpdateMode_choice[] = {
559 { 0, &hf_disp_onChange , BER_CLASS_UNI, BER_UNI_TAG_BOOLEAN, BER_FLAGS_NOOWNTAG, dissect_disp_BOOLEAN },
560 { 1, &hf_disp_scheduled , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_SchedulingParameters },
561 { 0, NULL, 0, 0, 0, NULL }
564 static int
565 dissect_disp_SupplierUpdateMode(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
566 offset = dissect_ber_choice(actx, tree, tvb, offset,
567 SupplierUpdateMode_choice, hf_index, ett_disp_SupplierUpdateMode,
568 NULL);
570 return offset;
575 static int
576 dissect_disp_ConsumerUpdateMode(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
577 offset = dissect_disp_SchedulingParameters(implicit_tag, tvb, offset, actx, tree, hf_index);
579 return offset;
583 static const value_string disp_UpdateMode_vals[] = {
584 { 0, "supplierInitiated" },
585 { 1, "consumerInitiated" },
586 { 0, NULL }
589 static const ber_choice_t UpdateMode_choice[] = {
590 { 0, &hf_disp_supplierInitiated, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_disp_SupplierUpdateMode },
591 { 1, &hf_disp_consumerInitiated, BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_disp_ConsumerUpdateMode },
592 { 0, NULL, 0, 0, 0, NULL }
595 static int
596 dissect_disp_UpdateMode(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
597 offset = dissect_ber_choice(actx, tree, tvb, offset,
598 UpdateMode_choice, hf_index, ett_disp_UpdateMode,
599 NULL);
601 return offset;
605 static const ber_sequence_t ShadowingAgreementInfo_sequence[] = {
606 { &hf_disp_shadowSubject , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_UnitOfReplication },
607 { &hf_disp_updateMode , BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_disp_UpdateMode },
608 { &hf_disp_master , BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_dsp_AccessPoint },
609 { &hf_disp_secondaryShadows, BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_disp_BOOLEAN },
610 { NULL, 0, 0, 0, NULL }
613 static int
614 dissect_disp_ShadowingAgreementInfo(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
615 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
616 ShadowingAgreementInfo_sequence, hf_index, ett_disp_ShadowingAgreementInfo);
618 return offset;
622 static const value_string disp_StandardUpdate_vals[] = {
623 { 0, "noChanges" },
624 { 1, "incremental" },
625 { 2, "total" },
626 { 0, NULL }
630 static int
631 dissect_disp_StandardUpdate(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
632 uint32_t update;
634 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
635 &update);
638 col_append_fstr(actx->pinfo->cinfo, COL_INFO, " %s", val_to_str(update, disp_StandardUpdate_vals, "unknown(%d)"));
641 return offset;
646 static int
647 dissect_disp_EXTERNAL(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
648 offset = dissect_ber_external_type(implicit_tag, tree, tvb, offset, actx, hf_index, NULL);
650 return offset;
654 static const value_string disp_T_updateStrategy_vals[] = {
655 { 0, "standard" },
656 { 1, "other" },
657 { 0, NULL }
660 static const ber_choice_t T_updateStrategy_choice[] = {
661 { 0, &hf_disp_standardUpdate , BER_CLASS_UNI, BER_UNI_TAG_ENUMERATED, BER_FLAGS_NOOWNTAG, dissect_disp_StandardUpdate },
662 { 1, &hf_disp_other , BER_CLASS_UNI, BER_UNI_TAG_EXTERNAL, BER_FLAGS_NOOWNTAG, dissect_disp_EXTERNAL },
663 { 0, NULL, 0, 0, 0, NULL }
666 static int
667 dissect_disp_T_updateStrategy(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
668 offset = dissect_ber_choice(actx, tree, tvb, offset,
669 T_updateStrategy_choice, hf_index, ett_disp_T_updateStrategy,
670 NULL);
672 return offset;
676 static const ber_sequence_t CoordinateShadowUpdateArgumentData_sequence[] = {
677 { &hf_disp_agreementID , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_AgreementID },
678 { &hf_disp_lastUpdate , BER_CLASS_UNI, BER_UNI_TAG_GeneralizedTime, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_Time },
679 { &hf_disp_updateStrategy , BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_disp_T_updateStrategy },
680 { &hf_disp_securityParameters, BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_dap_SecurityParameters },
681 { NULL, 0, 0, 0, NULL }
684 static int
685 dissect_disp_CoordinateShadowUpdateArgumentData(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
686 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
687 CoordinateShadowUpdateArgumentData_sequence, hf_index, ett_disp_CoordinateShadowUpdateArgumentData);
689 return offset;
694 static int
695 dissect_disp_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_) {
696 offset = dissect_ber_bitstring(implicit_tag, actx, tree, tvb, offset,
697 NULL, 0, hf_index, -1,
698 NULL);
700 return offset;
704 static const ber_sequence_t T_signedCoordinateShadowUpdateArgument_sequence[] = {
705 { &hf_disp_coordinateShadowUpdateArgument, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_disp_CoordinateShadowUpdateArgumentData },
706 { &hf_disp_algorithmIdentifier, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509af_AlgorithmIdentifier },
707 { &hf_disp_encrypted , BER_CLASS_UNI, BER_UNI_TAG_BITSTRING, BER_FLAGS_NOOWNTAG, dissect_disp_BIT_STRING },
708 { NULL, 0, 0, 0, NULL }
711 static int
712 dissect_disp_T_signedCoordinateShadowUpdateArgument(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
713 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
714 T_signedCoordinateShadowUpdateArgument_sequence, hf_index, ett_disp_T_signedCoordinateShadowUpdateArgument);
716 return offset;
720 static const ber_choice_t CoordinateShadowUpdateArgument_choice[] = {
721 { 0, &hf_disp_unsignedCoordinateShadowUpdateArgument, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_disp_CoordinateShadowUpdateArgumentData },
722 { 1, &hf_disp_signedCoordinateShadowUpdateArgument, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_T_signedCoordinateShadowUpdateArgument },
723 { 0, NULL, 0, 0, 0, NULL }
726 static int
727 dissect_disp_CoordinateShadowUpdateArgument(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
728 offset = dissect_ber_choice(actx, tree, tvb, offset,
729 CoordinateShadowUpdateArgument_choice, hf_index, ett_disp_CoordinateShadowUpdateArgument,
730 NULL);
732 return offset;
736 static const ber_sequence_t SEQUENCE_OF_Attribute_sequence_of[1] = {
737 { &hf_disp_notification_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509if_Attribute },
740 static int
741 dissect_disp_SEQUENCE_OF_Attribute(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
742 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
743 SEQUENCE_OF_Attribute_sequence_of, hf_index, ett_disp_SEQUENCE_OF_Attribute);
745 return offset;
749 static const ber_sequence_t InformationData_sequence[] = {
750 { &hf_disp_agreementID , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_AgreementID },
751 { &hf_disp_lastUpdate , BER_CLASS_UNI, BER_UNI_TAG_GeneralizedTime, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_Time },
752 { &hf_disp_securityParameters, BER_CLASS_CON, 30, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_dap_SecurityParameters },
753 { &hf_disp_performer , BER_CLASS_CON, 29, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_x509if_DistinguishedName },
754 { &hf_disp_aliasDereferenced, BER_CLASS_CON, 28, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_disp_BOOLEAN },
755 { &hf_disp_notification , BER_CLASS_CON, 27, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_disp_SEQUENCE_OF_Attribute },
756 { NULL, 0, 0, 0, NULL }
759 static int
760 dissect_disp_InformationData(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
761 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
762 InformationData_sequence, hf_index, ett_disp_InformationData);
764 return offset;
768 static const ber_sequence_t T_signedInformation_sequence[] = {
769 { &hf_disp_information_data, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_disp_InformationData },
770 { &hf_disp_algorithmIdentifier, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509af_AlgorithmIdentifier },
771 { &hf_disp_encrypted , BER_CLASS_UNI, BER_UNI_TAG_BITSTRING, BER_FLAGS_NOOWNTAG, dissect_disp_BIT_STRING },
772 { NULL, 0, 0, 0, NULL }
775 static int
776 dissect_disp_T_signedInformation(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
777 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
778 T_signedInformation_sequence, hf_index, ett_disp_T_signedInformation);
780 return offset;
784 static const value_string disp_Information_vals[] = {
785 { 0, "unsignedInformation" },
786 { 1, "signedInformation" },
787 { 0, NULL }
790 static const ber_choice_t Information_choice[] = {
791 { 0, &hf_disp_unsignedInformation, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_disp_InformationData },
792 { 1, &hf_disp_signedInformation, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_T_signedInformation },
793 { 0, NULL, 0, 0, 0, NULL }
796 static int
797 dissect_disp_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_) {
798 offset = dissect_ber_choice(actx, tree, tvb, offset,
799 Information_choice, hf_index, ett_disp_Information,
800 NULL);
802 return offset;
806 static const value_string disp_CoordinateShadowUpdateResult_vals[] = {
807 { 0, "null" },
808 { 1, "information" },
809 { 0, NULL }
812 static const ber_choice_t CoordinateShadowUpdateResult_choice[] = {
813 { 0, &hf_disp_null , BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_NOOWNTAG, dissect_disp_NULL },
814 { 1, &hf_disp_information , BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG, dissect_disp_Information },
815 { 0, NULL, 0, 0, 0, NULL }
818 static int
819 dissect_disp_CoordinateShadowUpdateResult(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
820 uint32_t update;
822 offset = dissect_ber_choice(actx, tree, tvb, offset,
823 CoordinateShadowUpdateResult_choice, hf_index, ett_disp_CoordinateShadowUpdateResult,
824 &update);
827 col_append_fstr(actx->pinfo->cinfo, COL_INFO, " %s", val_to_str(update, disp_CoordinateShadowUpdateResult_vals, "unknown(%d)"));
830 return offset;
834 static const value_string disp_T_standard_vals[] = {
835 { 1, "incremental" },
836 { 2, "total" },
837 { 0, NULL }
841 static int
842 dissect_disp_T_standard(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
843 uint32_t update;
845 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
846 &update);
849 col_append_fstr(actx->pinfo->cinfo, COL_INFO, " %s", val_to_str(update, disp_T_standard_vals, "standard(%d"));
852 return offset;
856 static const value_string disp_T_requestedStrategy_vals[] = {
857 { 0, "standard" },
858 { 1, "other" },
859 { 0, NULL }
862 static const ber_choice_t T_requestedStrategy_choice[] = {
863 { 0, &hf_disp_standard , BER_CLASS_UNI, BER_UNI_TAG_ENUMERATED, BER_FLAGS_NOOWNTAG, dissect_disp_T_standard },
864 { 1, &hf_disp_other , BER_CLASS_UNI, BER_UNI_TAG_EXTERNAL, BER_FLAGS_NOOWNTAG, dissect_disp_EXTERNAL },
865 { 0, NULL, 0, 0, 0, NULL }
868 static int
869 dissect_disp_T_requestedStrategy(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
870 offset = dissect_ber_choice(actx, tree, tvb, offset,
871 T_requestedStrategy_choice, hf_index, ett_disp_T_requestedStrategy,
872 NULL);
874 return offset;
878 static const ber_sequence_t RequestShadowUpdateArgumentData_sequence[] = {
879 { &hf_disp_agreementID , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_AgreementID },
880 { &hf_disp_lastUpdate , BER_CLASS_UNI, BER_UNI_TAG_GeneralizedTime, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_Time },
881 { &hf_disp_requestedStrategy, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_disp_T_requestedStrategy },
882 { &hf_disp_securityParameters, BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_dap_SecurityParameters },
883 { NULL, 0, 0, 0, NULL }
886 static int
887 dissect_disp_RequestShadowUpdateArgumentData(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
888 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
889 RequestShadowUpdateArgumentData_sequence, hf_index, ett_disp_RequestShadowUpdateArgumentData);
891 return offset;
895 static const ber_sequence_t T_signedRequestShadowUpdateArgument_sequence[] = {
896 { &hf_disp_requestShadowUpdateArgument, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_disp_RequestShadowUpdateArgumentData },
897 { &hf_disp_algorithmIdentifier, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509af_AlgorithmIdentifier },
898 { &hf_disp_encrypted , BER_CLASS_UNI, BER_UNI_TAG_BITSTRING, BER_FLAGS_NOOWNTAG, dissect_disp_BIT_STRING },
899 { NULL, 0, 0, 0, NULL }
902 static int
903 dissect_disp_T_signedRequestShadowUpdateArgument(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
904 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
905 T_signedRequestShadowUpdateArgument_sequence, hf_index, ett_disp_T_signedRequestShadowUpdateArgument);
907 return offset;
911 static const ber_choice_t RequestShadowUpdateArgument_choice[] = {
912 { 0, &hf_disp_unsignedRequestShadowUpdateArgument, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_disp_RequestShadowUpdateArgumentData },
913 { 1, &hf_disp_signedRequestShadowUpdateArgument, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_T_signedRequestShadowUpdateArgument },
914 { 0, NULL, 0, 0, 0, NULL }
917 static int
918 dissect_disp_RequestShadowUpdateArgument(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
919 offset = dissect_ber_choice(actx, tree, tvb, offset,
920 RequestShadowUpdateArgument_choice, hf_index, ett_disp_RequestShadowUpdateArgument,
921 NULL);
923 return offset;
927 static const value_string disp_RequestShadowUpdateResult_vals[] = {
928 { 0, "null" },
929 { 1, "information" },
930 { 0, NULL }
933 static const ber_choice_t RequestShadowUpdateResult_choice[] = {
934 { 0, &hf_disp_null , BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_NOOWNTAG, dissect_disp_NULL },
935 { 1, &hf_disp_information , BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG, dissect_disp_Information },
936 { 0, NULL, 0, 0, 0, NULL }
939 static int
940 dissect_disp_RequestShadowUpdateResult(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 uint32_t update;
943 offset = dissect_ber_choice(actx, tree, tvb, offset,
944 RequestShadowUpdateResult_choice, hf_index, ett_disp_RequestShadowUpdateResult,
945 &update);
948 col_append_fstr(actx->pinfo->cinfo, COL_INFO, " %s", val_to_str(update, disp_RequestShadowUpdateResult_vals, "unknown(%d)"));
951 return offset;
955 static const ber_sequence_t UpdateWindow_sequence[] = {
956 { &hf_disp_start , BER_CLASS_UNI, BER_UNI_TAG_GeneralizedTime, BER_FLAGS_NOOWNTAG, dissect_disp_Time },
957 { &hf_disp_stop , BER_CLASS_UNI, BER_UNI_TAG_GeneralizedTime, BER_FLAGS_NOOWNTAG, dissect_disp_Time },
958 { NULL, 0, 0, 0, NULL }
961 static int
962 dissect_disp_UpdateWindow(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
963 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
964 UpdateWindow_sequence, hf_index, ett_disp_UpdateWindow);
966 return offset;
971 static int
972 dissect_disp_SDSEType(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
973 offset = dissect_dop_DSEType(implicit_tag, tvb, offset, actx, tree, hf_index);
975 return offset;
979 static const ber_sequence_t SET_OF_Attribute_set_of[1] = {
980 { &hf_disp_attributes_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509if_Attribute },
983 static int
984 dissect_disp_SET_OF_Attribute(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
985 offset = dissect_ber_set_of(implicit_tag, actx, tree, tvb, offset,
986 SET_OF_Attribute_set_of, hf_index, ett_disp_SET_OF_Attribute);
988 return offset;
992 static const ber_sequence_t SET_OF_AttributeType_set_of[1] = {
993 { &hf_disp_attValIncomplete_item, BER_CLASS_UNI, BER_UNI_TAG_OID, BER_FLAGS_NOOWNTAG, dissect_x509if_AttributeType },
996 static int
997 dissect_disp_SET_OF_AttributeType(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
998 offset = dissect_ber_set_of(implicit_tag, actx, tree, tvb, offset,
999 SET_OF_AttributeType_set_of, hf_index, ett_disp_SET_OF_AttributeType);
1001 return offset;
1005 static const ber_sequence_t SDSEContent_sequence[] = {
1006 { &hf_disp_sDSEType , BER_CLASS_UNI, BER_UNI_TAG_BITSTRING, BER_FLAGS_NOOWNTAG, dissect_disp_SDSEType },
1007 { &hf_disp_subComplete , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_disp_BOOLEAN },
1008 { &hf_disp_attComplete , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_disp_BOOLEAN },
1009 { &hf_disp_attributes , BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_disp_SET_OF_Attribute },
1010 { &hf_disp_attValIncomplete, BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_SET_OF_AttributeType },
1011 { NULL, 0, 0, 0, NULL }
1014 static int
1015 dissect_disp_SDSEContent(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1016 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1017 SDSEContent_sequence, hf_index, ett_disp_SDSEContent);
1019 return offset;
1023 static const ber_sequence_t SET_OF_Subtree_set_of[1] = {
1024 { &hf_disp_subtree_item , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_Subtree },
1027 static int
1028 dissect_disp_SET_OF_Subtree(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1029 offset = dissect_ber_set_of(implicit_tag, actx, tree, tvb, offset,
1030 SET_OF_Subtree_set_of, hf_index, ett_disp_SET_OF_Subtree);
1032 return offset;
1036 static const ber_sequence_t Subtree_sequence[] = {
1037 { &hf_disp_rdn , BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_x509if_RelativeDistinguishedName },
1038 { &hf_disp_sDSE , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_SDSEContent },
1039 { &hf_disp_subtree , BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_SET_OF_Subtree },
1040 { NULL, 0, 0, 0, NULL }
1043 static int
1044 dissect_disp_Subtree(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1045 // Subtree -> Subtree/subtree -> Subtree
1046 actx->pinfo->dissection_depth += 2;
1047 increment_dissection_depth(actx->pinfo);
1048 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1049 Subtree_sequence, hf_index, ett_disp_Subtree);
1051 actx->pinfo->dissection_depth -= 2;
1052 decrement_dissection_depth(actx->pinfo);
1053 return offset;
1057 static const ber_sequence_t TotalRefresh_sequence[] = {
1058 { &hf_disp_sDSE , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_SDSEContent },
1059 { &hf_disp_subtree , BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_SET_OF_Subtree },
1060 { NULL, 0, 0, 0, NULL }
1063 static int
1064 dissect_disp_TotalRefresh(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1065 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1066 TotalRefresh_sequence, hf_index, ett_disp_TotalRefresh);
1068 return offset;
1072 static const value_string disp_T_rename_vals[] = {
1073 { 0, "newRDN" },
1074 { 1, "newDN" },
1075 { 0, NULL }
1078 static const ber_choice_t T_rename_choice[] = {
1079 { 0, &hf_disp_newRDN , BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_x509if_RelativeDistinguishedName },
1080 { 1, &hf_disp_newDN , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509if_DistinguishedName },
1081 { 0, NULL, 0, 0, 0, NULL }
1084 static int
1085 dissect_disp_T_rename(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1086 offset = dissect_ber_choice(actx, tree, tvb, offset,
1087 T_rename_choice, hf_index, ett_disp_T_rename,
1088 NULL);
1090 return offset;
1094 static const ber_sequence_t SEQUENCE_OF_EntryModification_sequence_of[1] = {
1095 { &hf_disp_changes_item , BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG, dissect_dap_EntryModification },
1098 static int
1099 dissect_disp_SEQUENCE_OF_EntryModification(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1100 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
1101 SEQUENCE_OF_EntryModification_sequence_of, hf_index, ett_disp_SEQUENCE_OF_EntryModification);
1103 return offset;
1107 static const value_string disp_T_attributeChanges_vals[] = {
1108 { 0, "replace" },
1109 { 1, "changes" },
1110 { 0, NULL }
1113 static const ber_choice_t T_attributeChanges_choice[] = {
1114 { 0, &hf_disp_replace , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_disp_SET_OF_Attribute },
1115 { 1, &hf_disp_changes , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_disp_SEQUENCE_OF_EntryModification },
1116 { 0, NULL, 0, 0, 0, NULL }
1119 static int
1120 dissect_disp_T_attributeChanges(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1121 offset = dissect_ber_choice(actx, tree, tvb, offset,
1122 T_attributeChanges_choice, hf_index, ett_disp_T_attributeChanges,
1123 NULL);
1125 return offset;
1129 static const ber_sequence_t ContentChange_sequence[] = {
1130 { &hf_disp_rename , BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_disp_T_rename },
1131 { &hf_disp_attributeChanges, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_disp_T_attributeChanges },
1132 { &hf_disp_sDSEType , BER_CLASS_UNI, BER_UNI_TAG_BITSTRING, BER_FLAGS_NOOWNTAG, dissect_disp_SDSEType },
1133 { &hf_disp_subComplete , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_disp_BOOLEAN },
1134 { &hf_disp_attComplete , BER_CLASS_CON, 3, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_disp_BOOLEAN },
1135 { &hf_disp_attValIncomplete, BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_SET_OF_AttributeType },
1136 { NULL, 0, 0, 0, NULL }
1139 static int
1140 dissect_disp_ContentChange(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1141 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1142 ContentChange_sequence, hf_index, ett_disp_ContentChange);
1144 return offset;
1148 static const value_string disp_T_sDSEChanges_vals[] = {
1149 { 0, "add" },
1150 { 1, "remove" },
1151 { 2, "modify" },
1152 { 0, NULL }
1155 static const ber_choice_t T_sDSEChanges_choice[] = {
1156 { 0, &hf_disp_add , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_disp_SDSEContent },
1157 { 1, &hf_disp_remove , BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_NOOWNTAG, dissect_disp_NULL },
1158 { 2, &hf_disp_modify , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_disp_ContentChange },
1159 { 0, NULL, 0, 0, 0, NULL }
1162 static int
1163 dissect_disp_T_sDSEChanges(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1164 offset = dissect_ber_choice(actx, tree, tvb, offset,
1165 T_sDSEChanges_choice, hf_index, ett_disp_T_sDSEChanges,
1166 NULL);
1168 return offset;
1172 static const ber_sequence_t SubordinateChanges_sequence[] = {
1173 { &hf_disp_subordinate , BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_NOOWNTAG, dissect_x509if_RelativeDistinguishedName },
1174 { &hf_disp_subordinate_changes, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_IncrementalStepRefresh },
1175 { NULL, 0, 0, 0, NULL }
1178 static int
1179 dissect_disp_SubordinateChanges(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1180 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1181 SubordinateChanges_sequence, hf_index, ett_disp_SubordinateChanges);
1183 return offset;
1187 static const ber_sequence_t SEQUENCE_OF_SubordinateChanges_sequence_of[1] = {
1188 { &hf_disp_subordinateUpdates_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_SubordinateChanges },
1191 static int
1192 dissect_disp_SEQUENCE_OF_SubordinateChanges(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1193 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
1194 SEQUENCE_OF_SubordinateChanges_sequence_of, hf_index, ett_disp_SEQUENCE_OF_SubordinateChanges);
1196 return offset;
1200 static const ber_sequence_t IncrementalStepRefresh_sequence[] = {
1201 { &hf_disp_sDSEChanges , BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_disp_T_sDSEChanges },
1202 { &hf_disp_subordinateUpdates, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_SEQUENCE_OF_SubordinateChanges },
1203 { NULL, 0, 0, 0, NULL }
1206 static int
1207 dissect_disp_IncrementalStepRefresh(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1208 // IncrementalStepRefresh -> IncrementalStepRefresh/subordinateUpdates -> SubordinateChanges -> IncrementalStepRefresh
1209 actx->pinfo->dissection_depth += 3;
1210 increment_dissection_depth(actx->pinfo);
1211 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1212 IncrementalStepRefresh_sequence, hf_index, ett_disp_IncrementalStepRefresh);
1214 actx->pinfo->dissection_depth -= 3;
1215 decrement_dissection_depth(actx->pinfo);
1216 return offset;
1220 static const ber_sequence_t IncrementalRefresh_sequence_of[1] = {
1221 { &hf_disp_IncrementalRefresh_item, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_IncrementalStepRefresh },
1224 static int
1225 dissect_disp_IncrementalRefresh(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1226 offset = dissect_ber_sequence_of(implicit_tag, actx, tree, tvb, offset,
1227 IncrementalRefresh_sequence_of, hf_index, ett_disp_IncrementalRefresh);
1229 return offset;
1233 static const value_string disp_RefreshInformation_vals[] = {
1234 { 0, "noRefresh" },
1235 { 1, "total" },
1236 { 2, "incremental" },
1237 { 3, "otherStrategy" },
1238 { 0, NULL }
1241 static const ber_choice_t RefreshInformation_choice[] = {
1242 { 0, &hf_disp_noRefresh , BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_NOOWNTAG, dissect_disp_NULL },
1243 { 1, &hf_disp_total , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_disp_TotalRefresh },
1244 { 2, &hf_disp_incremental , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_disp_IncrementalRefresh },
1245 { 3, &hf_disp_otherStrategy , BER_CLASS_UNI, BER_UNI_TAG_EXTERNAL, BER_FLAGS_NOOWNTAG, dissect_disp_EXTERNAL },
1246 { 0, NULL, 0, 0, 0, NULL }
1249 static int
1250 dissect_disp_RefreshInformation(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1251 uint32_t update;
1253 offset = dissect_ber_choice(actx, tree, tvb, offset,
1254 RefreshInformation_choice, hf_index, ett_disp_RefreshInformation,
1255 &update);
1258 col_append_fstr(actx->pinfo->cinfo, COL_INFO, " %s", val_to_str(update, disp_RefreshInformation_vals, "unknown(%d)"));
1261 return offset;
1265 static const ber_sequence_t UpdateShadowArgumentData_sequence[] = {
1266 { &hf_disp_agreementID , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_AgreementID },
1267 { &hf_disp_updateTime , BER_CLASS_UNI, BER_UNI_TAG_GeneralizedTime, BER_FLAGS_NOOWNTAG, dissect_disp_Time },
1268 { &hf_disp_updateWindow , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_UpdateWindow },
1269 { &hf_disp_updatedInfo , BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_disp_RefreshInformation },
1270 { &hf_disp_securityParameters, BER_CLASS_UNI, BER_UNI_TAG_SET, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_dap_SecurityParameters },
1271 { NULL, 0, 0, 0, NULL }
1274 static int
1275 dissect_disp_UpdateShadowArgumentData(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1276 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1277 UpdateShadowArgumentData_sequence, hf_index, ett_disp_UpdateShadowArgumentData);
1279 return offset;
1283 static const ber_sequence_t T_signedUpdateShadowArgument_sequence[] = {
1284 { &hf_disp_updateShadowArgument, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_disp_UpdateShadowArgumentData },
1285 { &hf_disp_algorithmIdentifier, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509af_AlgorithmIdentifier },
1286 { &hf_disp_encrypted , BER_CLASS_UNI, BER_UNI_TAG_BITSTRING, BER_FLAGS_NOOWNTAG, dissect_disp_BIT_STRING },
1287 { NULL, 0, 0, 0, NULL }
1290 static int
1291 dissect_disp_T_signedUpdateShadowArgument(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1292 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1293 T_signedUpdateShadowArgument_sequence, hf_index, ett_disp_T_signedUpdateShadowArgument);
1295 return offset;
1299 static const ber_choice_t UpdateShadowArgument_choice[] = {
1300 { 0, &hf_disp_unsignedUpdateShadowArgument, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_disp_UpdateShadowArgumentData },
1301 { 1, &hf_disp_signedUpdateShadowArgument, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_T_signedUpdateShadowArgument },
1302 { 0, NULL, 0, 0, 0, NULL }
1305 static int
1306 dissect_disp_UpdateShadowArgument(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1307 offset = dissect_ber_choice(actx, tree, tvb, offset,
1308 UpdateShadowArgument_choice, hf_index, ett_disp_UpdateShadowArgument,
1309 NULL);
1311 return offset;
1315 static const value_string disp_UpdateShadowResult_vals[] = {
1316 { 0, "null" },
1317 { 1, "information" },
1318 { 0, NULL }
1321 static const ber_choice_t UpdateShadowResult_choice[] = {
1322 { 0, &hf_disp_null , BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_NOOWNTAG, dissect_disp_NULL },
1323 { 1, &hf_disp_information , BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG, dissect_disp_Information },
1324 { 0, NULL, 0, 0, 0, NULL }
1327 static int
1328 dissect_disp_UpdateShadowResult(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1329 uint32_t update;
1331 offset = dissect_ber_choice(actx, tree, tvb, offset,
1332 UpdateShadowResult_choice, hf_index, ett_disp_UpdateShadowResult,
1333 &update);
1336 col_append_fstr(actx->pinfo->cinfo, COL_INFO, " %s", val_to_str(update, disp_UpdateShadowResult_vals, "unknown(%d)"));
1339 return offset;
1343 static const value_string disp_ShadowProblem_vals[] = {
1344 { 1, "invalidAgreementID" },
1345 { 2, "inactiveAgreement" },
1346 { 3, "invalidInformationReceived" },
1347 { 4, "unsupportedStrategy" },
1348 { 5, "missedPrevious" },
1349 { 6, "fullUpdateRequired" },
1350 { 7, "unwillingToPerform" },
1351 { 8, "unsuitableTiming" },
1352 { 9, "updateAlreadyReceived" },
1353 { 10, "invalidSequencing" },
1354 { 11, "insufficientResources" },
1355 { 0, NULL }
1359 static int
1360 dissect_disp_ShadowProblem(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1361 uint32_t problem;
1363 offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
1364 &problem);
1367 col_append_fstr(actx->pinfo->cinfo, COL_INFO, " %s", val_to_str(problem, disp_ShadowProblem_vals, "ShadowProblem(%d)"));
1369 return offset;
1373 static const ber_sequence_t ShadowErrorData_sequence[] = {
1374 { &hf_disp_problem , BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_disp_ShadowProblem },
1375 { &hf_disp_lastUpdate , BER_CLASS_UNI, BER_UNI_TAG_GeneralizedTime, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_Time },
1376 { &hf_disp_updateWindow , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_disp_UpdateWindow },
1377 { &hf_disp_securityParameters, BER_CLASS_CON, 30, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_dap_SecurityParameters },
1378 { &hf_disp_performer , BER_CLASS_CON, 29, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_x509if_DistinguishedName },
1379 { &hf_disp_aliasDereferenced, BER_CLASS_CON, 28, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_disp_BOOLEAN },
1380 { &hf_disp_notification , BER_CLASS_CON, 27, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_disp_SEQUENCE_OF_Attribute },
1381 { NULL, 0, 0, 0, NULL }
1384 static int
1385 dissect_disp_ShadowErrorData(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1386 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1387 ShadowErrorData_sequence, hf_index, ett_disp_ShadowErrorData);
1389 return offset;
1393 static const ber_sequence_t T_signedShadowError_sequence[] = {
1394 { &hf_disp_shadowError , BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_ShadowErrorData },
1395 { &hf_disp_algorithmIdentifier, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_x509af_AlgorithmIdentifier },
1396 { &hf_disp_encrypted , BER_CLASS_UNI, BER_UNI_TAG_BITSTRING, BER_FLAGS_NOOWNTAG, dissect_disp_BIT_STRING },
1397 { NULL, 0, 0, 0, NULL }
1400 static int
1401 dissect_disp_T_signedShadowError(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1402 offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
1403 T_signedShadowError_sequence, hf_index, ett_disp_T_signedShadowError);
1405 return offset;
1409 static const ber_choice_t ShadowError_choice[] = {
1410 { 0, &hf_disp_unsignedShadowError, BER_CLASS_UNI, BER_UNI_TAG_SEQUENCE, BER_FLAGS_NOOWNTAG, dissect_disp_ShadowErrorData },
1411 { 1, &hf_disp_signedShadowError, BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_disp_T_signedShadowError },
1412 { 0, NULL, 0, 0, 0, NULL }
1415 static int
1416 dissect_disp_ShadowError(bool implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1417 offset = dissect_ber_choice(actx, tree, tvb, offset,
1418 ShadowError_choice, hf_index, ett_disp_ShadowError,
1419 NULL);
1421 return offset;
1424 /*--- PDUs ---*/
1426 static int dissect_EstablishParameter_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1427 int offset = 0;
1428 asn1_ctx_t asn1_ctx;
1429 asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, true, pinfo);
1430 offset = dissect_disp_EstablishParameter(false, tvb, offset, &asn1_ctx, tree, hf_disp_EstablishParameter_PDU);
1431 return offset;
1433 static int dissect_ModificationParameter_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1434 int offset = 0;
1435 asn1_ctx_t asn1_ctx;
1436 asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, true, pinfo);
1437 offset = dissect_disp_ModificationParameter(false, tvb, offset, &asn1_ctx, tree, hf_disp_ModificationParameter_PDU);
1438 return offset;
1440 static int dissect_ShadowingAgreementInfo_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1441 int offset = 0;
1442 asn1_ctx_t asn1_ctx;
1443 asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, true, pinfo);
1444 offset = dissect_disp_ShadowingAgreementInfo(false, tvb, offset, &asn1_ctx, tree, hf_disp_ShadowingAgreementInfo_PDU);
1445 return offset;
1450 * Dissect DISP PDUs inside a ROS PDUs
1452 static int
1453 dissect_disp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* data)
1455 int offset = 0;
1456 int old_offset;
1457 proto_item *item;
1458 proto_tree *tree;
1459 struct SESSION_DATA_STRUCTURE* session;
1460 int (*disp_dissector)(bool implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index _U_) = NULL;
1461 const char *disp_op_name;
1462 asn1_ctx_t asn1_ctx;
1464 /* do we have operation information from the ROS dissector */
1465 if (data == NULL)
1466 return 0;
1467 session = (struct SESSION_DATA_STRUCTURE*)data;
1469 asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, true, pinfo);
1471 asn1_ctx.private_data = session;
1473 item = proto_tree_add_item(parent_tree, proto_disp, tvb, 0, -1, ENC_NA);
1474 tree = proto_item_add_subtree(item, ett_disp);
1476 col_set_str(pinfo->cinfo, COL_PROTOCOL, "DISP");
1477 col_clear(pinfo->cinfo, COL_INFO);
1479 switch(session->ros_op & ROS_OP_MASK) {
1480 case (ROS_OP_BIND | ROS_OP_ARGUMENT): /* BindInvoke */
1481 disp_dissector = dissect_disp_DSAShadowBindArgument;
1482 disp_op_name = "Shadow-Bind-Argument";
1483 break;
1484 case (ROS_OP_BIND | ROS_OP_RESULT): /* BindResult */
1485 disp_dissector = dissect_disp_DSAShadowBindResult;
1486 disp_op_name = "Shadow-Bind-Result";
1487 break;
1488 case (ROS_OP_BIND | ROS_OP_ERROR): /* BindError */
1489 disp_dissector = dissect_disp_DSAShadowBindError;
1490 disp_op_name = "Shadow-Bind-Error";
1491 break;
1492 case (ROS_OP_INVOKE | ROS_OP_ARGUMENT): /* Invoke Argument */
1493 switch(session->ros_op & ROS_OP_OPCODE_MASK) {
1494 case 1: /* requestShadowUpdate */
1495 disp_dissector = dissect_disp_RequestShadowUpdateArgument;
1496 disp_op_name = "Request-Shadow-Update-Argument";
1497 break;
1498 case 2: /* updateShadow*/
1499 disp_dissector = dissect_disp_UpdateShadowArgument;
1500 disp_op_name = "Update-Shadow-Argument";
1501 break;
1502 case 3: /* coordinateShadowUpdate */
1503 disp_dissector = dissect_disp_CoordinateShadowUpdateArgument;
1504 disp_op_name = "Coordinate-Shadow-Update-Argument";
1505 break;
1506 default:
1507 proto_tree_add_expert_format(tree, pinfo, &ei_disp_unsupported_opcode, tvb, offset, -1,
1508 "Unsupported DISP opcode (%d)", session->ros_op & ROS_OP_OPCODE_MASK);
1509 break;
1511 break;
1512 case (ROS_OP_INVOKE | ROS_OP_RESULT): /* Return Result */
1513 switch(session->ros_op & ROS_OP_OPCODE_MASK) {
1514 case 1: /* requestShadowUpdate */
1515 disp_dissector = dissect_disp_RequestShadowUpdateResult;
1516 disp_op_name = "Request-Shadow-Result";
1517 break;
1518 case 2: /* updateShadow */
1519 disp_dissector = dissect_disp_UpdateShadowResult;
1520 disp_op_name = "Update-Shadow-Result";
1521 break;
1522 case 3: /* coordinateShadowUpdate */
1523 disp_dissector = dissect_disp_CoordinateShadowUpdateResult;
1524 disp_op_name = "Coordinate-Shadow-Update-Result";
1525 break;
1526 default:
1527 proto_tree_add_expert_format(tree, pinfo, &ei_disp_unsupported_opcode, tvb, offset, -1,
1528 "Unsupported DISP opcode (%d)", session->ros_op & ROS_OP_OPCODE_MASK);
1529 break;
1531 break;
1532 case (ROS_OP_INVOKE | ROS_OP_ERROR): /* Return Error */
1533 switch(session->ros_op & ROS_OP_OPCODE_MASK) {
1534 case 1: /* shadowError */
1535 disp_dissector = dissect_disp_ShadowError;
1536 disp_op_name = "Shadow-Error";
1537 break;
1538 default:
1539 proto_tree_add_expert_format(tree, pinfo, &ei_disp_unsupported_errcode, tvb, offset, -1,
1540 "Unsupported DISP errcode (%d)", session->ros_op & ROS_OP_OPCODE_MASK);
1541 break;
1543 break;
1544 default:
1545 proto_tree_add_expert(tree, pinfo, &ei_disp_unsupported_pdu, tvb, offset, -1);
1546 return tvb_captured_length(tvb);
1549 if(disp_dissector) {
1550 col_set_str(pinfo->cinfo, COL_INFO, disp_op_name);
1552 while (tvb_reported_length_remaining(tvb, offset) > 0){
1553 old_offset=offset;
1554 offset=(*disp_dissector)(false, tvb, offset, &asn1_ctx, tree, -1);
1555 if(offset == old_offset){
1556 proto_tree_add_expert(tree, pinfo, &ei_disp_zero_pdu, tvb, offset, -1);
1557 break;
1562 return tvb_captured_length(tvb);
1566 /*--- proto_register_disp -------------------------------------------*/
1567 void proto_register_disp(void) {
1569 /* List of fields */
1570 static hf_register_info hf[] =
1572 { &hf_disp_EstablishParameter_PDU,
1573 { "EstablishParameter", "disp.EstablishParameter_element",
1574 FT_NONE, BASE_NONE, NULL, 0,
1575 NULL, HFILL }},
1576 { &hf_disp_ModificationParameter_PDU,
1577 { "ModificationParameter", "disp.ModificationParameter_element",
1578 FT_NONE, BASE_NONE, NULL, 0,
1579 NULL, HFILL }},
1580 { &hf_disp_ShadowingAgreementInfo_PDU,
1581 { "ShadowingAgreementInfo", "disp.ShadowingAgreementInfo_element",
1582 FT_NONE, BASE_NONE, NULL, 0,
1583 NULL, HFILL }},
1584 { &hf_disp_modifiedSecondaryShadows,
1585 { "secondaryShadows", "disp.modifiedSecondaryShadows",
1586 FT_UINT32, BASE_DEC, NULL, 0,
1587 "SET_OF_SupplierAndConsumers", HFILL }},
1588 { &hf_disp_modifiedSecondaryShadows_item,
1589 { "SupplierAndConsumers", "disp.SupplierAndConsumers_element",
1590 FT_NONE, BASE_NONE, NULL, 0,
1591 NULL, HFILL }},
1592 { &hf_disp_shadowSubject,
1593 { "shadowSubject", "disp.shadowSubject_element",
1594 FT_NONE, BASE_NONE, NULL, 0,
1595 "UnitOfReplication", HFILL }},
1596 { &hf_disp_updateMode,
1597 { "updateMode", "disp.updateMode",
1598 FT_UINT32, BASE_DEC, VALS(disp_UpdateMode_vals), 0,
1599 NULL, HFILL }},
1600 { &hf_disp_master,
1601 { "master", "disp.master_element",
1602 FT_NONE, BASE_NONE, NULL, 0,
1603 "AccessPoint", HFILL }},
1604 { &hf_disp_secondaryShadows,
1605 { "secondaryShadows", "disp.secondaryShadows",
1606 FT_BOOLEAN, BASE_NONE, NULL, 0,
1607 "BOOLEAN", HFILL }},
1608 { &hf_disp_area,
1609 { "area", "disp.area_element",
1610 FT_NONE, BASE_NONE, NULL, 0,
1611 "AreaSpecification", HFILL }},
1612 { &hf_disp_replication_attributes,
1613 { "attributes", "disp.attributes",
1614 FT_UINT32, BASE_DEC, NULL, 0,
1615 "AttributeSelection", HFILL }},
1616 { &hf_disp_knowledge,
1617 { "knowledge", "disp.knowledge_element",
1618 FT_NONE, BASE_NONE, NULL, 0,
1619 NULL, HFILL }},
1620 { &hf_disp_subordinates,
1621 { "subordinates", "disp.subordinates",
1622 FT_BOOLEAN, BASE_NONE, NULL, 0,
1623 "BOOLEAN", HFILL }},
1624 { &hf_disp_contextSelection,
1625 { "contextSelection", "disp.contextSelection",
1626 FT_UINT32, BASE_DEC, VALS(dap_ContextSelection_vals), 0,
1627 NULL, HFILL }},
1628 { &hf_disp_supplyContexts,
1629 { "supplyContexts", "disp.supplyContexts",
1630 FT_UINT32, BASE_DEC, VALS(disp_T_supplyContexts_vals), 0,
1631 NULL, HFILL }},
1632 { &hf_disp_allContexts,
1633 { "allContexts", "disp.allContexts_element",
1634 FT_NONE, BASE_NONE, NULL, 0,
1635 NULL, HFILL }},
1636 { &hf_disp_selectedContexts,
1637 { "selectedContexts", "disp.selectedContexts",
1638 FT_UINT32, BASE_DEC, NULL, 0,
1639 NULL, HFILL }},
1640 { &hf_disp_selectedContexts_item,
1641 { "selectedContexts item", "disp.selectedContexts_item",
1642 FT_OID, BASE_NONE, NULL, 0,
1643 "OBJECT_IDENTIFIER", HFILL }},
1644 { &hf_disp_contextPrefix,
1645 { "contextPrefix", "disp.contextPrefix",
1646 FT_UINT32, BASE_DEC, NULL, 0,
1647 "DistinguishedName", HFILL }},
1648 { &hf_disp_replicationArea,
1649 { "replicationArea", "disp.replicationArea_element",
1650 FT_NONE, BASE_NONE, NULL, 0,
1651 "SubtreeSpecification", HFILL }},
1652 { &hf_disp_knowledgeType,
1653 { "knowledgeType", "disp.knowledgeType",
1654 FT_UINT32, BASE_DEC, VALS(disp_T_knowledgeType_vals), 0,
1655 NULL, HFILL }},
1656 { &hf_disp_extendedKnowledge,
1657 { "extendedKnowledge", "disp.extendedKnowledge",
1658 FT_BOOLEAN, BASE_NONE, NULL, 0,
1659 "BOOLEAN", HFILL }},
1660 { &hf_disp_AttributeSelection_item,
1661 { "ClassAttributeSelection", "disp.ClassAttributeSelection_element",
1662 FT_NONE, BASE_NONE, NULL, 0,
1663 NULL, HFILL }},
1664 { &hf_disp_class,
1665 { "class", "disp.class",
1666 FT_OID, BASE_NONE, NULL, 0,
1667 "OBJECT_IDENTIFIER", HFILL }},
1668 { &hf_disp_classAttributes,
1669 { "classAttributes", "disp.classAttributes",
1670 FT_UINT32, BASE_DEC, VALS(disp_ClassAttributes_vals), 0,
1671 NULL, HFILL }},
1672 { &hf_disp_allAttributes,
1673 { "allAttributes", "disp.allAttributes_element",
1674 FT_NONE, BASE_NONE, NULL, 0,
1675 NULL, HFILL }},
1676 { &hf_disp_include,
1677 { "include", "disp.include",
1678 FT_UINT32, BASE_DEC, NULL, 0,
1679 "AttributeTypes", HFILL }},
1680 { &hf_disp_exclude,
1681 { "exclude", "disp.exclude",
1682 FT_UINT32, BASE_DEC, NULL, 0,
1683 "AttributeTypes", HFILL }},
1684 { &hf_disp_AttributeTypes_item,
1685 { "AttributeType", "disp.AttributeType",
1686 FT_OID, BASE_NONE, NULL, 0,
1687 NULL, HFILL }},
1688 { &hf_disp_supplierInitiated,
1689 { "supplierInitiated", "disp.supplierInitiated",
1690 FT_UINT32, BASE_DEC, VALS(disp_SupplierUpdateMode_vals), 0,
1691 "SupplierUpdateMode", HFILL }},
1692 { &hf_disp_consumerInitiated,
1693 { "consumerInitiated", "disp.consumerInitiated_element",
1694 FT_NONE, BASE_NONE, NULL, 0,
1695 "ConsumerUpdateMode", HFILL }},
1696 { &hf_disp_onChange,
1697 { "onChange", "disp.onChange",
1698 FT_BOOLEAN, BASE_NONE, NULL, 0,
1699 "BOOLEAN", HFILL }},
1700 { &hf_disp_scheduled,
1701 { "scheduled", "disp.scheduled_element",
1702 FT_NONE, BASE_NONE, NULL, 0,
1703 "SchedulingParameters", HFILL }},
1704 { &hf_disp_periodic,
1705 { "periodic", "disp.periodic_element",
1706 FT_NONE, BASE_NONE, NULL, 0,
1707 "PeriodicStrategy", HFILL }},
1708 { &hf_disp_othertimes,
1709 { "othertimes", "disp.othertimes",
1710 FT_BOOLEAN, BASE_NONE, NULL, 0,
1711 "BOOLEAN", HFILL }},
1712 { &hf_disp_beginTime,
1713 { "beginTime", "disp.beginTime",
1714 FT_STRING, BASE_NONE, NULL, 0,
1715 "Time", HFILL }},
1716 { &hf_disp_windowSize,
1717 { "windowSize", "disp.windowSize",
1718 FT_INT32, BASE_DEC, NULL, 0,
1719 "INTEGER", HFILL }},
1720 { &hf_disp_updateInterval,
1721 { "updateInterval", "disp.updateInterval",
1722 FT_INT32, BASE_DEC, NULL, 0,
1723 "INTEGER", HFILL }},
1724 { &hf_disp_agreementID,
1725 { "agreementID", "disp.agreementID_element",
1726 FT_NONE, BASE_NONE, NULL, 0,
1727 NULL, HFILL }},
1728 { &hf_disp_lastUpdate,
1729 { "lastUpdate", "disp.lastUpdate",
1730 FT_STRING, BASE_NONE, NULL, 0,
1731 "Time", HFILL }},
1732 { &hf_disp_updateStrategy,
1733 { "updateStrategy", "disp.updateStrategy",
1734 FT_UINT32, BASE_DEC, VALS(disp_T_updateStrategy_vals), 0,
1735 NULL, HFILL }},
1736 { &hf_disp_standardUpdate,
1737 { "standard", "disp.standard",
1738 FT_UINT32, BASE_DEC, VALS(disp_StandardUpdate_vals), 0,
1739 "StandardUpdate", HFILL }},
1740 { &hf_disp_other,
1741 { "other", "disp.other_element",
1742 FT_NONE, BASE_NONE, NULL, 0,
1743 "EXTERNAL", HFILL }},
1744 { &hf_disp_securityParameters,
1745 { "securityParameters", "disp.securityParameters_element",
1746 FT_NONE, BASE_NONE, NULL, 0,
1747 NULL, HFILL }},
1748 { &hf_disp_unsignedCoordinateShadowUpdateArgument,
1749 { "unsignedCoordinateShadowUpdateArgument", "disp.unsignedCoordinateShadowUpdateArgument_element",
1750 FT_NONE, BASE_NONE, NULL, 0,
1751 "CoordinateShadowUpdateArgumentData", HFILL }},
1752 { &hf_disp_signedCoordinateShadowUpdateArgument,
1753 { "signedCoordinateShadowUpdateArgument", "disp.signedCoordinateShadowUpdateArgument_element",
1754 FT_NONE, BASE_NONE, NULL, 0,
1755 NULL, HFILL }},
1756 { &hf_disp_coordinateShadowUpdateArgument,
1757 { "coordinateShadowUpdateArgument", "disp.coordinateShadowUpdateArgument_element",
1758 FT_NONE, BASE_NONE, NULL, 0,
1759 "CoordinateShadowUpdateArgumentData", HFILL }},
1760 { &hf_disp_algorithmIdentifier,
1761 { "algorithmIdentifier", "disp.algorithmIdentifier_element",
1762 FT_NONE, BASE_NONE, NULL, 0,
1763 NULL, HFILL }},
1764 { &hf_disp_encrypted,
1765 { "encrypted", "disp.encrypted",
1766 FT_BYTES, BASE_NONE, NULL, 0,
1767 "BIT_STRING", HFILL }},
1768 { &hf_disp_null,
1769 { "null", "disp.null_element",
1770 FT_NONE, BASE_NONE, NULL, 0,
1771 NULL, HFILL }},
1772 { &hf_disp_information,
1773 { "information", "disp.information",
1774 FT_UINT32, BASE_DEC, VALS(disp_Information_vals), 0,
1775 NULL, HFILL }},
1776 { &hf_disp_performer,
1777 { "performer", "disp.performer",
1778 FT_UINT32, BASE_DEC, NULL, 0,
1779 "DistinguishedName", HFILL }},
1780 { &hf_disp_aliasDereferenced,
1781 { "aliasDereferenced", "disp.aliasDereferenced",
1782 FT_BOOLEAN, BASE_NONE, NULL, 0,
1783 "BOOLEAN", HFILL }},
1784 { &hf_disp_notification,
1785 { "notification", "disp.notification",
1786 FT_UINT32, BASE_DEC, NULL, 0,
1787 "SEQUENCE_OF_Attribute", HFILL }},
1788 { &hf_disp_notification_item,
1789 { "Attribute", "disp.Attribute_element",
1790 FT_NONE, BASE_NONE, NULL, 0,
1791 NULL, HFILL }},
1792 { &hf_disp_unsignedInformation,
1793 { "unsignedInformation", "disp.unsignedInformation_element",
1794 FT_NONE, BASE_NONE, NULL, 0,
1795 "InformationData", HFILL }},
1796 { &hf_disp_signedInformation,
1797 { "signedInformation", "disp.signedInformation_element",
1798 FT_NONE, BASE_NONE, NULL, 0,
1799 NULL, HFILL }},
1800 { &hf_disp_information_data,
1801 { "information", "disp.information_element",
1802 FT_NONE, BASE_NONE, NULL, 0,
1803 "InformationData", HFILL }},
1804 { &hf_disp_requestedStrategy,
1805 { "requestedStrategy", "disp.requestedStrategy",
1806 FT_UINT32, BASE_DEC, VALS(disp_T_requestedStrategy_vals), 0,
1807 NULL, HFILL }},
1808 { &hf_disp_standard,
1809 { "standard", "disp.standard",
1810 FT_UINT32, BASE_DEC, VALS(disp_T_standard_vals), 0,
1811 NULL, HFILL }},
1812 { &hf_disp_unsignedRequestShadowUpdateArgument,
1813 { "unsignedRequestShadowUpdateArgument", "disp.unsignedRequestShadowUpdateArgument_element",
1814 FT_NONE, BASE_NONE, NULL, 0,
1815 "RequestShadowUpdateArgumentData", HFILL }},
1816 { &hf_disp_signedRequestShadowUpdateArgument,
1817 { "signedRequestShadowUpdateArgument", "disp.signedRequestShadowUpdateArgument_element",
1818 FT_NONE, BASE_NONE, NULL, 0,
1819 NULL, HFILL }},
1820 { &hf_disp_requestShadowUpdateArgument,
1821 { "requestShadowUpdateArgument", "disp.requestShadowUpdateArgument_element",
1822 FT_NONE, BASE_NONE, NULL, 0,
1823 "RequestShadowUpdateArgumentData", HFILL }},
1824 { &hf_disp_updateTime,
1825 { "updateTime", "disp.updateTime",
1826 FT_STRING, BASE_NONE, NULL, 0,
1827 "Time", HFILL }},
1828 { &hf_disp_updateWindow,
1829 { "updateWindow", "disp.updateWindow_element",
1830 FT_NONE, BASE_NONE, NULL, 0,
1831 NULL, HFILL }},
1832 { &hf_disp_updatedInfo,
1833 { "updatedInfo", "disp.updatedInfo",
1834 FT_UINT32, BASE_DEC, VALS(disp_RefreshInformation_vals), 0,
1835 "RefreshInformation", HFILL }},
1836 { &hf_disp_unsignedUpdateShadowArgument,
1837 { "unsignedUpdateShadowArgument", "disp.unsignedUpdateShadowArgument_element",
1838 FT_NONE, BASE_NONE, NULL, 0,
1839 "UpdateShadowArgumentData", HFILL }},
1840 { &hf_disp_signedUpdateShadowArgument,
1841 { "signedUpdateShadowArgument", "disp.signedUpdateShadowArgument_element",
1842 FT_NONE, BASE_NONE, NULL, 0,
1843 NULL, HFILL }},
1844 { &hf_disp_updateShadowArgument,
1845 { "updateShadowArgument", "disp.updateShadowArgument_element",
1846 FT_NONE, BASE_NONE, NULL, 0,
1847 "UpdateShadowArgumentData", HFILL }},
1848 { &hf_disp_start,
1849 { "start", "disp.start",
1850 FT_STRING, BASE_NONE, NULL, 0,
1851 "Time", HFILL }},
1852 { &hf_disp_stop,
1853 { "stop", "disp.stop",
1854 FT_STRING, BASE_NONE, NULL, 0,
1855 "Time", HFILL }},
1856 { &hf_disp_noRefresh,
1857 { "noRefresh", "disp.noRefresh_element",
1858 FT_NONE, BASE_NONE, NULL, 0,
1859 NULL, HFILL }},
1860 { &hf_disp_total,
1861 { "total", "disp.total_element",
1862 FT_NONE, BASE_NONE, NULL, 0,
1863 "TotalRefresh", HFILL }},
1864 { &hf_disp_incremental,
1865 { "incremental", "disp.incremental",
1866 FT_UINT32, BASE_DEC, NULL, 0,
1867 "IncrementalRefresh", HFILL }},
1868 { &hf_disp_otherStrategy,
1869 { "otherStrategy", "disp.otherStrategy_element",
1870 FT_NONE, BASE_NONE, NULL, 0,
1871 "EXTERNAL", HFILL }},
1872 { &hf_disp_sDSE,
1873 { "sDSE", "disp.sDSE_element",
1874 FT_NONE, BASE_NONE, NULL, 0,
1875 "SDSEContent", HFILL }},
1876 { &hf_disp_subtree,
1877 { "subtree", "disp.subtree",
1878 FT_UINT32, BASE_DEC, NULL, 0,
1879 "SET_OF_Subtree", HFILL }},
1880 { &hf_disp_subtree_item,
1881 { "Subtree", "disp.Subtree_element",
1882 FT_NONE, BASE_NONE, NULL, 0,
1883 NULL, HFILL }},
1884 { &hf_disp_sDSEType,
1885 { "sDSEType", "disp.sDSEType",
1886 FT_BYTES, BASE_NONE, NULL, 0,
1887 NULL, HFILL }},
1888 { &hf_disp_subComplete,
1889 { "subComplete", "disp.subComplete",
1890 FT_BOOLEAN, BASE_NONE, NULL, 0,
1891 "BOOLEAN", HFILL }},
1892 { &hf_disp_attComplete,
1893 { "attComplete", "disp.attComplete",
1894 FT_BOOLEAN, BASE_NONE, NULL, 0,
1895 "BOOLEAN", HFILL }},
1896 { &hf_disp_attributes,
1897 { "attributes", "disp.attributes",
1898 FT_UINT32, BASE_DEC, NULL, 0,
1899 "SET_OF_Attribute", HFILL }},
1900 { &hf_disp_attributes_item,
1901 { "Attribute", "disp.Attribute_element",
1902 FT_NONE, BASE_NONE, NULL, 0,
1903 NULL, HFILL }},
1904 { &hf_disp_attValIncomplete,
1905 { "attValIncomplete", "disp.attValIncomplete",
1906 FT_UINT32, BASE_DEC, NULL, 0,
1907 "SET_OF_AttributeType", HFILL }},
1908 { &hf_disp_attValIncomplete_item,
1909 { "AttributeType", "disp.AttributeType",
1910 FT_OID, BASE_NONE, NULL, 0,
1911 NULL, HFILL }},
1912 { &hf_disp_rdn,
1913 { "rdn", "disp.rdn",
1914 FT_UINT32, BASE_DEC, NULL, 0,
1915 "RelativeDistinguishedName", HFILL }},
1916 { &hf_disp_IncrementalRefresh_item,
1917 { "IncrementalStepRefresh", "disp.IncrementalStepRefresh_element",
1918 FT_NONE, BASE_NONE, NULL, 0,
1919 NULL, HFILL }},
1920 { &hf_disp_sDSEChanges,
1921 { "sDSEChanges", "disp.sDSEChanges",
1922 FT_UINT32, BASE_DEC, VALS(disp_T_sDSEChanges_vals), 0,
1923 NULL, HFILL }},
1924 { &hf_disp_add,
1925 { "add", "disp.add_element",
1926 FT_NONE, BASE_NONE, NULL, 0,
1927 "SDSEContent", HFILL }},
1928 { &hf_disp_remove,
1929 { "remove", "disp.remove_element",
1930 FT_NONE, BASE_NONE, NULL, 0,
1931 NULL, HFILL }},
1932 { &hf_disp_modify,
1933 { "modify", "disp.modify_element",
1934 FT_NONE, BASE_NONE, NULL, 0,
1935 "ContentChange", HFILL }},
1936 { &hf_disp_subordinateUpdates,
1937 { "subordinateUpdates", "disp.subordinateUpdates",
1938 FT_UINT32, BASE_DEC, NULL, 0,
1939 "SEQUENCE_OF_SubordinateChanges", HFILL }},
1940 { &hf_disp_subordinateUpdates_item,
1941 { "SubordinateChanges", "disp.SubordinateChanges_element",
1942 FT_NONE, BASE_NONE, NULL, 0,
1943 NULL, HFILL }},
1944 { &hf_disp_rename,
1945 { "rename", "disp.rename",
1946 FT_UINT32, BASE_DEC, VALS(disp_T_rename_vals), 0,
1947 NULL, HFILL }},
1948 { &hf_disp_newRDN,
1949 { "newRDN", "disp.newRDN",
1950 FT_UINT32, BASE_DEC, NULL, 0,
1951 "RelativeDistinguishedName", HFILL }},
1952 { &hf_disp_newDN,
1953 { "newDN", "disp.newDN",
1954 FT_UINT32, BASE_DEC, NULL, 0,
1955 "DistinguishedName", HFILL }},
1956 { &hf_disp_attributeChanges,
1957 { "attributeChanges", "disp.attributeChanges",
1958 FT_UINT32, BASE_DEC, VALS(disp_T_attributeChanges_vals), 0,
1959 NULL, HFILL }},
1960 { &hf_disp_replace,
1961 { "replace", "disp.replace",
1962 FT_UINT32, BASE_DEC, NULL, 0,
1963 "SET_OF_Attribute", HFILL }},
1964 { &hf_disp_replace_item,
1965 { "Attribute", "disp.Attribute_element",
1966 FT_NONE, BASE_NONE, NULL, 0,
1967 NULL, HFILL }},
1968 { &hf_disp_changes,
1969 { "changes", "disp.changes",
1970 FT_UINT32, BASE_DEC, NULL, 0,
1971 "SEQUENCE_OF_EntryModification", HFILL }},
1972 { &hf_disp_changes_item,
1973 { "EntryModification", "disp.EntryModification",
1974 FT_UINT32, BASE_DEC, VALS(dap_EntryModification_vals), 0,
1975 NULL, HFILL }},
1976 { &hf_disp_subordinate,
1977 { "subordinate", "disp.subordinate",
1978 FT_UINT32, BASE_DEC, NULL, 0,
1979 "RelativeDistinguishedName", HFILL }},
1980 { &hf_disp_subordinate_changes,
1981 { "changes", "disp.changes_element",
1982 FT_NONE, BASE_NONE, NULL, 0,
1983 "IncrementalStepRefresh", HFILL }},
1984 { &hf_disp_problem,
1985 { "problem", "disp.problem",
1986 FT_INT32, BASE_DEC, VALS(disp_ShadowProblem_vals), 0,
1987 "ShadowProblem", HFILL }},
1988 { &hf_disp_unsignedShadowError,
1989 { "unsignedShadowError", "disp.unsignedShadowError_element",
1990 FT_NONE, BASE_NONE, NULL, 0,
1991 "ShadowErrorData", HFILL }},
1992 { &hf_disp_signedShadowError,
1993 { "signedShadowError", "disp.signedShadowError_element",
1994 FT_NONE, BASE_NONE, NULL, 0,
1995 NULL, HFILL }},
1996 { &hf_disp_shadowError,
1997 { "shadowError", "disp.shadowError_element",
1998 FT_NONE, BASE_NONE, NULL, 0,
1999 "ShadowErrorData", HFILL }},
2002 /* List of subtrees */
2003 static int *ett[] = {
2004 &ett_disp,
2005 &ett_disp_ModificationParameter,
2006 &ett_disp_SET_OF_SupplierAndConsumers,
2007 &ett_disp_ShadowingAgreementInfo,
2008 &ett_disp_UnitOfReplication,
2009 &ett_disp_T_supplyContexts,
2010 &ett_disp_T_selectedContexts,
2011 &ett_disp_AreaSpecification,
2012 &ett_disp_Knowledge,
2013 &ett_disp_AttributeSelection,
2014 &ett_disp_ClassAttributeSelection,
2015 &ett_disp_ClassAttributes,
2016 &ett_disp_AttributeTypes,
2017 &ett_disp_UpdateMode,
2018 &ett_disp_SupplierUpdateMode,
2019 &ett_disp_SchedulingParameters,
2020 &ett_disp_PeriodicStrategy,
2021 &ett_disp_CoordinateShadowUpdateArgumentData,
2022 &ett_disp_T_updateStrategy,
2023 &ett_disp_CoordinateShadowUpdateArgument,
2024 &ett_disp_T_signedCoordinateShadowUpdateArgument,
2025 &ett_disp_CoordinateShadowUpdateResult,
2026 &ett_disp_InformationData,
2027 &ett_disp_SEQUENCE_OF_Attribute,
2028 &ett_disp_Information,
2029 &ett_disp_T_signedInformation,
2030 &ett_disp_RequestShadowUpdateArgumentData,
2031 &ett_disp_T_requestedStrategy,
2032 &ett_disp_RequestShadowUpdateArgument,
2033 &ett_disp_T_signedRequestShadowUpdateArgument,
2034 &ett_disp_RequestShadowUpdateResult,
2035 &ett_disp_UpdateShadowArgumentData,
2036 &ett_disp_UpdateShadowArgument,
2037 &ett_disp_T_signedUpdateShadowArgument,
2038 &ett_disp_UpdateShadowResult,
2039 &ett_disp_UpdateWindow,
2040 &ett_disp_RefreshInformation,
2041 &ett_disp_TotalRefresh,
2042 &ett_disp_SET_OF_Subtree,
2043 &ett_disp_SDSEContent,
2044 &ett_disp_SET_OF_Attribute,
2045 &ett_disp_SET_OF_AttributeType,
2046 &ett_disp_Subtree,
2047 &ett_disp_IncrementalRefresh,
2048 &ett_disp_IncrementalStepRefresh,
2049 &ett_disp_T_sDSEChanges,
2050 &ett_disp_SEQUENCE_OF_SubordinateChanges,
2051 &ett_disp_ContentChange,
2052 &ett_disp_T_rename,
2053 &ett_disp_T_attributeChanges,
2054 &ett_disp_SEQUENCE_OF_EntryModification,
2055 &ett_disp_SubordinateChanges,
2056 &ett_disp_ShadowErrorData,
2057 &ett_disp_ShadowError,
2058 &ett_disp_T_signedShadowError,
2061 static ei_register_info ei[] = {
2062 { &ei_disp_unsupported_opcode, { "disp.unsupported_opcode", PI_UNDECODED, PI_WARN, "Unsupported DISP opcode", EXPFILL }},
2063 { &ei_disp_unsupported_errcode, { "disp.unsupported_errcode", PI_UNDECODED, PI_WARN, "Unsupported DISP errcode", EXPFILL }},
2064 { &ei_disp_unsupported_pdu, { "disp.unsupported_pdu", PI_UNDECODED, PI_WARN, "Unsupported DISP PDU", EXPFILL }},
2065 { &ei_disp_zero_pdu, { "disp.zero_pdu", PI_PROTOCOL, PI_ERROR, "Internal error, zero-byte DISP PDU", EXPFILL }},
2068 module_t *disp_module;
2069 expert_module_t* expert_disp;
2071 /* Register protocol */
2072 proto_disp = proto_register_protocol(PNAME, PSNAME, PFNAME);
2073 disp_handle = register_dissector("disp", dissect_disp, proto_disp);
2075 /* Register fields and subtrees */
2076 proto_register_field_array(proto_disp, hf, array_length(hf));
2077 proto_register_subtree_array(ett, array_length(ett));
2078 expert_disp = expert_register_protocol(proto_disp);
2079 expert_register_field_array(expert_disp, ei, array_length(ei));
2081 /* Register our configuration options for DISP, particularly our port */
2083 disp_module = prefs_register_protocol_subtree("OSI/X.500", proto_disp, NULL);
2085 prefs_register_obsolete_preference(disp_module, "tcp.port");
2087 prefs_register_static_text_preference(disp_module, "tcp_port_info",
2088 "The TCP ports used by the DISP protocol should be added to the TPKT preference \"TPKT TCP ports\", or by selecting \"TPKT\" as the \"Transport\" protocol in the \"Decode As\" dialog.",
2089 "DISP TCP Port preference moved information");
2094 /*--- proto_reg_handoff_disp --- */
2095 void proto_reg_handoff_disp(void) {
2096 dissector_add_string("dop.oid", "agreement.2.5.19.1", create_dissector_handle(dissect_ShadowingAgreementInfo_PDU, proto_disp));
2097 dissector_add_string("dop.oid", "establish.rolea.2.5.19.1", create_dissector_handle(dissect_EstablishParameter_PDU, proto_disp));
2098 dissector_add_string("dop.oid", "establish.roleb.2.5.19.1", create_dissector_handle(dissect_EstablishParameter_PDU, proto_disp));
2099 dissector_add_string("dop.oid", "modify.rolea.2.5.19.1", create_dissector_handle(dissect_ModificationParameter_PDU, proto_disp));
2100 dissector_add_string("dop.oid", "modify.roleb.2.5.19.1", create_dissector_handle(dissect_ModificationParameter_PDU, proto_disp));
2103 /* APPLICATION CONTEXT */
2105 oid_add_from_string("id-ac-shadow-consumer-initiated","2.5.3.4");
2106 oid_add_from_string("id-ac-shadow-supplier-initiated","2.5.3.5");
2107 oid_add_from_string("id-ac-reliable-shadow-consumer-initiated","2.5.3.6");
2108 oid_add_from_string("id-ac-reliable-shadow-supplier-initiated","2.5.3.7");
2110 /* ABSTRACT SYNTAXES */
2111 register_ros_oid_dissector_handle("2.5.9.3", disp_handle, 0, "id-as-directory-shadow", false);
2112 register_rtse_oid_dissector_handle("2.5.9.5", disp_handle, 0, "id-as-directory-reliable-shadow", false);
2113 register_rtse_oid_dissector_handle("2.5.9.6", disp_handle, 0, "id-as-directory-reliable-binding", false);
2115 /* OPERATIONAL BINDING */
2116 oid_add_from_string("id-op-binding-shadow","2.5.1.0.5.1");
2118 /* DNs */
2119 x509if_register_fmt(hf_disp_contextPrefix, "cp=");