1 /******************************************************************************
2 ** Copyright (C) 2006-2015 ascolab GmbH. All Rights Reserved.
3 ** Web: http://www.ascolab.com
4 **
5 ** SPDX-License-Identifier: GPL-2.0-or-later
6 **
7 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
8 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
9 **
10 ** Project: OpcUa Wireshark Plugin
11 **
12 ** Description: OpcUa Complex Type Parser
13 **
14 ** This file was autogenerated on 13.10.2015.
15 ** DON'T MODIFY THIS FILE!
16 **
17 ******************************************************************************/
18 
19 #include "config.h"
20 
21 #include <epan/packet.h>
22 #include "opcua_complextypeparser.h"
23 #include "opcua_enumparser.h"
24 #include "opcua_simpletypes.h"
25 #include "opcua_hfindeces.h"
26 
27 gint ett_opcua_TrustListDataType = -1;
28 gint ett_opcua_array_TrustListDataType = -1;
29 gint ett_opcua_Node = -1;
30 gint ett_opcua_array_Node = -1;
31 gint ett_opcua_InstanceNode = -1;
32 gint ett_opcua_array_InstanceNode = -1;
33 gint ett_opcua_TypeNode = -1;
34 gint ett_opcua_array_TypeNode = -1;
35 gint ett_opcua_ObjectNode = -1;
36 gint ett_opcua_array_ObjectNode = -1;
37 gint ett_opcua_ObjectTypeNode = -1;
38 gint ett_opcua_array_ObjectTypeNode = -1;
39 gint ett_opcua_VariableNode = -1;
40 gint ett_opcua_array_VariableNode = -1;
41 gint ett_opcua_VariableTypeNode = -1;
42 gint ett_opcua_array_VariableTypeNode = -1;
43 gint ett_opcua_ReferenceTypeNode = -1;
44 gint ett_opcua_array_ReferenceTypeNode = -1;
45 gint ett_opcua_MethodNode = -1;
46 gint ett_opcua_array_MethodNode = -1;
47 gint ett_opcua_ViewNode = -1;
48 gint ett_opcua_array_ViewNode = -1;
49 gint ett_opcua_DataTypeNode = -1;
50 gint ett_opcua_array_DataTypeNode = -1;
51 gint ett_opcua_ReferenceNode = -1;
52 gint ett_opcua_array_ReferenceNode = -1;
53 gint ett_opcua_Argument = -1;
54 gint ett_opcua_array_Argument = -1;
55 gint ett_opcua_EnumValueType = -1;
56 gint ett_opcua_array_EnumValueType = -1;
57 gint ett_opcua_OptionSet = -1;
58 gint ett_opcua_array_OptionSet = -1;
59 gint ett_opcua_TimeZoneDataType = -1;
60 gint ett_opcua_array_TimeZoneDataType = -1;
61 gint ett_opcua_ApplicationDescription = -1;
62 gint ett_opcua_array_ApplicationDescription = -1;
63 gint ett_opcua_RequestHeader = -1;
64 gint ett_opcua_array_RequestHeader = -1;
65 gint ett_opcua_ResponseHeader = -1;
66 gint ett_opcua_array_ResponseHeader = -1;
67 gint ett_opcua_ServerOnNetwork = -1;
68 gint ett_opcua_array_ServerOnNetwork = -1;
69 gint ett_opcua_UserTokenPolicy = -1;
70 gint ett_opcua_array_UserTokenPolicy = -1;
71 gint ett_opcua_EndpointDescription = -1;
72 gint ett_opcua_array_EndpointDescription = -1;
73 gint ett_opcua_RegisteredServer = -1;
74 gint ett_opcua_array_RegisteredServer = -1;
75 gint ett_opcua_MdnsDiscoveryConfiguration = -1;
76 gint ett_opcua_array_MdnsDiscoveryConfiguration = -1;
77 gint ett_opcua_ChannelSecurityToken = -1;
78 gint ett_opcua_array_ChannelSecurityToken = -1;
79 gint ett_opcua_SignedSoftwareCertificate = -1;
80 gint ett_opcua_array_SignedSoftwareCertificate = -1;
81 gint ett_opcua_SignatureData = -1;
82 gint ett_opcua_array_SignatureData = -1;
83 gint ett_opcua_UserIdentityToken = -1;
84 gint ett_opcua_array_UserIdentityToken = -1;
85 gint ett_opcua_AnonymousIdentityToken = -1;
86 gint ett_opcua_array_AnonymousIdentityToken = -1;
87 gint ett_opcua_UserNameIdentityToken = -1;
88 gint ett_opcua_array_UserNameIdentityToken = -1;
89 gint ett_opcua_X509IdentityToken = -1;
90 gint ett_opcua_array_X509IdentityToken = -1;
91 gint ett_opcua_KerberosIdentityToken = -1;
92 gint ett_opcua_array_KerberosIdentityToken = -1;
93 gint ett_opcua_IssuedIdentityToken = -1;
94 gint ett_opcua_array_IssuedIdentityToken = -1;
95 gint ett_opcua_NodeAttributes = -1;
96 gint ett_opcua_array_NodeAttributes = -1;
97 gint ett_opcua_ObjectAttributes = -1;
98 gint ett_opcua_array_ObjectAttributes = -1;
99 gint ett_opcua_VariableAttributes = -1;
100 gint ett_opcua_array_VariableAttributes = -1;
101 gint ett_opcua_MethodAttributes = -1;
102 gint ett_opcua_array_MethodAttributes = -1;
103 gint ett_opcua_ObjectTypeAttributes = -1;
104 gint ett_opcua_array_ObjectTypeAttributes = -1;
105 gint ett_opcua_VariableTypeAttributes = -1;
106 gint ett_opcua_array_VariableTypeAttributes = -1;
107 gint ett_opcua_ReferenceTypeAttributes = -1;
108 gint ett_opcua_array_ReferenceTypeAttributes = -1;
109 gint ett_opcua_DataTypeAttributes = -1;
110 gint ett_opcua_array_DataTypeAttributes = -1;
111 gint ett_opcua_ViewAttributes = -1;
112 gint ett_opcua_array_ViewAttributes = -1;
113 gint ett_opcua_AddNodesItem = -1;
114 gint ett_opcua_array_AddNodesItem = -1;
115 gint ett_opcua_AddNodesResult = -1;
116 gint ett_opcua_array_AddNodesResult = -1;
117 gint ett_opcua_AddReferencesItem = -1;
118 gint ett_opcua_array_AddReferencesItem = -1;
119 gint ett_opcua_DeleteNodesItem = -1;
120 gint ett_opcua_array_DeleteNodesItem = -1;
121 gint ett_opcua_DeleteReferencesItem = -1;
122 gint ett_opcua_array_DeleteReferencesItem = -1;
123 gint ett_opcua_ViewDescription = -1;
124 gint ett_opcua_array_ViewDescription = -1;
125 gint ett_opcua_BrowseDescription = -1;
126 gint ett_opcua_array_BrowseDescription = -1;
127 gint ett_opcua_ReferenceDescription = -1;
128 gint ett_opcua_array_ReferenceDescription = -1;
129 gint ett_opcua_BrowseResult = -1;
130 gint ett_opcua_array_BrowseResult = -1;
131 gint ett_opcua_RelativePathElement = -1;
132 gint ett_opcua_array_RelativePathElement = -1;
133 gint ett_opcua_RelativePath = -1;
134 gint ett_opcua_array_RelativePath = -1;
135 gint ett_opcua_BrowsePath = -1;
136 gint ett_opcua_array_BrowsePath = -1;
137 gint ett_opcua_BrowsePathTarget = -1;
138 gint ett_opcua_array_BrowsePathTarget = -1;
139 gint ett_opcua_BrowsePathResult = -1;
140 gint ett_opcua_array_BrowsePathResult = -1;
141 gint ett_opcua_EndpointConfiguration = -1;
142 gint ett_opcua_array_EndpointConfiguration = -1;
143 gint ett_opcua_SupportedProfile = -1;
144 gint ett_opcua_array_SupportedProfile = -1;
145 gint ett_opcua_SoftwareCertificate = -1;
146 gint ett_opcua_array_SoftwareCertificate = -1;
147 gint ett_opcua_QueryDataDescription = -1;
148 gint ett_opcua_array_QueryDataDescription = -1;
149 gint ett_opcua_NodeTypeDescription = -1;
150 gint ett_opcua_array_NodeTypeDescription = -1;
151 gint ett_opcua_QueryDataSet = -1;
152 gint ett_opcua_array_QueryDataSet = -1;
153 gint ett_opcua_NodeReference = -1;
154 gint ett_opcua_array_NodeReference = -1;
155 gint ett_opcua_ContentFilterElement = -1;
156 gint ett_opcua_array_ContentFilterElement = -1;
157 gint ett_opcua_ContentFilter = -1;
158 gint ett_opcua_array_ContentFilter = -1;
159 gint ett_opcua_ElementOperand = -1;
160 gint ett_opcua_array_ElementOperand = -1;
161 gint ett_opcua_LiteralOperand = -1;
162 gint ett_opcua_array_LiteralOperand = -1;
163 gint ett_opcua_AttributeOperand = -1;
164 gint ett_opcua_array_AttributeOperand = -1;
165 gint ett_opcua_SimpleAttributeOperand = -1;
166 gint ett_opcua_array_SimpleAttributeOperand = -1;
167 gint ett_opcua_ContentFilterElementResult = -1;
168 gint ett_opcua_array_ContentFilterElementResult = -1;
169 gint ett_opcua_ContentFilterResult = -1;
170 gint ett_opcua_array_ContentFilterResult = -1;
171 gint ett_opcua_ParsingResult = -1;
172 gint ett_opcua_array_ParsingResult = -1;
173 gint ett_opcua_ReadValueId = -1;
174 gint ett_opcua_array_ReadValueId = -1;
175 gint ett_opcua_HistoryReadValueId = -1;
176 gint ett_opcua_array_HistoryReadValueId = -1;
177 gint ett_opcua_HistoryReadResult = -1;
178 gint ett_opcua_array_HistoryReadResult = -1;
179 gint ett_opcua_ReadEventDetails = -1;
180 gint ett_opcua_array_ReadEventDetails = -1;
181 gint ett_opcua_ReadRawModifiedDetails = -1;
182 gint ett_opcua_array_ReadRawModifiedDetails = -1;
183 gint ett_opcua_ReadProcessedDetails = -1;
184 gint ett_opcua_array_ReadProcessedDetails = -1;
185 gint ett_opcua_ReadAtTimeDetails = -1;
186 gint ett_opcua_array_ReadAtTimeDetails = -1;
187 gint ett_opcua_HistoryData = -1;
188 gint ett_opcua_array_HistoryData = -1;
189 gint ett_opcua_ModificationInfo = -1;
190 gint ett_opcua_array_ModificationInfo = -1;
191 gint ett_opcua_HistoryModifiedData = -1;
192 gint ett_opcua_array_HistoryModifiedData = -1;
193 gint ett_opcua_HistoryEvent = -1;
194 gint ett_opcua_array_HistoryEvent = -1;
195 gint ett_opcua_WriteValue = -1;
196 gint ett_opcua_array_WriteValue = -1;
197 gint ett_opcua_HistoryUpdateDetails = -1;
198 gint ett_opcua_array_HistoryUpdateDetails = -1;
199 gint ett_opcua_UpdateDataDetails = -1;
200 gint ett_opcua_array_UpdateDataDetails = -1;
201 gint ett_opcua_UpdateStructureDataDetails = -1;
202 gint ett_opcua_array_UpdateStructureDataDetails = -1;
203 gint ett_opcua_UpdateEventDetails = -1;
204 gint ett_opcua_array_UpdateEventDetails = -1;
205 gint ett_opcua_DeleteRawModifiedDetails = -1;
206 gint ett_opcua_array_DeleteRawModifiedDetails = -1;
207 gint ett_opcua_DeleteAtTimeDetails = -1;
208 gint ett_opcua_array_DeleteAtTimeDetails = -1;
209 gint ett_opcua_DeleteEventDetails = -1;
210 gint ett_opcua_array_DeleteEventDetails = -1;
211 gint ett_opcua_HistoryUpdateResult = -1;
212 gint ett_opcua_array_HistoryUpdateResult = -1;
213 gint ett_opcua_CallMethodRequest = -1;
214 gint ett_opcua_array_CallMethodRequest = -1;
215 gint ett_opcua_CallMethodResult = -1;
216 gint ett_opcua_array_CallMethodResult = -1;
217 gint ett_opcua_DataChangeFilter = -1;
218 gint ett_opcua_array_DataChangeFilter = -1;
219 gint ett_opcua_EventFilter = -1;
220 gint ett_opcua_array_EventFilter = -1;
221 gint ett_opcua_AggregateConfiguration = -1;
222 gint ett_opcua_array_AggregateConfiguration = -1;
223 gint ett_opcua_AggregateFilter = -1;
224 gint ett_opcua_array_AggregateFilter = -1;
225 gint ett_opcua_EventFilterResult = -1;
226 gint ett_opcua_array_EventFilterResult = -1;
227 gint ett_opcua_AggregateFilterResult = -1;
228 gint ett_opcua_array_AggregateFilterResult = -1;
229 gint ett_opcua_MonitoringParameters = -1;
230 gint ett_opcua_array_MonitoringParameters = -1;
231 gint ett_opcua_MonitoredItemCreateRequest = -1;
232 gint ett_opcua_array_MonitoredItemCreateRequest = -1;
233 gint ett_opcua_MonitoredItemCreateResult = -1;
234 gint ett_opcua_array_MonitoredItemCreateResult = -1;
235 gint ett_opcua_MonitoredItemModifyRequest = -1;
236 gint ett_opcua_array_MonitoredItemModifyRequest = -1;
237 gint ett_opcua_MonitoredItemModifyResult = -1;
238 gint ett_opcua_array_MonitoredItemModifyResult = -1;
239 gint ett_opcua_NotificationMessage = -1;
240 gint ett_opcua_array_NotificationMessage = -1;
241 gint ett_opcua_DataChangeNotification = -1;
242 gint ett_opcua_array_DataChangeNotification = -1;
243 gint ett_opcua_MonitoredItemNotification = -1;
244 gint ett_opcua_array_MonitoredItemNotification = -1;
245 gint ett_opcua_EventNotificationList = -1;
246 gint ett_opcua_array_EventNotificationList = -1;
247 gint ett_opcua_EventFieldList = -1;
248 gint ett_opcua_array_EventFieldList = -1;
249 gint ett_opcua_HistoryEventFieldList = -1;
250 gint ett_opcua_array_HistoryEventFieldList = -1;
251 gint ett_opcua_StatusChangeNotification = -1;
252 gint ett_opcua_array_StatusChangeNotification = -1;
253 gint ett_opcua_SubscriptionAcknowledgement = -1;
254 gint ett_opcua_array_SubscriptionAcknowledgement = -1;
255 gint ett_opcua_TransferResult = -1;
256 gint ett_opcua_array_TransferResult = -1;
257 gint ett_opcua_ScalarTestType = -1;
258 gint ett_opcua_array_ScalarTestType = -1;
259 gint ett_opcua_ArrayTestType = -1;
260 gint ett_opcua_array_ArrayTestType = -1;
261 gint ett_opcua_CompositeTestType = -1;
262 gint ett_opcua_array_CompositeTestType = -1;
263 gint ett_opcua_BuildInfo = -1;
264 gint ett_opcua_array_BuildInfo = -1;
265 gint ett_opcua_RedundantServerDataType = -1;
266 gint ett_opcua_array_RedundantServerDataType = -1;
267 gint ett_opcua_EndpointUrlListDataType = -1;
268 gint ett_opcua_array_EndpointUrlListDataType = -1;
269 gint ett_opcua_NetworkGroupDataType = -1;
270 gint ett_opcua_array_NetworkGroupDataType = -1;
271 gint ett_opcua_SamplingIntervalDiagnosticsDataType = -1;
272 gint ett_opcua_array_SamplingIntervalDiagnosticsDataType = -1;
273 gint ett_opcua_ServerDiagnosticsSummaryDataType = -1;
274 gint ett_opcua_array_ServerDiagnosticsSummaryDataType = -1;
275 gint ett_opcua_ServerStatusDataType = -1;
276 gint ett_opcua_array_ServerStatusDataType = -1;
277 gint ett_opcua_SessionDiagnosticsDataType = -1;
278 gint ett_opcua_array_SessionDiagnosticsDataType = -1;
279 gint ett_opcua_SessionSecurityDiagnosticsDataType = -1;
280 gint ett_opcua_array_SessionSecurityDiagnosticsDataType = -1;
281 gint ett_opcua_ServiceCounterDataType = -1;
282 gint ett_opcua_array_ServiceCounterDataType = -1;
283 gint ett_opcua_StatusResult = -1;
284 gint ett_opcua_array_StatusResult = -1;
285 gint ett_opcua_SubscriptionDiagnosticsDataType = -1;
286 gint ett_opcua_array_SubscriptionDiagnosticsDataType = -1;
287 gint ett_opcua_ModelChangeStructureDataType = -1;
288 gint ett_opcua_array_ModelChangeStructureDataType = -1;
289 gint ett_opcua_SemanticChangeStructureDataType = -1;
290 gint ett_opcua_array_SemanticChangeStructureDataType = -1;
291 gint ett_opcua_Range = -1;
292 gint ett_opcua_array_Range = -1;
293 gint ett_opcua_EUInformation = -1;
294 gint ett_opcua_array_EUInformation = -1;
295 gint ett_opcua_ComplexNumberType = -1;
296 gint ett_opcua_array_ComplexNumberType = -1;
297 gint ett_opcua_DoubleComplexNumberType = -1;
298 gint ett_opcua_array_DoubleComplexNumberType = -1;
299 gint ett_opcua_AxisInformation = -1;
300 gint ett_opcua_array_AxisInformation = -1;
301 gint ett_opcua_XVType = -1;
302 gint ett_opcua_array_XVType = -1;
303 gint ett_opcua_ProgramDiagnosticDataType = -1;
304 gint ett_opcua_array_ProgramDiagnosticDataType = -1;
305 gint ett_opcua_Annotation = -1;
306 gint ett_opcua_array_Annotation = -1;
307 
parseTrustListDataType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)308 void parseTrustListDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
309 {
310   proto_item *ti;
311   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_TrustListDataType, &ti, "%s: TrustListDataType", szFieldName);
312   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedLists);
313   /* Array length field ignored: NoOfTrustedCertificates */
314   parseArraySimple(subtree, tvb, pinfo, pOffset, "TrustedCertificates", "ByteString", hf_opcua_TrustedCertificates, parseByteString, ett_opcua_array_ByteString);
315   /* Array length field ignored: NoOfTrustedCrls */
316   parseArraySimple(subtree, tvb, pinfo, pOffset, "TrustedCrls", "ByteString", hf_opcua_TrustedCrls, parseByteString, ett_opcua_array_ByteString);
317   /* Array length field ignored: NoOfIssuerCertificates */
318   parseArraySimple(subtree, tvb, pinfo, pOffset, "IssuerCertificates", "ByteString", hf_opcua_IssuerCertificates, parseByteString, ett_opcua_array_ByteString);
319   /* Array length field ignored: NoOfIssuerCrls */
320   parseArraySimple(subtree, tvb, pinfo, pOffset, "IssuerCrls", "ByteString", hf_opcua_IssuerCrls, parseByteString, ett_opcua_array_ByteString);
321   proto_item_set_end(ti, tvb, *pOffset);
322 }
parseNode(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)323 void parseNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
324 {
325   proto_item *ti;
326   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_Node, &ti, "%s: Node", szFieldName);
327   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
328   parseNodeClass(subtree, tvb, pinfo, pOffset);
329   parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
330   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
331   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
332   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
333   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
334   /* Array length field ignored: NoOfReferences */
335   parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
336   proto_item_set_end(ti, tvb, *pOffset);
337 }
parseInstanceNode(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)338 void parseInstanceNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
339 {
340   proto_item *ti;
341   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_InstanceNode, &ti, "%s: InstanceNode", szFieldName);
342   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
343   parseNodeClass(subtree, tvb, pinfo, pOffset);
344   parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
345   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
346   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
347   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
348   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
349   /* Array length field ignored: NoOfReferences */
350   parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
351   proto_item_set_end(ti, tvb, *pOffset);
352 }
parseTypeNode(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)353 void parseTypeNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
354 {
355   proto_item *ti;
356   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_TypeNode, &ti, "%s: TypeNode", szFieldName);
357   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
358   parseNodeClass(subtree, tvb, pinfo, pOffset);
359   parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
360   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
361   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
362   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
363   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
364   /* Array length field ignored: NoOfReferences */
365   parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
366   proto_item_set_end(ti, tvb, *pOffset);
367 }
parseObjectNode(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)368 void parseObjectNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
369 {
370   proto_item *ti;
371   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ObjectNode, &ti, "%s: ObjectNode", szFieldName);
372   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
373   parseNodeClass(subtree, tvb, pinfo, pOffset);
374   parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
375   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
376   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
377   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
378   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
379   /* Array length field ignored: NoOfReferences */
380   parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
381   parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_EventNotifier);
382   proto_item_set_end(ti, tvb, *pOffset);
383 }
parseObjectTypeNode(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)384 void parseObjectTypeNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
385 {
386   proto_item *ti;
387   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ObjectTypeNode, &ti, "%s: ObjectTypeNode", szFieldName);
388   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
389   parseNodeClass(subtree, tvb, pinfo, pOffset);
390   parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
391   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
392   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
393   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
394   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
395   /* Array length field ignored: NoOfReferences */
396   parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
397   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsAbstract);
398   proto_item_set_end(ti, tvb, *pOffset);
399 }
parseVariableNode(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)400 void parseVariableNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
401 {
402   proto_item *ti;
403   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_VariableNode, &ti, "%s: VariableNode", szFieldName);
404   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
405   parseNodeClass(subtree, tvb, pinfo, pOffset);
406   parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
407   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
408   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
409   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
410   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
411   /* Array length field ignored: NoOfReferences */
412   parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
413   parseVariant(subtree, tvb, pinfo, pOffset, "Value");
414   parseNodeId(subtree, tvb, pinfo, pOffset, "DataType");
415   parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ValueRank);
416   /* Array length field ignored: NoOfArrayDimensions */
417   parseArraySimple(subtree, tvb, pinfo, pOffset, "ArrayDimensions", "UInt32", hf_opcua_ArrayDimensions, parseUInt32, ett_opcua_array_UInt32);
418   parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_AccessLevel);
419   parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_UserAccessLevel);
420   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_MinimumSamplingInterval);
421   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_Historizing);
422   proto_item_set_end(ti, tvb, *pOffset);
423 }
parseVariableTypeNode(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)424 void parseVariableTypeNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
425 {
426   proto_item *ti;
427   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_VariableTypeNode, &ti, "%s: VariableTypeNode", szFieldName);
428   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
429   parseNodeClass(subtree, tvb, pinfo, pOffset);
430   parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
431   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
432   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
433   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
434   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
435   /* Array length field ignored: NoOfReferences */
436   parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
437   parseVariant(subtree, tvb, pinfo, pOffset, "Value");
438   parseNodeId(subtree, tvb, pinfo, pOffset, "DataType");
439   parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ValueRank);
440   /* Array length field ignored: NoOfArrayDimensions */
441   parseArraySimple(subtree, tvb, pinfo, pOffset, "ArrayDimensions", "UInt32", hf_opcua_ArrayDimensions, parseUInt32, ett_opcua_array_UInt32);
442   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsAbstract);
443   proto_item_set_end(ti, tvb, *pOffset);
444 }
parseReferenceTypeNode(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)445 void parseReferenceTypeNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
446 {
447   proto_item *ti;
448   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReferenceTypeNode, &ti, "%s: ReferenceTypeNode", szFieldName);
449   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
450   parseNodeClass(subtree, tvb, pinfo, pOffset);
451   parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
452   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
453   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
454   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
455   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
456   /* Array length field ignored: NoOfReferences */
457   parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
458   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsAbstract);
459   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_Symmetric);
460   parseLocalizedText(subtree, tvb, pinfo, pOffset, "InverseName");
461   proto_item_set_end(ti, tvb, *pOffset);
462 }
parseMethodNode(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)463 void parseMethodNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
464 {
465   proto_item *ti;
466   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MethodNode, &ti, "%s: MethodNode", szFieldName);
467   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
468   parseNodeClass(subtree, tvb, pinfo, pOffset);
469   parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
470   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
471   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
472   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
473   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
474   /* Array length field ignored: NoOfReferences */
475   parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
476   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_Executable);
477   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_UserExecutable);
478   proto_item_set_end(ti, tvb, *pOffset);
479 }
parseViewNode(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)480 void parseViewNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
481 {
482   proto_item *ti;
483   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ViewNode, &ti, "%s: ViewNode", szFieldName);
484   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
485   parseNodeClass(subtree, tvb, pinfo, pOffset);
486   parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
487   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
488   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
489   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
490   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
491   /* Array length field ignored: NoOfReferences */
492   parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
493   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_ContainsNoLoops);
494   parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_EventNotifier);
495   proto_item_set_end(ti, tvb, *pOffset);
496 }
parseDataTypeNode(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)497 void parseDataTypeNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
498 {
499   proto_item *ti;
500   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DataTypeNode, &ti, "%s: DataTypeNode", szFieldName);
501   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
502   parseNodeClass(subtree, tvb, pinfo, pOffset);
503   parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
504   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
505   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
506   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
507   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
508   /* Array length field ignored: NoOfReferences */
509   parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
510   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsAbstract);
511   proto_item_set_end(ti, tvb, *pOffset);
512 }
parseReferenceNode(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)513 void parseReferenceNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
514 {
515   proto_item *ti;
516   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReferenceNode, &ti, "%s: ReferenceNode", szFieldName);
517   parseNodeId(subtree, tvb, pinfo, pOffset, "ReferenceTypeId");
518   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsInverse);
519   parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "TargetId");
520   proto_item_set_end(ti, tvb, *pOffset);
521 }
parseArgument(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)522 void parseArgument(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
523 {
524   proto_item *ti;
525   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_Argument, &ti, "%s: Argument", szFieldName);
526   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_Name);
527   parseNodeId(subtree, tvb, pinfo, pOffset, "DataType");
528   parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ValueRank);
529   /* Array length field ignored: NoOfArrayDimensions */
530   parseArraySimple(subtree, tvb, pinfo, pOffset, "ArrayDimensions", "UInt32", hf_opcua_ArrayDimensions, parseUInt32, ett_opcua_array_UInt32);
531   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
532   proto_item_set_end(ti, tvb, *pOffset);
533 }
parseEnumValueType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)534 void parseEnumValueType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
535 {
536   proto_item *ti;
537   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EnumValueType, &ti, "%s: EnumValueType", szFieldName);
538   parseInt64(subtree, tvb, pinfo, pOffset, hf_opcua_Value);
539   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
540   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
541   proto_item_set_end(ti, tvb, *pOffset);
542 }
parseOptionSet(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)543 void parseOptionSet(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
544 {
545   proto_item *ti;
546   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_OptionSet, &ti, "%s: OptionSet", szFieldName);
547   parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_Value);
548   parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ValidBits);
549   proto_item_set_end(ti, tvb, *pOffset);
550 }
parseTimeZoneDataType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)551 void parseTimeZoneDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
552 {
553   proto_item *ti;
554   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_TimeZoneDataType, &ti, "%s: TimeZoneDataType", szFieldName);
555   parseInt16(subtree, tvb, pinfo, pOffset, hf_opcua_Offset);
556   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_DaylightSavingInOffset);
557   proto_item_set_end(ti, tvb, *pOffset);
558 }
parseApplicationDescription(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)559 void parseApplicationDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
560 {
561   proto_item *ti;
562   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ApplicationDescription, &ti, "%s: ApplicationDescription", szFieldName);
563   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ApplicationUri);
564   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ProductUri);
565   parseLocalizedText(subtree, tvb, pinfo, pOffset, "ApplicationName");
566   parseApplicationType(subtree, tvb, pinfo, pOffset);
567   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_GatewayServerUri);
568   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_DiscoveryProfileUri);
569   /* Array length field ignored: NoOfDiscoveryUrls */
570   parseArraySimple(subtree, tvb, pinfo, pOffset, "DiscoveryUrls", "String", hf_opcua_DiscoveryUrls, parseString, ett_opcua_array_String);
571   proto_item_set_end(ti, tvb, *pOffset);
572 }
parseRequestHeader(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)573 void parseRequestHeader(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
574 {
575   static int * const returnDiagnostics_mask[] = {
576     &hf_opcua_returnDiag_mask_sl_symbolicId,
577     &hf_opcua_returnDiag_mask_sl_localizedText,
578     &hf_opcua_returnDiag_mask_sl_additionalinfo,
579     &hf_opcua_returnDiag_mask_sl_innerstatuscode,
580     &hf_opcua_returnDiag_mask_sl_innerdiagnostics,
581     &hf_opcua_returnDiag_mask_ol_symbolicId,
582     &hf_opcua_returnDiag_mask_ol_localizedText,
583     &hf_opcua_returnDiag_mask_ol_additionalinfo,
584     &hf_opcua_returnDiag_mask_ol_innerstatuscode,
585     &hf_opcua_returnDiag_mask_ol_innerdiagnostics,
586     NULL};
587 
588   proto_item *ti;
589   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_RequestHeader, &ti, "%s: RequestHeader", szFieldName);
590   parseNodeId(subtree, tvb, pinfo, pOffset, "AuthenticationToken");
591   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_Timestamp);
592   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RequestHandle);
593   proto_tree_add_bitmask(subtree, tvb, *pOffset, hf_opcua_returnDiag, ett_opcua_returnDiagnostics, returnDiagnostics_mask, ENC_LITTLE_ENDIAN); *pOffset += 4;
594   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_AuditEntryId);
595   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_TimeoutHint);
596   parseExtensionObject(subtree, tvb, pinfo, pOffset, "AdditionalHeader");
597   proto_item_set_end(ti, tvb, *pOffset);
598 }
parseResponseHeader(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)599 void parseResponseHeader(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
600 {
601   proto_item *ti;
602   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ResponseHeader, &ti, "%s: ResponseHeader", szFieldName);
603   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_Timestamp);
604   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RequestHandle);
605   parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_ServiceResult);
606   parseDiagnosticInfo(subtree, tvb, pinfo, pOffset, "ServiceDiagnostics");
607   /* Array length field ignored: NoOfStringTable */
608   parseArraySimple(subtree, tvb, pinfo, pOffset, "StringTable", "String", hf_opcua_StringTable, parseString, ett_opcua_array_String);
609   parseExtensionObject(subtree, tvb, pinfo, pOffset, "AdditionalHeader");
610   proto_item_set_end(ti, tvb, *pOffset);
611 }
parseServerOnNetwork(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)612 void parseServerOnNetwork(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
613 {
614   proto_item *ti;
615   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ServerOnNetwork, &ti, "%s: ServerOnNetwork", szFieldName);
616   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RecordId);
617   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerName);
618   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_DiscoveryUrl);
619   /* Array length field ignored: NoOfServerCapabilities */
620   parseArraySimple(subtree, tvb, pinfo, pOffset, "ServerCapabilities", "String", hf_opcua_ServerCapabilities, parseString, ett_opcua_array_String);
621   proto_item_set_end(ti, tvb, *pOffset);
622 }
parseUserTokenPolicy(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)623 void parseUserTokenPolicy(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
624 {
625   proto_item *ti;
626   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_UserTokenPolicy, &ti, "%s: UserTokenPolicy", szFieldName);
627   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_PolicyId);
628   parseUserTokenType(subtree, tvb, pinfo, pOffset);
629   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IssuedTokenType);
630   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IssuerEndpointUrl);
631   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_SecurityPolicyUri);
632   proto_item_set_end(ti, tvb, *pOffset);
633 }
parseEndpointDescription(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)634 void parseEndpointDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
635 {
636   proto_item *ti;
637   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EndpointDescription, &ti, "%s: EndpointDescription", szFieldName);
638   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_EndpointUrl);
639   parseApplicationDescription(subtree, tvb, pinfo, pOffset, "Server");
640   parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerCertificate);
641   parseMessageSecurityMode(subtree, tvb, pinfo, pOffset);
642   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_SecurityPolicyUri);
643   /* Array length field ignored: NoOfUserIdentityTokens */
644   parseArrayComplex(subtree, tvb, pinfo, pOffset, "UserIdentityTokens", "UserTokenPolicy", parseUserTokenPolicy, ett_opcua_array_UserTokenPolicy);
645   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_TransportProfileUri);
646   parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_SecurityLevel);
647   proto_item_set_end(ti, tvb, *pOffset);
648 }
parseRegisteredServer(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)649 void parseRegisteredServer(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
650 {
651   proto_item *ti;
652   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_RegisteredServer, &ti, "%s: RegisteredServer", szFieldName);
653   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerUri);
654   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ProductUri);
655   /* Array length field ignored: NoOfServerNames */
656   parseArrayComplex(subtree, tvb, pinfo, pOffset, "ServerNames", "LocalizedText", parseLocalizedText, ett_opcua_array_LocalizedText);
657   parseApplicationType(subtree, tvb, pinfo, pOffset);
658   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_GatewayServerUri);
659   /* Array length field ignored: NoOfDiscoveryUrls */
660   parseArraySimple(subtree, tvb, pinfo, pOffset, "DiscoveryUrls", "String", hf_opcua_DiscoveryUrls, parseString, ett_opcua_array_String);
661   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_SemaphoreFilePath);
662   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsOnline);
663   proto_item_set_end(ti, tvb, *pOffset);
664 }
parseMdnsDiscoveryConfiguration(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)665 void parseMdnsDiscoveryConfiguration(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
666 {
667   proto_item *ti;
668   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MdnsDiscoveryConfiguration, &ti, "%s: MdnsDiscoveryConfiguration", szFieldName);
669   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_MdnsServerName);
670   /* Array length field ignored: NoOfServerCapabilities */
671   parseArraySimple(subtree, tvb, pinfo, pOffset, "ServerCapabilities", "String", hf_opcua_ServerCapabilities, parseString, ett_opcua_array_String);
672   proto_item_set_end(ti, tvb, *pOffset);
673 }
parseChannelSecurityToken(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)674 void parseChannelSecurityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
675 {
676   proto_item *ti;
677   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ChannelSecurityToken, &ti, "%s: ChannelSecurityToken", szFieldName);
678   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ChannelId);
679   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_TokenId);
680   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_CreatedAt);
681   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedLifetime);
682   proto_item_set_end(ti, tvb, *pOffset);
683 }
parseSignedSoftwareCertificate(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)684 void parseSignedSoftwareCertificate(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
685 {
686   proto_item *ti;
687   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SignedSoftwareCertificate, &ti, "%s: SignedSoftwareCertificate", szFieldName);
688   parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_CertificateData);
689   parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_Signature);
690   proto_item_set_end(ti, tvb, *pOffset);
691 }
parseSignatureData(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)692 void parseSignatureData(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
693 {
694   proto_item *ti;
695   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SignatureData, &ti, "%s: SignatureData", szFieldName);
696   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_Algorithm);
697   parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_Signature);
698   proto_item_set_end(ti, tvb, *pOffset);
699 }
parseUserIdentityToken(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)700 void parseUserIdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
701 {
702   proto_item *ti;
703   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_UserIdentityToken, &ti, "%s: UserIdentityToken", szFieldName);
704   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_PolicyId);
705   proto_item_set_end(ti, tvb, *pOffset);
706 }
parseAnonymousIdentityToken(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)707 void parseAnonymousIdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
708 {
709   proto_item *ti;
710   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AnonymousIdentityToken, &ti, "%s: AnonymousIdentityToken", szFieldName);
711   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_PolicyId);
712   proto_item_set_end(ti, tvb, *pOffset);
713 }
parseUserNameIdentityToken(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)714 void parseUserNameIdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
715 {
716   proto_item *ti;
717   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_UserNameIdentityToken, &ti, "%s: UserNameIdentityToken", szFieldName);
718   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_PolicyId);
719   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_UserName);
720   parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_Password);
721   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_EncryptionAlgorithm);
722   proto_item_set_end(ti, tvb, *pOffset);
723 }
parseX509IdentityToken(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)724 void parseX509IdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
725 {
726   proto_item *ti;
727   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_X509IdentityToken, &ti, "%s: X509IdentityToken", szFieldName);
728   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_PolicyId);
729   parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_CertificateData);
730   proto_item_set_end(ti, tvb, *pOffset);
731 }
parseKerberosIdentityToken(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)732 void parseKerberosIdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
733 {
734   proto_item *ti;
735   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_KerberosIdentityToken, &ti, "%s: KerberosIdentityToken", szFieldName);
736   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_PolicyId);
737   parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_TicketData);
738   proto_item_set_end(ti, tvb, *pOffset);
739 }
parseIssuedIdentityToken(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)740 void parseIssuedIdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
741 {
742   proto_item *ti;
743   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_IssuedIdentityToken, &ti, "%s: IssuedIdentityToken", szFieldName);
744   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_PolicyId);
745   parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_TokenData);
746   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_EncryptionAlgorithm);
747   proto_item_set_end(ti, tvb, *pOffset);
748 }
parseNodeAttributes(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)749 void parseNodeAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
750 {
751   proto_item *ti;
752   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_NodeAttributes, &ti, "%s: NodeAttributes", szFieldName);
753   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
754   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
755   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
756   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
757   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
758   proto_item_set_end(ti, tvb, *pOffset);
759 }
parseObjectAttributes(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)760 void parseObjectAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
761 {
762   proto_item *ti;
763   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ObjectAttributes, &ti, "%s: ObjectAttributes", szFieldName);
764   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
765   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
766   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
767   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
768   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
769   parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_EventNotifier);
770   proto_item_set_end(ti, tvb, *pOffset);
771 }
parseVariableAttributes(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)772 void parseVariableAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
773 {
774   proto_item *ti;
775   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_VariableAttributes, &ti, "%s: VariableAttributes", szFieldName);
776   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
777   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
778   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
779   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
780   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
781   parseVariant(subtree, tvb, pinfo, pOffset, "Value");
782   parseNodeId(subtree, tvb, pinfo, pOffset, "DataType");
783   parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ValueRank);
784   /* Array length field ignored: NoOfArrayDimensions */
785   parseArraySimple(subtree, tvb, pinfo, pOffset, "ArrayDimensions", "UInt32", hf_opcua_ArrayDimensions, parseUInt32, ett_opcua_array_UInt32);
786   parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_AccessLevel);
787   parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_UserAccessLevel);
788   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_MinimumSamplingInterval);
789   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_Historizing);
790   proto_item_set_end(ti, tvb, *pOffset);
791 }
parseMethodAttributes(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)792 void parseMethodAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
793 {
794   proto_item *ti;
795   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MethodAttributes, &ti, "%s: MethodAttributes", szFieldName);
796   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
797   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
798   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
799   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
800   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
801   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_Executable);
802   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_UserExecutable);
803   proto_item_set_end(ti, tvb, *pOffset);
804 }
parseObjectTypeAttributes(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)805 void parseObjectTypeAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
806 {
807   proto_item *ti;
808   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ObjectTypeAttributes, &ti, "%s: ObjectTypeAttributes", szFieldName);
809   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
810   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
811   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
812   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
813   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
814   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsAbstract);
815   proto_item_set_end(ti, tvb, *pOffset);
816 }
parseVariableTypeAttributes(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)817 void parseVariableTypeAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
818 {
819   proto_item *ti;
820   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_VariableTypeAttributes, &ti, "%s: VariableTypeAttributes", szFieldName);
821   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
822   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
823   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
824   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
825   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
826   parseVariant(subtree, tvb, pinfo, pOffset, "Value");
827   parseNodeId(subtree, tvb, pinfo, pOffset, "DataType");
828   parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ValueRank);
829   /* Array length field ignored: NoOfArrayDimensions */
830   parseArraySimple(subtree, tvb, pinfo, pOffset, "ArrayDimensions", "UInt32", hf_opcua_ArrayDimensions, parseUInt32, ett_opcua_array_UInt32);
831   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsAbstract);
832   proto_item_set_end(ti, tvb, *pOffset);
833 }
parseReferenceTypeAttributes(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)834 void parseReferenceTypeAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
835 {
836   proto_item *ti;
837   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReferenceTypeAttributes, &ti, "%s: ReferenceTypeAttributes", szFieldName);
838   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
839   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
840   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
841   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
842   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
843   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsAbstract);
844   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_Symmetric);
845   parseLocalizedText(subtree, tvb, pinfo, pOffset, "InverseName");
846   proto_item_set_end(ti, tvb, *pOffset);
847 }
parseDataTypeAttributes(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)848 void parseDataTypeAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
849 {
850   proto_item *ti;
851   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DataTypeAttributes, &ti, "%s: DataTypeAttributes", szFieldName);
852   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
853   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
854   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
855   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
856   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
857   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsAbstract);
858   proto_item_set_end(ti, tvb, *pOffset);
859 }
parseViewAttributes(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)860 void parseViewAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
861 {
862   proto_item *ti;
863   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ViewAttributes, &ti, "%s: ViewAttributes", szFieldName);
864   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
865   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
866   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
867   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
868   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
869   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_ContainsNoLoops);
870   parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_EventNotifier);
871   proto_item_set_end(ti, tvb, *pOffset);
872 }
parseAddNodesItem(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)873 void parseAddNodesItem(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
874 {
875   proto_item *ti;
876   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AddNodesItem, &ti, "%s: AddNodesItem", szFieldName);
877   parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "ParentNodeId");
878   parseNodeId(subtree, tvb, pinfo, pOffset, "ReferenceTypeId");
879   parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "RequestedNewNodeId");
880   parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
881   parseNodeClass(subtree, tvb, pinfo, pOffset);
882   parseExtensionObject(subtree, tvb, pinfo, pOffset, "NodeAttributes");
883   parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "TypeDefinition");
884   proto_item_set_end(ti, tvb, *pOffset);
885 }
parseAddNodesResult(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)886 void parseAddNodesResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
887 {
888   proto_item *ti;
889   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AddNodesResult, &ti, "%s: AddNodesResult", szFieldName);
890   parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
891   parseNodeId(subtree, tvb, pinfo, pOffset, "AddedNodeId");
892   proto_item_set_end(ti, tvb, *pOffset);
893 }
parseAddReferencesItem(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)894 void parseAddReferencesItem(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
895 {
896   proto_item *ti;
897   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AddReferencesItem, &ti, "%s: AddReferencesItem", szFieldName);
898   parseNodeId(subtree, tvb, pinfo, pOffset, "SourceNodeId");
899   parseNodeId(subtree, tvb, pinfo, pOffset, "ReferenceTypeId");
900   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsForward);
901   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_TargetServerUri);
902   parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "TargetNodeId");
903   parseNodeClass(subtree, tvb, pinfo, pOffset);
904   proto_item_set_end(ti, tvb, *pOffset);
905 }
parseDeleteNodesItem(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)906 void parseDeleteNodesItem(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
907 {
908   proto_item *ti;
909   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DeleteNodesItem, &ti, "%s: DeleteNodesItem", szFieldName);
910   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
911   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_DeleteTargetReferences);
912   proto_item_set_end(ti, tvb, *pOffset);
913 }
parseDeleteReferencesItem(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)914 void parseDeleteReferencesItem(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
915 {
916   proto_item *ti;
917   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DeleteReferencesItem, &ti, "%s: DeleteReferencesItem", szFieldName);
918   parseNodeId(subtree, tvb, pinfo, pOffset, "SourceNodeId");
919   parseNodeId(subtree, tvb, pinfo, pOffset, "ReferenceTypeId");
920   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsForward);
921   parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "TargetNodeId");
922   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_DeleteBidirectional);
923   proto_item_set_end(ti, tvb, *pOffset);
924 }
parseViewDescription(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)925 void parseViewDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
926 {
927   proto_item *ti;
928   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ViewDescription, &ti, "%s: ViewDescription", szFieldName);
929   parseNodeId(subtree, tvb, pinfo, pOffset, "ViewId");
930   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_Timestamp);
931   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ViewVersion);
932   proto_item_set_end(ti, tvb, *pOffset);
933 }
parseBrowseDescription(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)934 void parseBrowseDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
935 {
936   proto_item *ti;
937   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_BrowseDescription, &ti, "%s: BrowseDescription", szFieldName);
938   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
939   parseBrowseDirection(subtree, tvb, pinfo, pOffset);
940   parseNodeId(subtree, tvb, pinfo, pOffset, "ReferenceTypeId");
941   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IncludeSubtypes);
942   parseNodeClassMask(subtree, tvb, pinfo, pOffset);
943   parseResultMask(subtree, tvb, pinfo, pOffset);
944   proto_item_set_end(ti, tvb, *pOffset);
945 }
parseReferenceDescription(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)946 void parseReferenceDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
947 {
948   proto_item *ti;
949   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReferenceDescription, &ti, "%s: ReferenceDescription", szFieldName);
950   parseNodeId(subtree, tvb, pinfo, pOffset, "ReferenceTypeId");
951   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsForward);
952   parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
953   parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
954   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
955   parseNodeClass(subtree, tvb, pinfo, pOffset);
956   parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "TypeDefinition");
957   proto_item_set_end(ti, tvb, *pOffset);
958 }
parseBrowseResult(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)959 void parseBrowseResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
960 {
961   proto_item *ti;
962   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_BrowseResult, &ti, "%s: BrowseResult", szFieldName);
963   parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
964   parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ContinuationPoint);
965   /* Array length field ignored: NoOfReferences */
966   parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceDescription", parseReferenceDescription, ett_opcua_array_ReferenceDescription);
967   proto_item_set_end(ti, tvb, *pOffset);
968 }
parseRelativePathElement(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)969 void parseRelativePathElement(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
970 {
971   proto_item *ti;
972   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_RelativePathElement, &ti, "%s: RelativePathElement", szFieldName);
973   parseNodeId(subtree, tvb, pinfo, pOffset, "ReferenceTypeId");
974   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsInverse);
975   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IncludeSubtypes);
976   parseQualifiedName(subtree, tvb, pinfo, pOffset, "TargetName");
977   proto_item_set_end(ti, tvb, *pOffset);
978 }
parseRelativePath(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)979 void parseRelativePath(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
980 {
981   proto_item *ti;
982   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_RelativePath, &ti, "%s: RelativePath", szFieldName);
983   /* Array length field ignored: NoOfElements */
984   parseArrayComplex(subtree, tvb, pinfo, pOffset, "Elements", "RelativePathElement", parseRelativePathElement, ett_opcua_array_RelativePathElement);
985   proto_item_set_end(ti, tvb, *pOffset);
986 }
parseBrowsePath(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)987 void parseBrowsePath(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
988 {
989   proto_item *ti;
990   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_BrowsePath, &ti, "%s: BrowsePath", szFieldName);
991   parseNodeId(subtree, tvb, pinfo, pOffset, "StartingNode");
992   parseRelativePath(subtree, tvb, pinfo, pOffset, "RelativePath");
993   proto_item_set_end(ti, tvb, *pOffset);
994 }
parseBrowsePathTarget(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)995 void parseBrowsePathTarget(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
996 {
997   proto_item *ti;
998   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_BrowsePathTarget, &ti, "%s: BrowsePathTarget", szFieldName);
999   parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "TargetId");
1000   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RemainingPathIndex);
1001   proto_item_set_end(ti, tvb, *pOffset);
1002 }
parseBrowsePathResult(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1003 void parseBrowsePathResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1004 {
1005   proto_item *ti;
1006   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_BrowsePathResult, &ti, "%s: BrowsePathResult", szFieldName);
1007   parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
1008   /* Array length field ignored: NoOfTargets */
1009   parseArrayComplex(subtree, tvb, pinfo, pOffset, "Targets", "BrowsePathTarget", parseBrowsePathTarget, ett_opcua_array_BrowsePathTarget);
1010   proto_item_set_end(ti, tvb, *pOffset);
1011 }
parseEndpointConfiguration(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1012 void parseEndpointConfiguration(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1013 {
1014   proto_item *ti;
1015   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EndpointConfiguration, &ti, "%s: EndpointConfiguration", szFieldName);
1016   parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_OperationTimeout);
1017   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_UseBinaryEncoding);
1018   parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxStringLength);
1019   parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxByteStringLength);
1020   parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxArrayLength);
1021   parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxMessageSize);
1022   parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxBufferSize);
1023   parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ChannelLifetime);
1024   parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SecurityTokenLifetime);
1025   proto_item_set_end(ti, tvb, *pOffset);
1026 }
parseSupportedProfile(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1027 void parseSupportedProfile(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1028 {
1029   proto_item *ti;
1030   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SupportedProfile, &ti, "%s: SupportedProfile", szFieldName);
1031   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_OrganizationUri);
1032   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ProfileId);
1033   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ComplianceTool);
1034   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_ComplianceDate);
1035   parseComplianceLevel(subtree, tvb, pinfo, pOffset);
1036   /* Array length field ignored: NoOfUnsupportedUnitIds */
1037   parseArraySimple(subtree, tvb, pinfo, pOffset, "UnsupportedUnitIds", "String", hf_opcua_UnsupportedUnitIds, parseString, ett_opcua_array_String);
1038   proto_item_set_end(ti, tvb, *pOffset);
1039 }
parseSoftwareCertificate(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1040 void parseSoftwareCertificate(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1041 {
1042   proto_item *ti;
1043   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SoftwareCertificate, &ti, "%s: SoftwareCertificate", szFieldName);
1044   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ProductName);
1045   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ProductUri);
1046   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_VendorName);
1047   parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_VendorProductCertificate);
1048   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_SoftwareVersion);
1049   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_BuildNumber);
1050   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_BuildDate);
1051   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IssuedBy);
1052   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_IssueDate);
1053   /* Array length field ignored: NoOfSupportedProfiles */
1054   parseArrayComplex(subtree, tvb, pinfo, pOffset, "SupportedProfiles", "SupportedProfile", parseSupportedProfile, ett_opcua_array_SupportedProfile);
1055   proto_item_set_end(ti, tvb, *pOffset);
1056 }
parseQueryDataDescription(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1057 void parseQueryDataDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1058 {
1059   proto_item *ti;
1060   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_QueryDataDescription, &ti, "%s: QueryDataDescription", szFieldName);
1061   parseRelativePath(subtree, tvb, pinfo, pOffset, "RelativePath");
1062   parseAttributeId(subtree, tvb, pinfo, pOffset);
1063   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IndexRange);
1064   proto_item_set_end(ti, tvb, *pOffset);
1065 }
parseNodeTypeDescription(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1066 void parseNodeTypeDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1067 {
1068   proto_item *ti;
1069   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_NodeTypeDescription, &ti, "%s: NodeTypeDescription", szFieldName);
1070   parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "TypeDefinitionNode");
1071   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IncludeSubTypes);
1072   /* Array length field ignored: NoOfDataToReturn */
1073   parseArrayComplex(subtree, tvb, pinfo, pOffset, "DataToReturn", "QueryDataDescription", parseQueryDataDescription, ett_opcua_array_QueryDataDescription);
1074   proto_item_set_end(ti, tvb, *pOffset);
1075 }
parseQueryDataSet(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1076 void parseQueryDataSet(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1077 {
1078   proto_item *ti;
1079   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_QueryDataSet, &ti, "%s: QueryDataSet", szFieldName);
1080   parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
1081   parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "TypeDefinitionNode");
1082   /* Array length field ignored: NoOfValues */
1083   parseArrayComplex(subtree, tvb, pinfo, pOffset, "Values", "Variant", parseVariant, ett_opcua_array_Variant);
1084   proto_item_set_end(ti, tvb, *pOffset);
1085 }
parseNodeReference(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1086 void parseNodeReference(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1087 {
1088   proto_item *ti;
1089   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_NodeReference, &ti, "%s: NodeReference", szFieldName);
1090   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
1091   parseNodeId(subtree, tvb, pinfo, pOffset, "ReferenceTypeId");
1092   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsForward);
1093   /* Array length field ignored: NoOfReferencedNodeIds */
1094   parseArrayComplex(subtree, tvb, pinfo, pOffset, "ReferencedNodeIds", "NodeId", parseNodeId, ett_opcua_array_NodeId);
1095   proto_item_set_end(ti, tvb, *pOffset);
1096 }
parseContentFilterElement(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1097 void parseContentFilterElement(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1098 {
1099   proto_item *ti;
1100   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ContentFilterElement, &ti, "%s: ContentFilterElement", szFieldName);
1101   parseFilterOperator(subtree, tvb, pinfo, pOffset);
1102   /* Array length field ignored: NoOfFilterOperands */
1103   parseArrayComplex(subtree, tvb, pinfo, pOffset, "FilterOperands", "ExtensionObject", parseExtensionObject, ett_opcua_array_ExtensionObject);
1104   proto_item_set_end(ti, tvb, *pOffset);
1105 }
parseContentFilter(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1106 void parseContentFilter(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1107 {
1108   proto_item *ti;
1109   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ContentFilter, &ti, "%s: ContentFilter", szFieldName);
1110   /* Array length field ignored: NoOfElements */
1111   parseArrayComplex(subtree, tvb, pinfo, pOffset, "Elements", "ContentFilterElement", parseContentFilterElement, ett_opcua_array_ContentFilterElement);
1112   proto_item_set_end(ti, tvb, *pOffset);
1113 }
parseElementOperand(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1114 void parseElementOperand(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1115 {
1116   proto_item *ti;
1117   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ElementOperand, &ti, "%s: ElementOperand", szFieldName);
1118   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_Index);
1119   proto_item_set_end(ti, tvb, *pOffset);
1120 }
parseLiteralOperand(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1121 void parseLiteralOperand(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1122 {
1123   proto_item *ti;
1124   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_LiteralOperand, &ti, "%s: LiteralOperand", szFieldName);
1125   parseVariant(subtree, tvb, pinfo, pOffset, "Value");
1126   proto_item_set_end(ti, tvb, *pOffset);
1127 }
parseAttributeOperand(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1128 void parseAttributeOperand(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1129 {
1130   proto_item *ti;
1131   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AttributeOperand, &ti, "%s: AttributeOperand", szFieldName);
1132   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
1133   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_Alias);
1134   parseRelativePath(subtree, tvb, pinfo, pOffset, "BrowsePath");
1135   parseAttributeId(subtree, tvb, pinfo, pOffset);
1136   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IndexRange);
1137   proto_item_set_end(ti, tvb, *pOffset);
1138 }
parseSimpleAttributeOperand(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1139 void parseSimpleAttributeOperand(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1140 {
1141   proto_item *ti;
1142   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SimpleAttributeOperand, &ti, "%s: SimpleAttributeOperand", szFieldName);
1143   parseNodeId(subtree, tvb, pinfo, pOffset, "TypeDefinitionId");
1144   /* Array length field ignored: NoOfBrowsePath */
1145   parseArrayComplex(subtree, tvb, pinfo, pOffset, "BrowsePath", "QualifiedName", parseQualifiedName, ett_opcua_array_QualifiedName);
1146   parseAttributeId(subtree, tvb, pinfo, pOffset);
1147   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IndexRange);
1148   proto_item_set_end(ti, tvb, *pOffset);
1149 }
parseContentFilterElementResult(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1150 void parseContentFilterElementResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1151 {
1152   proto_item *ti;
1153   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ContentFilterElementResult, &ti, "%s: ContentFilterElementResult", szFieldName);
1154   parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
1155   /* Array length field ignored: NoOfOperandStatusCodes */
1156   parseArraySimple(subtree, tvb, pinfo, pOffset, "OperandStatusCodes", "StatusCode", hf_opcua_OperandStatusCodes, parseStatusCode, ett_opcua_array_StatusCode);
1157   /* Array length field ignored: NoOfOperandDiagnosticInfos */
1158   parseArrayComplex(subtree, tvb, pinfo, pOffset, "OperandDiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
1159   proto_item_set_end(ti, tvb, *pOffset);
1160 }
parseContentFilterResult(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1161 void parseContentFilterResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1162 {
1163   proto_item *ti;
1164   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ContentFilterResult, &ti, "%s: ContentFilterResult", szFieldName);
1165   /* Array length field ignored: NoOfElementResults */
1166   parseArrayComplex(subtree, tvb, pinfo, pOffset, "ElementResults", "ContentFilterElementResult", parseContentFilterElementResult, ett_opcua_array_ContentFilterElementResult);
1167   /* Array length field ignored: NoOfElementDiagnosticInfos */
1168   parseArrayComplex(subtree, tvb, pinfo, pOffset, "ElementDiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
1169   proto_item_set_end(ti, tvb, *pOffset);
1170 }
parseParsingResult(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1171 void parseParsingResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1172 {
1173   proto_item *ti;
1174   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ParsingResult, &ti, "%s: ParsingResult", szFieldName);
1175   parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
1176   /* Array length field ignored: NoOfDataStatusCodes */
1177   parseArraySimple(subtree, tvb, pinfo, pOffset, "DataStatusCodes", "StatusCode", hf_opcua_DataStatusCodes, parseStatusCode, ett_opcua_array_StatusCode);
1178   /* Array length field ignored: NoOfDataDiagnosticInfos */
1179   parseArrayComplex(subtree, tvb, pinfo, pOffset, "DataDiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
1180   proto_item_set_end(ti, tvb, *pOffset);
1181 }
parseReadValueId(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1182 void parseReadValueId(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1183 {
1184   proto_item *ti;
1185   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReadValueId, &ti, "%s: ReadValueId", szFieldName);
1186   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
1187   parseAttributeId(subtree, tvb, pinfo, pOffset);
1188   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IndexRange);
1189   parseQualifiedName(subtree, tvb, pinfo, pOffset, "DataEncoding");
1190   proto_item_set_end(ti, tvb, *pOffset);
1191 }
parseHistoryReadValueId(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1192 void parseHistoryReadValueId(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1193 {
1194   proto_item *ti;
1195   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_HistoryReadValueId, &ti, "%s: HistoryReadValueId", szFieldName);
1196   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
1197   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IndexRange);
1198   parseQualifiedName(subtree, tvb, pinfo, pOffset, "DataEncoding");
1199   parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ContinuationPoint);
1200   proto_item_set_end(ti, tvb, *pOffset);
1201 }
parseHistoryReadResult(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1202 void parseHistoryReadResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1203 {
1204   proto_item *ti;
1205   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_HistoryReadResult, &ti, "%s: HistoryReadResult", szFieldName);
1206   parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
1207   parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ContinuationPoint);
1208   parseExtensionObject(subtree, tvb, pinfo, pOffset, "HistoryData");
1209   proto_item_set_end(ti, tvb, *pOffset);
1210 }
parseReadEventDetails(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1211 void parseReadEventDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1212 {
1213   proto_item *ti;
1214   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReadEventDetails, &ti, "%s: ReadEventDetails", szFieldName);
1215   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_NumValuesPerNode);
1216   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_StartTime);
1217   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_EndTime);
1218   parseEventFilter(subtree, tvb, pinfo, pOffset, "Filter");
1219   proto_item_set_end(ti, tvb, *pOffset);
1220 }
parseReadRawModifiedDetails(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1221 void parseReadRawModifiedDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1222 {
1223   proto_item *ti;
1224   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReadRawModifiedDetails, &ti, "%s: ReadRawModifiedDetails", szFieldName);
1225   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsReadModified);
1226   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_StartTime);
1227   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_EndTime);
1228   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_NumValuesPerNode);
1229   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_ReturnBounds);
1230   proto_item_set_end(ti, tvb, *pOffset);
1231 }
parseReadProcessedDetails(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1232 void parseReadProcessedDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1233 {
1234   proto_item *ti;
1235   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReadProcessedDetails, &ti, "%s: ReadProcessedDetails", szFieldName);
1236   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_StartTime);
1237   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_EndTime);
1238   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_ProcessingInterval);
1239   /* Array length field ignored: NoOfAggregateType */
1240   parseArrayComplex(subtree, tvb, pinfo, pOffset, "AggregateType", "NodeId", parseNodeId, ett_opcua_array_NodeId);
1241   parseAggregateConfiguration(subtree, tvb, pinfo, pOffset, "AggregateConfiguration");
1242   proto_item_set_end(ti, tvb, *pOffset);
1243 }
parseReadAtTimeDetails(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1244 void parseReadAtTimeDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1245 {
1246   proto_item *ti;
1247   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReadAtTimeDetails, &ti, "%s: ReadAtTimeDetails", szFieldName);
1248   /* Array length field ignored: NoOfReqTimes */
1249   parseArraySimple(subtree, tvb, pinfo, pOffset, "ReqTimes", "DateTime", hf_opcua_ReqTimes, parseDateTime, ett_opcua_array_DateTime);
1250   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_UseSimpleBounds);
1251   proto_item_set_end(ti, tvb, *pOffset);
1252 }
parseHistoryData(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1253 void parseHistoryData(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1254 {
1255   proto_item *ti;
1256   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_HistoryData, &ti, "%s: HistoryData", szFieldName);
1257   /* Array length field ignored: NoOfDataValues */
1258   parseArrayComplex(subtree, tvb, pinfo, pOffset, "DataValues", "DataValue", parseDataValue, ett_opcua_array_DataValue);
1259   proto_item_set_end(ti, tvb, *pOffset);
1260 }
parseModificationInfo(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1261 void parseModificationInfo(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1262 {
1263   proto_item *ti;
1264   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ModificationInfo, &ti, "%s: ModificationInfo", szFieldName);
1265   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_ModificationTime);
1266   parseHistoryUpdateType(subtree, tvb, pinfo, pOffset);
1267   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_UserName);
1268   proto_item_set_end(ti, tvb, *pOffset);
1269 }
parseHistoryModifiedData(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1270 void parseHistoryModifiedData(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1271 {
1272   proto_item *ti;
1273   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_HistoryModifiedData, &ti, "%s: HistoryModifiedData", szFieldName);
1274   /* Array length field ignored: NoOfDataValues */
1275   parseArrayComplex(subtree, tvb, pinfo, pOffset, "DataValues", "DataValue", parseDataValue, ett_opcua_array_DataValue);
1276   /* Array length field ignored: NoOfModificationInfos */
1277   parseArrayComplex(subtree, tvb, pinfo, pOffset, "ModificationInfos", "ModificationInfo", parseModificationInfo, ett_opcua_array_ModificationInfo);
1278   proto_item_set_end(ti, tvb, *pOffset);
1279 }
parseHistoryEvent(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1280 void parseHistoryEvent(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1281 {
1282   proto_item *ti;
1283   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_HistoryEvent, &ti, "%s: HistoryEvent", szFieldName);
1284   /* Array length field ignored: NoOfEvents */
1285   parseArrayComplex(subtree, tvb, pinfo, pOffset, "Events", "HistoryEventFieldList", parseHistoryEventFieldList, ett_opcua_array_HistoryEventFieldList);
1286   proto_item_set_end(ti, tvb, *pOffset);
1287 }
parseWriteValue(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1288 void parseWriteValue(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1289 {
1290   proto_item *ti;
1291   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_WriteValue, &ti, "%s: WriteValue", szFieldName);
1292   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
1293   parseAttributeId(subtree, tvb, pinfo, pOffset);
1294   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IndexRange);
1295   parseDataValue(subtree, tvb, pinfo, pOffset, "Value");
1296   proto_item_set_end(ti, tvb, *pOffset);
1297 }
parseHistoryUpdateDetails(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1298 void parseHistoryUpdateDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1299 {
1300   proto_item *ti;
1301   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_HistoryUpdateDetails, &ti, "%s: HistoryUpdateDetails", szFieldName);
1302   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
1303   proto_item_set_end(ti, tvb, *pOffset);
1304 }
parseUpdateDataDetails(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1305 void parseUpdateDataDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1306 {
1307   proto_item *ti;
1308   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_UpdateDataDetails, &ti, "%s: UpdateDataDetails", szFieldName);
1309   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
1310   parsePerformUpdateType(subtree, tvb, pinfo, pOffset);
1311   /* Array length field ignored: NoOfUpdateValues */
1312   parseArrayComplex(subtree, tvb, pinfo, pOffset, "UpdateValues", "DataValue", parseDataValue, ett_opcua_array_DataValue);
1313   proto_item_set_end(ti, tvb, *pOffset);
1314 }
parseUpdateStructureDataDetails(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1315 void parseUpdateStructureDataDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1316 {
1317   proto_item *ti;
1318   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_UpdateStructureDataDetails, &ti, "%s: UpdateStructureDataDetails", szFieldName);
1319   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
1320   parsePerformUpdateType(subtree, tvb, pinfo, pOffset);
1321   /* Array length field ignored: NoOfUpdateValues */
1322   parseArrayComplex(subtree, tvb, pinfo, pOffset, "UpdateValues", "DataValue", parseDataValue, ett_opcua_array_DataValue);
1323   proto_item_set_end(ti, tvb, *pOffset);
1324 }
parseUpdateEventDetails(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1325 void parseUpdateEventDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1326 {
1327   proto_item *ti;
1328   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_UpdateEventDetails, &ti, "%s: UpdateEventDetails", szFieldName);
1329   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
1330   parsePerformUpdateType(subtree, tvb, pinfo, pOffset);
1331   parseEventFilter(subtree, tvb, pinfo, pOffset, "Filter");
1332   /* Array length field ignored: NoOfEventData */
1333   parseArrayComplex(subtree, tvb, pinfo, pOffset, "EventData", "HistoryEventFieldList", parseHistoryEventFieldList, ett_opcua_array_HistoryEventFieldList);
1334   proto_item_set_end(ti, tvb, *pOffset);
1335 }
parseDeleteRawModifiedDetails(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1336 void parseDeleteRawModifiedDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1337 {
1338   proto_item *ti;
1339   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DeleteRawModifiedDetails, &ti, "%s: DeleteRawModifiedDetails", szFieldName);
1340   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
1341   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsDeleteModified);
1342   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_StartTime);
1343   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_EndTime);
1344   proto_item_set_end(ti, tvb, *pOffset);
1345 }
parseDeleteAtTimeDetails(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1346 void parseDeleteAtTimeDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1347 {
1348   proto_item *ti;
1349   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DeleteAtTimeDetails, &ti, "%s: DeleteAtTimeDetails", szFieldName);
1350   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
1351   /* Array length field ignored: NoOfReqTimes */
1352   parseArraySimple(subtree, tvb, pinfo, pOffset, "ReqTimes", "DateTime", hf_opcua_ReqTimes, parseDateTime, ett_opcua_array_DateTime);
1353   proto_item_set_end(ti, tvb, *pOffset);
1354 }
parseDeleteEventDetails(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1355 void parseDeleteEventDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1356 {
1357   proto_item *ti;
1358   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DeleteEventDetails, &ti, "%s: DeleteEventDetails", szFieldName);
1359   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
1360   /* Array length field ignored: NoOfEventIds */
1361   parseArraySimple(subtree, tvb, pinfo, pOffset, "EventIds", "ByteString", hf_opcua_EventIds, parseByteString, ett_opcua_array_ByteString);
1362   proto_item_set_end(ti, tvb, *pOffset);
1363 }
parseHistoryUpdateResult(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1364 void parseHistoryUpdateResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1365 {
1366   proto_item *ti;
1367   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_HistoryUpdateResult, &ti, "%s: HistoryUpdateResult", szFieldName);
1368   parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
1369   /* Array length field ignored: NoOfOperationResults */
1370   parseArraySimple(subtree, tvb, pinfo, pOffset, "OperationResults", "StatusCode", hf_opcua_OperationResults, parseStatusCode, ett_opcua_array_StatusCode);
1371   /* Array length field ignored: NoOfDiagnosticInfos */
1372   parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
1373   proto_item_set_end(ti, tvb, *pOffset);
1374 }
parseCallMethodRequest(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1375 void parseCallMethodRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1376 {
1377   proto_item *ti;
1378   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_CallMethodRequest, &ti, "%s: CallMethodRequest", szFieldName);
1379   parseNodeId(subtree, tvb, pinfo, pOffset, "ObjectId");
1380   parseNodeId(subtree, tvb, pinfo, pOffset, "MethodId");
1381   /* Array length field ignored: NoOfInputArguments */
1382   parseArrayComplex(subtree, tvb, pinfo, pOffset, "InputArguments", "Variant", parseVariant, ett_opcua_array_Variant);
1383   proto_item_set_end(ti, tvb, *pOffset);
1384 }
parseCallMethodResult(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1385 void parseCallMethodResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1386 {
1387   proto_item *ti;
1388   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_CallMethodResult, &ti, "%s: CallMethodResult", szFieldName);
1389   parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
1390   /* Array length field ignored: NoOfInputArgumentResults */
1391   parseArraySimple(subtree, tvb, pinfo, pOffset, "InputArgumentResults", "StatusCode", hf_opcua_InputArgumentResults, parseStatusCode, ett_opcua_array_StatusCode);
1392   /* Array length field ignored: NoOfInputArgumentDiagnosticInfos */
1393   parseArrayComplex(subtree, tvb, pinfo, pOffset, "InputArgumentDiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
1394   /* Array length field ignored: NoOfOutputArguments */
1395   parseArrayComplex(subtree, tvb, pinfo, pOffset, "OutputArguments", "Variant", parseVariant, ett_opcua_array_Variant);
1396   proto_item_set_end(ti, tvb, *pOffset);
1397 }
parseDataChangeFilter(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1398 void parseDataChangeFilter(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1399 {
1400   proto_item *ti;
1401   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DataChangeFilter, &ti, "%s: DataChangeFilter", szFieldName);
1402   parseDataChangeTrigger(subtree, tvb, pinfo, pOffset);
1403   parseDeadbandType(subtree, tvb, pinfo, pOffset);
1404   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_DeadbandValue);
1405   proto_item_set_end(ti, tvb, *pOffset);
1406 }
parseEventFilter(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1407 void parseEventFilter(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1408 {
1409   proto_item *ti;
1410   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EventFilter, &ti, "%s: EventFilter", szFieldName);
1411   /* Array length field ignored: NoOfSelectClauses */
1412   parseArrayComplex(subtree, tvb, pinfo, pOffset, "SelectClauses", "SimpleAttributeOperand", parseSimpleAttributeOperand, ett_opcua_array_SimpleAttributeOperand);
1413   parseContentFilter(subtree, tvb, pinfo, pOffset, "WhereClause");
1414   proto_item_set_end(ti, tvb, *pOffset);
1415 }
parseAggregateConfiguration(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1416 void parseAggregateConfiguration(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1417 {
1418   proto_item *ti;
1419   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AggregateConfiguration, &ti, "%s: AggregateConfiguration", szFieldName);
1420   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_UseServerCapabilitiesDefaults);
1421   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_TreatUncertainAsBad);
1422   parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_PercentDataBad);
1423   parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_PercentDataGood);
1424   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_UseSlopedExtrapolation);
1425   proto_item_set_end(ti, tvb, *pOffset);
1426 }
parseAggregateFilter(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1427 void parseAggregateFilter(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1428 {
1429   proto_item *ti;
1430   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AggregateFilter, &ti, "%s: AggregateFilter", szFieldName);
1431   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_StartTime);
1432   parseNodeId(subtree, tvb, pinfo, pOffset, "AggregateType");
1433   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_ProcessingInterval);
1434   parseAggregateConfiguration(subtree, tvb, pinfo, pOffset, "AggregateConfiguration");
1435   proto_item_set_end(ti, tvb, *pOffset);
1436 }
parseEventFilterResult(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1437 void parseEventFilterResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1438 {
1439   proto_item *ti;
1440   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EventFilterResult, &ti, "%s: EventFilterResult", szFieldName);
1441   /* Array length field ignored: NoOfSelectClauseResults */
1442   parseArraySimple(subtree, tvb, pinfo, pOffset, "SelectClauseResults", "StatusCode", hf_opcua_SelectClauseResults, parseStatusCode, ett_opcua_array_StatusCode);
1443   /* Array length field ignored: NoOfSelectClauseDiagnosticInfos */
1444   parseArrayComplex(subtree, tvb, pinfo, pOffset, "SelectClauseDiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
1445   parseContentFilterResult(subtree, tvb, pinfo, pOffset, "WhereClauseResult");
1446   proto_item_set_end(ti, tvb, *pOffset);
1447 }
parseAggregateFilterResult(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1448 void parseAggregateFilterResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1449 {
1450   proto_item *ti;
1451   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AggregateFilterResult, &ti, "%s: AggregateFilterResult", szFieldName);
1452   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedStartTime);
1453   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedProcessingInterval);
1454   parseAggregateConfiguration(subtree, tvb, pinfo, pOffset, "RevisedAggregateConfiguration");
1455   proto_item_set_end(ti, tvb, *pOffset);
1456 }
parseMonitoringParameters(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1457 void parseMonitoringParameters(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1458 {
1459   proto_item *ti;
1460   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MonitoringParameters, &ti, "%s: MonitoringParameters", szFieldName);
1461   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ClientHandle);
1462   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_SamplingInterval);
1463   parseExtensionObject(subtree, tvb, pinfo, pOffset, "Filter");
1464   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_QueueSize);
1465   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_DiscardOldest);
1466   proto_item_set_end(ti, tvb, *pOffset);
1467 }
parseMonitoredItemCreateRequest(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1468 void parseMonitoredItemCreateRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1469 {
1470   proto_item *ti;
1471   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MonitoredItemCreateRequest, &ti, "%s: MonitoredItemCreateRequest", szFieldName);
1472   parseReadValueId(subtree, tvb, pinfo, pOffset, "ItemToMonitor");
1473   parseMonitoringMode(subtree, tvb, pinfo, pOffset);
1474   parseMonitoringParameters(subtree, tvb, pinfo, pOffset, "RequestedParameters");
1475   proto_item_set_end(ti, tvb, *pOffset);
1476 }
parseMonitoredItemCreateResult(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1477 void parseMonitoredItemCreateResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1478 {
1479   proto_item *ti;
1480   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MonitoredItemCreateResult, &ti, "%s: MonitoredItemCreateResult", szFieldName);
1481   parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
1482   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MonitoredItemId);
1483   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedSamplingInterval);
1484   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedQueueSize);
1485   parseExtensionObject(subtree, tvb, pinfo, pOffset, "FilterResult");
1486   proto_item_set_end(ti, tvb, *pOffset);
1487 }
parseMonitoredItemModifyRequest(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1488 void parseMonitoredItemModifyRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1489 {
1490   proto_item *ti;
1491   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MonitoredItemModifyRequest, &ti, "%s: MonitoredItemModifyRequest", szFieldName);
1492   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MonitoredItemId);
1493   parseMonitoringParameters(subtree, tvb, pinfo, pOffset, "RequestedParameters");
1494   proto_item_set_end(ti, tvb, *pOffset);
1495 }
parseMonitoredItemModifyResult(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1496 void parseMonitoredItemModifyResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1497 {
1498   proto_item *ti;
1499   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MonitoredItemModifyResult, &ti, "%s: MonitoredItemModifyResult", szFieldName);
1500   parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
1501   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedSamplingInterval);
1502   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedQueueSize);
1503   parseExtensionObject(subtree, tvb, pinfo, pOffset, "FilterResult");
1504   proto_item_set_end(ti, tvb, *pOffset);
1505 }
parseNotificationMessage(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1506 void parseNotificationMessage(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1507 {
1508   proto_item *ti;
1509   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_NotificationMessage, &ti, "%s: NotificationMessage", szFieldName);
1510   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SequenceNumber);
1511   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_PublishTime);
1512   /* Array length field ignored: NoOfNotificationData */
1513   parseArrayComplex(subtree, tvb, pinfo, pOffset, "NotificationData", "ExtensionObject", parseExtensionObject, ett_opcua_array_ExtensionObject);
1514   proto_item_set_end(ti, tvb, *pOffset);
1515 }
parseDataChangeNotification(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1516 void parseDataChangeNotification(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1517 {
1518   proto_item *ti;
1519   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DataChangeNotification, &ti, "%s: DataChangeNotification", szFieldName);
1520   /* Array length field ignored: NoOfMonitoredItems */
1521   parseArrayComplex(subtree, tvb, pinfo, pOffset, "MonitoredItems", "MonitoredItemNotification", parseMonitoredItemNotification, ett_opcua_array_MonitoredItemNotification);
1522   /* Array length field ignored: NoOfDiagnosticInfos */
1523   parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
1524   proto_item_set_end(ti, tvb, *pOffset);
1525 }
parseMonitoredItemNotification(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1526 void parseMonitoredItemNotification(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1527 {
1528   proto_item *ti;
1529   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MonitoredItemNotification, &ti, "%s: MonitoredItemNotification", szFieldName);
1530   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ClientHandle);
1531   parseDataValue(subtree, tvb, pinfo, pOffset, "Value");
1532   proto_item_set_end(ti, tvb, *pOffset);
1533 }
parseEventNotificationList(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1534 void parseEventNotificationList(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1535 {
1536   proto_item *ti;
1537   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EventNotificationList, &ti, "%s: EventNotificationList", szFieldName);
1538   /* Array length field ignored: NoOfEvents */
1539   parseArrayComplex(subtree, tvb, pinfo, pOffset, "Events", "EventFieldList", parseEventFieldList, ett_opcua_array_EventFieldList);
1540   proto_item_set_end(ti, tvb, *pOffset);
1541 }
parseEventFieldList(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1542 void parseEventFieldList(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1543 {
1544   proto_item *ti;
1545   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EventFieldList, &ti, "%s: EventFieldList", szFieldName);
1546   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ClientHandle);
1547   /* Array length field ignored: NoOfEventFields */
1548   parseArrayComplex(subtree, tvb, pinfo, pOffset, "EventFields", "Variant", parseVariant, ett_opcua_array_Variant);
1549   proto_item_set_end(ti, tvb, *pOffset);
1550 }
parseHistoryEventFieldList(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1551 void parseHistoryEventFieldList(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1552 {
1553   proto_item *ti;
1554   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_HistoryEventFieldList, &ti, "%s: HistoryEventFieldList", szFieldName);
1555   /* Array length field ignored: NoOfEventFields */
1556   parseArrayComplex(subtree, tvb, pinfo, pOffset, "EventFields", "Variant", parseVariant, ett_opcua_array_Variant);
1557   proto_item_set_end(ti, tvb, *pOffset);
1558 }
parseStatusChangeNotification(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1559 void parseStatusChangeNotification(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1560 {
1561   proto_item *ti;
1562   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_StatusChangeNotification, &ti, "%s: StatusChangeNotification", szFieldName);
1563   parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_Status);
1564   parseDiagnosticInfo(subtree, tvb, pinfo, pOffset, "DiagnosticInfo");
1565   proto_item_set_end(ti, tvb, *pOffset);
1566 }
parseSubscriptionAcknowledgement(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1567 void parseSubscriptionAcknowledgement(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1568 {
1569   proto_item *ti;
1570   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SubscriptionAcknowledgement, &ti, "%s: SubscriptionAcknowledgement", szFieldName);
1571   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SubscriptionId);
1572   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SequenceNumber);
1573   proto_item_set_end(ti, tvb, *pOffset);
1574 }
parseTransferResult(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1575 void parseTransferResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1576 {
1577   proto_item *ti;
1578   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_TransferResult, &ti, "%s: TransferResult", szFieldName);
1579   parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
1580   /* Array length field ignored: NoOfAvailableSequenceNumbers */
1581   parseArraySimple(subtree, tvb, pinfo, pOffset, "AvailableSequenceNumbers", "UInt32", hf_opcua_AvailableSequenceNumbers, parseUInt32, ett_opcua_array_UInt32);
1582   proto_item_set_end(ti, tvb, *pOffset);
1583 }
parseScalarTestType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1584 void parseScalarTestType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1585 {
1586   proto_item *ti;
1587   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ScalarTestType, &ti, "%s: ScalarTestType", szFieldName);
1588   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_Boolean);
1589   parseSByte(subtree, tvb, pinfo, pOffset, hf_opcua_SByte);
1590   parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_Byte);
1591   parseInt16(subtree, tvb, pinfo, pOffset, hf_opcua_Int16);
1592   parseUInt16(subtree, tvb, pinfo, pOffset, hf_opcua_UInt16);
1593   parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_Int32);
1594   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UInt32);
1595   parseInt64(subtree, tvb, pinfo, pOffset, hf_opcua_Int64);
1596   parseUInt64(subtree, tvb, pinfo, pOffset, hf_opcua_UInt64);
1597   parseFloat(subtree, tvb, pinfo, pOffset, hf_opcua_Float);
1598   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_Double);
1599   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_String);
1600   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_DateTime);
1601   parseGuid(subtree, tvb, pinfo, pOffset, hf_opcua_Guid);
1602   parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ByteString);
1603   parseXmlElement(subtree, tvb, pinfo, pOffset, hf_opcua_XmlElement);
1604   parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
1605   parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "ExpandedNodeId");
1606   parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
1607   parseDiagnosticInfo(subtree, tvb, pinfo, pOffset, "DiagnosticInfo");
1608   parseQualifiedName(subtree, tvb, pinfo, pOffset, "QualifiedName");
1609   parseLocalizedText(subtree, tvb, pinfo, pOffset, "LocalizedText");
1610   parseExtensionObject(subtree, tvb, pinfo, pOffset, "ExtensionObject");
1611   parseDataValue(subtree, tvb, pinfo, pOffset, "DataValue");
1612   parseEnumeratedTestType(subtree, tvb, pinfo, pOffset);
1613   proto_item_set_end(ti, tvb, *pOffset);
1614 }
parseArrayTestType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1615 void parseArrayTestType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1616 {
1617   proto_item *ti;
1618   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ArrayTestType, &ti, "%s: ArrayTestType", szFieldName);
1619   /* Array length field ignored: NoOfBooleans */
1620   parseArraySimple(subtree, tvb, pinfo, pOffset, "Booleans", "Boolean", hf_opcua_Booleans, parseBoolean, ett_opcua_array_Boolean);
1621   /* Array length field ignored: NoOfSBytes */
1622   parseArraySimple(subtree, tvb, pinfo, pOffset, "SBytes", "SByte", hf_opcua_SBytes, parseSByte, ett_opcua_array_SByte);
1623   /* Array length field ignored: NoOfInt16s */
1624   parseArraySimple(subtree, tvb, pinfo, pOffset, "Int16s", "Int16", hf_opcua_Int16s, parseInt16, ett_opcua_array_Int16);
1625   /* Array length field ignored: NoOfUInt16s */
1626   parseArraySimple(subtree, tvb, pinfo, pOffset, "UInt16s", "UInt16", hf_opcua_UInt16s, parseUInt16, ett_opcua_array_UInt16);
1627   /* Array length field ignored: NoOfInt32s */
1628   parseArraySimple(subtree, tvb, pinfo, pOffset, "Int32s", "Int32", hf_opcua_Int32s, parseInt32, ett_opcua_array_Int32);
1629   /* Array length field ignored: NoOfUInt32s */
1630   parseArraySimple(subtree, tvb, pinfo, pOffset, "UInt32s", "UInt32", hf_opcua_UInt32s, parseUInt32, ett_opcua_array_UInt32);
1631   /* Array length field ignored: NoOfInt64s */
1632   parseArraySimple(subtree, tvb, pinfo, pOffset, "Int64s", "Int64", hf_opcua_Int64s, parseInt64, ett_opcua_array_Int64);
1633   /* Array length field ignored: NoOfUInt64s */
1634   parseArraySimple(subtree, tvb, pinfo, pOffset, "UInt64s", "UInt64", hf_opcua_UInt64s, parseUInt64, ett_opcua_array_UInt64);
1635   /* Array length field ignored: NoOfFloats */
1636   parseArraySimple(subtree, tvb, pinfo, pOffset, "Floats", "Float", hf_opcua_Floats, parseFloat, ett_opcua_array_Float);
1637   /* Array length field ignored: NoOfDoubles */
1638   parseArraySimple(subtree, tvb, pinfo, pOffset, "Doubles", "Double", hf_opcua_Doubles, parseDouble, ett_opcua_array_Double);
1639   /* Array length field ignored: NoOfStrings */
1640   parseArraySimple(subtree, tvb, pinfo, pOffset, "Strings", "String", hf_opcua_Strings, parseString, ett_opcua_array_String);
1641   /* Array length field ignored: NoOfDateTimes */
1642   parseArraySimple(subtree, tvb, pinfo, pOffset, "DateTimes", "DateTime", hf_opcua_DateTimes, parseDateTime, ett_opcua_array_DateTime);
1643   /* Array length field ignored: NoOfGuids */
1644   parseArraySimple(subtree, tvb, pinfo, pOffset, "Guids", "Guid", hf_opcua_Guids, parseGuid, ett_opcua_array_Guid);
1645   /* Array length field ignored: NoOfByteStrings */
1646   parseArraySimple(subtree, tvb, pinfo, pOffset, "ByteStrings", "ByteString", hf_opcua_ByteStrings, parseByteString, ett_opcua_array_ByteString);
1647   /* Array length field ignored: NoOfXmlElements */
1648   parseArraySimple(subtree, tvb, pinfo, pOffset, "XmlElements", "XmlElement", hf_opcua_XmlElements, parseXmlElement, ett_opcua_array_XmlElement);
1649   /* Array length field ignored: NoOfNodeIds */
1650   parseArrayComplex(subtree, tvb, pinfo, pOffset, "NodeIds", "NodeId", parseNodeId, ett_opcua_array_NodeId);
1651   /* Array length field ignored: NoOfExpandedNodeIds */
1652   parseArrayComplex(subtree, tvb, pinfo, pOffset, "ExpandedNodeIds", "ExpandedNodeId", parseExpandedNodeId, ett_opcua_array_ExpandedNodeId);
1653   /* Array length field ignored: NoOfStatusCodes */
1654   parseArraySimple(subtree, tvb, pinfo, pOffset, "StatusCodes", "StatusCode", hf_opcua_StatusCodes, parseStatusCode, ett_opcua_array_StatusCode);
1655   /* Array length field ignored: NoOfDiagnosticInfos */
1656   parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
1657   /* Array length field ignored: NoOfQualifiedNames */
1658   parseArrayComplex(subtree, tvb, pinfo, pOffset, "QualifiedNames", "QualifiedName", parseQualifiedName, ett_opcua_array_QualifiedName);
1659   /* Array length field ignored: NoOfLocalizedTexts */
1660   parseArrayComplex(subtree, tvb, pinfo, pOffset, "LocalizedTexts", "LocalizedText", parseLocalizedText, ett_opcua_array_LocalizedText);
1661   /* Array length field ignored: NoOfExtensionObjects */
1662   parseArrayComplex(subtree, tvb, pinfo, pOffset, "ExtensionObjects", "ExtensionObject", parseExtensionObject, ett_opcua_array_ExtensionObject);
1663   /* Array length field ignored: NoOfDataValues */
1664   parseArrayComplex(subtree, tvb, pinfo, pOffset, "DataValues", "DataValue", parseDataValue, ett_opcua_array_DataValue);
1665   /* Array length field ignored: NoOfVariants */
1666   parseArrayComplex(subtree, tvb, pinfo, pOffset, "Variants", "Variant", parseVariant, ett_opcua_array_Variant);
1667   /* Array length field ignored: NoOfEnumeratedValues */
1668   parseArrayEnum(subtree, tvb, pinfo, pOffset, "EnumeratedValues", "EnumeratedTestType", parseEnumeratedTestType, ett_opcua_array_EnumeratedTestType);
1669   proto_item_set_end(ti, tvb, *pOffset);
1670 }
parseCompositeTestType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1671 void parseCompositeTestType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1672 {
1673   proto_item *ti;
1674   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_CompositeTestType, &ti, "%s: CompositeTestType", szFieldName);
1675   parseScalarTestType(subtree, tvb, pinfo, pOffset, "Field1");
1676   parseArrayTestType(subtree, tvb, pinfo, pOffset, "Field2");
1677   proto_item_set_end(ti, tvb, *pOffset);
1678 }
parseBuildInfo(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1679 void parseBuildInfo(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1680 {
1681   proto_item *ti;
1682   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_BuildInfo, &ti, "%s: BuildInfo", szFieldName);
1683   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ProductUri);
1684   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ManufacturerName);
1685   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ProductName);
1686   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_SoftwareVersion);
1687   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_BuildNumber);
1688   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_BuildDate);
1689   proto_item_set_end(ti, tvb, *pOffset);
1690 }
parseRedundantServerDataType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1691 void parseRedundantServerDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1692 {
1693   proto_item *ti;
1694   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_RedundantServerDataType, &ti, "%s: RedundantServerDataType", szFieldName);
1695   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerId);
1696   parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_ServiceLevel);
1697   parseServerState(subtree, tvb, pinfo, pOffset);
1698   proto_item_set_end(ti, tvb, *pOffset);
1699 }
parseEndpointUrlListDataType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1700 void parseEndpointUrlListDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1701 {
1702   proto_item *ti;
1703   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EndpointUrlListDataType, &ti, "%s: EndpointUrlListDataType", szFieldName);
1704   /* Array length field ignored: NoOfEndpointUrlList */
1705   parseArraySimple(subtree, tvb, pinfo, pOffset, "EndpointUrlList", "String", hf_opcua_EndpointUrlList, parseString, ett_opcua_array_String);
1706   proto_item_set_end(ti, tvb, *pOffset);
1707 }
parseNetworkGroupDataType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1708 void parseNetworkGroupDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1709 {
1710   proto_item *ti;
1711   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_NetworkGroupDataType, &ti, "%s: NetworkGroupDataType", szFieldName);
1712   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerUri);
1713   /* Array length field ignored: NoOfNetworkPaths */
1714   parseArrayComplex(subtree, tvb, pinfo, pOffset, "NetworkPaths", "EndpointUrlListDataType", parseEndpointUrlListDataType, ett_opcua_array_EndpointUrlListDataType);
1715   proto_item_set_end(ti, tvb, *pOffset);
1716 }
parseSamplingIntervalDiagnosticsDataType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1717 void parseSamplingIntervalDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1718 {
1719   proto_item *ti;
1720   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SamplingIntervalDiagnosticsDataType, &ti, "%s: SamplingIntervalDiagnosticsDataType", szFieldName);
1721   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_SamplingInterval);
1722   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MonitoredItemCount);
1723   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxMonitoredItemCount);
1724   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_DisabledMonitoredItemCount);
1725   proto_item_set_end(ti, tvb, *pOffset);
1726 }
parseServerDiagnosticsSummaryDataType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1727 void parseServerDiagnosticsSummaryDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1728 {
1729   proto_item *ti;
1730   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ServerDiagnosticsSummaryDataType, &ti, "%s: ServerDiagnosticsSummaryDataType", szFieldName);
1731   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ServerViewCount);
1732   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CurrentSessionCount);
1733   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CumulatedSessionCount);
1734   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SecurityRejectedSessionCount);
1735   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RejectedSessionCount);
1736   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SessionTimeoutCount);
1737   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SessionAbortCount);
1738   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CurrentSubscriptionCount);
1739   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CumulatedSubscriptionCount);
1740   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_PublishingIntervalCount);
1741   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SecurityRejectedRequestsCount);
1742   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RejectedRequestsCount);
1743   proto_item_set_end(ti, tvb, *pOffset);
1744 }
parseServerStatusDataType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1745 void parseServerStatusDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1746 {
1747   proto_item *ti;
1748   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ServerStatusDataType, &ti, "%s: ServerStatusDataType", szFieldName);
1749   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_StartTime);
1750   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_CurrentTime);
1751   parseServerState(subtree, tvb, pinfo, pOffset);
1752   parseBuildInfo(subtree, tvb, pinfo, pOffset, "BuildInfo");
1753   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SecondsTillShutdown);
1754   parseLocalizedText(subtree, tvb, pinfo, pOffset, "ShutdownReason");
1755   proto_item_set_end(ti, tvb, *pOffset);
1756 }
parseSessionDiagnosticsDataType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1757 void parseSessionDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1758 {
1759   proto_item *ti;
1760   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SessionDiagnosticsDataType, &ti, "%s: SessionDiagnosticsDataType", szFieldName);
1761   parseNodeId(subtree, tvb, pinfo, pOffset, "SessionId");
1762   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_SessionName);
1763   parseApplicationDescription(subtree, tvb, pinfo, pOffset, "ClientDescription");
1764   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerUri);
1765   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_EndpointUrl);
1766   /* Array length field ignored: NoOfLocaleIds */
1767   parseArraySimple(subtree, tvb, pinfo, pOffset, "LocaleIds", "String", hf_opcua_LocaleIds, parseString, ett_opcua_array_String);
1768   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_ActualSessionTimeout);
1769   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxResponseMessageSize);
1770   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_ClientConnectionTime);
1771   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_ClientLastContactTime);
1772   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CurrentSubscriptionsCount);
1773   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CurrentMonitoredItemsCount);
1774   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CurrentPublishRequestsInQueue);
1775   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "TotalRequestCount");
1776   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UnauthorizedRequestCount);
1777   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "ReadCount");
1778   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "HistoryReadCount");
1779   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "WriteCount");
1780   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "HistoryUpdateCount");
1781   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "CallCount");
1782   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "CreateMonitoredItemsCount");
1783   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "ModifyMonitoredItemsCount");
1784   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "SetMonitoringModeCount");
1785   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "SetTriggeringCount");
1786   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "DeleteMonitoredItemsCount");
1787   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "CreateSubscriptionCount");
1788   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "ModifySubscriptionCount");
1789   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "SetPublishingModeCount");
1790   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "PublishCount");
1791   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "RepublishCount");
1792   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "TransferSubscriptionsCount");
1793   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "DeleteSubscriptionsCount");
1794   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "AddNodesCount");
1795   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "AddReferencesCount");
1796   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "DeleteNodesCount");
1797   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "DeleteReferencesCount");
1798   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "BrowseCount");
1799   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "BrowseNextCount");
1800   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "TranslateBrowsePathsToNodeIdsCount");
1801   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "QueryFirstCount");
1802   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "QueryNextCount");
1803   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "RegisterNodesCount");
1804   parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "UnregisterNodesCount");
1805   proto_item_set_end(ti, tvb, *pOffset);
1806 }
parseSessionSecurityDiagnosticsDataType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1807 void parseSessionSecurityDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1808 {
1809   proto_item *ti;
1810   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SessionSecurityDiagnosticsDataType, &ti, "%s: SessionSecurityDiagnosticsDataType", szFieldName);
1811   parseNodeId(subtree, tvb, pinfo, pOffset, "SessionId");
1812   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ClientUserIdOfSession);
1813   /* Array length field ignored: NoOfClientUserIdHistory */
1814   parseArraySimple(subtree, tvb, pinfo, pOffset, "ClientUserIdHistory", "String", hf_opcua_ClientUserIdHistory, parseString, ett_opcua_array_String);
1815   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_AuthenticationMechanism);
1816   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_Encoding);
1817   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_TransportProtocol);
1818   parseMessageSecurityMode(subtree, tvb, pinfo, pOffset);
1819   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_SecurityPolicyUri);
1820   parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ClientCertificate);
1821   proto_item_set_end(ti, tvb, *pOffset);
1822 }
parseServiceCounterDataType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1823 void parseServiceCounterDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1824 {
1825   proto_item *ti;
1826   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ServiceCounterDataType, &ti, "%s: ServiceCounterDataType", szFieldName);
1827   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_TotalCount);
1828   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ErrorCount);
1829   proto_item_set_end(ti, tvb, *pOffset);
1830 }
parseStatusResult(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1831 void parseStatusResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1832 {
1833   proto_item *ti;
1834   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_StatusResult, &ti, "%s: StatusResult", szFieldName);
1835   parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
1836   parseDiagnosticInfo(subtree, tvb, pinfo, pOffset, "DiagnosticInfo");
1837   proto_item_set_end(ti, tvb, *pOffset);
1838 }
parseSubscriptionDiagnosticsDataType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1839 void parseSubscriptionDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1840 {
1841   proto_item *ti;
1842   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SubscriptionDiagnosticsDataType, &ti, "%s: SubscriptionDiagnosticsDataType", szFieldName);
1843   parseNodeId(subtree, tvb, pinfo, pOffset, "SessionId");
1844   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SubscriptionId);
1845   parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_Priority);
1846   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_PublishingInterval);
1847   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxKeepAliveCount);
1848   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxLifetimeCount);
1849   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxNotificationsPerPublish);
1850   parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_PublishingEnabled);
1851   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ModifyCount);
1852   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_EnableCount);
1853   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_DisableCount);
1854   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RepublishRequestCount);
1855   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RepublishMessageRequestCount);
1856   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RepublishMessageCount);
1857   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_TransferRequestCount);
1858   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_TransferredToAltClientCount);
1859   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_TransferredToSameClientCount);
1860   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_PublishRequestCount);
1861   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_DataChangeNotificationsCount);
1862   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_EventNotificationsCount);
1863   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_NotificationsCount);
1864   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_LatePublishRequestCount);
1865   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CurrentKeepAliveCount);
1866   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CurrentLifetimeCount);
1867   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UnacknowledgedMessageCount);
1868   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_DiscardedMessageCount);
1869   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MonitoredItemCount);
1870   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_DisabledMonitoredItemCount);
1871   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MonitoringQueueOverflowCount);
1872   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_NextSequenceNumber);
1873   parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_EventQueueOverFlowCount);
1874   proto_item_set_end(ti, tvb, *pOffset);
1875 }
parseModelChangeStructureDataType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1876 void parseModelChangeStructureDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1877 {
1878   proto_item *ti;
1879   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ModelChangeStructureDataType, &ti, "%s: ModelChangeStructureDataType", szFieldName);
1880   parseNodeId(subtree, tvb, pinfo, pOffset, "Affected");
1881   parseNodeId(subtree, tvb, pinfo, pOffset, "AffectedType");
1882   parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_Verb);
1883   proto_item_set_end(ti, tvb, *pOffset);
1884 }
parseSemanticChangeStructureDataType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1885 void parseSemanticChangeStructureDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1886 {
1887   proto_item *ti;
1888   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SemanticChangeStructureDataType, &ti, "%s: SemanticChangeStructureDataType", szFieldName);
1889   parseNodeId(subtree, tvb, pinfo, pOffset, "Affected");
1890   parseNodeId(subtree, tvb, pinfo, pOffset, "AffectedType");
1891   proto_item_set_end(ti, tvb, *pOffset);
1892 }
parseRange(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1893 void parseRange(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1894 {
1895   proto_item *ti;
1896   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_Range, &ti, "%s: Range", szFieldName);
1897   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_Low);
1898   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_High);
1899   proto_item_set_end(ti, tvb, *pOffset);
1900 }
parseEUInformation(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1901 void parseEUInformation(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1902 {
1903   proto_item *ti;
1904   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EUInformation, &ti, "%s: EUInformation", szFieldName);
1905   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_NamespaceUri);
1906   parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UnitId);
1907   parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
1908   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
1909   proto_item_set_end(ti, tvb, *pOffset);
1910 }
parseComplexNumberType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1911 void parseComplexNumberType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1912 {
1913   proto_item *ti;
1914   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ComplexNumberType, &ti, "%s: ComplexNumberType", szFieldName);
1915   parseFloat(subtree, tvb, pinfo, pOffset, hf_opcua_Real);
1916   parseFloat(subtree, tvb, pinfo, pOffset, hf_opcua_Imaginary);
1917   proto_item_set_end(ti, tvb, *pOffset);
1918 }
parseDoubleComplexNumberType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1919 void parseDoubleComplexNumberType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1920 {
1921   proto_item *ti;
1922   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DoubleComplexNumberType, &ti, "%s: DoubleComplexNumberType", szFieldName);
1923   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_Real);
1924   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_Imaginary);
1925   proto_item_set_end(ti, tvb, *pOffset);
1926 }
parseAxisInformation(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1927 void parseAxisInformation(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1928 {
1929   proto_item *ti;
1930   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AxisInformation, &ti, "%s: AxisInformation", szFieldName);
1931   parseEUInformation(subtree, tvb, pinfo, pOffset, "EngineeringUnits");
1932   parseRange(subtree, tvb, pinfo, pOffset, "EURange");
1933   parseLocalizedText(subtree, tvb, pinfo, pOffset, "Title");
1934   parseAxisScaleEnumeration(subtree, tvb, pinfo, pOffset);
1935   /* Array length field ignored: NoOfAxisSteps */
1936   parseArraySimple(subtree, tvb, pinfo, pOffset, "AxisSteps", "Double", hf_opcua_AxisSteps, parseDouble, ett_opcua_array_Double);
1937   proto_item_set_end(ti, tvb, *pOffset);
1938 }
parseXVType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1939 void parseXVType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1940 {
1941   proto_item *ti;
1942   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_XVType, &ti, "%s: XVType", szFieldName);
1943   parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_X);
1944   parseFloat(subtree, tvb, pinfo, pOffset, hf_opcua_Value);
1945   proto_item_set_end(ti, tvb, *pOffset);
1946 }
parseProgramDiagnosticDataType(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1947 void parseProgramDiagnosticDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1948 {
1949   proto_item *ti;
1950   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ProgramDiagnosticDataType, &ti, "%s: ProgramDiagnosticDataType", szFieldName);
1951   parseNodeId(subtree, tvb, pinfo, pOffset, "CreateSessionId");
1952   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_CreateClientName);
1953   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_InvocationCreationTime);
1954   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_LastTransitionTime);
1955   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_LastMethodCall);
1956   parseNodeId(subtree, tvb, pinfo, pOffset, "LastMethodSessionId");
1957   /* Array length field ignored: NoOfLastMethodInputArguments */
1958   parseArrayComplex(subtree, tvb, pinfo, pOffset, "LastMethodInputArguments", "Argument", parseArgument, ett_opcua_array_Argument);
1959   /* Array length field ignored: NoOfLastMethodOutputArguments */
1960   parseArrayComplex(subtree, tvb, pinfo, pOffset, "LastMethodOutputArguments", "Argument", parseArgument, ett_opcua_array_Argument);
1961   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_LastMethodCallTime);
1962   parseStatusResult(subtree, tvb, pinfo, pOffset, "LastMethodReturnStatus");
1963   proto_item_set_end(ti, tvb, *pOffset);
1964 }
parseAnnotation(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,gint * pOffset,const char * szFieldName)1965 void parseAnnotation(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
1966 {
1967   proto_item *ti;
1968   proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_Annotation, &ti, "%s: Annotation", szFieldName);
1969   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_Message);
1970   parseString(subtree, tvb, pinfo, pOffset, hf_opcua_UserName);
1971   parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_AnnotationTime);
1972   proto_item_set_end(ti, tvb, *pOffset);
1973 }
1974 
1975 /** Setup protocol subtree array */
1976 static gint *ett[] =
1977 {
1978   &ett_opcua_TrustListDataType,
1979   &ett_opcua_array_TrustListDataType,
1980   &ett_opcua_Node,
1981   &ett_opcua_array_Node,
1982   &ett_opcua_InstanceNode,
1983   &ett_opcua_array_InstanceNode,
1984   &ett_opcua_TypeNode,
1985   &ett_opcua_array_TypeNode,
1986   &ett_opcua_ObjectNode,
1987   &ett_opcua_array_ObjectNode,
1988   &ett_opcua_ObjectTypeNode,
1989   &ett_opcua_array_ObjectTypeNode,
1990   &ett_opcua_VariableNode,
1991   &ett_opcua_array_VariableNode,
1992   &ett_opcua_VariableTypeNode,
1993   &ett_opcua_array_VariableTypeNode,
1994   &ett_opcua_ReferenceTypeNode,
1995   &ett_opcua_array_ReferenceTypeNode,
1996   &ett_opcua_MethodNode,
1997   &ett_opcua_array_MethodNode,
1998   &ett_opcua_ViewNode,
1999   &ett_opcua_array_ViewNode,
2000   &ett_opcua_DataTypeNode,
2001   &ett_opcua_array_DataTypeNode,
2002   &ett_opcua_ReferenceNode,
2003   &ett_opcua_array_ReferenceNode,
2004   &ett_opcua_Argument,
2005   &ett_opcua_array_Argument,
2006   &ett_opcua_EnumValueType,
2007   &ett_opcua_array_EnumValueType,
2008   &ett_opcua_OptionSet,
2009   &ett_opcua_array_OptionSet,
2010   &ett_opcua_TimeZoneDataType,
2011   &ett_opcua_array_TimeZoneDataType,
2012   &ett_opcua_ApplicationDescription,
2013   &ett_opcua_array_ApplicationDescription,
2014   &ett_opcua_RequestHeader,
2015   &ett_opcua_array_RequestHeader,
2016   &ett_opcua_ResponseHeader,
2017   &ett_opcua_array_ResponseHeader,
2018   &ett_opcua_ServerOnNetwork,
2019   &ett_opcua_array_ServerOnNetwork,
2020   &ett_opcua_UserTokenPolicy,
2021   &ett_opcua_array_UserTokenPolicy,
2022   &ett_opcua_EndpointDescription,
2023   &ett_opcua_array_EndpointDescription,
2024   &ett_opcua_RegisteredServer,
2025   &ett_opcua_array_RegisteredServer,
2026   &ett_opcua_MdnsDiscoveryConfiguration,
2027   &ett_opcua_array_MdnsDiscoveryConfiguration,
2028   &ett_opcua_ChannelSecurityToken,
2029   &ett_opcua_array_ChannelSecurityToken,
2030   &ett_opcua_SignedSoftwareCertificate,
2031   &ett_opcua_array_SignedSoftwareCertificate,
2032   &ett_opcua_SignatureData,
2033   &ett_opcua_array_SignatureData,
2034   &ett_opcua_UserIdentityToken,
2035   &ett_opcua_array_UserIdentityToken,
2036   &ett_opcua_AnonymousIdentityToken,
2037   &ett_opcua_array_AnonymousIdentityToken,
2038   &ett_opcua_UserNameIdentityToken,
2039   &ett_opcua_array_UserNameIdentityToken,
2040   &ett_opcua_X509IdentityToken,
2041   &ett_opcua_array_X509IdentityToken,
2042   &ett_opcua_KerberosIdentityToken,
2043   &ett_opcua_array_KerberosIdentityToken,
2044   &ett_opcua_IssuedIdentityToken,
2045   &ett_opcua_array_IssuedIdentityToken,
2046   &ett_opcua_NodeAttributes,
2047   &ett_opcua_array_NodeAttributes,
2048   &ett_opcua_ObjectAttributes,
2049   &ett_opcua_array_ObjectAttributes,
2050   &ett_opcua_VariableAttributes,
2051   &ett_opcua_array_VariableAttributes,
2052   &ett_opcua_MethodAttributes,
2053   &ett_opcua_array_MethodAttributes,
2054   &ett_opcua_ObjectTypeAttributes,
2055   &ett_opcua_array_ObjectTypeAttributes,
2056   &ett_opcua_VariableTypeAttributes,
2057   &ett_opcua_array_VariableTypeAttributes,
2058   &ett_opcua_ReferenceTypeAttributes,
2059   &ett_opcua_array_ReferenceTypeAttributes,
2060   &ett_opcua_DataTypeAttributes,
2061   &ett_opcua_array_DataTypeAttributes,
2062   &ett_opcua_ViewAttributes,
2063   &ett_opcua_array_ViewAttributes,
2064   &ett_opcua_AddNodesItem,
2065   &ett_opcua_array_AddNodesItem,
2066   &ett_opcua_AddNodesResult,
2067   &ett_opcua_array_AddNodesResult,
2068   &ett_opcua_AddReferencesItem,
2069   &ett_opcua_array_AddReferencesItem,
2070   &ett_opcua_DeleteNodesItem,
2071   &ett_opcua_array_DeleteNodesItem,
2072   &ett_opcua_DeleteReferencesItem,
2073   &ett_opcua_array_DeleteReferencesItem,
2074   &ett_opcua_ViewDescription,
2075   &ett_opcua_array_ViewDescription,
2076   &ett_opcua_BrowseDescription,
2077   &ett_opcua_array_BrowseDescription,
2078   &ett_opcua_ReferenceDescription,
2079   &ett_opcua_array_ReferenceDescription,
2080   &ett_opcua_BrowseResult,
2081   &ett_opcua_array_BrowseResult,
2082   &ett_opcua_RelativePathElement,
2083   &ett_opcua_array_RelativePathElement,
2084   &ett_opcua_RelativePath,
2085   &ett_opcua_array_RelativePath,
2086   &ett_opcua_BrowsePath,
2087   &ett_opcua_array_BrowsePath,
2088   &ett_opcua_BrowsePathTarget,
2089   &ett_opcua_array_BrowsePathTarget,
2090   &ett_opcua_BrowsePathResult,
2091   &ett_opcua_array_BrowsePathResult,
2092   &ett_opcua_EndpointConfiguration,
2093   &ett_opcua_array_EndpointConfiguration,
2094   &ett_opcua_SupportedProfile,
2095   &ett_opcua_array_SupportedProfile,
2096   &ett_opcua_SoftwareCertificate,
2097   &ett_opcua_array_SoftwareCertificate,
2098   &ett_opcua_QueryDataDescription,
2099   &ett_opcua_array_QueryDataDescription,
2100   &ett_opcua_NodeTypeDescription,
2101   &ett_opcua_array_NodeTypeDescription,
2102   &ett_opcua_QueryDataSet,
2103   &ett_opcua_array_QueryDataSet,
2104   &ett_opcua_NodeReference,
2105   &ett_opcua_array_NodeReference,
2106   &ett_opcua_ContentFilterElement,
2107   &ett_opcua_array_ContentFilterElement,
2108   &ett_opcua_ContentFilter,
2109   &ett_opcua_array_ContentFilter,
2110   &ett_opcua_ElementOperand,
2111   &ett_opcua_array_ElementOperand,
2112   &ett_opcua_LiteralOperand,
2113   &ett_opcua_array_LiteralOperand,
2114   &ett_opcua_AttributeOperand,
2115   &ett_opcua_array_AttributeOperand,
2116   &ett_opcua_SimpleAttributeOperand,
2117   &ett_opcua_array_SimpleAttributeOperand,
2118   &ett_opcua_ContentFilterElementResult,
2119   &ett_opcua_array_ContentFilterElementResult,
2120   &ett_opcua_ContentFilterResult,
2121   &ett_opcua_array_ContentFilterResult,
2122   &ett_opcua_ParsingResult,
2123   &ett_opcua_array_ParsingResult,
2124   &ett_opcua_ReadValueId,
2125   &ett_opcua_array_ReadValueId,
2126   &ett_opcua_HistoryReadValueId,
2127   &ett_opcua_array_HistoryReadValueId,
2128   &ett_opcua_HistoryReadResult,
2129   &ett_opcua_array_HistoryReadResult,
2130   &ett_opcua_ReadEventDetails,
2131   &ett_opcua_array_ReadEventDetails,
2132   &ett_opcua_ReadRawModifiedDetails,
2133   &ett_opcua_array_ReadRawModifiedDetails,
2134   &ett_opcua_ReadProcessedDetails,
2135   &ett_opcua_array_ReadProcessedDetails,
2136   &ett_opcua_ReadAtTimeDetails,
2137   &ett_opcua_array_ReadAtTimeDetails,
2138   &ett_opcua_HistoryData,
2139   &ett_opcua_array_HistoryData,
2140   &ett_opcua_ModificationInfo,
2141   &ett_opcua_array_ModificationInfo,
2142   &ett_opcua_HistoryModifiedData,
2143   &ett_opcua_array_HistoryModifiedData,
2144   &ett_opcua_HistoryEvent,
2145   &ett_opcua_array_HistoryEvent,
2146   &ett_opcua_WriteValue,
2147   &ett_opcua_array_WriteValue,
2148   &ett_opcua_HistoryUpdateDetails,
2149   &ett_opcua_array_HistoryUpdateDetails,
2150   &ett_opcua_UpdateDataDetails,
2151   &ett_opcua_array_UpdateDataDetails,
2152   &ett_opcua_UpdateStructureDataDetails,
2153   &ett_opcua_array_UpdateStructureDataDetails,
2154   &ett_opcua_UpdateEventDetails,
2155   &ett_opcua_array_UpdateEventDetails,
2156   &ett_opcua_DeleteRawModifiedDetails,
2157   &ett_opcua_array_DeleteRawModifiedDetails,
2158   &ett_opcua_DeleteAtTimeDetails,
2159   &ett_opcua_array_DeleteAtTimeDetails,
2160   &ett_opcua_DeleteEventDetails,
2161   &ett_opcua_array_DeleteEventDetails,
2162   &ett_opcua_HistoryUpdateResult,
2163   &ett_opcua_array_HistoryUpdateResult,
2164   &ett_opcua_CallMethodRequest,
2165   &ett_opcua_array_CallMethodRequest,
2166   &ett_opcua_CallMethodResult,
2167   &ett_opcua_array_CallMethodResult,
2168   &ett_opcua_DataChangeFilter,
2169   &ett_opcua_array_DataChangeFilter,
2170   &ett_opcua_EventFilter,
2171   &ett_opcua_array_EventFilter,
2172   &ett_opcua_AggregateConfiguration,
2173   &ett_opcua_array_AggregateConfiguration,
2174   &ett_opcua_AggregateFilter,
2175   &ett_opcua_array_AggregateFilter,
2176   &ett_opcua_EventFilterResult,
2177   &ett_opcua_array_EventFilterResult,
2178   &ett_opcua_AggregateFilterResult,
2179   &ett_opcua_array_AggregateFilterResult,
2180   &ett_opcua_MonitoringParameters,
2181   &ett_opcua_array_MonitoringParameters,
2182   &ett_opcua_MonitoredItemCreateRequest,
2183   &ett_opcua_array_MonitoredItemCreateRequest,
2184   &ett_opcua_MonitoredItemCreateResult,
2185   &ett_opcua_array_MonitoredItemCreateResult,
2186   &ett_opcua_MonitoredItemModifyRequest,
2187   &ett_opcua_array_MonitoredItemModifyRequest,
2188   &ett_opcua_MonitoredItemModifyResult,
2189   &ett_opcua_array_MonitoredItemModifyResult,
2190   &ett_opcua_NotificationMessage,
2191   &ett_opcua_array_NotificationMessage,
2192   &ett_opcua_DataChangeNotification,
2193   &ett_opcua_array_DataChangeNotification,
2194   &ett_opcua_MonitoredItemNotification,
2195   &ett_opcua_array_MonitoredItemNotification,
2196   &ett_opcua_EventNotificationList,
2197   &ett_opcua_array_EventNotificationList,
2198   &ett_opcua_EventFieldList,
2199   &ett_opcua_array_EventFieldList,
2200   &ett_opcua_HistoryEventFieldList,
2201   &ett_opcua_array_HistoryEventFieldList,
2202   &ett_opcua_StatusChangeNotification,
2203   &ett_opcua_array_StatusChangeNotification,
2204   &ett_opcua_SubscriptionAcknowledgement,
2205   &ett_opcua_array_SubscriptionAcknowledgement,
2206   &ett_opcua_TransferResult,
2207   &ett_opcua_array_TransferResult,
2208   &ett_opcua_ScalarTestType,
2209   &ett_opcua_array_ScalarTestType,
2210   &ett_opcua_ArrayTestType,
2211   &ett_opcua_array_ArrayTestType,
2212   &ett_opcua_CompositeTestType,
2213   &ett_opcua_array_CompositeTestType,
2214   &ett_opcua_BuildInfo,
2215   &ett_opcua_array_BuildInfo,
2216   &ett_opcua_RedundantServerDataType,
2217   &ett_opcua_array_RedundantServerDataType,
2218   &ett_opcua_EndpointUrlListDataType,
2219   &ett_opcua_array_EndpointUrlListDataType,
2220   &ett_opcua_NetworkGroupDataType,
2221   &ett_opcua_array_NetworkGroupDataType,
2222   &ett_opcua_SamplingIntervalDiagnosticsDataType,
2223   &ett_opcua_array_SamplingIntervalDiagnosticsDataType,
2224   &ett_opcua_ServerDiagnosticsSummaryDataType,
2225   &ett_opcua_array_ServerDiagnosticsSummaryDataType,
2226   &ett_opcua_ServerStatusDataType,
2227   &ett_opcua_array_ServerStatusDataType,
2228   &ett_opcua_SessionDiagnosticsDataType,
2229   &ett_opcua_array_SessionDiagnosticsDataType,
2230   &ett_opcua_SessionSecurityDiagnosticsDataType,
2231   &ett_opcua_array_SessionSecurityDiagnosticsDataType,
2232   &ett_opcua_ServiceCounterDataType,
2233   &ett_opcua_array_ServiceCounterDataType,
2234   &ett_opcua_StatusResult,
2235   &ett_opcua_array_StatusResult,
2236   &ett_opcua_SubscriptionDiagnosticsDataType,
2237   &ett_opcua_array_SubscriptionDiagnosticsDataType,
2238   &ett_opcua_ModelChangeStructureDataType,
2239   &ett_opcua_array_ModelChangeStructureDataType,
2240   &ett_opcua_SemanticChangeStructureDataType,
2241   &ett_opcua_array_SemanticChangeStructureDataType,
2242   &ett_opcua_Range,
2243   &ett_opcua_array_Range,
2244   &ett_opcua_EUInformation,
2245   &ett_opcua_array_EUInformation,
2246   &ett_opcua_ComplexNumberType,
2247   &ett_opcua_array_ComplexNumberType,
2248   &ett_opcua_DoubleComplexNumberType,
2249   &ett_opcua_array_DoubleComplexNumberType,
2250   &ett_opcua_AxisInformation,
2251   &ett_opcua_array_AxisInformation,
2252   &ett_opcua_XVType,
2253   &ett_opcua_array_XVType,
2254   &ett_opcua_ProgramDiagnosticDataType,
2255   &ett_opcua_array_ProgramDiagnosticDataType,
2256   &ett_opcua_Annotation,
2257   &ett_opcua_array_Annotation,
2258 };
2259 
registerComplexTypes(void)2260 void registerComplexTypes(void)
2261 {
2262   proto_register_subtree_array(ett, array_length(ett));
2263 }
2264 
2265