summaryrefslogtreecommitdiffstats
path: root/plugins/epan/opcua
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /plugins/epan/opcua
parentInitial commit. (diff)
downloadwireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz
wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'plugins/epan/opcua')
-rw-r--r--plugins/epan/opcua/AUTHORS7
-rw-r--r--plugins/epan/opcua/CMakeLists.txt81
-rw-r--r--plugins/epan/opcua/ChangeLog19
-rw-r--r--plugins/epan/opcua/Doxyfile275
-rw-r--r--plugins/epan/opcua/README86
-rw-r--r--plugins/epan/opcua/opcua.c457
-rw-r--r--plugins/epan/opcua/opcua_application_layer.c112
-rw-r--r--plugins/epan/opcua/opcua_application_layer.h20
-rw-r--r--plugins/epan/opcua/opcua_complextypeparser.c2264
-rw-r--r--plugins/epan/opcua/opcua_complextypeparser.h445
-rw-r--r--plugins/epan/opcua/opcua_enumparser.c675
-rw-r--r--plugins/epan/opcua/opcua_enumparser.h81
-rw-r--r--plugins/epan/opcua/opcua_extensionobjectids.h159
-rw-r--r--plugins/epan/opcua/opcua_extensionobjecttable.c215
-rw-r--r--plugins/epan/opcua/opcua_hfindeces.c630
-rw-r--r--plugins/epan/opcua/opcua_hfindeces.h322
-rw-r--r--plugins/epan/opcua/opcua_identifiers.h43
-rw-r--r--plugins/epan/opcua/opcua_security_layer.c60
-rw-r--r--plugins/epan/opcua/opcua_security_layer.h18
-rw-r--r--plugins/epan/opcua/opcua_serviceids.h187
-rw-r--r--plugins/epan/opcua/opcua_serviceparser.c1317
-rw-r--r--plugins/epan/opcua/opcua_serviceparser.h273
-rw-r--r--plugins/epan/opcua/opcua_servicetable.c300
-rw-r--r--plugins/epan/opcua/opcua_servicetable.h17
-rw-r--r--plugins/epan/opcua/opcua_simpletypes.c1398
-rw-r--r--plugins/epan/opcua/opcua_simpletypes.h105
-rw-r--r--plugins/epan/opcua/opcua_statuscode.c267
-rw-r--r--plugins/epan/opcua/opcua_statuscode.h16
-rw-r--r--plugins/epan/opcua/opcua_transport_layer.c245
-rw-r--r--plugins/epan/opcua/opcua_transport_layer.h27
30 files changed, 10121 insertions, 0 deletions
diff --git a/plugins/epan/opcua/AUTHORS b/plugins/epan/opcua/AUTHORS
new file mode 100644
index 00000000..fffa8685
--- /dev/null
+++ b/plugins/epan/opcua/AUTHORS
@@ -0,0 +1,7 @@
+Authors :
+Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>
+Hannes Mezger <hannes.mezger@ascolab.com>
+ascolab GmbH
+http://www.ascolab.com
+
+
diff --git a/plugins/epan/opcua/CMakeLists.txt b/plugins/epan/opcua/CMakeLists.txt
new file mode 100644
index 00000000..2f43d42c
--- /dev/null
+++ b/plugins/epan/opcua/CMakeLists.txt
@@ -0,0 +1,81 @@
+# CMakeLists.txt
+#
+# Wireshark - Network traffic analyzer
+# By Gerald Combs <gerald@wireshark.org>
+# Copyright 1998 Gerald Combs
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+
+include(WiresharkPlugin)
+
+# Plugin name and version info (major minor micro extra)
+set_module_info(opcua 1 0 0 0)
+
+set(DISSECTOR_SRC
+ opcua.c
+)
+
+set(DISSECTOR_SUPPORT_SRC
+ opcua_transport_layer.c
+ opcua_security_layer.c
+ opcua_application_layer.c
+ opcua_serviceparser.c
+ opcua_complextypeparser.c
+ opcua_enumparser.c
+ opcua_simpletypes.c
+ opcua_servicetable.c
+ opcua_extensionobjecttable.c
+ opcua_hfindeces.c
+ opcua_statuscode.c
+)
+
+set(PLUGIN_FILES
+ plugin.c
+ ${DISSECTOR_SRC}
+ ${DISSECTOR_SUPPORT_SRC}
+)
+
+set_source_files_properties(
+ ${PLUGIN_FILES}
+ PROPERTIES
+ COMPILE_FLAGS "${WERROR_COMMON_FLAGS}"
+)
+
+register_plugin_files(plugin.c
+ plugin
+ ${DISSECTOR_SRC}
+ ${DISSECTOR_SUPPORT_SRC}
+)
+
+add_wireshark_plugin_library(opcua epan)
+
+target_link_libraries(opcua epan)
+
+install_plugin(opcua epan)
+
+file(GLOB DISSECTOR_HEADERS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "*.h")
+CHECKAPI(
+ NAME
+ opcua
+ SWITCHES
+ --group dissectors-prohibited
+ --group dissectors-restricted
+ SOURCES
+ ${DISSECTOR_SRC}
+ ${DISSECTOR_SUPPORT_SRC}
+ ${DISSECTOR_HEADERS}
+)
+
+#
+# Editor modelines - https://www.wireshark.org/tools/modelines.html
+#
+# Local variables:
+# c-basic-offset: 8
+# tab-width: 8
+# indent-tabs-mode: t
+# End:
+#
+# vi: set shiftwidth=8 tabstop=8 noexpandtab:
+# :indentSize=8:tabSize=8:noTabs=false:
+#
diff --git a/plugins/epan/opcua/ChangeLog b/plugins/epan/opcua/ChangeLog
new file mode 100644
index 00000000..5ebfc8f9
--- /dev/null
+++ b/plugins/epan/opcua/ChangeLog
@@ -0,0 +1,19 @@
+Overview of changes in OpcUa plugin:
+
+Version 0.0.1:
+
+* initial implementation without security
+
+Version 1.0.0:
+
+* released implementation that works for OPC UA V1.0.
+ - The protocol is not compatible to the previous version.
+ Transport-layer, security-layer as well as the application-layer
+ data types have changed.
+ - This implementation is compliant to
+ "OPC UA Part 6 - Mappings 1.00 Specification"
+ - The security-layer is always present, but this plugin can only
+ decode communication with security policy
+ http://opcfoundation.org/UA/SecurityPolicy#None, which means
+ that neither encryption nor signing is active.
+
diff --git a/plugins/epan/opcua/Doxyfile b/plugins/epan/opcua/Doxyfile
new file mode 100644
index 00000000..478bcdb8
--- /dev/null
+++ b/plugins/epan/opcua/Doxyfile
@@ -0,0 +1,275 @@
+# Doxyfile 1.4.1-KDevelop
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME = opcua.kdevelop
+PROJECT_NUMBER = $VERSION$
+OUTPUT_DIRECTORY =
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+USE_WINDOWS_ENCODING = NO
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = YES
+STRIP_FROM_PATH = /home/gergap/
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP = NO
+INHERIT_DOCS = YES
+DISTRIBUTE_GROUP_DOC = NO
+TAB_SIZE = 8
+ALIASES =
+OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_JAVA = NO
+SUBGROUPING = YES
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = NO
+EXTRACT_PRIVATE = NO
+EXTRACT_STATIC = NO
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_BY_SCOPE_NAME = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 30
+SHOW_USED_FILES = YES
+SHOW_DIRECTORIES = YES
+FILE_VERSION_FILTER =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_IF_DOC_ERROR = YES
+WARN_NO_PARAMDOC = NO
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = /home/gergap/work/wireshark/plugins/opcua
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.java \
+ *.ii \
+ *.ixx \
+ *.ipp \
+ *.i++ \
+ *.inl \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.idl \
+ *.odl \
+ *.cs \
+ *.php \
+ *.php3 \
+ *.inc \
+ *.m \
+ *.mm \
+ *.dox \
+ *.C \
+ *.CC \
+ *.C++ \
+ *.II \
+ *.I++ \
+ *.H \
+ *.HH \
+ *.H++ \
+ *.CS \
+ *.PHP \
+ *.PHP3 \
+ *.M \
+ *.MM \
+ *.C \
+ *.H \
+ *.tlh \
+ *.diff \
+ *.patch \
+ *.moc \
+ *.xpm \
+ *.dox
+RECURSIVE = yes
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS = *
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = NO
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION = YES
+VERBATIM_HEADERS = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = NO
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT = html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_ALIGN_MEMBERS = YES
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+BINARY_TOC = NO
+TOC_EXPAND = NO
+DISABLE_INDEX = NO
+ENUM_VALUES_PER_LINE = 4
+GENERATE_TREEVIEW = NO
+TREEVIEW_WIDTH = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = YES
+LATEX_OUTPUT = latex
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES =
+LATEX_HEADER =
+PDF_HYPERLINKS = NO
+USE_PDFLATEX = NO
+LATEX_BATCHMODE = NO
+LATEX_HIDE_INDICES = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = yes
+XML_OUTPUT = xml
+XML_SCHEMA =
+XML_DTD =
+XML_PROGRAMLISTING = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = NO
+EXPAND_ONLY_PREDEF = NO
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
+SKIP_FUNCTION_MACROS = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES =
+GENERATE_TAGFILE = opcua.tag
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+PERL_PATH = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = YES
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = NO
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DIRECTORY_GRAPH = YES
+DOT_IMAGE_FORMAT = png
+DOT_PATH =
+DOTFILE_DIRS =
+MAX_DOT_GRAPH_WIDTH = 1024
+MAX_DOT_GRAPH_HEIGHT = 1024
+MAX_DOT_GRAPH_DEPTH = 1000
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+SEARCHENGINE = NO
diff --git a/plugins/epan/opcua/README b/plugins/epan/opcua/README
new file mode 100644
index 00000000..8c4993be
--- /dev/null
+++ b/plugins/epan/opcua/README
@@ -0,0 +1,86 @@
+OpcUa Plugin:
+=============
+
+This plugin implements the dissection of the OpcUa Binary Protocol.
+Authors: Gerhard Gappmeier & Hannes Mezger
+ ascolab GmbH
+ http://www.ascolab.com
+
+Overview:
+=========
+
+OpcUa (OPC Unified Architecture) is a vendor and platform independent
+protocol for automation technology. It is the successor of the
+COM/DCOM based specifications OPC DA, OPC Alarm & Events, OPC HDA, etc.
+It unifies all this technologies into a single protocol.
+
+The specification describes abstract services that are independent
+of the underlying protocol. For now there exist protocol mappings
+to a Binary TCP based protocol and a SOAP based Webservice.
+Also a hybrid version will be available where the Binary messages are transported
+by a single webservice command called "Invoke".
+
+More information about the technology you can find on
+http://www.ascolab.com/index.php?file=ua&lang=en.
+
+Protocol Mappings:
+==================
+
+Binary (TCP): The fastest and most flexible version (small footprint, no XML and SOAP necessary)
+ can easily be tunneled (SSH, IPSEC, etc.), redirected, ...
+SOAP version: Easy to implement with verious tools like .Net, JAVA, gSOAP, etc.
+ Better to communicate through firewalls via HTTP.
+SOAP with Binary Attachment: Combines the advantages of both.
+ The messages are encoded as Binary, and transported via SOAP as binary
+ attachment.
+
+The OPC Foundation offers a free Opc Ua stack implementation in ANSI C
+for all members. This stack implements the binary protocol as well
+as the SOAP version. It's easily portable to different kinds of operating
+systems from embedded devices to servers.
+This makes it easy to implement Opc Ua applications based on this stack
+and it is expected that the binary protocol will be the most used
+protocol.
+Nevertheless it's free to everbody to implement an own stack according
+to the specification. An own implementation of the SOAP version
+should be easy with the various SOAP toolkits.
+
+For more information see http://www.opcfoundation.org
+
+Known limitations:
+==================
+
+* Only the security policy http://opcfoundation.org/UA/SecurityPolicy#None is
+ supported, which means the encryption and signing is turned off.
+
+Machine-generated dissector:
+============================
+Parts of the OpcUa dissector are machine generated. Several of the files are
+marked "DON'T MODIFY THIS FILE!" for this reason.
+
+However, the code to create this dissector is not part of the Wireshark source
+source code distribution. This was discussed prior to the plugin's inclusion.
+From https://www.wireshark.org/lists/wireshark-dev/200704/msg00025.html :
+
+~~~
+> a lot of the code seems to be autogenerated (as the comments suggest)
+> It might make sense to include the sources and the build process instead
+> of the intermediate files (if the amount of code/tools to build the
+> files seems reasonable). The reason: When people start to hack your code
+> (e.g. to remove warnings on a compiler you don't even think about),
+> you'll might get into annoying trouble with merging code the next time
+> you've update the upcua files.
+>
+>
+I'm sorry, but I cannot give you the sources of the code generator,
+because they are owned by the OPC Foundation.
+I only extended the existing code generator to produce also wireshark code.
+It's .Net based so I guess you don't want to have it anyway ;-)
+~~~
+
+So, if changes must be made to the machine-generated files, it just means the
+upstream source will have to be modified before pushing any updates back to
+Wireshark.
+
+Of course it also means that care must be taken when applying patches from
+upstream to ensure local changes aren't reversed.
diff --git a/plugins/epan/opcua/opcua.c b/plugins/epan/opcua/opcua.c
new file mode 100644
index 00000000..7eec5b69
--- /dev/null
+++ b/plugins/epan/opcua/opcua.c
@@ -0,0 +1,457 @@
+/******************************************************************************
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: OpcUa Protocol Decoder.
+**
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>
+******************************************************************************/
+
+#include "config.h"
+
+#include <epan/packet.h>
+#include <epan/reassemble.h>
+#include <epan/dissectors/packet-tcp.h>
+#include "opcua_transport_layer.h"
+#include "opcua_security_layer.h"
+#include "opcua_application_layer.h"
+#include "opcua_complextypeparser.h"
+#include "opcua_serviceparser.h"
+#include "opcua_enumparser.h"
+#include "opcua_simpletypes.h"
+#include "opcua_hfindeces.h"
+
+void proto_register_opcua(void);
+
+extern const value_string g_requesttypes[];
+extern const int g_NumServices;
+
+/* forward reference */
+void proto_reg_handoff_opcua(void);
+/* declare parse function pointer */
+typedef int (*FctParse)(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+
+int proto_opcua = -1;
+static dissector_handle_t opcua_handle;
+/** Official IANA registered port for OPC UA Binary Protocol. */
+#define OPCUA_PORT_RANGE "4840"
+
+/** subtree types used in opcua_transport_layer.c */
+gint ett_opcua_extensionobject = -1;
+gint ett_opcua_nodeid = -1;
+
+/** subtree types used locally */
+static gint ett_opcua_transport = -1;
+static gint ett_opcua_fragment = -1;
+static gint ett_opcua_fragments = -1;
+
+static int hf_opcua_fragments = -1;
+static int hf_opcua_fragment = -1;
+static int hf_opcua_fragment_overlap = -1;
+static int hf_opcua_fragment_overlap_conflicts = -1;
+static int hf_opcua_fragment_multiple_tails = -1;
+static int hf_opcua_fragment_too_long_fragment = -1;
+static int hf_opcua_fragment_error = -1;
+static int hf_opcua_fragment_count = -1;
+static int hf_opcua_reassembled_in = -1;
+static int hf_opcua_reassembled_length = -1;
+
+static const fragment_items opcua_frag_items = {
+ /* Fragment subtrees */
+ &ett_opcua_fragment,
+ &ett_opcua_fragments,
+ /* Fragment fields */
+ &hf_opcua_fragments,
+ &hf_opcua_fragment,
+ &hf_opcua_fragment_overlap,
+ &hf_opcua_fragment_overlap_conflicts,
+ &hf_opcua_fragment_multiple_tails,
+ &hf_opcua_fragment_too_long_fragment,
+ &hf_opcua_fragment_error,
+ &hf_opcua_fragment_count,
+ /* Reassembled in field */
+ &hf_opcua_reassembled_in,
+ /* Reassembled length field */
+ &hf_opcua_reassembled_length,
+ /* Reassembled data field */
+ NULL,
+ /* Tag */
+ "Message fragments"
+};
+
+
+static reassembly_table opcua_reassembly_table;
+
+/** OpcUa Transport Message Types */
+enum MessageType
+{
+ MSG_HELLO = 0,
+ MSG_ACKNOWLEDGE,
+ MSG_ERROR,
+ MSG_REVERSEHELLO,
+ MSG_MESSAGE,
+ MSG_OPENSECURECHANNEL,
+ MSG_CLOSESECURECHANNEL,
+ MSG_INVALID
+};
+
+/** OpcUa Transport Message Type Names */
+static const char* g_szMessageTypes[] =
+{
+ "Hello message",
+ "Acknowledge message",
+ "Error message",
+ "Reverse Hello message",
+ "UA Secure Conversation Message",
+ "OpenSecureChannel message",
+ "CloseSecureChannel message",
+ "Invalid message"
+};
+
+
+
+
+/** header length that is needed to compute
+ * the pdu length.
+ * @see get_opcua_message_len
+ */
+#define FRAME_HEADER_LEN 8
+
+/** returns the length of an OpcUa message.
+ * This function reads the length information from
+ * the transport header.
+ */
+static guint get_opcua_message_len(packet_info *pinfo _U_, tvbuff_t *tvb,
+ int offset, void *data _U_)
+{
+ gint32 plen;
+
+ /* the message length starts at offset 4 */
+ plen = tvb_get_letohl(tvb, offset + 4);
+
+ return plen;
+}
+
+/** The OpcUa message dissector.
+ * This method dissects full OpcUa messages.
+ * It gets only called with reassembled data
+ * from tcp_dissect_pdus.
+ */
+static int dissect_opcua_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ FctParse pfctParse = NULL;
+ enum MessageType msgtype = MSG_INVALID;
+
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "OpcUa");
+
+ /* parse message type */
+ if (tvb_memeql(tvb, 0, (const guint8 * )"HEL", 3) == 0)
+ {
+ msgtype = MSG_HELLO;
+ pfctParse = parseHello;
+ }
+ else if (tvb_memeql(tvb, 0, (const guint8*)"ACK", 3) == 0)
+ {
+ msgtype = MSG_ACKNOWLEDGE;
+ pfctParse = parseAcknowledge;
+ }
+ else if (tvb_memeql(tvb, 0, (const guint8*)"ERR", 3) == 0)
+ {
+ msgtype = MSG_ERROR;
+ pfctParse = parseError;
+ }
+ else if (tvb_memeql(tvb, 0, (const guint8*)"RHE", 3) == 0)
+ {
+ msgtype = MSG_REVERSEHELLO;
+ pfctParse = parseReverseHello;
+ }
+ else if (tvb_memeql(tvb, 0, (const guint8*)"MSG", 3) == 0)
+ {
+ msgtype = MSG_MESSAGE;
+ pfctParse = parseMessage;
+ }
+ else if (tvb_memeql(tvb, 0, (const guint8*)"OPN", 3) == 0)
+ {
+ msgtype = MSG_OPENSECURECHANNEL;
+ pfctParse = parseOpenSecureChannel;
+ }
+ else if (tvb_memeql(tvb, 0, (const guint8*)"CLO", 3) == 0)
+ {
+ msgtype = MSG_CLOSESECURECHANNEL;
+ pfctParse = parseCloseSecureChannel;
+ }
+ else
+ {
+ msgtype = MSG_INVALID;
+
+ /* Clear out stuff in the info column */
+ col_set_str(pinfo->cinfo, COL_INFO, g_szMessageTypes[msgtype]);
+
+ /* add empty item to make filtering by 'opcua' work */
+ proto_tree_add_item(tree, proto_opcua, tvb, 0, -1, ENC_NA);
+
+ return tvb_reported_length(tvb);
+ }
+
+ /* Clear out stuff in the info column */
+ col_set_str(pinfo->cinfo, COL_INFO, g_szMessageTypes[msgtype]);
+
+ if (pfctParse)
+ {
+ gint offset = 0;
+ int iServiceId = -1;
+ tvbuff_t *next_tvb = tvb;
+ gboolean bParseService = TRUE;
+ gboolean bIsLastFragment = FALSE;
+
+ /* we are being asked for details */
+ proto_item *ti = NULL;
+ proto_tree *transport_tree = NULL;
+
+ ti = proto_tree_add_item(tree, proto_opcua, tvb, 0, -1, ENC_NA);
+ transport_tree = proto_item_add_subtree(ti, ett_opcua_transport);
+
+ /* MSG_MESSAGE might be fragmented, check for that */
+ if (msgtype == MSG_MESSAGE)
+ {
+ guint8 chunkType = 0;
+ guint32 opcua_seqid = 0;
+ guint32 opcua_num = 0;
+ guint32 opcua_seqnum;
+ fragment_head *frag_msg = NULL;
+ fragment_item *frag_i = NULL;
+
+ offset = 3;
+
+ chunkType = tvb_get_guint8(tvb, offset); offset += 1;
+
+ offset += 4; /* Message Size */
+ offset += 4; /* SecureChannelId */
+ offset += 4; /* Security Token Id */
+
+ opcua_num = tvb_get_letohl(tvb, offset); offset += 4; /* Security Sequence Number */
+ opcua_seqid = tvb_get_letohl(tvb, offset); offset += 4; /* Security RequestId */
+
+ if (chunkType == 'A')
+ {
+ fragment_delete(&opcua_reassembly_table, pinfo, opcua_seqid, NULL);
+
+ col_clear_fence(pinfo->cinfo, COL_INFO);
+ col_set_str(pinfo->cinfo, COL_INFO, "Abort message");
+
+ offset = 0;
+ (*pfctParse)(transport_tree, tvb, pinfo, &offset);
+ parseAbort(transport_tree, tvb, pinfo, &offset);
+
+ return tvb_reported_length(tvb);
+ }
+
+ /* check if tvb is part of a chunked message:
+ the UA protocol does not tell us that, so we look into
+ opcua_reassembly_table if the opcua_seqid belongs to a
+ chunked message */
+ frag_msg = fragment_get(&opcua_reassembly_table, pinfo, opcua_seqid, NULL);
+ if (frag_msg == NULL)
+ {
+ frag_msg = fragment_get_reassembled_id(&opcua_reassembly_table, pinfo, opcua_seqid);
+ }
+
+ if (frag_msg != NULL || chunkType != 'F')
+ {
+ gboolean bSaveFragmented = pinfo->fragmented;
+ gboolean bMoreFragments = TRUE;
+ tvbuff_t *new_tvb = NULL;
+
+ pinfo->fragmented = TRUE;
+
+ if (frag_msg == NULL)
+ {
+ /* first fragment */
+ opcua_seqnum = 0;
+ }
+ else
+ {
+ /* the UA protocol does not number the chunks beginning from 0 but from a
+ arbitrary value, so we have to fake the numbers in the stored fragments.
+ this way Wireshark reassembles the message, as it expects the fragment
+ sequence numbers to start at 0 */
+ for (frag_i = frag_msg->next; frag_i; frag_i = frag_i->next) {}
+ if (frag_i) {
+ opcua_seqnum = frag_i->offset + 1;
+ } else {
+ /* We should never have a fragment head with no fragment items, but
+ * just in case.
+ */
+ opcua_seqnum = 0;
+ }
+
+ if (chunkType == 'F')
+ {
+ bMoreFragments = FALSE;
+ }
+ }
+
+ frag_msg = fragment_add_seq_check(&opcua_reassembly_table,
+ tvb,
+ offset,
+ pinfo,
+ opcua_seqid, /* ID for fragments belonging together */
+ NULL,
+ opcua_seqnum, /* fragment sequence number */
+ tvb_captured_length_remaining(tvb, offset), /* fragment length - to the end */
+ bMoreFragments); /* More fragments? */
+
+ new_tvb = process_reassembled_data(tvb,
+ offset,
+ pinfo,
+ "Reassembled Message",
+ frag_msg,
+ &opcua_frag_items,
+ NULL,
+ transport_tree);
+
+ if (new_tvb)
+ {
+ /* Reassembled */
+ bIsLastFragment = TRUE;
+ }
+ else
+ {
+ /* Not last packet of reassembled UA message */
+ col_append_fstr(pinfo->cinfo, COL_INFO, " (Message fragment %u)", opcua_num);
+ }
+
+ if (new_tvb)
+ {
+ /* take it all */
+ next_tvb = new_tvb;
+ }
+ else
+ {
+ /* only show transport header */
+ bParseService = FALSE;
+ next_tvb = tvb_new_subset_remaining(tvb, 0);
+ }
+
+ pinfo->fragmented = bSaveFragmented;
+ }
+ }
+
+ offset = 0;
+
+ /* call the transport message dissector */
+ iServiceId = (*pfctParse)(transport_tree, tvb, pinfo, &offset);
+
+ /* parse the service if not chunked or last chunk */
+ if (msgtype == MSG_MESSAGE && bParseService)
+ {
+ if (bIsLastFragment != FALSE)
+ {
+ offset = 0;
+ }
+ iServiceId = parseService(transport_tree, next_tvb, pinfo, &offset);
+ }
+
+ /* display the service type in addition to the message type */
+ if (iServiceId != -1)
+ {
+ const gchar *szServiceName = val_to_str((guint32)iServiceId, g_requesttypes, "ServiceId %d");
+
+ if (bIsLastFragment == FALSE)
+ {
+ col_add_fstr(pinfo->cinfo, COL_INFO, "%s: %s", g_szMessageTypes[msgtype], szServiceName);
+ }
+ else
+ {
+ col_add_fstr(pinfo->cinfo, COL_INFO, "%s: %s (Message Reassembled)", g_szMessageTypes[msgtype], szServiceName);
+ }
+ }
+ }
+
+ return tvb_reported_length(tvb);
+}
+
+/** The main OpcUa dissector functions.
+ * It uses tcp_dissect_pdus from packet-tcp.h
+ * to reassemble the TCP data.
+ */
+static int dissect_opcua(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+{
+ tcp_dissect_pdus(tvb, pinfo, tree, TRUE, FRAME_HEADER_LEN,
+ get_opcua_message_len, dissect_opcua_message, data);
+ return tvb_reported_length(tvb);
+}
+
+/** plugin entry functions.
+ * This registers the OpcUa protocol.
+ */
+void proto_register_opcua(void)
+{
+ static hf_register_info hf[] =
+ {
+ /* id full name abbreviation type display strings bitmask blurb HFILL */
+ {&hf_opcua_fragments, {"Message fragments", "opcua.fragments", FT_NONE, BASE_NONE, NULL, 0x00, NULL, HFILL}},
+ {&hf_opcua_fragment, {"Message fragment", "opcua.fragment", FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL}},
+ {&hf_opcua_fragment_overlap, {"Message fragment overlap", "opcua.fragment.overlap", FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL}},
+ {&hf_opcua_fragment_overlap_conflicts, {"Message fragment overlapping with conflicting data", "opcua.fragment.overlap.conflicts", FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL}},
+ {&hf_opcua_fragment_multiple_tails, {"Message has multiple tail fragments", "opcua.fragment.multiple_tails", FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL}},
+ {&hf_opcua_fragment_too_long_fragment, {"Message fragment too long", "opcua.fragment.too_long_fragment", FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL}},
+ {&hf_opcua_fragment_error, {"Message defragmentation error", "opcua.fragment.error", FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL}},
+ {&hf_opcua_fragment_count, {"Message fragment count", "opcua.fragment.count", FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL}},
+ {&hf_opcua_reassembled_in, {"Reassembled in", "opcua.reassembled.in", FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL}},
+ {&hf_opcua_reassembled_length, {"Reassembled length", "opcua.reassembled.length", FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL}}
+ };
+
+ /** Setup protocol subtree array */
+ static gint *ett[] =
+ {
+ &ett_opcua_extensionobject,
+ &ett_opcua_nodeid,
+ &ett_opcua_transport,
+ &ett_opcua_fragment,
+ &ett_opcua_fragments
+ };
+
+ proto_opcua = proto_register_protocol("OpcUa Binary Protocol", "OpcUa", "opcua");
+ opcua_handle = register_dissector("opcua", dissect_opcua, proto_opcua);
+
+ registerTransportLayerTypes(proto_opcua);
+ registerSecurityLayerTypes(proto_opcua);
+ registerApplicationLayerTypes(proto_opcua);
+ registerSimpleTypes(proto_opcua);
+ registerEnumTypes(proto_opcua);
+ registerComplexTypes();
+ registerServiceTypes();
+ registerFieldTypes(proto_opcua);
+
+ proto_register_subtree_array(ett, array_length(ett));
+ proto_register_field_array(proto_opcua, hf, array_length(hf));
+
+ reassembly_table_register(&opcua_reassembly_table,
+ &addresses_reassembly_table_functions);
+}
+
+void proto_reg_handoff_opcua(void)
+{
+ dissector_add_uint_range_with_preference("tcp.port", OPCUA_PORT_RANGE, opcua_handle);
+}
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
diff --git a/plugins/epan/opcua/opcua_application_layer.c b/plugins/epan/opcua/opcua_application_layer.c
new file mode 100644
index 00000000..688cd651
--- /dev/null
+++ b/plugins/epan/opcua/opcua_application_layer.c
@@ -0,0 +1,112 @@
+/******************************************************************************
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: OpcUa Application Layer Decoder.
+**
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>
+******************************************************************************/
+
+#include "config.h"
+
+#include <epan/packet.h>
+#include "opcua_application_layer.h"
+
+/** NodeId encoding mask table */
+static const value_string g_nodeidmasks[] = {
+ { 0x00, "Two byte encoded Numeric" },
+ { 0x01, "Four byte encoded Numeric" },
+ { 0x02, "Numeric of arbitrary length" },
+ { 0x03, "String" },
+ { 0x04, "GUID" },
+ { 0x05, "Opaque" },
+ { 0, NULL }
+};
+
+/** Service type table */
+extern const value_string g_requesttypes[];
+
+static int hf_opcua_nodeid_encodingmask = -1;
+static int hf_opcua_app_nsid = -1;
+static int hf_opcua_app_numeric = -1;
+
+/** Register application layer types. */
+void registerApplicationLayerTypes(int proto)
+{
+ /** header field definitions */
+ static hf_register_info hf[] =
+ {
+ /* id full name abbreviation type display strings bitmask blurb HFILL */
+ {&hf_opcua_nodeid_encodingmask, {"NodeId EncodingMask", "opcua.servicenodeid.encodingmask", FT_UINT8, BASE_HEX, VALS(g_nodeidmasks), 0x0, NULL, HFILL}},
+ {&hf_opcua_app_nsid, {"NodeId Namespace Index", "opcua.servicenodeid.nsid", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_app_numeric, {"NodeId Identifier Numeric", "opcua.servicenodeid.numeric", FT_UINT32, BASE_DEC, VALS(g_requesttypes), 0x0, NULL, HFILL}}
+ };
+
+ proto_register_field_array(proto, hf, array_length(hf));
+}
+
+/** Parses an OpcUa Service NodeId and returns the service type.
+ * In this cases the NodeId is always from type numeric and NSId = 0.
+ */
+int parseServiceNodeId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)
+{
+ gint iOffset = *pOffset;
+ guint8 EncodingMask;
+ guint32 Numeric = 0;
+
+ EncodingMask = tvb_get_guint8(tvb, iOffset);
+ proto_tree_add_item(tree, hf_opcua_nodeid_encodingmask, tvb, iOffset, 1, ENC_LITTLE_ENDIAN);
+ iOffset++;
+
+ switch(EncodingMask)
+ {
+ case 0x00: /* two byte node id */
+ Numeric = tvb_get_guint8(tvb, iOffset);
+ proto_tree_add_item(tree, hf_opcua_app_numeric, tvb, iOffset, 1, ENC_LITTLE_ENDIAN);
+ iOffset+=1;
+ break;
+ case 0x01: /* four byte node id */
+ proto_tree_add_item(tree, hf_opcua_app_nsid, tvb, iOffset, 1, ENC_LITTLE_ENDIAN);
+ iOffset+=1;
+ Numeric = tvb_get_letohs(tvb, iOffset);
+ proto_tree_add_item(tree, hf_opcua_app_numeric, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ iOffset+=2;
+ break;
+ case 0x02: /* numeric, that does not fit into four bytes */
+ proto_tree_add_item(tree, hf_opcua_app_nsid, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ iOffset+=2;
+ Numeric = tvb_get_letohl(tvb, iOffset);
+ proto_tree_add_item(tree, hf_opcua_app_numeric, tvb, iOffset, 4, ENC_LITTLE_ENDIAN);
+ iOffset+=4;
+ break;
+ case 0x03: /* string */
+ case 0x04: /* guid */
+ case 0x05: /* opaque*/
+ /* NOT USED */
+ break;
+ };
+
+ *pOffset = iOffset;
+
+ return Numeric;
+}
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
diff --git a/plugins/epan/opcua/opcua_application_layer.h b/plugins/epan/opcua/opcua_application_layer.h
new file mode 100644
index 00000000..c9b043e8
--- /dev/null
+++ b/plugins/epan/opcua/opcua_application_layer.h
@@ -0,0 +1,20 @@
+/******************************************************************************
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: OpcUa Application Layer Decoder.
+**
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>
+******************************************************************************/
+
+void registerApplicationLayerTypes(int proto);
+
+/* Ua type parsers */
+int parseServiceNodeId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
diff --git a/plugins/epan/opcua/opcua_complextypeparser.c b/plugins/epan/opcua/opcua_complextypeparser.c
new file mode 100644
index 00000000..e37dd299
--- /dev/null
+++ b/plugins/epan/opcua/opcua_complextypeparser.c
@@ -0,0 +1,2264 @@
+/******************************************************************************
+** Copyright (C) 2006-2015 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: OpcUa Complex Type Parser
+**
+** This file was autogenerated on 13.10.2015.
+** DON'T MODIFY THIS FILE!
+**
+******************************************************************************/
+
+#include "config.h"
+
+#include <epan/packet.h>
+#include "opcua_complextypeparser.h"
+#include "opcua_enumparser.h"
+#include "opcua_simpletypes.h"
+#include "opcua_hfindeces.h"
+
+gint ett_opcua_TrustListDataType = -1;
+gint ett_opcua_array_TrustListDataType = -1;
+gint ett_opcua_Node = -1;
+gint ett_opcua_array_Node = -1;
+gint ett_opcua_InstanceNode = -1;
+gint ett_opcua_array_InstanceNode = -1;
+gint ett_opcua_TypeNode = -1;
+gint ett_opcua_array_TypeNode = -1;
+gint ett_opcua_ObjectNode = -1;
+gint ett_opcua_array_ObjectNode = -1;
+gint ett_opcua_ObjectTypeNode = -1;
+gint ett_opcua_array_ObjectTypeNode = -1;
+gint ett_opcua_VariableNode = -1;
+gint ett_opcua_array_VariableNode = -1;
+gint ett_opcua_VariableTypeNode = -1;
+gint ett_opcua_array_VariableTypeNode = -1;
+gint ett_opcua_ReferenceTypeNode = -1;
+gint ett_opcua_array_ReferenceTypeNode = -1;
+gint ett_opcua_MethodNode = -1;
+gint ett_opcua_array_MethodNode = -1;
+gint ett_opcua_ViewNode = -1;
+gint ett_opcua_array_ViewNode = -1;
+gint ett_opcua_DataTypeNode = -1;
+gint ett_opcua_array_DataTypeNode = -1;
+gint ett_opcua_ReferenceNode = -1;
+gint ett_opcua_array_ReferenceNode = -1;
+gint ett_opcua_Argument = -1;
+gint ett_opcua_array_Argument = -1;
+gint ett_opcua_EnumValueType = -1;
+gint ett_opcua_array_EnumValueType = -1;
+gint ett_opcua_OptionSet = -1;
+gint ett_opcua_array_OptionSet = -1;
+gint ett_opcua_TimeZoneDataType = -1;
+gint ett_opcua_array_TimeZoneDataType = -1;
+gint ett_opcua_ApplicationDescription = -1;
+gint ett_opcua_array_ApplicationDescription = -1;
+gint ett_opcua_RequestHeader = -1;
+gint ett_opcua_array_RequestHeader = -1;
+gint ett_opcua_ResponseHeader = -1;
+gint ett_opcua_array_ResponseHeader = -1;
+gint ett_opcua_ServerOnNetwork = -1;
+gint ett_opcua_array_ServerOnNetwork = -1;
+gint ett_opcua_UserTokenPolicy = -1;
+gint ett_opcua_array_UserTokenPolicy = -1;
+gint ett_opcua_EndpointDescription = -1;
+gint ett_opcua_array_EndpointDescription = -1;
+gint ett_opcua_RegisteredServer = -1;
+gint ett_opcua_array_RegisteredServer = -1;
+gint ett_opcua_MdnsDiscoveryConfiguration = -1;
+gint ett_opcua_array_MdnsDiscoveryConfiguration = -1;
+gint ett_opcua_ChannelSecurityToken = -1;
+gint ett_opcua_array_ChannelSecurityToken = -1;
+gint ett_opcua_SignedSoftwareCertificate = -1;
+gint ett_opcua_array_SignedSoftwareCertificate = -1;
+gint ett_opcua_SignatureData = -1;
+gint ett_opcua_array_SignatureData = -1;
+gint ett_opcua_UserIdentityToken = -1;
+gint ett_opcua_array_UserIdentityToken = -1;
+gint ett_opcua_AnonymousIdentityToken = -1;
+gint ett_opcua_array_AnonymousIdentityToken = -1;
+gint ett_opcua_UserNameIdentityToken = -1;
+gint ett_opcua_array_UserNameIdentityToken = -1;
+gint ett_opcua_X509IdentityToken = -1;
+gint ett_opcua_array_X509IdentityToken = -1;
+gint ett_opcua_KerberosIdentityToken = -1;
+gint ett_opcua_array_KerberosIdentityToken = -1;
+gint ett_opcua_IssuedIdentityToken = -1;
+gint ett_opcua_array_IssuedIdentityToken = -1;
+gint ett_opcua_NodeAttributes = -1;
+gint ett_opcua_array_NodeAttributes = -1;
+gint ett_opcua_ObjectAttributes = -1;
+gint ett_opcua_array_ObjectAttributes = -1;
+gint ett_opcua_VariableAttributes = -1;
+gint ett_opcua_array_VariableAttributes = -1;
+gint ett_opcua_MethodAttributes = -1;
+gint ett_opcua_array_MethodAttributes = -1;
+gint ett_opcua_ObjectTypeAttributes = -1;
+gint ett_opcua_array_ObjectTypeAttributes = -1;
+gint ett_opcua_VariableTypeAttributes = -1;
+gint ett_opcua_array_VariableTypeAttributes = -1;
+gint ett_opcua_ReferenceTypeAttributes = -1;
+gint ett_opcua_array_ReferenceTypeAttributes = -1;
+gint ett_opcua_DataTypeAttributes = -1;
+gint ett_opcua_array_DataTypeAttributes = -1;
+gint ett_opcua_ViewAttributes = -1;
+gint ett_opcua_array_ViewAttributes = -1;
+gint ett_opcua_AddNodesItem = -1;
+gint ett_opcua_array_AddNodesItem = -1;
+gint ett_opcua_AddNodesResult = -1;
+gint ett_opcua_array_AddNodesResult = -1;
+gint ett_opcua_AddReferencesItem = -1;
+gint ett_opcua_array_AddReferencesItem = -1;
+gint ett_opcua_DeleteNodesItem = -1;
+gint ett_opcua_array_DeleteNodesItem = -1;
+gint ett_opcua_DeleteReferencesItem = -1;
+gint ett_opcua_array_DeleteReferencesItem = -1;
+gint ett_opcua_ViewDescription = -1;
+gint ett_opcua_array_ViewDescription = -1;
+gint ett_opcua_BrowseDescription = -1;
+gint ett_opcua_array_BrowseDescription = -1;
+gint ett_opcua_ReferenceDescription = -1;
+gint ett_opcua_array_ReferenceDescription = -1;
+gint ett_opcua_BrowseResult = -1;
+gint ett_opcua_array_BrowseResult = -1;
+gint ett_opcua_RelativePathElement = -1;
+gint ett_opcua_array_RelativePathElement = -1;
+gint ett_opcua_RelativePath = -1;
+gint ett_opcua_array_RelativePath = -1;
+gint ett_opcua_BrowsePath = -1;
+gint ett_opcua_array_BrowsePath = -1;
+gint ett_opcua_BrowsePathTarget = -1;
+gint ett_opcua_array_BrowsePathTarget = -1;
+gint ett_opcua_BrowsePathResult = -1;
+gint ett_opcua_array_BrowsePathResult = -1;
+gint ett_opcua_EndpointConfiguration = -1;
+gint ett_opcua_array_EndpointConfiguration = -1;
+gint ett_opcua_SupportedProfile = -1;
+gint ett_opcua_array_SupportedProfile = -1;
+gint ett_opcua_SoftwareCertificate = -1;
+gint ett_opcua_array_SoftwareCertificate = -1;
+gint ett_opcua_QueryDataDescription = -1;
+gint ett_opcua_array_QueryDataDescription = -1;
+gint ett_opcua_NodeTypeDescription = -1;
+gint ett_opcua_array_NodeTypeDescription = -1;
+gint ett_opcua_QueryDataSet = -1;
+gint ett_opcua_array_QueryDataSet = -1;
+gint ett_opcua_NodeReference = -1;
+gint ett_opcua_array_NodeReference = -1;
+gint ett_opcua_ContentFilterElement = -1;
+gint ett_opcua_array_ContentFilterElement = -1;
+gint ett_opcua_ContentFilter = -1;
+gint ett_opcua_array_ContentFilter = -1;
+gint ett_opcua_ElementOperand = -1;
+gint ett_opcua_array_ElementOperand = -1;
+gint ett_opcua_LiteralOperand = -1;
+gint ett_opcua_array_LiteralOperand = -1;
+gint ett_opcua_AttributeOperand = -1;
+gint ett_opcua_array_AttributeOperand = -1;
+gint ett_opcua_SimpleAttributeOperand = -1;
+gint ett_opcua_array_SimpleAttributeOperand = -1;
+gint ett_opcua_ContentFilterElementResult = -1;
+gint ett_opcua_array_ContentFilterElementResult = -1;
+gint ett_opcua_ContentFilterResult = -1;
+gint ett_opcua_array_ContentFilterResult = -1;
+gint ett_opcua_ParsingResult = -1;
+gint ett_opcua_array_ParsingResult = -1;
+gint ett_opcua_ReadValueId = -1;
+gint ett_opcua_array_ReadValueId = -1;
+gint ett_opcua_HistoryReadValueId = -1;
+gint ett_opcua_array_HistoryReadValueId = -1;
+gint ett_opcua_HistoryReadResult = -1;
+gint ett_opcua_array_HistoryReadResult = -1;
+gint ett_opcua_ReadEventDetails = -1;
+gint ett_opcua_array_ReadEventDetails = -1;
+gint ett_opcua_ReadRawModifiedDetails = -1;
+gint ett_opcua_array_ReadRawModifiedDetails = -1;
+gint ett_opcua_ReadProcessedDetails = -1;
+gint ett_opcua_array_ReadProcessedDetails = -1;
+gint ett_opcua_ReadAtTimeDetails = -1;
+gint ett_opcua_array_ReadAtTimeDetails = -1;
+gint ett_opcua_HistoryData = -1;
+gint ett_opcua_array_HistoryData = -1;
+gint ett_opcua_ModificationInfo = -1;
+gint ett_opcua_array_ModificationInfo = -1;
+gint ett_opcua_HistoryModifiedData = -1;
+gint ett_opcua_array_HistoryModifiedData = -1;
+gint ett_opcua_HistoryEvent = -1;
+gint ett_opcua_array_HistoryEvent = -1;
+gint ett_opcua_WriteValue = -1;
+gint ett_opcua_array_WriteValue = -1;
+gint ett_opcua_HistoryUpdateDetails = -1;
+gint ett_opcua_array_HistoryUpdateDetails = -1;
+gint ett_opcua_UpdateDataDetails = -1;
+gint ett_opcua_array_UpdateDataDetails = -1;
+gint ett_opcua_UpdateStructureDataDetails = -1;
+gint ett_opcua_array_UpdateStructureDataDetails = -1;
+gint ett_opcua_UpdateEventDetails = -1;
+gint ett_opcua_array_UpdateEventDetails = -1;
+gint ett_opcua_DeleteRawModifiedDetails = -1;
+gint ett_opcua_array_DeleteRawModifiedDetails = -1;
+gint ett_opcua_DeleteAtTimeDetails = -1;
+gint ett_opcua_array_DeleteAtTimeDetails = -1;
+gint ett_opcua_DeleteEventDetails = -1;
+gint ett_opcua_array_DeleteEventDetails = -1;
+gint ett_opcua_HistoryUpdateResult = -1;
+gint ett_opcua_array_HistoryUpdateResult = -1;
+gint ett_opcua_CallMethodRequest = -1;
+gint ett_opcua_array_CallMethodRequest = -1;
+gint ett_opcua_CallMethodResult = -1;
+gint ett_opcua_array_CallMethodResult = -1;
+gint ett_opcua_DataChangeFilter = -1;
+gint ett_opcua_array_DataChangeFilter = -1;
+gint ett_opcua_EventFilter = -1;
+gint ett_opcua_array_EventFilter = -1;
+gint ett_opcua_AggregateConfiguration = -1;
+gint ett_opcua_array_AggregateConfiguration = -1;
+gint ett_opcua_AggregateFilter = -1;
+gint ett_opcua_array_AggregateFilter = -1;
+gint ett_opcua_EventFilterResult = -1;
+gint ett_opcua_array_EventFilterResult = -1;
+gint ett_opcua_AggregateFilterResult = -1;
+gint ett_opcua_array_AggregateFilterResult = -1;
+gint ett_opcua_MonitoringParameters = -1;
+gint ett_opcua_array_MonitoringParameters = -1;
+gint ett_opcua_MonitoredItemCreateRequest = -1;
+gint ett_opcua_array_MonitoredItemCreateRequest = -1;
+gint ett_opcua_MonitoredItemCreateResult = -1;
+gint ett_opcua_array_MonitoredItemCreateResult = -1;
+gint ett_opcua_MonitoredItemModifyRequest = -1;
+gint ett_opcua_array_MonitoredItemModifyRequest = -1;
+gint ett_opcua_MonitoredItemModifyResult = -1;
+gint ett_opcua_array_MonitoredItemModifyResult = -1;
+gint ett_opcua_NotificationMessage = -1;
+gint ett_opcua_array_NotificationMessage = -1;
+gint ett_opcua_DataChangeNotification = -1;
+gint ett_opcua_array_DataChangeNotification = -1;
+gint ett_opcua_MonitoredItemNotification = -1;
+gint ett_opcua_array_MonitoredItemNotification = -1;
+gint ett_opcua_EventNotificationList = -1;
+gint ett_opcua_array_EventNotificationList = -1;
+gint ett_opcua_EventFieldList = -1;
+gint ett_opcua_array_EventFieldList = -1;
+gint ett_opcua_HistoryEventFieldList = -1;
+gint ett_opcua_array_HistoryEventFieldList = -1;
+gint ett_opcua_StatusChangeNotification = -1;
+gint ett_opcua_array_StatusChangeNotification = -1;
+gint ett_opcua_SubscriptionAcknowledgement = -1;
+gint ett_opcua_array_SubscriptionAcknowledgement = -1;
+gint ett_opcua_TransferResult = -1;
+gint ett_opcua_array_TransferResult = -1;
+gint ett_opcua_ScalarTestType = -1;
+gint ett_opcua_array_ScalarTestType = -1;
+gint ett_opcua_ArrayTestType = -1;
+gint ett_opcua_array_ArrayTestType = -1;
+gint ett_opcua_CompositeTestType = -1;
+gint ett_opcua_array_CompositeTestType = -1;
+gint ett_opcua_BuildInfo = -1;
+gint ett_opcua_array_BuildInfo = -1;
+gint ett_opcua_RedundantServerDataType = -1;
+gint ett_opcua_array_RedundantServerDataType = -1;
+gint ett_opcua_EndpointUrlListDataType = -1;
+gint ett_opcua_array_EndpointUrlListDataType = -1;
+gint ett_opcua_NetworkGroupDataType = -1;
+gint ett_opcua_array_NetworkGroupDataType = -1;
+gint ett_opcua_SamplingIntervalDiagnosticsDataType = -1;
+gint ett_opcua_array_SamplingIntervalDiagnosticsDataType = -1;
+gint ett_opcua_ServerDiagnosticsSummaryDataType = -1;
+gint ett_opcua_array_ServerDiagnosticsSummaryDataType = -1;
+gint ett_opcua_ServerStatusDataType = -1;
+gint ett_opcua_array_ServerStatusDataType = -1;
+gint ett_opcua_SessionDiagnosticsDataType = -1;
+gint ett_opcua_array_SessionDiagnosticsDataType = -1;
+gint ett_opcua_SessionSecurityDiagnosticsDataType = -1;
+gint ett_opcua_array_SessionSecurityDiagnosticsDataType = -1;
+gint ett_opcua_ServiceCounterDataType = -1;
+gint ett_opcua_array_ServiceCounterDataType = -1;
+gint ett_opcua_StatusResult = -1;
+gint ett_opcua_array_StatusResult = -1;
+gint ett_opcua_SubscriptionDiagnosticsDataType = -1;
+gint ett_opcua_array_SubscriptionDiagnosticsDataType = -1;
+gint ett_opcua_ModelChangeStructureDataType = -1;
+gint ett_opcua_array_ModelChangeStructureDataType = -1;
+gint ett_opcua_SemanticChangeStructureDataType = -1;
+gint ett_opcua_array_SemanticChangeStructureDataType = -1;
+gint ett_opcua_Range = -1;
+gint ett_opcua_array_Range = -1;
+gint ett_opcua_EUInformation = -1;
+gint ett_opcua_array_EUInformation = -1;
+gint ett_opcua_ComplexNumberType = -1;
+gint ett_opcua_array_ComplexNumberType = -1;
+gint ett_opcua_DoubleComplexNumberType = -1;
+gint ett_opcua_array_DoubleComplexNumberType = -1;
+gint ett_opcua_AxisInformation = -1;
+gint ett_opcua_array_AxisInformation = -1;
+gint ett_opcua_XVType = -1;
+gint ett_opcua_array_XVType = -1;
+gint ett_opcua_ProgramDiagnosticDataType = -1;
+gint ett_opcua_array_ProgramDiagnosticDataType = -1;
+gint ett_opcua_Annotation = -1;
+gint ett_opcua_array_Annotation = -1;
+
+void parseTrustListDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_TrustListDataType, &ti, "%s: TrustListDataType", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedLists);
+ /* Array length field ignored: NoOfTrustedCertificates */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "TrustedCertificates", "ByteString", hf_opcua_TrustedCertificates, parseByteString, ett_opcua_array_ByteString);
+ /* Array length field ignored: NoOfTrustedCrls */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "TrustedCrls", "ByteString", hf_opcua_TrustedCrls, parseByteString, ett_opcua_array_ByteString);
+ /* Array length field ignored: NoOfIssuerCertificates */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "IssuerCertificates", "ByteString", hf_opcua_IssuerCertificates, parseByteString, ett_opcua_array_ByteString);
+ /* Array length field ignored: NoOfIssuerCrls */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "IssuerCrls", "ByteString", hf_opcua_IssuerCrls, parseByteString, ett_opcua_array_ByteString);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_Node, &ti, "%s: Node", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseNodeClass(subtree, tvb, pinfo, pOffset);
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ /* Array length field ignored: NoOfReferences */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseInstanceNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_InstanceNode, &ti, "%s: InstanceNode", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseNodeClass(subtree, tvb, pinfo, pOffset);
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ /* Array length field ignored: NoOfReferences */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseTypeNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_TypeNode, &ti, "%s: TypeNode", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseNodeClass(subtree, tvb, pinfo, pOffset);
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ /* Array length field ignored: NoOfReferences */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseObjectNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ObjectNode, &ti, "%s: ObjectNode", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseNodeClass(subtree, tvb, pinfo, pOffset);
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ /* Array length field ignored: NoOfReferences */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_EventNotifier);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseObjectTypeNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ObjectTypeNode, &ti, "%s: ObjectTypeNode", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseNodeClass(subtree, tvb, pinfo, pOffset);
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ /* Array length field ignored: NoOfReferences */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsAbstract);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseVariableNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_VariableNode, &ti, "%s: VariableNode", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseNodeClass(subtree, tvb, pinfo, pOffset);
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ /* Array length field ignored: NoOfReferences */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
+ parseVariant(subtree, tvb, pinfo, pOffset, "Value");
+ parseNodeId(subtree, tvb, pinfo, pOffset, "DataType");
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ValueRank);
+ /* Array length field ignored: NoOfArrayDimensions */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "ArrayDimensions", "UInt32", hf_opcua_ArrayDimensions, parseUInt32, ett_opcua_array_UInt32);
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_AccessLevel);
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_UserAccessLevel);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_MinimumSamplingInterval);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_Historizing);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseVariableTypeNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_VariableTypeNode, &ti, "%s: VariableTypeNode", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseNodeClass(subtree, tvb, pinfo, pOffset);
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ /* Array length field ignored: NoOfReferences */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
+ parseVariant(subtree, tvb, pinfo, pOffset, "Value");
+ parseNodeId(subtree, tvb, pinfo, pOffset, "DataType");
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ValueRank);
+ /* Array length field ignored: NoOfArrayDimensions */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "ArrayDimensions", "UInt32", hf_opcua_ArrayDimensions, parseUInt32, ett_opcua_array_UInt32);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsAbstract);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseReferenceTypeNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReferenceTypeNode, &ti, "%s: ReferenceTypeNode", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseNodeClass(subtree, tvb, pinfo, pOffset);
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ /* Array length field ignored: NoOfReferences */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsAbstract);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_Symmetric);
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "InverseName");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseMethodNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MethodNode, &ti, "%s: MethodNode", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseNodeClass(subtree, tvb, pinfo, pOffset);
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ /* Array length field ignored: NoOfReferences */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_Executable);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_UserExecutable);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseViewNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ViewNode, &ti, "%s: ViewNode", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseNodeClass(subtree, tvb, pinfo, pOffset);
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ /* Array length field ignored: NoOfReferences */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_ContainsNoLoops);
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_EventNotifier);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDataTypeNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DataTypeNode, &ti, "%s: DataTypeNode", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseNodeClass(subtree, tvb, pinfo, pOffset);
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ /* Array length field ignored: NoOfReferences */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceNode", parseReferenceNode, ett_opcua_array_ReferenceNode);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsAbstract);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseReferenceNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReferenceNode, &ti, "%s: ReferenceNode", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "ReferenceTypeId");
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsInverse);
+ parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "TargetId");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseArgument(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_Argument, &ti, "%s: Argument", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_Name);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "DataType");
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ValueRank);
+ /* Array length field ignored: NoOfArrayDimensions */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "ArrayDimensions", "UInt32", hf_opcua_ArrayDimensions, parseUInt32, ett_opcua_array_UInt32);
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseEnumValueType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EnumValueType, &ti, "%s: EnumValueType", szFieldName);
+ parseInt64(subtree, tvb, pinfo, pOffset, hf_opcua_Value);
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseOptionSet(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_OptionSet, &ti, "%s: OptionSet", szFieldName);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_Value);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ValidBits);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseTimeZoneDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_TimeZoneDataType, &ti, "%s: TimeZoneDataType", szFieldName);
+ parseInt16(subtree, tvb, pinfo, pOffset, hf_opcua_Offset);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_DaylightSavingInOffset);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseApplicationDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ApplicationDescription, &ti, "%s: ApplicationDescription", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ApplicationUri);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ProductUri);
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "ApplicationName");
+ parseApplicationType(subtree, tvb, pinfo, pOffset);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_GatewayServerUri);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_DiscoveryProfileUri);
+ /* Array length field ignored: NoOfDiscoveryUrls */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "DiscoveryUrls", "String", hf_opcua_DiscoveryUrls, parseString, ett_opcua_array_String);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseRequestHeader(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ static int * const returnDiagnostics_mask[] = {
+ &hf_opcua_returnDiag_mask_sl_symbolicId,
+ &hf_opcua_returnDiag_mask_sl_localizedText,
+ &hf_opcua_returnDiag_mask_sl_additionalinfo,
+ &hf_opcua_returnDiag_mask_sl_innerstatuscode,
+ &hf_opcua_returnDiag_mask_sl_innerdiagnostics,
+ &hf_opcua_returnDiag_mask_ol_symbolicId,
+ &hf_opcua_returnDiag_mask_ol_localizedText,
+ &hf_opcua_returnDiag_mask_ol_additionalinfo,
+ &hf_opcua_returnDiag_mask_ol_innerstatuscode,
+ &hf_opcua_returnDiag_mask_ol_innerdiagnostics,
+ NULL};
+
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_RequestHeader, &ti, "%s: RequestHeader", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "AuthenticationToken");
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_Timestamp);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RequestHandle);
+ proto_tree_add_bitmask(subtree, tvb, *pOffset, hf_opcua_returnDiag, ett_opcua_returnDiagnostics, returnDiagnostics_mask, ENC_LITTLE_ENDIAN); *pOffset += 4;
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_AuditEntryId);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_TimeoutHint);
+ parseExtensionObject(subtree, tvb, pinfo, pOffset, "AdditionalHeader");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseResponseHeader(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ResponseHeader, &ti, "%s: ResponseHeader", szFieldName);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_Timestamp);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RequestHandle);
+ parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_ServiceResult);
+ parseDiagnosticInfo(subtree, tvb, pinfo, pOffset, "ServiceDiagnostics");
+ /* Array length field ignored: NoOfStringTable */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "StringTable", "String", hf_opcua_StringTable, parseString, ett_opcua_array_String);
+ parseExtensionObject(subtree, tvb, pinfo, pOffset, "AdditionalHeader");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseServerOnNetwork(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ServerOnNetwork, &ti, "%s: ServerOnNetwork", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RecordId);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_DiscoveryUrl);
+ /* Array length field ignored: NoOfServerCapabilities */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "ServerCapabilities", "String", hf_opcua_ServerCapabilities, parseString, ett_opcua_array_String);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseUserTokenPolicy(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_UserTokenPolicy, &ti, "%s: UserTokenPolicy", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_PolicyId);
+ parseUserTokenType(subtree, tvb, pinfo, pOffset);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IssuedTokenType);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IssuerEndpointUrl);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_SecurityPolicyUri);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseEndpointDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EndpointDescription, &ti, "%s: EndpointDescription", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_EndpointUrl);
+ parseApplicationDescription(subtree, tvb, pinfo, pOffset, "Server");
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerCertificate);
+ parseMessageSecurityMode(subtree, tvb, pinfo, pOffset);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_SecurityPolicyUri);
+ /* Array length field ignored: NoOfUserIdentityTokens */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "UserIdentityTokens", "UserTokenPolicy", parseUserTokenPolicy, ett_opcua_array_UserTokenPolicy);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_TransportProfileUri);
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_SecurityLevel);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseRegisteredServer(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_RegisteredServer, &ti, "%s: RegisteredServer", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerUri);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ProductUri);
+ /* Array length field ignored: NoOfServerNames */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "ServerNames", "LocalizedText", parseLocalizedText, ett_opcua_array_LocalizedText);
+ parseApplicationType(subtree, tvb, pinfo, pOffset);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_GatewayServerUri);
+ /* Array length field ignored: NoOfDiscoveryUrls */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "DiscoveryUrls", "String", hf_opcua_DiscoveryUrls, parseString, ett_opcua_array_String);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_SemaphoreFilePath);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsOnline);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseMdnsDiscoveryConfiguration(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MdnsDiscoveryConfiguration, &ti, "%s: MdnsDiscoveryConfiguration", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_MdnsServerName);
+ /* Array length field ignored: NoOfServerCapabilities */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "ServerCapabilities", "String", hf_opcua_ServerCapabilities, parseString, ett_opcua_array_String);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseChannelSecurityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ChannelSecurityToken, &ti, "%s: ChannelSecurityToken", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ChannelId);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_TokenId);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_CreatedAt);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedLifetime);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSignedSoftwareCertificate(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SignedSoftwareCertificate, &ti, "%s: SignedSoftwareCertificate", szFieldName);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_CertificateData);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_Signature);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSignatureData(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SignatureData, &ti, "%s: SignatureData", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_Algorithm);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_Signature);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseUserIdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_UserIdentityToken, &ti, "%s: UserIdentityToken", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_PolicyId);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseAnonymousIdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AnonymousIdentityToken, &ti, "%s: AnonymousIdentityToken", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_PolicyId);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseUserNameIdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_UserNameIdentityToken, &ti, "%s: UserNameIdentityToken", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_PolicyId);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_UserName);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_Password);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_EncryptionAlgorithm);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseX509IdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_X509IdentityToken, &ti, "%s: X509IdentityToken", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_PolicyId);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_CertificateData);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseKerberosIdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_KerberosIdentityToken, &ti, "%s: KerberosIdentityToken", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_PolicyId);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_TicketData);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseIssuedIdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_IssuedIdentityToken, &ti, "%s: IssuedIdentityToken", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_PolicyId);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_TokenData);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_EncryptionAlgorithm);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseNodeAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_NodeAttributes, &ti, "%s: NodeAttributes", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseObjectAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ObjectAttributes, &ti, "%s: ObjectAttributes", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_EventNotifier);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseVariableAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_VariableAttributes, &ti, "%s: VariableAttributes", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ parseVariant(subtree, tvb, pinfo, pOffset, "Value");
+ parseNodeId(subtree, tvb, pinfo, pOffset, "DataType");
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ValueRank);
+ /* Array length field ignored: NoOfArrayDimensions */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "ArrayDimensions", "UInt32", hf_opcua_ArrayDimensions, parseUInt32, ett_opcua_array_UInt32);
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_AccessLevel);
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_UserAccessLevel);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_MinimumSamplingInterval);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_Historizing);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseMethodAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MethodAttributes, &ti, "%s: MethodAttributes", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_Executable);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_UserExecutable);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseObjectTypeAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ObjectTypeAttributes, &ti, "%s: ObjectTypeAttributes", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsAbstract);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseVariableTypeAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_VariableTypeAttributes, &ti, "%s: VariableTypeAttributes", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ parseVariant(subtree, tvb, pinfo, pOffset, "Value");
+ parseNodeId(subtree, tvb, pinfo, pOffset, "DataType");
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ValueRank);
+ /* Array length field ignored: NoOfArrayDimensions */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "ArrayDimensions", "UInt32", hf_opcua_ArrayDimensions, parseUInt32, ett_opcua_array_UInt32);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsAbstract);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseReferenceTypeAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReferenceTypeAttributes, &ti, "%s: ReferenceTypeAttributes", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsAbstract);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_Symmetric);
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "InverseName");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDataTypeAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DataTypeAttributes, &ti, "%s: DataTypeAttributes", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsAbstract);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseViewAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ViewAttributes, &ti, "%s: ViewAttributes", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SpecifiedAttributes);
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_WriteMask);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UserWriteMask);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_ContainsNoLoops);
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_EventNotifier);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseAddNodesItem(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AddNodesItem, &ti, "%s: AddNodesItem", szFieldName);
+ parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "ParentNodeId");
+ parseNodeId(subtree, tvb, pinfo, pOffset, "ReferenceTypeId");
+ parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "RequestedNewNodeId");
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
+ parseNodeClass(subtree, tvb, pinfo, pOffset);
+ parseExtensionObject(subtree, tvb, pinfo, pOffset, "NodeAttributes");
+ parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "TypeDefinition");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseAddNodesResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AddNodesResult, &ti, "%s: AddNodesResult", szFieldName);
+ parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "AddedNodeId");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseAddReferencesItem(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AddReferencesItem, &ti, "%s: AddReferencesItem", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "SourceNodeId");
+ parseNodeId(subtree, tvb, pinfo, pOffset, "ReferenceTypeId");
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsForward);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_TargetServerUri);
+ parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "TargetNodeId");
+ parseNodeClass(subtree, tvb, pinfo, pOffset);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDeleteNodesItem(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DeleteNodesItem, &ti, "%s: DeleteNodesItem", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_DeleteTargetReferences);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDeleteReferencesItem(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DeleteReferencesItem, &ti, "%s: DeleteReferencesItem", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "SourceNodeId");
+ parseNodeId(subtree, tvb, pinfo, pOffset, "ReferenceTypeId");
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsForward);
+ parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "TargetNodeId");
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_DeleteBidirectional);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseViewDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ViewDescription, &ti, "%s: ViewDescription", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "ViewId");
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_Timestamp);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ViewVersion);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseBrowseDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_BrowseDescription, &ti, "%s: BrowseDescription", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseBrowseDirection(subtree, tvb, pinfo, pOffset);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "ReferenceTypeId");
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IncludeSubtypes);
+ parseNodeClassMask(subtree, tvb, pinfo, pOffset);
+ parseResultMask(subtree, tvb, pinfo, pOffset);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseReferenceDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReferenceDescription, &ti, "%s: ReferenceDescription", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "ReferenceTypeId");
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsForward);
+ parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "BrowseName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseNodeClass(subtree, tvb, pinfo, pOffset);
+ parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "TypeDefinition");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseBrowseResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_BrowseResult, &ti, "%s: BrowseResult", szFieldName);
+ parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ContinuationPoint);
+ /* Array length field ignored: NoOfReferences */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "References", "ReferenceDescription", parseReferenceDescription, ett_opcua_array_ReferenceDescription);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseRelativePathElement(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_RelativePathElement, &ti, "%s: RelativePathElement", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "ReferenceTypeId");
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsInverse);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IncludeSubtypes);
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "TargetName");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseRelativePath(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_RelativePath, &ti, "%s: RelativePath", szFieldName);
+ /* Array length field ignored: NoOfElements */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Elements", "RelativePathElement", parseRelativePathElement, ett_opcua_array_RelativePathElement);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseBrowsePath(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_BrowsePath, &ti, "%s: BrowsePath", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "StartingNode");
+ parseRelativePath(subtree, tvb, pinfo, pOffset, "RelativePath");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseBrowsePathTarget(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_BrowsePathTarget, &ti, "%s: BrowsePathTarget", szFieldName);
+ parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "TargetId");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RemainingPathIndex);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseBrowsePathResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_BrowsePathResult, &ti, "%s: BrowsePathResult", szFieldName);
+ parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
+ /* Array length field ignored: NoOfTargets */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Targets", "BrowsePathTarget", parseBrowsePathTarget, ett_opcua_array_BrowsePathTarget);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseEndpointConfiguration(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EndpointConfiguration, &ti, "%s: EndpointConfiguration", szFieldName);
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_OperationTimeout);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_UseBinaryEncoding);
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxStringLength);
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxByteStringLength);
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxArrayLength);
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxMessageSize);
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxBufferSize);
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ChannelLifetime);
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SecurityTokenLifetime);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSupportedProfile(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SupportedProfile, &ti, "%s: SupportedProfile", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_OrganizationUri);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ProfileId);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ComplianceTool);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_ComplianceDate);
+ parseComplianceLevel(subtree, tvb, pinfo, pOffset);
+ /* Array length field ignored: NoOfUnsupportedUnitIds */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "UnsupportedUnitIds", "String", hf_opcua_UnsupportedUnitIds, parseString, ett_opcua_array_String);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSoftwareCertificate(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SoftwareCertificate, &ti, "%s: SoftwareCertificate", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ProductName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ProductUri);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_VendorName);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_VendorProductCertificate);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_SoftwareVersion);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_BuildNumber);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_BuildDate);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IssuedBy);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_IssueDate);
+ /* Array length field ignored: NoOfSupportedProfiles */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "SupportedProfiles", "SupportedProfile", parseSupportedProfile, ett_opcua_array_SupportedProfile);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseQueryDataDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_QueryDataDescription, &ti, "%s: QueryDataDescription", szFieldName);
+ parseRelativePath(subtree, tvb, pinfo, pOffset, "RelativePath");
+ parseAttributeId(subtree, tvb, pinfo, pOffset);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IndexRange);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseNodeTypeDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_NodeTypeDescription, &ti, "%s: NodeTypeDescription", szFieldName);
+ parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "TypeDefinitionNode");
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IncludeSubTypes);
+ /* Array length field ignored: NoOfDataToReturn */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DataToReturn", "QueryDataDescription", parseQueryDataDescription, ett_opcua_array_QueryDataDescription);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseQueryDataSet(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_QueryDataSet, &ti, "%s: QueryDataSet", szFieldName);
+ parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "TypeDefinitionNode");
+ /* Array length field ignored: NoOfValues */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Values", "Variant", parseVariant, ett_opcua_array_Variant);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseNodeReference(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_NodeReference, &ti, "%s: NodeReference", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseNodeId(subtree, tvb, pinfo, pOffset, "ReferenceTypeId");
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsForward);
+ /* Array length field ignored: NoOfReferencedNodeIds */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "ReferencedNodeIds", "NodeId", parseNodeId, ett_opcua_array_NodeId);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseContentFilterElement(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ContentFilterElement, &ti, "%s: ContentFilterElement", szFieldName);
+ parseFilterOperator(subtree, tvb, pinfo, pOffset);
+ /* Array length field ignored: NoOfFilterOperands */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "FilterOperands", "ExtensionObject", parseExtensionObject, ett_opcua_array_ExtensionObject);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseContentFilter(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ContentFilter, &ti, "%s: ContentFilter", szFieldName);
+ /* Array length field ignored: NoOfElements */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Elements", "ContentFilterElement", parseContentFilterElement, ett_opcua_array_ContentFilterElement);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseElementOperand(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ElementOperand, &ti, "%s: ElementOperand", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_Index);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseLiteralOperand(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_LiteralOperand, &ti, "%s: LiteralOperand", szFieldName);
+ parseVariant(subtree, tvb, pinfo, pOffset, "Value");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseAttributeOperand(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AttributeOperand, &ti, "%s: AttributeOperand", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_Alias);
+ parseRelativePath(subtree, tvb, pinfo, pOffset, "BrowsePath");
+ parseAttributeId(subtree, tvb, pinfo, pOffset);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IndexRange);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSimpleAttributeOperand(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SimpleAttributeOperand, &ti, "%s: SimpleAttributeOperand", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "TypeDefinitionId");
+ /* Array length field ignored: NoOfBrowsePath */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "BrowsePath", "QualifiedName", parseQualifiedName, ett_opcua_array_QualifiedName);
+ parseAttributeId(subtree, tvb, pinfo, pOffset);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IndexRange);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseContentFilterElementResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ContentFilterElementResult, &ti, "%s: ContentFilterElementResult", szFieldName);
+ parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
+ /* Array length field ignored: NoOfOperandStatusCodes */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "OperandStatusCodes", "StatusCode", hf_opcua_OperandStatusCodes, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfOperandDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "OperandDiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseContentFilterResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ContentFilterResult, &ti, "%s: ContentFilterResult", szFieldName);
+ /* Array length field ignored: NoOfElementResults */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "ElementResults", "ContentFilterElementResult", parseContentFilterElementResult, ett_opcua_array_ContentFilterElementResult);
+ /* Array length field ignored: NoOfElementDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "ElementDiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseParsingResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ParsingResult, &ti, "%s: ParsingResult", szFieldName);
+ parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
+ /* Array length field ignored: NoOfDataStatusCodes */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "DataStatusCodes", "StatusCode", hf_opcua_DataStatusCodes, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfDataDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DataDiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseReadValueId(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReadValueId, &ti, "%s: ReadValueId", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseAttributeId(subtree, tvb, pinfo, pOffset);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IndexRange);
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "DataEncoding");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseHistoryReadValueId(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_HistoryReadValueId, &ti, "%s: HistoryReadValueId", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IndexRange);
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "DataEncoding");
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ContinuationPoint);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseHistoryReadResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_HistoryReadResult, &ti, "%s: HistoryReadResult", szFieldName);
+ parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ContinuationPoint);
+ parseExtensionObject(subtree, tvb, pinfo, pOffset, "HistoryData");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseReadEventDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReadEventDetails, &ti, "%s: ReadEventDetails", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_NumValuesPerNode);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_StartTime);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_EndTime);
+ parseEventFilter(subtree, tvb, pinfo, pOffset, "Filter");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseReadRawModifiedDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReadRawModifiedDetails, &ti, "%s: ReadRawModifiedDetails", szFieldName);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsReadModified);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_StartTime);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_EndTime);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_NumValuesPerNode);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_ReturnBounds);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseReadProcessedDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReadProcessedDetails, &ti, "%s: ReadProcessedDetails", szFieldName);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_StartTime);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_EndTime);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_ProcessingInterval);
+ /* Array length field ignored: NoOfAggregateType */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "AggregateType", "NodeId", parseNodeId, ett_opcua_array_NodeId);
+ parseAggregateConfiguration(subtree, tvb, pinfo, pOffset, "AggregateConfiguration");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseReadAtTimeDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ReadAtTimeDetails, &ti, "%s: ReadAtTimeDetails", szFieldName);
+ /* Array length field ignored: NoOfReqTimes */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "ReqTimes", "DateTime", hf_opcua_ReqTimes, parseDateTime, ett_opcua_array_DateTime);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_UseSimpleBounds);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseHistoryData(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_HistoryData, &ti, "%s: HistoryData", szFieldName);
+ /* Array length field ignored: NoOfDataValues */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DataValues", "DataValue", parseDataValue, ett_opcua_array_DataValue);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseModificationInfo(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ModificationInfo, &ti, "%s: ModificationInfo", szFieldName);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_ModificationTime);
+ parseHistoryUpdateType(subtree, tvb, pinfo, pOffset);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_UserName);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseHistoryModifiedData(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_HistoryModifiedData, &ti, "%s: HistoryModifiedData", szFieldName);
+ /* Array length field ignored: NoOfDataValues */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DataValues", "DataValue", parseDataValue, ett_opcua_array_DataValue);
+ /* Array length field ignored: NoOfModificationInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "ModificationInfos", "ModificationInfo", parseModificationInfo, ett_opcua_array_ModificationInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseHistoryEvent(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_HistoryEvent, &ti, "%s: HistoryEvent", szFieldName);
+ /* Array length field ignored: NoOfEvents */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Events", "HistoryEventFieldList", parseHistoryEventFieldList, ett_opcua_array_HistoryEventFieldList);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseWriteValue(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_WriteValue, &ti, "%s: WriteValue", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseAttributeId(subtree, tvb, pinfo, pOffset);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_IndexRange);
+ parseDataValue(subtree, tvb, pinfo, pOffset, "Value");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseHistoryUpdateDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_HistoryUpdateDetails, &ti, "%s: HistoryUpdateDetails", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseUpdateDataDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_UpdateDataDetails, &ti, "%s: UpdateDataDetails", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parsePerformUpdateType(subtree, tvb, pinfo, pOffset);
+ /* Array length field ignored: NoOfUpdateValues */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "UpdateValues", "DataValue", parseDataValue, ett_opcua_array_DataValue);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseUpdateStructureDataDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_UpdateStructureDataDetails, &ti, "%s: UpdateStructureDataDetails", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parsePerformUpdateType(subtree, tvb, pinfo, pOffset);
+ /* Array length field ignored: NoOfUpdateValues */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "UpdateValues", "DataValue", parseDataValue, ett_opcua_array_DataValue);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseUpdateEventDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_UpdateEventDetails, &ti, "%s: UpdateEventDetails", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parsePerformUpdateType(subtree, tvb, pinfo, pOffset);
+ parseEventFilter(subtree, tvb, pinfo, pOffset, "Filter");
+ /* Array length field ignored: NoOfEventData */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "EventData", "HistoryEventFieldList", parseHistoryEventFieldList, ett_opcua_array_HistoryEventFieldList);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDeleteRawModifiedDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DeleteRawModifiedDetails, &ti, "%s: DeleteRawModifiedDetails", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_IsDeleteModified);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_StartTime);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_EndTime);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDeleteAtTimeDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DeleteAtTimeDetails, &ti, "%s: DeleteAtTimeDetails", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ /* Array length field ignored: NoOfReqTimes */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "ReqTimes", "DateTime", hf_opcua_ReqTimes, parseDateTime, ett_opcua_array_DateTime);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDeleteEventDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DeleteEventDetails, &ti, "%s: DeleteEventDetails", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ /* Array length field ignored: NoOfEventIds */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "EventIds", "ByteString", hf_opcua_EventIds, parseByteString, ett_opcua_array_ByteString);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseHistoryUpdateResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_HistoryUpdateResult, &ti, "%s: HistoryUpdateResult", szFieldName);
+ parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
+ /* Array length field ignored: NoOfOperationResults */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "OperationResults", "StatusCode", hf_opcua_OperationResults, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCallMethodRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_CallMethodRequest, &ti, "%s: CallMethodRequest", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "ObjectId");
+ parseNodeId(subtree, tvb, pinfo, pOffset, "MethodId");
+ /* Array length field ignored: NoOfInputArguments */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "InputArguments", "Variant", parseVariant, ett_opcua_array_Variant);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCallMethodResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_CallMethodResult, &ti, "%s: CallMethodResult", szFieldName);
+ parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
+ /* Array length field ignored: NoOfInputArgumentResults */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "InputArgumentResults", "StatusCode", hf_opcua_InputArgumentResults, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfInputArgumentDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "InputArgumentDiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ /* Array length field ignored: NoOfOutputArguments */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "OutputArguments", "Variant", parseVariant, ett_opcua_array_Variant);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDataChangeFilter(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DataChangeFilter, &ti, "%s: DataChangeFilter", szFieldName);
+ parseDataChangeTrigger(subtree, tvb, pinfo, pOffset);
+ parseDeadbandType(subtree, tvb, pinfo, pOffset);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_DeadbandValue);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseEventFilter(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EventFilter, &ti, "%s: EventFilter", szFieldName);
+ /* Array length field ignored: NoOfSelectClauses */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "SelectClauses", "SimpleAttributeOperand", parseSimpleAttributeOperand, ett_opcua_array_SimpleAttributeOperand);
+ parseContentFilter(subtree, tvb, pinfo, pOffset, "WhereClause");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseAggregateConfiguration(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AggregateConfiguration, &ti, "%s: AggregateConfiguration", szFieldName);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_UseServerCapabilitiesDefaults);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_TreatUncertainAsBad);
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_PercentDataBad);
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_PercentDataGood);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_UseSlopedExtrapolation);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseAggregateFilter(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AggregateFilter, &ti, "%s: AggregateFilter", szFieldName);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_StartTime);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "AggregateType");
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_ProcessingInterval);
+ parseAggregateConfiguration(subtree, tvb, pinfo, pOffset, "AggregateConfiguration");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseEventFilterResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EventFilterResult, &ti, "%s: EventFilterResult", szFieldName);
+ /* Array length field ignored: NoOfSelectClauseResults */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "SelectClauseResults", "StatusCode", hf_opcua_SelectClauseResults, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfSelectClauseDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "SelectClauseDiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ parseContentFilterResult(subtree, tvb, pinfo, pOffset, "WhereClauseResult");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseAggregateFilterResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AggregateFilterResult, &ti, "%s: AggregateFilterResult", szFieldName);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedStartTime);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedProcessingInterval);
+ parseAggregateConfiguration(subtree, tvb, pinfo, pOffset, "RevisedAggregateConfiguration");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseMonitoringParameters(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MonitoringParameters, &ti, "%s: MonitoringParameters", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ClientHandle);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_SamplingInterval);
+ parseExtensionObject(subtree, tvb, pinfo, pOffset, "Filter");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_QueueSize);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_DiscardOldest);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseMonitoredItemCreateRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MonitoredItemCreateRequest, &ti, "%s: MonitoredItemCreateRequest", szFieldName);
+ parseReadValueId(subtree, tvb, pinfo, pOffset, "ItemToMonitor");
+ parseMonitoringMode(subtree, tvb, pinfo, pOffset);
+ parseMonitoringParameters(subtree, tvb, pinfo, pOffset, "RequestedParameters");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseMonitoredItemCreateResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MonitoredItemCreateResult, &ti, "%s: MonitoredItemCreateResult", szFieldName);
+ parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MonitoredItemId);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedSamplingInterval);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedQueueSize);
+ parseExtensionObject(subtree, tvb, pinfo, pOffset, "FilterResult");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseMonitoredItemModifyRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MonitoredItemModifyRequest, &ti, "%s: MonitoredItemModifyRequest", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MonitoredItemId);
+ parseMonitoringParameters(subtree, tvb, pinfo, pOffset, "RequestedParameters");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseMonitoredItemModifyResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MonitoredItemModifyResult, &ti, "%s: MonitoredItemModifyResult", szFieldName);
+ parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedSamplingInterval);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedQueueSize);
+ parseExtensionObject(subtree, tvb, pinfo, pOffset, "FilterResult");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseNotificationMessage(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_NotificationMessage, &ti, "%s: NotificationMessage", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SequenceNumber);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_PublishTime);
+ /* Array length field ignored: NoOfNotificationData */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "NotificationData", "ExtensionObject", parseExtensionObject, ett_opcua_array_ExtensionObject);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDataChangeNotification(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DataChangeNotification, &ti, "%s: DataChangeNotification", szFieldName);
+ /* Array length field ignored: NoOfMonitoredItems */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "MonitoredItems", "MonitoredItemNotification", parseMonitoredItemNotification, ett_opcua_array_MonitoredItemNotification);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseMonitoredItemNotification(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_MonitoredItemNotification, &ti, "%s: MonitoredItemNotification", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ClientHandle);
+ parseDataValue(subtree, tvb, pinfo, pOffset, "Value");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseEventNotificationList(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EventNotificationList, &ti, "%s: EventNotificationList", szFieldName);
+ /* Array length field ignored: NoOfEvents */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Events", "EventFieldList", parseEventFieldList, ett_opcua_array_EventFieldList);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseEventFieldList(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EventFieldList, &ti, "%s: EventFieldList", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ClientHandle);
+ /* Array length field ignored: NoOfEventFields */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "EventFields", "Variant", parseVariant, ett_opcua_array_Variant);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseHistoryEventFieldList(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_HistoryEventFieldList, &ti, "%s: HistoryEventFieldList", szFieldName);
+ /* Array length field ignored: NoOfEventFields */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "EventFields", "Variant", parseVariant, ett_opcua_array_Variant);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseStatusChangeNotification(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_StatusChangeNotification, &ti, "%s: StatusChangeNotification", szFieldName);
+ parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_Status);
+ parseDiagnosticInfo(subtree, tvb, pinfo, pOffset, "DiagnosticInfo");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSubscriptionAcknowledgement(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SubscriptionAcknowledgement, &ti, "%s: SubscriptionAcknowledgement", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SubscriptionId);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SequenceNumber);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseTransferResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_TransferResult, &ti, "%s: TransferResult", szFieldName);
+ parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
+ /* Array length field ignored: NoOfAvailableSequenceNumbers */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "AvailableSequenceNumbers", "UInt32", hf_opcua_AvailableSequenceNumbers, parseUInt32, ett_opcua_array_UInt32);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseScalarTestType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ScalarTestType, &ti, "%s: ScalarTestType", szFieldName);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_Boolean);
+ parseSByte(subtree, tvb, pinfo, pOffset, hf_opcua_SByte);
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_Byte);
+ parseInt16(subtree, tvb, pinfo, pOffset, hf_opcua_Int16);
+ parseUInt16(subtree, tvb, pinfo, pOffset, hf_opcua_UInt16);
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_Int32);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UInt32);
+ parseInt64(subtree, tvb, pinfo, pOffset, hf_opcua_Int64);
+ parseUInt64(subtree, tvb, pinfo, pOffset, hf_opcua_UInt64);
+ parseFloat(subtree, tvb, pinfo, pOffset, hf_opcua_Float);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_Double);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_String);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_DateTime);
+ parseGuid(subtree, tvb, pinfo, pOffset, hf_opcua_Guid);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ByteString);
+ parseXmlElement(subtree, tvb, pinfo, pOffset, hf_opcua_XmlElement);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "NodeId");
+ parseExpandedNodeId(subtree, tvb, pinfo, pOffset, "ExpandedNodeId");
+ parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
+ parseDiagnosticInfo(subtree, tvb, pinfo, pOffset, "DiagnosticInfo");
+ parseQualifiedName(subtree, tvb, pinfo, pOffset, "QualifiedName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "LocalizedText");
+ parseExtensionObject(subtree, tvb, pinfo, pOffset, "ExtensionObject");
+ parseDataValue(subtree, tvb, pinfo, pOffset, "DataValue");
+ parseEnumeratedTestType(subtree, tvb, pinfo, pOffset);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseArrayTestType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ArrayTestType, &ti, "%s: ArrayTestType", szFieldName);
+ /* Array length field ignored: NoOfBooleans */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Booleans", "Boolean", hf_opcua_Booleans, parseBoolean, ett_opcua_array_Boolean);
+ /* Array length field ignored: NoOfSBytes */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "SBytes", "SByte", hf_opcua_SBytes, parseSByte, ett_opcua_array_SByte);
+ /* Array length field ignored: NoOfInt16s */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Int16s", "Int16", hf_opcua_Int16s, parseInt16, ett_opcua_array_Int16);
+ /* Array length field ignored: NoOfUInt16s */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "UInt16s", "UInt16", hf_opcua_UInt16s, parseUInt16, ett_opcua_array_UInt16);
+ /* Array length field ignored: NoOfInt32s */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Int32s", "Int32", hf_opcua_Int32s, parseInt32, ett_opcua_array_Int32);
+ /* Array length field ignored: NoOfUInt32s */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "UInt32s", "UInt32", hf_opcua_UInt32s, parseUInt32, ett_opcua_array_UInt32);
+ /* Array length field ignored: NoOfInt64s */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Int64s", "Int64", hf_opcua_Int64s, parseInt64, ett_opcua_array_Int64);
+ /* Array length field ignored: NoOfUInt64s */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "UInt64s", "UInt64", hf_opcua_UInt64s, parseUInt64, ett_opcua_array_UInt64);
+ /* Array length field ignored: NoOfFloats */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Floats", "Float", hf_opcua_Floats, parseFloat, ett_opcua_array_Float);
+ /* Array length field ignored: NoOfDoubles */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Doubles", "Double", hf_opcua_Doubles, parseDouble, ett_opcua_array_Double);
+ /* Array length field ignored: NoOfStrings */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Strings", "String", hf_opcua_Strings, parseString, ett_opcua_array_String);
+ /* Array length field ignored: NoOfDateTimes */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "DateTimes", "DateTime", hf_opcua_DateTimes, parseDateTime, ett_opcua_array_DateTime);
+ /* Array length field ignored: NoOfGuids */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Guids", "Guid", hf_opcua_Guids, parseGuid, ett_opcua_array_Guid);
+ /* Array length field ignored: NoOfByteStrings */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "ByteStrings", "ByteString", hf_opcua_ByteStrings, parseByteString, ett_opcua_array_ByteString);
+ /* Array length field ignored: NoOfXmlElements */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "XmlElements", "XmlElement", hf_opcua_XmlElements, parseXmlElement, ett_opcua_array_XmlElement);
+ /* Array length field ignored: NoOfNodeIds */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "NodeIds", "NodeId", parseNodeId, ett_opcua_array_NodeId);
+ /* Array length field ignored: NoOfExpandedNodeIds */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "ExpandedNodeIds", "ExpandedNodeId", parseExpandedNodeId, ett_opcua_array_ExpandedNodeId);
+ /* Array length field ignored: NoOfStatusCodes */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "StatusCodes", "StatusCode", hf_opcua_StatusCodes, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ /* Array length field ignored: NoOfQualifiedNames */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "QualifiedNames", "QualifiedName", parseQualifiedName, ett_opcua_array_QualifiedName);
+ /* Array length field ignored: NoOfLocalizedTexts */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "LocalizedTexts", "LocalizedText", parseLocalizedText, ett_opcua_array_LocalizedText);
+ /* Array length field ignored: NoOfExtensionObjects */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "ExtensionObjects", "ExtensionObject", parseExtensionObject, ett_opcua_array_ExtensionObject);
+ /* Array length field ignored: NoOfDataValues */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DataValues", "DataValue", parseDataValue, ett_opcua_array_DataValue);
+ /* Array length field ignored: NoOfVariants */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Variants", "Variant", parseVariant, ett_opcua_array_Variant);
+ /* Array length field ignored: NoOfEnumeratedValues */
+ parseArrayEnum(subtree, tvb, pinfo, pOffset, "EnumeratedValues", "EnumeratedTestType", parseEnumeratedTestType, ett_opcua_array_EnumeratedTestType);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCompositeTestType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_CompositeTestType, &ti, "%s: CompositeTestType", szFieldName);
+ parseScalarTestType(subtree, tvb, pinfo, pOffset, "Field1");
+ parseArrayTestType(subtree, tvb, pinfo, pOffset, "Field2");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseBuildInfo(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_BuildInfo, &ti, "%s: BuildInfo", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ProductUri);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ManufacturerName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ProductName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_SoftwareVersion);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_BuildNumber);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_BuildDate);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseRedundantServerDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_RedundantServerDataType, &ti, "%s: RedundantServerDataType", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerId);
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_ServiceLevel);
+ parseServerState(subtree, tvb, pinfo, pOffset);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseEndpointUrlListDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EndpointUrlListDataType, &ti, "%s: EndpointUrlListDataType", szFieldName);
+ /* Array length field ignored: NoOfEndpointUrlList */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "EndpointUrlList", "String", hf_opcua_EndpointUrlList, parseString, ett_opcua_array_String);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseNetworkGroupDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_NetworkGroupDataType, &ti, "%s: NetworkGroupDataType", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerUri);
+ /* Array length field ignored: NoOfNetworkPaths */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "NetworkPaths", "EndpointUrlListDataType", parseEndpointUrlListDataType, ett_opcua_array_EndpointUrlListDataType);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSamplingIntervalDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SamplingIntervalDiagnosticsDataType, &ti, "%s: SamplingIntervalDiagnosticsDataType", szFieldName);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_SamplingInterval);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MonitoredItemCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxMonitoredItemCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_DisabledMonitoredItemCount);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseServerDiagnosticsSummaryDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ServerDiagnosticsSummaryDataType, &ti, "%s: ServerDiagnosticsSummaryDataType", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ServerViewCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CurrentSessionCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CumulatedSessionCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SecurityRejectedSessionCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RejectedSessionCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SessionTimeoutCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SessionAbortCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CurrentSubscriptionCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CumulatedSubscriptionCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_PublishingIntervalCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SecurityRejectedRequestsCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RejectedRequestsCount);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseServerStatusDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ServerStatusDataType, &ti, "%s: ServerStatusDataType", szFieldName);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_StartTime);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_CurrentTime);
+ parseServerState(subtree, tvb, pinfo, pOffset);
+ parseBuildInfo(subtree, tvb, pinfo, pOffset, "BuildInfo");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SecondsTillShutdown);
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "ShutdownReason");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSessionDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SessionDiagnosticsDataType, &ti, "%s: SessionDiagnosticsDataType", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "SessionId");
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_SessionName);
+ parseApplicationDescription(subtree, tvb, pinfo, pOffset, "ClientDescription");
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerUri);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_EndpointUrl);
+ /* Array length field ignored: NoOfLocaleIds */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "LocaleIds", "String", hf_opcua_LocaleIds, parseString, ett_opcua_array_String);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_ActualSessionTimeout);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxResponseMessageSize);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_ClientConnectionTime);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_ClientLastContactTime);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CurrentSubscriptionsCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CurrentMonitoredItemsCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CurrentPublishRequestsInQueue);
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "TotalRequestCount");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UnauthorizedRequestCount);
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "ReadCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "HistoryReadCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "WriteCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "HistoryUpdateCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "CallCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "CreateMonitoredItemsCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "ModifyMonitoredItemsCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "SetMonitoringModeCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "SetTriggeringCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "DeleteMonitoredItemsCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "CreateSubscriptionCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "ModifySubscriptionCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "SetPublishingModeCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "PublishCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "RepublishCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "TransferSubscriptionsCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "DeleteSubscriptionsCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "AddNodesCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "AddReferencesCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "DeleteNodesCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "DeleteReferencesCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "BrowseCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "BrowseNextCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "TranslateBrowsePathsToNodeIdsCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "QueryFirstCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "QueryNextCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "RegisterNodesCount");
+ parseServiceCounterDataType(subtree, tvb, pinfo, pOffset, "UnregisterNodesCount");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSessionSecurityDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SessionSecurityDiagnosticsDataType, &ti, "%s: SessionSecurityDiagnosticsDataType", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "SessionId");
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ClientUserIdOfSession);
+ /* Array length field ignored: NoOfClientUserIdHistory */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "ClientUserIdHistory", "String", hf_opcua_ClientUserIdHistory, parseString, ett_opcua_array_String);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_AuthenticationMechanism);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_Encoding);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_TransportProtocol);
+ parseMessageSecurityMode(subtree, tvb, pinfo, pOffset);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_SecurityPolicyUri);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ClientCertificate);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseServiceCounterDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ServiceCounterDataType, &ti, "%s: ServiceCounterDataType", szFieldName);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_TotalCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ErrorCount);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseStatusResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_StatusResult, &ti, "%s: StatusResult", szFieldName);
+ parseStatusCode(subtree, tvb, pinfo, pOffset, hf_opcua_StatusCode);
+ parseDiagnosticInfo(subtree, tvb, pinfo, pOffset, "DiagnosticInfo");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSubscriptionDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SubscriptionDiagnosticsDataType, &ti, "%s: SubscriptionDiagnosticsDataType", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "SessionId");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SubscriptionId);
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_Priority);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_PublishingInterval);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxKeepAliveCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxLifetimeCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxNotificationsPerPublish);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_PublishingEnabled);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ModifyCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_EnableCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_DisableCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RepublishRequestCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RepublishMessageRequestCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RepublishMessageCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_TransferRequestCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_TransferredToAltClientCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_TransferredToSameClientCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_PublishRequestCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_DataChangeNotificationsCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_EventNotificationsCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_NotificationsCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_LatePublishRequestCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CurrentKeepAliveCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CurrentLifetimeCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UnacknowledgedMessageCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_DiscardedMessageCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MonitoredItemCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_DisabledMonitoredItemCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MonitoringQueueOverflowCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_NextSequenceNumber);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_EventQueueOverFlowCount);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseModelChangeStructureDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ModelChangeStructureDataType, &ti, "%s: ModelChangeStructureDataType", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "Affected");
+ parseNodeId(subtree, tvb, pinfo, pOffset, "AffectedType");
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_Verb);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSemanticChangeStructureDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_SemanticChangeStructureDataType, &ti, "%s: SemanticChangeStructureDataType", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "Affected");
+ parseNodeId(subtree, tvb, pinfo, pOffset, "AffectedType");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseRange(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_Range, &ti, "%s: Range", szFieldName);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_Low);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_High);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseEUInformation(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_EUInformation, &ti, "%s: EUInformation", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_NamespaceUri);
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_UnitId);
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "DisplayName");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Description");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseComplexNumberType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ComplexNumberType, &ti, "%s: ComplexNumberType", szFieldName);
+ parseFloat(subtree, tvb, pinfo, pOffset, hf_opcua_Real);
+ parseFloat(subtree, tvb, pinfo, pOffset, hf_opcua_Imaginary);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDoubleComplexNumberType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_DoubleComplexNumberType, &ti, "%s: DoubleComplexNumberType", szFieldName);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_Real);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_Imaginary);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseAxisInformation(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_AxisInformation, &ti, "%s: AxisInformation", szFieldName);
+ parseEUInformation(subtree, tvb, pinfo, pOffset, "EngineeringUnits");
+ parseRange(subtree, tvb, pinfo, pOffset, "EURange");
+ parseLocalizedText(subtree, tvb, pinfo, pOffset, "Title");
+ parseAxisScaleEnumeration(subtree, tvb, pinfo, pOffset);
+ /* Array length field ignored: NoOfAxisSteps */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "AxisSteps", "Double", hf_opcua_AxisSteps, parseDouble, ett_opcua_array_Double);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseXVType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_XVType, &ti, "%s: XVType", szFieldName);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_X);
+ parseFloat(subtree, tvb, pinfo, pOffset, hf_opcua_Value);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseProgramDiagnosticDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_ProgramDiagnosticDataType, &ti, "%s: ProgramDiagnosticDataType", szFieldName);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "CreateSessionId");
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_CreateClientName);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_InvocationCreationTime);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_LastTransitionTime);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_LastMethodCall);
+ parseNodeId(subtree, tvb, pinfo, pOffset, "LastMethodSessionId");
+ /* Array length field ignored: NoOfLastMethodInputArguments */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "LastMethodInputArguments", "Argument", parseArgument, ett_opcua_array_Argument);
+ /* Array length field ignored: NoOfLastMethodOutputArguments */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "LastMethodOutputArguments", "Argument", parseArgument, ett_opcua_array_Argument);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_LastMethodCallTime);
+ parseStatusResult(subtree, tvb, pinfo, pOffset, "LastMethodReturnStatus");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseAnnotation(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_Annotation, &ti, "%s: Annotation", szFieldName);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_Message);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_UserName);
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_AnnotationTime);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+
+/** Setup protocol subtree array */
+static gint *ett[] =
+{
+ &ett_opcua_TrustListDataType,
+ &ett_opcua_array_TrustListDataType,
+ &ett_opcua_Node,
+ &ett_opcua_array_Node,
+ &ett_opcua_InstanceNode,
+ &ett_opcua_array_InstanceNode,
+ &ett_opcua_TypeNode,
+ &ett_opcua_array_TypeNode,
+ &ett_opcua_ObjectNode,
+ &ett_opcua_array_ObjectNode,
+ &ett_opcua_ObjectTypeNode,
+ &ett_opcua_array_ObjectTypeNode,
+ &ett_opcua_VariableNode,
+ &ett_opcua_array_VariableNode,
+ &ett_opcua_VariableTypeNode,
+ &ett_opcua_array_VariableTypeNode,
+ &ett_opcua_ReferenceTypeNode,
+ &ett_opcua_array_ReferenceTypeNode,
+ &ett_opcua_MethodNode,
+ &ett_opcua_array_MethodNode,
+ &ett_opcua_ViewNode,
+ &ett_opcua_array_ViewNode,
+ &ett_opcua_DataTypeNode,
+ &ett_opcua_array_DataTypeNode,
+ &ett_opcua_ReferenceNode,
+ &ett_opcua_array_ReferenceNode,
+ &ett_opcua_Argument,
+ &ett_opcua_array_Argument,
+ &ett_opcua_EnumValueType,
+ &ett_opcua_array_EnumValueType,
+ &ett_opcua_OptionSet,
+ &ett_opcua_array_OptionSet,
+ &ett_opcua_TimeZoneDataType,
+ &ett_opcua_array_TimeZoneDataType,
+ &ett_opcua_ApplicationDescription,
+ &ett_opcua_array_ApplicationDescription,
+ &ett_opcua_RequestHeader,
+ &ett_opcua_array_RequestHeader,
+ &ett_opcua_ResponseHeader,
+ &ett_opcua_array_ResponseHeader,
+ &ett_opcua_ServerOnNetwork,
+ &ett_opcua_array_ServerOnNetwork,
+ &ett_opcua_UserTokenPolicy,
+ &ett_opcua_array_UserTokenPolicy,
+ &ett_opcua_EndpointDescription,
+ &ett_opcua_array_EndpointDescription,
+ &ett_opcua_RegisteredServer,
+ &ett_opcua_array_RegisteredServer,
+ &ett_opcua_MdnsDiscoveryConfiguration,
+ &ett_opcua_array_MdnsDiscoveryConfiguration,
+ &ett_opcua_ChannelSecurityToken,
+ &ett_opcua_array_ChannelSecurityToken,
+ &ett_opcua_SignedSoftwareCertificate,
+ &ett_opcua_array_SignedSoftwareCertificate,
+ &ett_opcua_SignatureData,
+ &ett_opcua_array_SignatureData,
+ &ett_opcua_UserIdentityToken,
+ &ett_opcua_array_UserIdentityToken,
+ &ett_opcua_AnonymousIdentityToken,
+ &ett_opcua_array_AnonymousIdentityToken,
+ &ett_opcua_UserNameIdentityToken,
+ &ett_opcua_array_UserNameIdentityToken,
+ &ett_opcua_X509IdentityToken,
+ &ett_opcua_array_X509IdentityToken,
+ &ett_opcua_KerberosIdentityToken,
+ &ett_opcua_array_KerberosIdentityToken,
+ &ett_opcua_IssuedIdentityToken,
+ &ett_opcua_array_IssuedIdentityToken,
+ &ett_opcua_NodeAttributes,
+ &ett_opcua_array_NodeAttributes,
+ &ett_opcua_ObjectAttributes,
+ &ett_opcua_array_ObjectAttributes,
+ &ett_opcua_VariableAttributes,
+ &ett_opcua_array_VariableAttributes,
+ &ett_opcua_MethodAttributes,
+ &ett_opcua_array_MethodAttributes,
+ &ett_opcua_ObjectTypeAttributes,
+ &ett_opcua_array_ObjectTypeAttributes,
+ &ett_opcua_VariableTypeAttributes,
+ &ett_opcua_array_VariableTypeAttributes,
+ &ett_opcua_ReferenceTypeAttributes,
+ &ett_opcua_array_ReferenceTypeAttributes,
+ &ett_opcua_DataTypeAttributes,
+ &ett_opcua_array_DataTypeAttributes,
+ &ett_opcua_ViewAttributes,
+ &ett_opcua_array_ViewAttributes,
+ &ett_opcua_AddNodesItem,
+ &ett_opcua_array_AddNodesItem,
+ &ett_opcua_AddNodesResult,
+ &ett_opcua_array_AddNodesResult,
+ &ett_opcua_AddReferencesItem,
+ &ett_opcua_array_AddReferencesItem,
+ &ett_opcua_DeleteNodesItem,
+ &ett_opcua_array_DeleteNodesItem,
+ &ett_opcua_DeleteReferencesItem,
+ &ett_opcua_array_DeleteReferencesItem,
+ &ett_opcua_ViewDescription,
+ &ett_opcua_array_ViewDescription,
+ &ett_opcua_BrowseDescription,
+ &ett_opcua_array_BrowseDescription,
+ &ett_opcua_ReferenceDescription,
+ &ett_opcua_array_ReferenceDescription,
+ &ett_opcua_BrowseResult,
+ &ett_opcua_array_BrowseResult,
+ &ett_opcua_RelativePathElement,
+ &ett_opcua_array_RelativePathElement,
+ &ett_opcua_RelativePath,
+ &ett_opcua_array_RelativePath,
+ &ett_opcua_BrowsePath,
+ &ett_opcua_array_BrowsePath,
+ &ett_opcua_BrowsePathTarget,
+ &ett_opcua_array_BrowsePathTarget,
+ &ett_opcua_BrowsePathResult,
+ &ett_opcua_array_BrowsePathResult,
+ &ett_opcua_EndpointConfiguration,
+ &ett_opcua_array_EndpointConfiguration,
+ &ett_opcua_SupportedProfile,
+ &ett_opcua_array_SupportedProfile,
+ &ett_opcua_SoftwareCertificate,
+ &ett_opcua_array_SoftwareCertificate,
+ &ett_opcua_QueryDataDescription,
+ &ett_opcua_array_QueryDataDescription,
+ &ett_opcua_NodeTypeDescription,
+ &ett_opcua_array_NodeTypeDescription,
+ &ett_opcua_QueryDataSet,
+ &ett_opcua_array_QueryDataSet,
+ &ett_opcua_NodeReference,
+ &ett_opcua_array_NodeReference,
+ &ett_opcua_ContentFilterElement,
+ &ett_opcua_array_ContentFilterElement,
+ &ett_opcua_ContentFilter,
+ &ett_opcua_array_ContentFilter,
+ &ett_opcua_ElementOperand,
+ &ett_opcua_array_ElementOperand,
+ &ett_opcua_LiteralOperand,
+ &ett_opcua_array_LiteralOperand,
+ &ett_opcua_AttributeOperand,
+ &ett_opcua_array_AttributeOperand,
+ &ett_opcua_SimpleAttributeOperand,
+ &ett_opcua_array_SimpleAttributeOperand,
+ &ett_opcua_ContentFilterElementResult,
+ &ett_opcua_array_ContentFilterElementResult,
+ &ett_opcua_ContentFilterResult,
+ &ett_opcua_array_ContentFilterResult,
+ &ett_opcua_ParsingResult,
+ &ett_opcua_array_ParsingResult,
+ &ett_opcua_ReadValueId,
+ &ett_opcua_array_ReadValueId,
+ &ett_opcua_HistoryReadValueId,
+ &ett_opcua_array_HistoryReadValueId,
+ &ett_opcua_HistoryReadResult,
+ &ett_opcua_array_HistoryReadResult,
+ &ett_opcua_ReadEventDetails,
+ &ett_opcua_array_ReadEventDetails,
+ &ett_opcua_ReadRawModifiedDetails,
+ &ett_opcua_array_ReadRawModifiedDetails,
+ &ett_opcua_ReadProcessedDetails,
+ &ett_opcua_array_ReadProcessedDetails,
+ &ett_opcua_ReadAtTimeDetails,
+ &ett_opcua_array_ReadAtTimeDetails,
+ &ett_opcua_HistoryData,
+ &ett_opcua_array_HistoryData,
+ &ett_opcua_ModificationInfo,
+ &ett_opcua_array_ModificationInfo,
+ &ett_opcua_HistoryModifiedData,
+ &ett_opcua_array_HistoryModifiedData,
+ &ett_opcua_HistoryEvent,
+ &ett_opcua_array_HistoryEvent,
+ &ett_opcua_WriteValue,
+ &ett_opcua_array_WriteValue,
+ &ett_opcua_HistoryUpdateDetails,
+ &ett_opcua_array_HistoryUpdateDetails,
+ &ett_opcua_UpdateDataDetails,
+ &ett_opcua_array_UpdateDataDetails,
+ &ett_opcua_UpdateStructureDataDetails,
+ &ett_opcua_array_UpdateStructureDataDetails,
+ &ett_opcua_UpdateEventDetails,
+ &ett_opcua_array_UpdateEventDetails,
+ &ett_opcua_DeleteRawModifiedDetails,
+ &ett_opcua_array_DeleteRawModifiedDetails,
+ &ett_opcua_DeleteAtTimeDetails,
+ &ett_opcua_array_DeleteAtTimeDetails,
+ &ett_opcua_DeleteEventDetails,
+ &ett_opcua_array_DeleteEventDetails,
+ &ett_opcua_HistoryUpdateResult,
+ &ett_opcua_array_HistoryUpdateResult,
+ &ett_opcua_CallMethodRequest,
+ &ett_opcua_array_CallMethodRequest,
+ &ett_opcua_CallMethodResult,
+ &ett_opcua_array_CallMethodResult,
+ &ett_opcua_DataChangeFilter,
+ &ett_opcua_array_DataChangeFilter,
+ &ett_opcua_EventFilter,
+ &ett_opcua_array_EventFilter,
+ &ett_opcua_AggregateConfiguration,
+ &ett_opcua_array_AggregateConfiguration,
+ &ett_opcua_AggregateFilter,
+ &ett_opcua_array_AggregateFilter,
+ &ett_opcua_EventFilterResult,
+ &ett_opcua_array_EventFilterResult,
+ &ett_opcua_AggregateFilterResult,
+ &ett_opcua_array_AggregateFilterResult,
+ &ett_opcua_MonitoringParameters,
+ &ett_opcua_array_MonitoringParameters,
+ &ett_opcua_MonitoredItemCreateRequest,
+ &ett_opcua_array_MonitoredItemCreateRequest,
+ &ett_opcua_MonitoredItemCreateResult,
+ &ett_opcua_array_MonitoredItemCreateResult,
+ &ett_opcua_MonitoredItemModifyRequest,
+ &ett_opcua_array_MonitoredItemModifyRequest,
+ &ett_opcua_MonitoredItemModifyResult,
+ &ett_opcua_array_MonitoredItemModifyResult,
+ &ett_opcua_NotificationMessage,
+ &ett_opcua_array_NotificationMessage,
+ &ett_opcua_DataChangeNotification,
+ &ett_opcua_array_DataChangeNotification,
+ &ett_opcua_MonitoredItemNotification,
+ &ett_opcua_array_MonitoredItemNotification,
+ &ett_opcua_EventNotificationList,
+ &ett_opcua_array_EventNotificationList,
+ &ett_opcua_EventFieldList,
+ &ett_opcua_array_EventFieldList,
+ &ett_opcua_HistoryEventFieldList,
+ &ett_opcua_array_HistoryEventFieldList,
+ &ett_opcua_StatusChangeNotification,
+ &ett_opcua_array_StatusChangeNotification,
+ &ett_opcua_SubscriptionAcknowledgement,
+ &ett_opcua_array_SubscriptionAcknowledgement,
+ &ett_opcua_TransferResult,
+ &ett_opcua_array_TransferResult,
+ &ett_opcua_ScalarTestType,
+ &ett_opcua_array_ScalarTestType,
+ &ett_opcua_ArrayTestType,
+ &ett_opcua_array_ArrayTestType,
+ &ett_opcua_CompositeTestType,
+ &ett_opcua_array_CompositeTestType,
+ &ett_opcua_BuildInfo,
+ &ett_opcua_array_BuildInfo,
+ &ett_opcua_RedundantServerDataType,
+ &ett_opcua_array_RedundantServerDataType,
+ &ett_opcua_EndpointUrlListDataType,
+ &ett_opcua_array_EndpointUrlListDataType,
+ &ett_opcua_NetworkGroupDataType,
+ &ett_opcua_array_NetworkGroupDataType,
+ &ett_opcua_SamplingIntervalDiagnosticsDataType,
+ &ett_opcua_array_SamplingIntervalDiagnosticsDataType,
+ &ett_opcua_ServerDiagnosticsSummaryDataType,
+ &ett_opcua_array_ServerDiagnosticsSummaryDataType,
+ &ett_opcua_ServerStatusDataType,
+ &ett_opcua_array_ServerStatusDataType,
+ &ett_opcua_SessionDiagnosticsDataType,
+ &ett_opcua_array_SessionDiagnosticsDataType,
+ &ett_opcua_SessionSecurityDiagnosticsDataType,
+ &ett_opcua_array_SessionSecurityDiagnosticsDataType,
+ &ett_opcua_ServiceCounterDataType,
+ &ett_opcua_array_ServiceCounterDataType,
+ &ett_opcua_StatusResult,
+ &ett_opcua_array_StatusResult,
+ &ett_opcua_SubscriptionDiagnosticsDataType,
+ &ett_opcua_array_SubscriptionDiagnosticsDataType,
+ &ett_opcua_ModelChangeStructureDataType,
+ &ett_opcua_array_ModelChangeStructureDataType,
+ &ett_opcua_SemanticChangeStructureDataType,
+ &ett_opcua_array_SemanticChangeStructureDataType,
+ &ett_opcua_Range,
+ &ett_opcua_array_Range,
+ &ett_opcua_EUInformation,
+ &ett_opcua_array_EUInformation,
+ &ett_opcua_ComplexNumberType,
+ &ett_opcua_array_ComplexNumberType,
+ &ett_opcua_DoubleComplexNumberType,
+ &ett_opcua_array_DoubleComplexNumberType,
+ &ett_opcua_AxisInformation,
+ &ett_opcua_array_AxisInformation,
+ &ett_opcua_XVType,
+ &ett_opcua_array_XVType,
+ &ett_opcua_ProgramDiagnosticDataType,
+ &ett_opcua_array_ProgramDiagnosticDataType,
+ &ett_opcua_Annotation,
+ &ett_opcua_array_Annotation,
+};
+
+void registerComplexTypes(void)
+{
+ proto_register_subtree_array(ett, array_length(ett));
+}
+
diff --git a/plugins/epan/opcua/opcua_complextypeparser.h b/plugins/epan/opcua/opcua_complextypeparser.h
new file mode 100644
index 00000000..48ef060f
--- /dev/null
+++ b/plugins/epan/opcua/opcua_complextypeparser.h
@@ -0,0 +1,445 @@
+/******************************************************************************
+** Copyright (C) 2006-2015 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: OpcUa Complex Type Parser
+**
+** This file was autogenerated on 13.10.2015.
+** DON'T MODIFY THIS FILE!
+** XXX - well, except that you may have to. See the README.
+**
+******************************************************************************/
+
+#include <glib.h>
+#include <epan/packet.h>
+
+extern gint ett_opcua_TrustListDataType;
+extern gint ett_opcua_array_TrustListDataType;
+extern gint ett_opcua_Node;
+extern gint ett_opcua_array_Node;
+extern gint ett_opcua_InstanceNode;
+extern gint ett_opcua_array_InstanceNode;
+extern gint ett_opcua_TypeNode;
+extern gint ett_opcua_array_TypeNode;
+extern gint ett_opcua_ObjectNode;
+extern gint ett_opcua_array_ObjectNode;
+extern gint ett_opcua_ObjectTypeNode;
+extern gint ett_opcua_array_ObjectTypeNode;
+extern gint ett_opcua_VariableNode;
+extern gint ett_opcua_array_VariableNode;
+extern gint ett_opcua_VariableTypeNode;
+extern gint ett_opcua_array_VariableTypeNode;
+extern gint ett_opcua_ReferenceTypeNode;
+extern gint ett_opcua_array_ReferenceTypeNode;
+extern gint ett_opcua_MethodNode;
+extern gint ett_opcua_array_MethodNode;
+extern gint ett_opcua_ViewNode;
+extern gint ett_opcua_array_ViewNode;
+extern gint ett_opcua_DataTypeNode;
+extern gint ett_opcua_array_DataTypeNode;
+extern gint ett_opcua_ReferenceNode;
+extern gint ett_opcua_array_ReferenceNode;
+extern gint ett_opcua_Argument;
+extern gint ett_opcua_array_Argument;
+extern gint ett_opcua_EnumValueType;
+extern gint ett_opcua_array_EnumValueType;
+extern gint ett_opcua_OptionSet;
+extern gint ett_opcua_array_OptionSet;
+extern gint ett_opcua_TimeZoneDataType;
+extern gint ett_opcua_array_TimeZoneDataType;
+extern gint ett_opcua_ApplicationDescription;
+extern gint ett_opcua_array_ApplicationDescription;
+extern gint ett_opcua_RequestHeader;
+extern gint ett_opcua_array_RequestHeader;
+extern gint ett_opcua_ResponseHeader;
+extern gint ett_opcua_array_ResponseHeader;
+extern gint ett_opcua_ServerOnNetwork;
+extern gint ett_opcua_array_ServerOnNetwork;
+extern gint ett_opcua_UserTokenPolicy;
+extern gint ett_opcua_array_UserTokenPolicy;
+extern gint ett_opcua_EndpointDescription;
+extern gint ett_opcua_array_EndpointDescription;
+extern gint ett_opcua_RegisteredServer;
+extern gint ett_opcua_array_RegisteredServer;
+extern gint ett_opcua_MdnsDiscoveryConfiguration;
+extern gint ett_opcua_array_MdnsDiscoveryConfiguration;
+extern gint ett_opcua_ChannelSecurityToken;
+extern gint ett_opcua_array_ChannelSecurityToken;
+extern gint ett_opcua_SignedSoftwareCertificate;
+extern gint ett_opcua_array_SignedSoftwareCertificate;
+extern gint ett_opcua_SignatureData;
+extern gint ett_opcua_array_SignatureData;
+extern gint ett_opcua_UserIdentityToken;
+extern gint ett_opcua_array_UserIdentityToken;
+extern gint ett_opcua_AnonymousIdentityToken;
+extern gint ett_opcua_array_AnonymousIdentityToken;
+extern gint ett_opcua_UserNameIdentityToken;
+extern gint ett_opcua_array_UserNameIdentityToken;
+extern gint ett_opcua_X509IdentityToken;
+extern gint ett_opcua_array_X509IdentityToken;
+extern gint ett_opcua_KerberosIdentityToken;
+extern gint ett_opcua_array_KerberosIdentityToken;
+extern gint ett_opcua_IssuedIdentityToken;
+extern gint ett_opcua_array_IssuedIdentityToken;
+extern gint ett_opcua_NodeAttributes;
+extern gint ett_opcua_array_NodeAttributes;
+extern gint ett_opcua_ObjectAttributes;
+extern gint ett_opcua_array_ObjectAttributes;
+extern gint ett_opcua_VariableAttributes;
+extern gint ett_opcua_array_VariableAttributes;
+extern gint ett_opcua_MethodAttributes;
+extern gint ett_opcua_array_MethodAttributes;
+extern gint ett_opcua_ObjectTypeAttributes;
+extern gint ett_opcua_array_ObjectTypeAttributes;
+extern gint ett_opcua_VariableTypeAttributes;
+extern gint ett_opcua_array_VariableTypeAttributes;
+extern gint ett_opcua_ReferenceTypeAttributes;
+extern gint ett_opcua_array_ReferenceTypeAttributes;
+extern gint ett_opcua_DataTypeAttributes;
+extern gint ett_opcua_array_DataTypeAttributes;
+extern gint ett_opcua_ViewAttributes;
+extern gint ett_opcua_array_ViewAttributes;
+extern gint ett_opcua_AddNodesItem;
+extern gint ett_opcua_array_AddNodesItem;
+extern gint ett_opcua_AddNodesResult;
+extern gint ett_opcua_array_AddNodesResult;
+extern gint ett_opcua_AddReferencesItem;
+extern gint ett_opcua_array_AddReferencesItem;
+extern gint ett_opcua_DeleteNodesItem;
+extern gint ett_opcua_array_DeleteNodesItem;
+extern gint ett_opcua_DeleteReferencesItem;
+extern gint ett_opcua_array_DeleteReferencesItem;
+extern gint ett_opcua_ViewDescription;
+extern gint ett_opcua_array_ViewDescription;
+extern gint ett_opcua_BrowseDescription;
+extern gint ett_opcua_array_BrowseDescription;
+extern gint ett_opcua_ReferenceDescription;
+extern gint ett_opcua_array_ReferenceDescription;
+extern gint ett_opcua_BrowseResult;
+extern gint ett_opcua_array_BrowseResult;
+extern gint ett_opcua_RelativePathElement;
+extern gint ett_opcua_array_RelativePathElement;
+extern gint ett_opcua_RelativePath;
+extern gint ett_opcua_array_RelativePath;
+extern gint ett_opcua_BrowsePath;
+extern gint ett_opcua_array_BrowsePath;
+extern gint ett_opcua_BrowsePathTarget;
+extern gint ett_opcua_array_BrowsePathTarget;
+extern gint ett_opcua_BrowsePathResult;
+extern gint ett_opcua_array_BrowsePathResult;
+extern gint ett_opcua_EndpointConfiguration;
+extern gint ett_opcua_array_EndpointConfiguration;
+extern gint ett_opcua_SupportedProfile;
+extern gint ett_opcua_array_SupportedProfile;
+extern gint ett_opcua_SoftwareCertificate;
+extern gint ett_opcua_array_SoftwareCertificate;
+extern gint ett_opcua_QueryDataDescription;
+extern gint ett_opcua_array_QueryDataDescription;
+extern gint ett_opcua_NodeTypeDescription;
+extern gint ett_opcua_array_NodeTypeDescription;
+extern gint ett_opcua_QueryDataSet;
+extern gint ett_opcua_array_QueryDataSet;
+extern gint ett_opcua_NodeReference;
+extern gint ett_opcua_array_NodeReference;
+extern gint ett_opcua_ContentFilterElement;
+extern gint ett_opcua_array_ContentFilterElement;
+extern gint ett_opcua_ContentFilter;
+extern gint ett_opcua_array_ContentFilter;
+extern gint ett_opcua_ElementOperand;
+extern gint ett_opcua_array_ElementOperand;
+extern gint ett_opcua_LiteralOperand;
+extern gint ett_opcua_array_LiteralOperand;
+extern gint ett_opcua_AttributeOperand;
+extern gint ett_opcua_array_AttributeOperand;
+extern gint ett_opcua_SimpleAttributeOperand;
+extern gint ett_opcua_array_SimpleAttributeOperand;
+extern gint ett_opcua_ContentFilterElementResult;
+extern gint ett_opcua_array_ContentFilterElementResult;
+extern gint ett_opcua_ContentFilterResult;
+extern gint ett_opcua_array_ContentFilterResult;
+extern gint ett_opcua_ParsingResult;
+extern gint ett_opcua_array_ParsingResult;
+extern gint ett_opcua_ReadValueId;
+extern gint ett_opcua_array_ReadValueId;
+extern gint ett_opcua_HistoryReadValueId;
+extern gint ett_opcua_array_HistoryReadValueId;
+extern gint ett_opcua_HistoryReadResult;
+extern gint ett_opcua_array_HistoryReadResult;
+extern gint ett_opcua_ReadEventDetails;
+extern gint ett_opcua_array_ReadEventDetails;
+extern gint ett_opcua_ReadRawModifiedDetails;
+extern gint ett_opcua_array_ReadRawModifiedDetails;
+extern gint ett_opcua_ReadProcessedDetails;
+extern gint ett_opcua_array_ReadProcessedDetails;
+extern gint ett_opcua_ReadAtTimeDetails;
+extern gint ett_opcua_array_ReadAtTimeDetails;
+extern gint ett_opcua_HistoryData;
+extern gint ett_opcua_array_HistoryData;
+extern gint ett_opcua_ModificationInfo;
+extern gint ett_opcua_array_ModificationInfo;
+extern gint ett_opcua_HistoryModifiedData;
+extern gint ett_opcua_array_HistoryModifiedData;
+extern gint ett_opcua_HistoryEvent;
+extern gint ett_opcua_array_HistoryEvent;
+extern gint ett_opcua_WriteValue;
+extern gint ett_opcua_array_WriteValue;
+extern gint ett_opcua_HistoryUpdateDetails;
+extern gint ett_opcua_array_HistoryUpdateDetails;
+extern gint ett_opcua_UpdateDataDetails;
+extern gint ett_opcua_array_UpdateDataDetails;
+extern gint ett_opcua_UpdateStructureDataDetails;
+extern gint ett_opcua_array_UpdateStructureDataDetails;
+extern gint ett_opcua_UpdateEventDetails;
+extern gint ett_opcua_array_UpdateEventDetails;
+extern gint ett_opcua_DeleteRawModifiedDetails;
+extern gint ett_opcua_array_DeleteRawModifiedDetails;
+extern gint ett_opcua_DeleteAtTimeDetails;
+extern gint ett_opcua_array_DeleteAtTimeDetails;
+extern gint ett_opcua_DeleteEventDetails;
+extern gint ett_opcua_array_DeleteEventDetails;
+extern gint ett_opcua_HistoryUpdateResult;
+extern gint ett_opcua_array_HistoryUpdateResult;
+extern gint ett_opcua_CallMethodRequest;
+extern gint ett_opcua_array_CallMethodRequest;
+extern gint ett_opcua_CallMethodResult;
+extern gint ett_opcua_array_CallMethodResult;
+extern gint ett_opcua_DataChangeFilter;
+extern gint ett_opcua_array_DataChangeFilter;
+extern gint ett_opcua_EventFilter;
+extern gint ett_opcua_array_EventFilter;
+extern gint ett_opcua_AggregateConfiguration;
+extern gint ett_opcua_array_AggregateConfiguration;
+extern gint ett_opcua_AggregateFilter;
+extern gint ett_opcua_array_AggregateFilter;
+extern gint ett_opcua_EventFilterResult;
+extern gint ett_opcua_array_EventFilterResult;
+extern gint ett_opcua_AggregateFilterResult;
+extern gint ett_opcua_array_AggregateFilterResult;
+extern gint ett_opcua_MonitoringParameters;
+extern gint ett_opcua_array_MonitoringParameters;
+extern gint ett_opcua_MonitoredItemCreateRequest;
+extern gint ett_opcua_array_MonitoredItemCreateRequest;
+extern gint ett_opcua_MonitoredItemCreateResult;
+extern gint ett_opcua_array_MonitoredItemCreateResult;
+extern gint ett_opcua_MonitoredItemModifyRequest;
+extern gint ett_opcua_array_MonitoredItemModifyRequest;
+extern gint ett_opcua_MonitoredItemModifyResult;
+extern gint ett_opcua_array_MonitoredItemModifyResult;
+extern gint ett_opcua_NotificationMessage;
+extern gint ett_opcua_array_NotificationMessage;
+extern gint ett_opcua_DataChangeNotification;
+extern gint ett_opcua_array_DataChangeNotification;
+extern gint ett_opcua_MonitoredItemNotification;
+extern gint ett_opcua_array_MonitoredItemNotification;
+extern gint ett_opcua_EventNotificationList;
+extern gint ett_opcua_array_EventNotificationList;
+extern gint ett_opcua_EventFieldList;
+extern gint ett_opcua_array_EventFieldList;
+extern gint ett_opcua_HistoryEventFieldList;
+extern gint ett_opcua_array_HistoryEventFieldList;
+extern gint ett_opcua_StatusChangeNotification;
+extern gint ett_opcua_array_StatusChangeNotification;
+extern gint ett_opcua_SubscriptionAcknowledgement;
+extern gint ett_opcua_array_SubscriptionAcknowledgement;
+extern gint ett_opcua_TransferResult;
+extern gint ett_opcua_array_TransferResult;
+extern gint ett_opcua_ScalarTestType;
+extern gint ett_opcua_array_ScalarTestType;
+extern gint ett_opcua_ArrayTestType;
+extern gint ett_opcua_array_ArrayTestType;
+extern gint ett_opcua_CompositeTestType;
+extern gint ett_opcua_array_CompositeTestType;
+extern gint ett_opcua_BuildInfo;
+extern gint ett_opcua_array_BuildInfo;
+extern gint ett_opcua_RedundantServerDataType;
+extern gint ett_opcua_array_RedundantServerDataType;
+extern gint ett_opcua_EndpointUrlListDataType;
+extern gint ett_opcua_array_EndpointUrlListDataType;
+extern gint ett_opcua_NetworkGroupDataType;
+extern gint ett_opcua_array_NetworkGroupDataType;
+extern gint ett_opcua_SamplingIntervalDiagnosticsDataType;
+extern gint ett_opcua_array_SamplingIntervalDiagnosticsDataType;
+extern gint ett_opcua_ServerDiagnosticsSummaryDataType;
+extern gint ett_opcua_array_ServerDiagnosticsSummaryDataType;
+extern gint ett_opcua_ServerStatusDataType;
+extern gint ett_opcua_array_ServerStatusDataType;
+extern gint ett_opcua_SessionDiagnosticsDataType;
+extern gint ett_opcua_array_SessionDiagnosticsDataType;
+extern gint ett_opcua_SessionSecurityDiagnosticsDataType;
+extern gint ett_opcua_array_SessionSecurityDiagnosticsDataType;
+extern gint ett_opcua_ServiceCounterDataType;
+extern gint ett_opcua_array_ServiceCounterDataType;
+extern gint ett_opcua_StatusResult;
+extern gint ett_opcua_array_StatusResult;
+extern gint ett_opcua_SubscriptionDiagnosticsDataType;
+extern gint ett_opcua_array_SubscriptionDiagnosticsDataType;
+extern gint ett_opcua_ModelChangeStructureDataType;
+extern gint ett_opcua_array_ModelChangeStructureDataType;
+extern gint ett_opcua_SemanticChangeStructureDataType;
+extern gint ett_opcua_array_SemanticChangeStructureDataType;
+extern gint ett_opcua_Range;
+extern gint ett_opcua_array_Range;
+extern gint ett_opcua_EUInformation;
+extern gint ett_opcua_array_EUInformation;
+extern gint ett_opcua_ComplexNumberType;
+extern gint ett_opcua_array_ComplexNumberType;
+extern gint ett_opcua_DoubleComplexNumberType;
+extern gint ett_opcua_array_DoubleComplexNumberType;
+extern gint ett_opcua_AxisInformation;
+extern gint ett_opcua_array_AxisInformation;
+extern gint ett_opcua_XVType;
+extern gint ett_opcua_array_XVType;
+extern gint ett_opcua_ProgramDiagnosticDataType;
+extern gint ett_opcua_array_ProgramDiagnosticDataType;
+extern gint ett_opcua_Annotation;
+extern gint ett_opcua_array_Annotation;
+
+void parseTrustListDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseInstanceNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseTypeNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseObjectNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseObjectTypeNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseVariableNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseVariableTypeNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseReferenceTypeNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseMethodNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseViewNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseDataTypeNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseReferenceNode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseArgument(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseEnumValueType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseOptionSet(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseTimeZoneDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseApplicationDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseRequestHeader(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseResponseHeader(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseServerOnNetwork(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseUserTokenPolicy(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseEndpointDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseRegisteredServer(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseMdnsDiscoveryConfiguration(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseChannelSecurityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseSignedSoftwareCertificate(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseSignatureData(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseUserIdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseAnonymousIdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseUserNameIdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseX509IdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseKerberosIdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseIssuedIdentityToken(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseNodeAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseObjectAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseVariableAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseMethodAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseObjectTypeAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseVariableTypeAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseReferenceTypeAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseDataTypeAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseViewAttributes(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseAddNodesItem(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseAddNodesResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseAddReferencesItem(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseDeleteNodesItem(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseDeleteReferencesItem(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseViewDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseBrowseDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseReferenceDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseBrowseResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseRelativePathElement(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseRelativePath(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseBrowsePath(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseBrowsePathTarget(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseBrowsePathResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseEndpointConfiguration(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseSupportedProfile(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseSoftwareCertificate(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseQueryDataDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseNodeTypeDescription(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseQueryDataSet(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseNodeReference(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseContentFilterElement(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseContentFilter(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseElementOperand(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseLiteralOperand(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseAttributeOperand(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseSimpleAttributeOperand(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseContentFilterElementResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseContentFilterResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseParsingResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseReadValueId(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseHistoryReadValueId(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseHistoryReadResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseReadEventDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseReadRawModifiedDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseReadProcessedDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseReadAtTimeDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseHistoryData(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseModificationInfo(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseHistoryModifiedData(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseHistoryEvent(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseWriteValue(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseHistoryUpdateDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseUpdateDataDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseUpdateStructureDataDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseUpdateEventDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseDeleteRawModifiedDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseDeleteAtTimeDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseDeleteEventDetails(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseHistoryUpdateResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseCallMethodRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseCallMethodResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseDataChangeFilter(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseEventFilter(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseAggregateConfiguration(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseAggregateFilter(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseEventFilterResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseAggregateFilterResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseMonitoringParameters(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseMonitoredItemCreateRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseMonitoredItemCreateResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseMonitoredItemModifyRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseMonitoredItemModifyResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseNotificationMessage(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseDataChangeNotification(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseMonitoredItemNotification(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseEventNotificationList(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseEventFieldList(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseHistoryEventFieldList(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseStatusChangeNotification(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseSubscriptionAcknowledgement(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseTransferResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseScalarTestType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseArrayTestType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseCompositeTestType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseBuildInfo(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseRedundantServerDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseEndpointUrlListDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseNetworkGroupDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseSamplingIntervalDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseServerDiagnosticsSummaryDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseServerStatusDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseSessionDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseSessionSecurityDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseServiceCounterDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseStatusResult(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseSubscriptionDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseModelChangeStructureDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseSemanticChangeStructureDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseRange(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseEUInformation(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseComplexNumberType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseDoubleComplexNumberType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseAxisInformation(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseXVType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseProgramDiagnosticDataType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseAnnotation(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+
+void registerComplexTypes(void);
diff --git a/plugins/epan/opcua/opcua_enumparser.c b/plugins/epan/opcua/opcua_enumparser.c
new file mode 100644
index 00000000..0a93376e
--- /dev/null
+++ b/plugins/epan/opcua/opcua_enumparser.c
@@ -0,0 +1,675 @@
+/******************************************************************************
+** Copyright (C) 2006-2015 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: OpcUa Enum Type Parser
+**
+** This file was autogenerated on 13.10.2015.
+** DON'T MODIFY THIS FILE!
+**
+******************************************************************************/
+
+#include "config.h"
+
+#include <epan/packet.h>
+
+#include "opcua_enumparser.h"
+
+gint ett_opcua_array_NodeIdType = -1;
+gint ett_opcua_array_NamingRuleType = -1;
+gint ett_opcua_array_OpenFileMode = -1;
+gint ett_opcua_array_TrustListMasks = -1;
+gint ett_opcua_array_IdType = -1;
+gint ett_opcua_array_NodeClass = -1;
+gint ett_opcua_array_ApplicationType = -1;
+gint ett_opcua_array_MessageSecurityMode = -1;
+gint ett_opcua_array_UserTokenType = -1;
+gint ett_opcua_array_SecurityTokenRequestType = -1;
+gint ett_opcua_array_NodeAttributesMask = -1;
+gint ett_opcua_array_AttributeWriteMask = -1;
+gint ett_opcua_array_BrowseDirection = -1;
+gint ett_opcua_array_BrowseResultMask = -1;
+gint ett_opcua_array_ComplianceLevel = -1;
+gint ett_opcua_array_FilterOperator = -1;
+gint ett_opcua_array_TimestampsToReturn = -1;
+gint ett_opcua_array_HistoryUpdateType = -1;
+gint ett_opcua_array_PerformUpdateType = -1;
+gint ett_opcua_array_MonitoringMode = -1;
+gint ett_opcua_array_DataChangeTrigger = -1;
+gint ett_opcua_array_DeadbandType = -1;
+gint ett_opcua_array_EnumeratedTestType = -1;
+gint ett_opcua_array_RedundancySupport = -1;
+gint ett_opcua_array_ServerState = -1;
+gint ett_opcua_array_ModelChangeStructureVerbMask = -1;
+gint ett_opcua_array_AxisScaleEnumeration = -1;
+gint ett_opcua_array_ExceptionDeviationFormat = -1;
+
+/** NodeIdType enum table */
+static const value_string g_NodeIdTypeTable[] = {
+ { 0, "TwoByte" },
+ { 1, "FourByte" },
+ { 2, "Numeric" },
+ { 3, "String" },
+ { 4, "Guid" },
+ { 5, "ByteString" },
+ { 0, NULL }
+};
+static int hf_opcua_NodeIdType = -1;
+
+void parseNodeIdType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_NodeIdType, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** NamingRuleType enum table */
+static const value_string g_NamingRuleTypeTable[] = {
+ { 1, "Mandatory" },
+ { 2, "Optional" },
+ { 3, "Constraint" },
+ { 0, NULL }
+};
+static int hf_opcua_NamingRuleType = -1;
+
+void parseNamingRuleType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_NamingRuleType, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** OpenFileMode enum table */
+static const value_string g_OpenFileModeTable[] = {
+ { 1, "Read" },
+ { 2, "Write" },
+ { 4, "EraseExisting" },
+ { 8, "Append" },
+ { 0, NULL }
+};
+static int hf_opcua_OpenFileMode = -1;
+
+void parseOpenFileMode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_OpenFileMode, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** TrustListMasks enum table */
+static const value_string g_TrustListMasksTable[] = {
+ { 0, "None" },
+ { 1, "TrustedCertificates" },
+ { 2, "TrustedCrls" },
+ { 4, "IssuerCertificates" },
+ { 8, "IssuerCrls" },
+ { 15, "All" },
+ { 0, NULL }
+};
+static int hf_opcua_TrustListMasks = -1;
+
+void parseTrustListMasks(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_TrustListMasks, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** IdType enum table */
+static const value_string g_IdTypeTable[] = {
+ { 0, "Numeric" },
+ { 1, "String" },
+ { 2, "Guid" },
+ { 3, "Opaque" },
+ { 0, NULL }
+};
+static int hf_opcua_IdType = -1;
+
+void parseIdType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_IdType, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** NodeClass enum table */
+static const value_string g_NodeClassTable[] = {
+ { 0, "Unspecified" },
+ { 1, "Object" },
+ { 2, "Variable" },
+ { 4, "Method" },
+ { 8, "ObjectType" },
+ { 16, "VariableType" },
+ { 32, "ReferenceType" },
+ { 64, "DataType" },
+ { 128, "View" },
+ { 0, NULL }
+};
+static int hf_opcua_NodeClass = -1;
+
+void parseNodeClass(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_NodeClass, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** ApplicationType enum table */
+static const value_string g_ApplicationTypeTable[] = {
+ { 0, "Server" },
+ { 1, "Client" },
+ { 2, "ClientAndServer" },
+ { 3, "DiscoveryServer" },
+ { 0, NULL }
+};
+static int hf_opcua_ApplicationType = -1;
+
+void parseApplicationType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_ApplicationType, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** MessageSecurityMode enum table */
+static const value_string g_MessageSecurityModeTable[] = {
+ { 0, "Invalid" },
+ { 1, "None" },
+ { 2, "Sign" },
+ { 3, "SignAndEncrypt" },
+ { 0, NULL }
+};
+static int hf_opcua_MessageSecurityMode = -1;
+
+void parseMessageSecurityMode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_MessageSecurityMode, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** UserTokenType enum table */
+static const value_string g_UserTokenTypeTable[] = {
+ { 0, "Anonymous" },
+ { 1, "UserName" },
+ { 2, "Certificate" },
+ { 3, "IssuedToken" },
+ { 4, "Kerberos" },
+ { 0, NULL }
+};
+static int hf_opcua_UserTokenType = -1;
+
+void parseUserTokenType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_UserTokenType, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** SecurityTokenRequestType enum table */
+static const value_string g_SecurityTokenRequestTypeTable[] = {
+ { 0, "Issue" },
+ { 1, "Renew" },
+ { 0, NULL }
+};
+static int hf_opcua_SecurityTokenRequestType = -1;
+
+void parseSecurityTokenRequestType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_SecurityTokenRequestType, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** NodeAttributesMask enum table */
+static const value_string g_NodeAttributesMaskTable[] = {
+ { 0, "None" },
+ { 1, "AccessLevel" },
+ { 2, "ArrayDimensions" },
+ { 4, "BrowseName" },
+ { 8, "ContainsNoLoops" },
+ { 16, "DataType" },
+ { 32, "Description" },
+ { 64, "DisplayName" },
+ { 128, "EventNotifier" },
+ { 256, "Executable" },
+ { 512, "Historizing" },
+ { 1024, "InverseName" },
+ { 2048, "IsAbstract" },
+ { 4096, "MinimumSamplingInterval" },
+ { 8192, "NodeClass" },
+ { 16384, "NodeId" },
+ { 32768, "Symmetric" },
+ { 65536, "UserAccessLevel" },
+ { 131072, "UserExecutable" },
+ { 262144, "UserWriteMask" },
+ { 524288, "ValueRank" },
+ { 1048576, "WriteMask" },
+ { 2097152, "Value" },
+ { 4194303, "All" },
+ { 1335396, "BaseNode" },
+ { 1335524, "Object" },
+ { 1337444, "ObjectTypeOrDataType" },
+ { 4026999, "Variable" },
+ { 3958902, "VariableType" },
+ { 1466724, "Method" },
+ { 1371236, "ReferenceType" },
+ { 1335532, "View" },
+ { 0, NULL }
+};
+static int hf_opcua_NodeAttributesMask = -1;
+
+void parseNodeAttributesMask(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_NodeAttributesMask, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** AttributeWriteMask enum table */
+static const value_string g_AttributeWriteMaskTable[] = {
+ { 0, "None" },
+ { 1, "AccessLevel" },
+ { 2, "ArrayDimensions" },
+ { 4, "BrowseName" },
+ { 8, "ContainsNoLoops" },
+ { 16, "DataType" },
+ { 32, "Description" },
+ { 64, "DisplayName" },
+ { 128, "EventNotifier" },
+ { 256, "Executable" },
+ { 512, "Historizing" },
+ { 1024, "InverseName" },
+ { 2048, "IsAbstract" },
+ { 4096, "MinimumSamplingInterval" },
+ { 8192, "NodeClass" },
+ { 16384, "NodeId" },
+ { 32768, "Symmetric" },
+ { 65536, "UserAccessLevel" },
+ { 131072, "UserExecutable" },
+ { 262144, "UserWriteMask" },
+ { 524288, "ValueRank" },
+ { 1048576, "WriteMask" },
+ { 2097152, "ValueForVariableType" },
+ { 4194304, "DataTypeDefinition" },
+ { 8388608, "RolePermissions" },
+ { 16777216, "AccessRestrictions" },
+ { 33554432, "AccessLevelEx" },
+ { 0, NULL }
+};
+static int hf_opcua_AttributeWriteMask = -1;
+
+void parseAttributeWriteMask(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_AttributeWriteMask, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** BrowseDirection enum table */
+static const value_string g_BrowseDirectionTable[] = {
+ { 0, "Forward" },
+ { 1, "Inverse" },
+ { 2, "Both" },
+ { 3, "Invalid" },
+ { 0, NULL }
+};
+static int hf_opcua_BrowseDirection = -1;
+
+void parseBrowseDirection(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_BrowseDirection, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+
+/** ComplianceLevel enum table */
+static const value_string g_ComplianceLevelTable[] = {
+ { 0, "Untested" },
+ { 1, "Partial" },
+ { 2, "SelfTested" },
+ { 3, "Certified" },
+ { 0, NULL }
+};
+static int hf_opcua_ComplianceLevel = -1;
+
+void parseComplianceLevel(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_ComplianceLevel, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** FilterOperator enum table */
+static const value_string g_FilterOperatorTable[] = {
+ { 0, "Equals" },
+ { 1, "IsNull" },
+ { 2, "GreaterThan" },
+ { 3, "LessThan" },
+ { 4, "GreaterThanOrEqual" },
+ { 5, "LessThanOrEqual" },
+ { 6, "Like" },
+ { 7, "Not" },
+ { 8, "Between" },
+ { 9, "InList" },
+ { 10, "And" },
+ { 11, "Or" },
+ { 12, "Cast" },
+ { 13, "InView" },
+ { 14, "OfType" },
+ { 15, "RelatedTo" },
+ { 16, "BitwiseAnd" },
+ { 17, "BitwiseOr" },
+ { 0, NULL }
+};
+static int hf_opcua_FilterOperator = -1;
+
+void parseFilterOperator(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_FilterOperator, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** TimestampsToReturn enum table */
+static const value_string g_TimestampsToReturnTable[] = {
+ { 0, "Source" },
+ { 1, "Server" },
+ { 2, "Both" },
+ { 3, "Neither" },
+ { 4, "Invalid" },
+ { 0, NULL }
+};
+static int hf_opcua_TimestampsToReturn = -1;
+
+void parseTimestampsToReturn(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_TimestampsToReturn, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** HistoryUpdateType enum table */
+static const value_string g_HistoryUpdateTypeTable[] = {
+ { 1, "Insert" },
+ { 2, "Replace" },
+ { 3, "Update" },
+ { 4, "Delete" },
+ { 0, NULL }
+};
+static int hf_opcua_HistoryUpdateType = -1;
+
+void parseHistoryUpdateType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_HistoryUpdateType, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** PerformUpdateType enum table */
+static const value_string g_PerformUpdateTypeTable[] = {
+ { 1, "Insert" },
+ { 2, "Replace" },
+ { 3, "Update" },
+ { 4, "Remove" },
+ { 0, NULL }
+};
+static int hf_opcua_PerformUpdateType = -1;
+
+void parsePerformUpdateType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_PerformUpdateType, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** MonitoringMode enum table */
+static const value_string g_MonitoringModeTable[] = {
+ { 0, "Disabled" },
+ { 1, "Sampling" },
+ { 2, "Reporting" },
+ { 0, NULL }
+};
+static int hf_opcua_MonitoringMode = -1;
+
+void parseMonitoringMode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_MonitoringMode, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** DataChangeTrigger enum table */
+static const value_string g_DataChangeTriggerTable[] = {
+ { 0, "Status" },
+ { 1, "StatusValue" },
+ { 2, "StatusValueTimestamp" },
+ { 0, NULL }
+};
+static int hf_opcua_DataChangeTrigger = -1;
+
+void parseDataChangeTrigger(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_DataChangeTrigger, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** DeadbandType enum table */
+static const value_string g_DeadbandTypeTable[] = {
+ { 0, "None" },
+ { 1, "Absolute" },
+ { 2, "Percent" },
+ { 0, NULL }
+};
+static int hf_opcua_DeadbandType = -1;
+
+void parseDeadbandType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_DeadbandType, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** EnumeratedTestType enum table */
+static const value_string g_EnumeratedTestTypeTable[] = {
+ { 1, "Red" },
+ { 4, "Yellow" },
+ { 5, "Green" },
+ { 0, NULL }
+};
+static int hf_opcua_EnumeratedTestType = -1;
+
+void parseEnumeratedTestType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_EnumeratedTestType, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** RedundancySupport enum table */
+static const value_string g_RedundancySupportTable[] = {
+ { 0, "None" },
+ { 1, "Cold" },
+ { 2, "Warm" },
+ { 3, "Hot" },
+ { 4, "Transparent" },
+ { 5, "HotAndMirrored" },
+ { 0, NULL }
+};
+static int hf_opcua_RedundancySupport = -1;
+
+void parseRedundancySupport(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_RedundancySupport, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** ServerState enum table */
+static const value_string g_ServerStateTable[] = {
+ { 0, "Running" },
+ { 1, "Failed" },
+ { 2, "NoConfiguration" },
+ { 3, "Suspended" },
+ { 4, "Shutdown" },
+ { 5, "Test" },
+ { 6, "CommunicationFault" },
+ { 7, "Unknown" },
+ { 0, NULL }
+};
+static int hf_opcua_ServerState = -1;
+
+void parseServerState(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_ServerState, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** ModelChangeStructureVerbMask enum table */
+static const value_string g_ModelChangeStructureVerbMaskTable[] = {
+ { 1, "NodeAdded" },
+ { 2, "NodeDeleted" },
+ { 4, "ReferenceAdded" },
+ { 8, "ReferenceDeleted" },
+ { 16, "DataTypeChanged" },
+ { 0, NULL }
+};
+static int hf_opcua_ModelChangeStructureVerbMask = -1;
+
+void parseModelChangeStructureVerbMask(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_ModelChangeStructureVerbMask, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** AxisScaleEnumeration enum table */
+static const value_string g_AxisScaleEnumerationTable[] = {
+ { 0, "Linear" },
+ { 1, "Log" },
+ { 2, "Ln" },
+ { 0, NULL }
+};
+static int hf_opcua_AxisScaleEnumeration = -1;
+
+void parseAxisScaleEnumeration(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_AxisScaleEnumeration, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** ExceptionDeviationFormat enum table */
+static const value_string g_ExceptionDeviationFormatTable[] = {
+ { 0, "AbsoluteValue" },
+ { 1, "PercentOfValue" },
+ { 2, "PercentOfRange" },
+ { 3, "PercentOfEURange" },
+ { 4, "Unknown" },
+ { 0, NULL }
+};
+static int hf_opcua_ExceptionDeviationFormat = -1;
+
+void parseExceptionDeviationFormat(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_ExceptionDeviationFormat, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+/** AttributeId enum table */
+static const value_string g_AttributeIdTable[] = {
+ {1, "NodeId"},
+ {2, "NodeClass"},
+ {3, "BrowseName"},
+ {4, "DisplayName"},
+ {5, "Description"},
+ {6, "WriteMask"},
+ {7, "UserWriteMask"},
+ {8, "IsAbstract"},
+ {9, "Symmetric"},
+ {10, "InverseName"},
+ {11, "ContainsNoLoops"},
+ {12, "EventNotifier"},
+ {13, "Value"},
+ {14, "DataType"},
+ {15, "ValueRank"},
+ {16, "ArrayDimensions"},
+ {17, "AccessLevel"},
+ {18, "UserAccessLevel"},
+ {19, "MinimumSamplingInterval"},
+ {20, "Historizing"},
+ {21, "Executable"},
+ {22, "UserExecutable"},
+ {23, "DataTypeDefinition"},
+ {24, "RolePermissions"},
+ {25, "UserRolePermissions"},
+ {26, "AccessRestrictions"},
+ {27, "AccessLevelEx"},
+ {0, NULL}
+};
+static int hf_opcua_AttributeId = -1;
+
+void parseAttributeId(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_AttributeId, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset += 4;
+}
+
+/** Setup enum subtree array */
+static gint *ett[] =
+{
+ &ett_opcua_array_NodeIdType,
+ &ett_opcua_array_NamingRuleType,
+ &ett_opcua_array_OpenFileMode,
+ &ett_opcua_array_TrustListMasks,
+ &ett_opcua_array_IdType,
+ &ett_opcua_array_NodeClass,
+ &ett_opcua_array_ApplicationType,
+ &ett_opcua_array_MessageSecurityMode,
+ &ett_opcua_array_UserTokenType,
+ &ett_opcua_array_SecurityTokenRequestType,
+ &ett_opcua_array_NodeAttributesMask,
+ &ett_opcua_array_AttributeWriteMask,
+ &ett_opcua_array_BrowseDirection,
+ &ett_opcua_array_BrowseResultMask,
+ &ett_opcua_array_ComplianceLevel,
+ &ett_opcua_array_FilterOperator,
+ &ett_opcua_array_TimestampsToReturn,
+ &ett_opcua_array_HistoryUpdateType,
+ &ett_opcua_array_PerformUpdateType,
+ &ett_opcua_array_MonitoringMode,
+ &ett_opcua_array_DataChangeTrigger,
+ &ett_opcua_array_DeadbandType,
+ &ett_opcua_array_EnumeratedTestType,
+ &ett_opcua_array_RedundancySupport,
+ &ett_opcua_array_ServerState,
+ &ett_opcua_array_ModelChangeStructureVerbMask,
+ &ett_opcua_array_AxisScaleEnumeration,
+ &ett_opcua_array_ExceptionDeviationFormat,
+};
+
+/** Register enum types. */
+void registerEnumTypes(int proto)
+{
+ /** header field definitions */
+ static hf_register_info hf[] =
+ {
+ { &hf_opcua_NodeIdType,
+ { "NodeIdType", "opcua.NodeIdType", FT_UINT32, BASE_HEX, VALS(g_NodeIdTypeTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_NamingRuleType,
+ { "NamingRuleType", "opcua.NamingRuleType", FT_UINT32, BASE_HEX, VALS(g_NamingRuleTypeTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_OpenFileMode,
+ { "OpenFileMode", "opcua.OpenFileMode", FT_UINT32, BASE_HEX, VALS(g_OpenFileModeTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_TrustListMasks,
+ { "TrustListMasks", "opcua.TrustListMasks", FT_UINT32, BASE_HEX, VALS(g_TrustListMasksTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_IdType,
+ { "IdType", "opcua.IdType", FT_UINT32, BASE_HEX, VALS(g_IdTypeTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_NodeClass,
+ { "NodeClass", "opcua.NodeClass", FT_UINT32, BASE_HEX, VALS(g_NodeClassTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_ApplicationType,
+ { "ApplicationType", "opcua.ApplicationType", FT_UINT32, BASE_HEX, VALS(g_ApplicationTypeTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_MessageSecurityMode,
+ { "MessageSecurityMode", "opcua.MessageSecurityMode", FT_UINT32, BASE_HEX, VALS(g_MessageSecurityModeTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_UserTokenType,
+ { "UserTokenType", "opcua.UserTokenType", FT_UINT32, BASE_HEX, VALS(g_UserTokenTypeTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_SecurityTokenRequestType,
+ { "SecurityTokenRequestType", "opcua.SecurityTokenRequestType", FT_UINT32, BASE_HEX, VALS(g_SecurityTokenRequestTypeTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_NodeAttributesMask,
+ { "NodeAttributesMask", "opcua.NodeAttributesMask", FT_UINT32, BASE_HEX, VALS(g_NodeAttributesMaskTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_AttributeWriteMask,
+ { "AttributeWriteMask", "opcua.AttributeWriteMask", FT_UINT32, BASE_HEX, VALS(g_AttributeWriteMaskTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_BrowseDirection,
+ { "BrowseDirection", "opcua.BrowseDirection", FT_UINT32, BASE_HEX, VALS(g_BrowseDirectionTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_ComplianceLevel,
+ { "ComplianceLevel", "opcua.ComplianceLevel", FT_UINT32, BASE_HEX, VALS(g_ComplianceLevelTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_FilterOperator,
+ { "FilterOperator", "opcua.FilterOperator", FT_UINT32, BASE_HEX, VALS(g_FilterOperatorTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_TimestampsToReturn,
+ { "TimestampsToReturn", "opcua.TimestampsToReturn", FT_UINT32, BASE_HEX, VALS(g_TimestampsToReturnTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_HistoryUpdateType,
+ { "HistoryUpdateType", "opcua.HistoryUpdateType", FT_UINT32, BASE_HEX, VALS(g_HistoryUpdateTypeTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_PerformUpdateType,
+ { "PerformUpdateType", "opcua.PerformUpdateType", FT_UINT32, BASE_HEX, VALS(g_PerformUpdateTypeTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_MonitoringMode,
+ { "MonitoringMode", "opcua.MonitoringMode", FT_UINT32, BASE_HEX, VALS(g_MonitoringModeTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_DataChangeTrigger,
+ { "DataChangeTrigger", "opcua.DataChangeTrigger", FT_UINT32, BASE_HEX, VALS(g_DataChangeTriggerTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_DeadbandType,
+ { "DeadbandType", "opcua.DeadbandType", FT_UINT32, BASE_HEX, VALS(g_DeadbandTypeTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_EnumeratedTestType,
+ { "EnumeratedTestType", "opcua.EnumeratedTestType", FT_UINT32, BASE_HEX, VALS(g_EnumeratedTestTypeTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_RedundancySupport,
+ { "RedundancySupport", "opcua.RedundancySupport", FT_UINT32, BASE_HEX, VALS(g_RedundancySupportTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_ServerState,
+ { "ServerState", "opcua.ServerState", FT_UINT32, BASE_HEX, VALS(g_ServerStateTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_ModelChangeStructureVerbMask,
+ { "ModelChangeStructureVerbMask", "opcua.ModelChangeStructureVerbMask", FT_UINT32, BASE_HEX, VALS(g_ModelChangeStructureVerbMaskTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_AxisScaleEnumeration,
+ { "AxisScaleEnumeration", "opcua.AxisScaleEnumeration", FT_UINT32, BASE_HEX, VALS(g_AxisScaleEnumerationTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_ExceptionDeviationFormat,
+ { "ExceptionDeviationFormat", "opcua.ExceptionDeviationFormat", FT_UINT32, BASE_HEX, VALS(g_ExceptionDeviationFormatTable), 0x0, NULL, HFILL }
+ },
+ { &hf_opcua_AttributeId,
+ { "AttributeId", "opcua.AttributeId", FT_UINT32, BASE_HEX, VALS(g_AttributeIdTable), 0x0, NULL, HFILL }
+ },
+ };
+
+ proto_register_field_array(proto, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+}
+
diff --git a/plugins/epan/opcua/opcua_enumparser.h b/plugins/epan/opcua/opcua_enumparser.h
new file mode 100644
index 00000000..c52aa9a3
--- /dev/null
+++ b/plugins/epan/opcua/opcua_enumparser.h
@@ -0,0 +1,81 @@
+/******************************************************************************
+** Copyright (C) 2006-2015 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: OpcUa Enum Type Parser
+**
+** This file was autogenerated on 13.10.2015.
+** DON'T MODIFY THIS FILE!
+** XXX - well, except that you may have to. See the README.
+**
+******************************************************************************/
+
+#include <glib.h>
+#include <epan/packet.h>
+
+extern gint ett_opcua_array_NodeIdType;
+extern gint ett_opcua_array_NamingRuleType;
+extern gint ett_opcua_array_OpenFileMode;
+extern gint ett_opcua_array_TrustListMasks;
+extern gint ett_opcua_array_IdType;
+extern gint ett_opcua_array_NodeClass;
+extern gint ett_opcua_array_ApplicationType;
+extern gint ett_opcua_array_MessageSecurityMode;
+extern gint ett_opcua_array_UserTokenType;
+extern gint ett_opcua_array_SecurityTokenRequestType;
+extern gint ett_opcua_array_NodeAttributesMask;
+extern gint ett_opcua_array_AttributeWriteMask;
+extern gint ett_opcua_array_BrowseDirection;
+extern gint ett_opcua_array_BrowseResultMask;
+extern gint ett_opcua_array_ComplianceLevel;
+extern gint ett_opcua_array_FilterOperator;
+extern gint ett_opcua_array_TimestampsToReturn;
+extern gint ett_opcua_array_HistoryUpdateType;
+extern gint ett_opcua_array_PerformUpdateType;
+extern gint ett_opcua_array_MonitoringMode;
+extern gint ett_opcua_array_DataChangeTrigger;
+extern gint ett_opcua_array_DeadbandType;
+extern gint ett_opcua_array_EnumeratedTestType;
+extern gint ett_opcua_array_RedundancySupport;
+extern gint ett_opcua_array_ServerState;
+extern gint ett_opcua_array_ModelChangeStructureVerbMask;
+extern gint ett_opcua_array_AxisScaleEnumeration;
+extern gint ett_opcua_array_ExceptionDeviationFormat;
+extern gint ett_opcua_array_AttributeId;
+
+void parseNodeIdType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseNamingRuleType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseOpenFileMode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseTrustListMasks(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseIdType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseNodeClass(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseApplicationType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseMessageSecurityMode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseUserTokenType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseSecurityTokenRequestType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseNodeAttributesMask(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseAttributeWriteMask(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseBrowseDirection(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseComplianceLevel(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseFilterOperator(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseTimestampsToReturn(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseHistoryUpdateType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parsePerformUpdateType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseMonitoringMode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseDataChangeTrigger(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseDeadbandType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseEnumeratedTestType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseRedundancySupport(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseServerState(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseModelChangeStructureVerbMask(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseAxisScaleEnumeration(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseExceptionDeviationFormat(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseAttributeId(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void registerEnumTypes(int proto);
diff --git a/plugins/epan/opcua/opcua_extensionobjectids.h b/plugins/epan/opcua/opcua_extensionobjectids.h
new file mode 100644
index 00000000..321a74df
--- /dev/null
+++ b/plugins/epan/opcua/opcua_extensionobjectids.h
@@ -0,0 +1,159 @@
+/******************************************************************************
+** Copyright (C) 2006-2015 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: OpcUa Extension Object IDs
+**
+** This file was autogenerated on 13.10.2015.
+** DON'T MODIFY THIS FILE!
+**
+******************************************************************************/
+
+#define OpcUaId_TrustListDataType_Encoding_DefaultBinary 12680
+#define OpcUaId_Node_Encoding_DefaultBinary 260
+#define OpcUaId_InstanceNode_Encoding_DefaultBinary 11889
+#define OpcUaId_TypeNode_Encoding_DefaultBinary 11890
+#define OpcUaId_ObjectNode_Encoding_DefaultBinary 263
+#define OpcUaId_ObjectTypeNode_Encoding_DefaultBinary 266
+#define OpcUaId_VariableNode_Encoding_DefaultBinary 269
+#define OpcUaId_VariableTypeNode_Encoding_DefaultBinary 272
+#define OpcUaId_ReferenceTypeNode_Encoding_DefaultBinary 275
+#define OpcUaId_MethodNode_Encoding_DefaultBinary 278
+#define OpcUaId_ViewNode_Encoding_DefaultBinary 281
+#define OpcUaId_DataTypeNode_Encoding_DefaultBinary 284
+#define OpcUaId_ReferenceNode_Encoding_DefaultBinary 287
+#define OpcUaId_Argument_Encoding_DefaultBinary 298
+#define OpcUaId_EnumValueType_Encoding_DefaultBinary 8251
+#define OpcUaId_OptionSet_Encoding_DefaultBinary 12765
+#define OpcUaId_TimeZoneDataType_Encoding_DefaultBinary 8917
+#define OpcUaId_ApplicationDescription_Encoding_DefaultBinary 310
+#define OpcUaId_RequestHeader_Encoding_DefaultBinary 391
+#define OpcUaId_ResponseHeader_Encoding_DefaultBinary 394
+#define OpcUaId_ServerOnNetwork_Encoding_DefaultBinary 12207
+#define OpcUaId_UserTokenPolicy_Encoding_DefaultBinary 306
+#define OpcUaId_EndpointDescription_Encoding_DefaultBinary 314
+#define OpcUaId_RegisteredServer_Encoding_DefaultBinary 434
+#define OpcUaId_MdnsDiscoveryConfiguration_Encoding_DefaultBinary 12901
+#define OpcUaId_ChannelSecurityToken_Encoding_DefaultBinary 443
+#define OpcUaId_SignedSoftwareCertificate_Encoding_DefaultBinary 346
+#define OpcUaId_SignatureData_Encoding_DefaultBinary 458
+#define OpcUaId_UserIdentityToken_Encoding_DefaultBinary 318
+#define OpcUaId_AnonymousIdentityToken_Encoding_DefaultBinary 321
+#define OpcUaId_UserNameIdentityToken_Encoding_DefaultBinary 324
+#define OpcUaId_X509IdentityToken_Encoding_DefaultBinary 327
+#define OpcUaId_KerberosIdentityToken_Encoding_DefaultBinary 12509
+#define OpcUaId_IssuedIdentityToken_Encoding_DefaultBinary 940
+#define OpcUaId_NodeAttributes_Encoding_DefaultBinary 351
+#define OpcUaId_ObjectAttributes_Encoding_DefaultBinary 354
+#define OpcUaId_VariableAttributes_Encoding_DefaultBinary 357
+#define OpcUaId_MethodAttributes_Encoding_DefaultBinary 360
+#define OpcUaId_ObjectTypeAttributes_Encoding_DefaultBinary 363
+#define OpcUaId_VariableTypeAttributes_Encoding_DefaultBinary 366
+#define OpcUaId_ReferenceTypeAttributes_Encoding_DefaultBinary 369
+#define OpcUaId_DataTypeAttributes_Encoding_DefaultBinary 372
+#define OpcUaId_ViewAttributes_Encoding_DefaultBinary 375
+#define OpcUaId_AddNodesItem_Encoding_DefaultBinary 378
+#define OpcUaId_AddNodesResult_Encoding_DefaultBinary 485
+#define OpcUaId_AddReferencesItem_Encoding_DefaultBinary 381
+#define OpcUaId_DeleteNodesItem_Encoding_DefaultBinary 384
+#define OpcUaId_DeleteReferencesItem_Encoding_DefaultBinary 387
+#define OpcUaId_ViewDescription_Encoding_DefaultBinary 513
+#define OpcUaId_BrowseDescription_Encoding_DefaultBinary 516
+#define OpcUaId_ReferenceDescription_Encoding_DefaultBinary 520
+#define OpcUaId_BrowseResult_Encoding_DefaultBinary 524
+#define OpcUaId_RelativePathElement_Encoding_DefaultBinary 539
+#define OpcUaId_RelativePath_Encoding_DefaultBinary 542
+#define OpcUaId_BrowsePath_Encoding_DefaultBinary 545
+#define OpcUaId_BrowsePathTarget_Encoding_DefaultBinary 548
+#define OpcUaId_BrowsePathResult_Encoding_DefaultBinary 551
+#define OpcUaId_EndpointConfiguration_Encoding_DefaultBinary 333
+#define OpcUaId_SupportedProfile_Encoding_DefaultBinary 337
+#define OpcUaId_SoftwareCertificate_Encoding_DefaultBinary 343
+#define OpcUaId_QueryDataDescription_Encoding_DefaultBinary 572
+#define OpcUaId_NodeTypeDescription_Encoding_DefaultBinary 575
+#define OpcUaId_QueryDataSet_Encoding_DefaultBinary 579
+#define OpcUaId_NodeReference_Encoding_DefaultBinary 582
+#define OpcUaId_ContentFilterElement_Encoding_DefaultBinary 585
+#define OpcUaId_ContentFilter_Encoding_DefaultBinary 588
+#define OpcUaId_ElementOperand_Encoding_DefaultBinary 594
+#define OpcUaId_LiteralOperand_Encoding_DefaultBinary 597
+#define OpcUaId_AttributeOperand_Encoding_DefaultBinary 600
+#define OpcUaId_SimpleAttributeOperand_Encoding_DefaultBinary 603
+#define OpcUaId_ContentFilterElementResult_Encoding_DefaultBinary 606
+#define OpcUaId_ContentFilterResult_Encoding_DefaultBinary 609
+#define OpcUaId_ParsingResult_Encoding_DefaultBinary 612
+#define OpcUaId_ReadValueId_Encoding_DefaultBinary 628
+#define OpcUaId_HistoryReadValueId_Encoding_DefaultBinary 637
+#define OpcUaId_HistoryReadResult_Encoding_DefaultBinary 640
+#define OpcUaId_ReadEventDetails_Encoding_DefaultBinary 646
+#define OpcUaId_ReadRawModifiedDetails_Encoding_DefaultBinary 649
+#define OpcUaId_ReadProcessedDetails_Encoding_DefaultBinary 652
+#define OpcUaId_ReadAtTimeDetails_Encoding_DefaultBinary 655
+#define OpcUaId_HistoryData_Encoding_DefaultBinary 658
+#define OpcUaId_ModificationInfo_Encoding_DefaultBinary 11226
+#define OpcUaId_HistoryModifiedData_Encoding_DefaultBinary 11227
+#define OpcUaId_HistoryEvent_Encoding_DefaultBinary 661
+#define OpcUaId_WriteValue_Encoding_DefaultBinary 670
+#define OpcUaId_HistoryUpdateDetails_Encoding_DefaultBinary 679
+#define OpcUaId_UpdateDataDetails_Encoding_DefaultBinary 682
+#define OpcUaId_UpdateStructureDataDetails_Encoding_DefaultBinary 11300
+#define OpcUaId_UpdateEventDetails_Encoding_DefaultBinary 685
+#define OpcUaId_DeleteRawModifiedDetails_Encoding_DefaultBinary 688
+#define OpcUaId_DeleteAtTimeDetails_Encoding_DefaultBinary 691
+#define OpcUaId_DeleteEventDetails_Encoding_DefaultBinary 694
+#define OpcUaId_HistoryUpdateResult_Encoding_DefaultBinary 697
+#define OpcUaId_CallMethodRequest_Encoding_DefaultBinary 706
+#define OpcUaId_CallMethodResult_Encoding_DefaultBinary 709
+#define OpcUaId_DataChangeFilter_Encoding_DefaultBinary 724
+#define OpcUaId_EventFilter_Encoding_DefaultBinary 727
+#define OpcUaId_AggregateConfiguration_Encoding_DefaultBinary 950
+#define OpcUaId_AggregateFilter_Encoding_DefaultBinary 730
+#define OpcUaId_EventFilterResult_Encoding_DefaultBinary 736
+#define OpcUaId_AggregateFilterResult_Encoding_DefaultBinary 739
+#define OpcUaId_MonitoringParameters_Encoding_DefaultBinary 742
+#define OpcUaId_MonitoredItemCreateRequest_Encoding_DefaultBinary 745
+#define OpcUaId_MonitoredItemCreateResult_Encoding_DefaultBinary 748
+#define OpcUaId_MonitoredItemModifyRequest_Encoding_DefaultBinary 757
+#define OpcUaId_MonitoredItemModifyResult_Encoding_DefaultBinary 760
+#define OpcUaId_NotificationMessage_Encoding_DefaultBinary 805
+#define OpcUaId_DataChangeNotification_Encoding_DefaultBinary 811
+#define OpcUaId_MonitoredItemNotification_Encoding_DefaultBinary 808
+#define OpcUaId_EventNotificationList_Encoding_DefaultBinary 916
+#define OpcUaId_EventFieldList_Encoding_DefaultBinary 919
+#define OpcUaId_HistoryEventFieldList_Encoding_DefaultBinary 922
+#define OpcUaId_StatusChangeNotification_Encoding_DefaultBinary 820
+#define OpcUaId_SubscriptionAcknowledgement_Encoding_DefaultBinary 823
+#define OpcUaId_TransferResult_Encoding_DefaultBinary 838
+#define OpcUaId_ScalarTestType_Encoding_DefaultBinary 401
+#define OpcUaId_ArrayTestType_Encoding_DefaultBinary 404
+#define OpcUaId_CompositeTestType_Encoding_DefaultBinary 407
+#define OpcUaId_BuildInfo_Encoding_DefaultBinary 340
+#define OpcUaId_RedundantServerDataType_Encoding_DefaultBinary 855
+#define OpcUaId_EndpointUrlListDataType_Encoding_DefaultBinary 11957
+#define OpcUaId_NetworkGroupDataType_Encoding_DefaultBinary 11958
+#define OpcUaId_SamplingIntervalDiagnosticsDataType_Encoding_DefaultBinary 858
+#define OpcUaId_ServerDiagnosticsSummaryDataType_Encoding_DefaultBinary 861
+#define OpcUaId_ServerStatusDataType_Encoding_DefaultBinary 864
+#define OpcUaId_SessionDiagnosticsDataType_Encoding_DefaultBinary 867
+#define OpcUaId_SessionSecurityDiagnosticsDataType_Encoding_DefaultBinary 870
+#define OpcUaId_ServiceCounterDataType_Encoding_DefaultBinary 873
+#define OpcUaId_StatusResult_Encoding_DefaultBinary 301
+#define OpcUaId_SubscriptionDiagnosticsDataType_Encoding_DefaultBinary 876
+#define OpcUaId_ModelChangeStructureDataType_Encoding_DefaultBinary 879
+#define OpcUaId_SemanticChangeStructureDataType_Encoding_DefaultBinary 899
+#define OpcUaId_Range_Encoding_DefaultBinary 886
+#define OpcUaId_EUInformation_Encoding_DefaultBinary 889
+#define OpcUaId_ComplexNumberType_Encoding_DefaultBinary 12181
+#define OpcUaId_DoubleComplexNumberType_Encoding_DefaultBinary 12182
+#define OpcUaId_AxisInformation_Encoding_DefaultBinary 12089
+#define OpcUaId_XVType_Encoding_DefaultBinary 12090
+#define OpcUaId_ProgramDiagnosticDataType_Encoding_DefaultBinary 896
+#define OpcUaId_Annotation_Encoding_DefaultBinary 893
+
diff --git a/plugins/epan/opcua/opcua_extensionobjecttable.c b/plugins/epan/opcua/opcua_extensionobjecttable.c
new file mode 100644
index 00000000..2b9ae3c9
--- /dev/null
+++ b/plugins/epan/opcua/opcua_extensionobjecttable.c
@@ -0,0 +1,215 @@
+/******************************************************************************
+** Copyright (C) 2006-2015 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: Service table and service dispatcher.
+**
+** This file was autogenerated on 13.10.2015.
+** DON'T MODIFY THIS FILE!
+** XXX - well, except that you may have to. See the README.
+**
+******************************************************************************/
+
+#include "config.h"
+
+#include <epan/packet.h>
+#include "opcua_simpletypes.h"
+#include "opcua_complextypeparser.h"
+#include "opcua_extensionobjectids.h"
+#include "opcua_hfindeces.h"
+
+ExtensionObjectParserEntry g_arExtensionObjectParserTable[] = {
+ { OpcUaId_TrustListDataType_Encoding_DefaultBinary, parseTrustListDataType, "TrustListDataType" },
+ { OpcUaId_Node_Encoding_DefaultBinary, parseNode, "Node" },
+ { OpcUaId_InstanceNode_Encoding_DefaultBinary, parseInstanceNode, "InstanceNode" },
+ { OpcUaId_TypeNode_Encoding_DefaultBinary, parseTypeNode, "TypeNode" },
+ { OpcUaId_ObjectNode_Encoding_DefaultBinary, parseObjectNode, "ObjectNode" },
+ { OpcUaId_ObjectTypeNode_Encoding_DefaultBinary, parseObjectTypeNode, "ObjectTypeNode" },
+ { OpcUaId_VariableNode_Encoding_DefaultBinary, parseVariableNode, "VariableNode" },
+ { OpcUaId_VariableTypeNode_Encoding_DefaultBinary, parseVariableTypeNode, "VariableTypeNode" },
+ { OpcUaId_ReferenceTypeNode_Encoding_DefaultBinary, parseReferenceTypeNode, "ReferenceTypeNode" },
+ { OpcUaId_MethodNode_Encoding_DefaultBinary, parseMethodNode, "MethodNode" },
+ { OpcUaId_ViewNode_Encoding_DefaultBinary, parseViewNode, "ViewNode" },
+ { OpcUaId_DataTypeNode_Encoding_DefaultBinary, parseDataTypeNode, "DataTypeNode" },
+ { OpcUaId_ReferenceNode_Encoding_DefaultBinary, parseReferenceNode, "ReferenceNode" },
+ { OpcUaId_Argument_Encoding_DefaultBinary, parseArgument, "Argument" },
+ { OpcUaId_EnumValueType_Encoding_DefaultBinary, parseEnumValueType, "EnumValueType" },
+ { OpcUaId_OptionSet_Encoding_DefaultBinary, parseOptionSet, "OptionSet" },
+ { OpcUaId_TimeZoneDataType_Encoding_DefaultBinary, parseTimeZoneDataType, "TimeZoneDataType" },
+ { OpcUaId_ApplicationDescription_Encoding_DefaultBinary, parseApplicationDescription, "ApplicationDescription" },
+ { OpcUaId_RequestHeader_Encoding_DefaultBinary, parseRequestHeader, "RequestHeader" },
+ { OpcUaId_ResponseHeader_Encoding_DefaultBinary, parseResponseHeader, "ResponseHeader" },
+ { OpcUaId_ServerOnNetwork_Encoding_DefaultBinary, parseServerOnNetwork, "ServerOnNetwork" },
+ { OpcUaId_UserTokenPolicy_Encoding_DefaultBinary, parseUserTokenPolicy, "UserTokenPolicy" },
+ { OpcUaId_EndpointDescription_Encoding_DefaultBinary, parseEndpointDescription, "EndpointDescription" },
+ { OpcUaId_RegisteredServer_Encoding_DefaultBinary, parseRegisteredServer, "RegisteredServer" },
+ { OpcUaId_MdnsDiscoveryConfiguration_Encoding_DefaultBinary, parseMdnsDiscoveryConfiguration, "MdnsDiscoveryConfiguration" },
+ { OpcUaId_ChannelSecurityToken_Encoding_DefaultBinary, parseChannelSecurityToken, "ChannelSecurityToken" },
+ { OpcUaId_SignedSoftwareCertificate_Encoding_DefaultBinary, parseSignedSoftwareCertificate, "SignedSoftwareCertificate" },
+ { OpcUaId_SignatureData_Encoding_DefaultBinary, parseSignatureData, "SignatureData" },
+ { OpcUaId_UserIdentityToken_Encoding_DefaultBinary, parseUserIdentityToken, "UserIdentityToken" },
+ { OpcUaId_AnonymousIdentityToken_Encoding_DefaultBinary, parseAnonymousIdentityToken, "AnonymousIdentityToken" },
+ { OpcUaId_UserNameIdentityToken_Encoding_DefaultBinary, parseUserNameIdentityToken, "UserNameIdentityToken" },
+ { OpcUaId_X509IdentityToken_Encoding_DefaultBinary, parseX509IdentityToken, "X509IdentityToken" },
+ { OpcUaId_KerberosIdentityToken_Encoding_DefaultBinary, parseKerberosIdentityToken, "KerberosIdentityToken" },
+ { OpcUaId_IssuedIdentityToken_Encoding_DefaultBinary, parseIssuedIdentityToken, "IssuedIdentityToken" },
+ { OpcUaId_NodeAttributes_Encoding_DefaultBinary, parseNodeAttributes, "NodeAttributes" },
+ { OpcUaId_ObjectAttributes_Encoding_DefaultBinary, parseObjectAttributes, "ObjectAttributes" },
+ { OpcUaId_VariableAttributes_Encoding_DefaultBinary, parseVariableAttributes, "VariableAttributes" },
+ { OpcUaId_MethodAttributes_Encoding_DefaultBinary, parseMethodAttributes, "MethodAttributes" },
+ { OpcUaId_ObjectTypeAttributes_Encoding_DefaultBinary, parseObjectTypeAttributes, "ObjectTypeAttributes" },
+ { OpcUaId_VariableTypeAttributes_Encoding_DefaultBinary, parseVariableTypeAttributes, "VariableTypeAttributes" },
+ { OpcUaId_ReferenceTypeAttributes_Encoding_DefaultBinary, parseReferenceTypeAttributes, "ReferenceTypeAttributes" },
+ { OpcUaId_DataTypeAttributes_Encoding_DefaultBinary, parseDataTypeAttributes, "DataTypeAttributes" },
+ { OpcUaId_ViewAttributes_Encoding_DefaultBinary, parseViewAttributes, "ViewAttributes" },
+ { OpcUaId_AddNodesItem_Encoding_DefaultBinary, parseAddNodesItem, "AddNodesItem" },
+ { OpcUaId_AddNodesResult_Encoding_DefaultBinary, parseAddNodesResult, "AddNodesResult" },
+ { OpcUaId_AddReferencesItem_Encoding_DefaultBinary, parseAddReferencesItem, "AddReferencesItem" },
+ { OpcUaId_DeleteNodesItem_Encoding_DefaultBinary, parseDeleteNodesItem, "DeleteNodesItem" },
+ { OpcUaId_DeleteReferencesItem_Encoding_DefaultBinary, parseDeleteReferencesItem, "DeleteReferencesItem" },
+ { OpcUaId_ViewDescription_Encoding_DefaultBinary, parseViewDescription, "ViewDescription" },
+ { OpcUaId_BrowseDescription_Encoding_DefaultBinary, parseBrowseDescription, "BrowseDescription" },
+ { OpcUaId_ReferenceDescription_Encoding_DefaultBinary, parseReferenceDescription, "ReferenceDescription" },
+ { OpcUaId_BrowseResult_Encoding_DefaultBinary, parseBrowseResult, "BrowseResult" },
+ { OpcUaId_RelativePathElement_Encoding_DefaultBinary, parseRelativePathElement, "RelativePathElement" },
+ { OpcUaId_RelativePath_Encoding_DefaultBinary, parseRelativePath, "RelativePath" },
+ { OpcUaId_BrowsePath_Encoding_DefaultBinary, parseBrowsePath, "BrowsePath" },
+ { OpcUaId_BrowsePathTarget_Encoding_DefaultBinary, parseBrowsePathTarget, "BrowsePathTarget" },
+ { OpcUaId_BrowsePathResult_Encoding_DefaultBinary, parseBrowsePathResult, "BrowsePathResult" },
+ { OpcUaId_EndpointConfiguration_Encoding_DefaultBinary, parseEndpointConfiguration, "EndpointConfiguration" },
+ { OpcUaId_SupportedProfile_Encoding_DefaultBinary, parseSupportedProfile, "SupportedProfile" },
+ { OpcUaId_SoftwareCertificate_Encoding_DefaultBinary, parseSoftwareCertificate, "SoftwareCertificate" },
+ { OpcUaId_QueryDataDescription_Encoding_DefaultBinary, parseQueryDataDescription, "QueryDataDescription" },
+ { OpcUaId_NodeTypeDescription_Encoding_DefaultBinary, parseNodeTypeDescription, "NodeTypeDescription" },
+ { OpcUaId_QueryDataSet_Encoding_DefaultBinary, parseQueryDataSet, "QueryDataSet" },
+ { OpcUaId_NodeReference_Encoding_DefaultBinary, parseNodeReference, "NodeReference" },
+ { OpcUaId_ContentFilterElement_Encoding_DefaultBinary, parseContentFilterElement, "ContentFilterElement" },
+ { OpcUaId_ContentFilter_Encoding_DefaultBinary, parseContentFilter, "ContentFilter" },
+ { OpcUaId_ElementOperand_Encoding_DefaultBinary, parseElementOperand, "ElementOperand" },
+ { OpcUaId_LiteralOperand_Encoding_DefaultBinary, parseLiteralOperand, "LiteralOperand" },
+ { OpcUaId_AttributeOperand_Encoding_DefaultBinary, parseAttributeOperand, "AttributeOperand" },
+ { OpcUaId_SimpleAttributeOperand_Encoding_DefaultBinary, parseSimpleAttributeOperand, "SimpleAttributeOperand" },
+ { OpcUaId_ContentFilterElementResult_Encoding_DefaultBinary, parseContentFilterElementResult, "ContentFilterElementResult" },
+ { OpcUaId_ContentFilterResult_Encoding_DefaultBinary, parseContentFilterResult, "ContentFilterResult" },
+ { OpcUaId_ParsingResult_Encoding_DefaultBinary, parseParsingResult, "ParsingResult" },
+ { OpcUaId_ReadValueId_Encoding_DefaultBinary, parseReadValueId, "ReadValueId" },
+ { OpcUaId_HistoryReadValueId_Encoding_DefaultBinary, parseHistoryReadValueId, "HistoryReadValueId" },
+ { OpcUaId_HistoryReadResult_Encoding_DefaultBinary, parseHistoryReadResult, "HistoryReadResult" },
+ { OpcUaId_ReadEventDetails_Encoding_DefaultBinary, parseReadEventDetails, "ReadEventDetails" },
+ { OpcUaId_ReadRawModifiedDetails_Encoding_DefaultBinary, parseReadRawModifiedDetails, "ReadRawModifiedDetails" },
+ { OpcUaId_ReadProcessedDetails_Encoding_DefaultBinary, parseReadProcessedDetails, "ReadProcessedDetails" },
+ { OpcUaId_ReadAtTimeDetails_Encoding_DefaultBinary, parseReadAtTimeDetails, "ReadAtTimeDetails" },
+ { OpcUaId_HistoryData_Encoding_DefaultBinary, parseHistoryData, "HistoryData" },
+ { OpcUaId_ModificationInfo_Encoding_DefaultBinary, parseModificationInfo, "ModificationInfo" },
+ { OpcUaId_HistoryModifiedData_Encoding_DefaultBinary, parseHistoryModifiedData, "HistoryModifiedData" },
+ { OpcUaId_HistoryEvent_Encoding_DefaultBinary, parseHistoryEvent, "HistoryEvent" },
+ { OpcUaId_WriteValue_Encoding_DefaultBinary, parseWriteValue, "WriteValue" },
+ { OpcUaId_HistoryUpdateDetails_Encoding_DefaultBinary, parseHistoryUpdateDetails, "HistoryUpdateDetails" },
+ { OpcUaId_UpdateDataDetails_Encoding_DefaultBinary, parseUpdateDataDetails, "UpdateDataDetails" },
+ { OpcUaId_UpdateStructureDataDetails_Encoding_DefaultBinary, parseUpdateStructureDataDetails, "UpdateStructureDataDetails" },
+ { OpcUaId_UpdateEventDetails_Encoding_DefaultBinary, parseUpdateEventDetails, "UpdateEventDetails" },
+ { OpcUaId_DeleteRawModifiedDetails_Encoding_DefaultBinary, parseDeleteRawModifiedDetails, "DeleteRawModifiedDetails" },
+ { OpcUaId_DeleteAtTimeDetails_Encoding_DefaultBinary, parseDeleteAtTimeDetails, "DeleteAtTimeDetails" },
+ { OpcUaId_DeleteEventDetails_Encoding_DefaultBinary, parseDeleteEventDetails, "DeleteEventDetails" },
+ { OpcUaId_HistoryUpdateResult_Encoding_DefaultBinary, parseHistoryUpdateResult, "HistoryUpdateResult" },
+ { OpcUaId_CallMethodRequest_Encoding_DefaultBinary, parseCallMethodRequest, "CallMethodRequest" },
+ { OpcUaId_CallMethodResult_Encoding_DefaultBinary, parseCallMethodResult, "CallMethodResult" },
+ { OpcUaId_DataChangeFilter_Encoding_DefaultBinary, parseDataChangeFilter, "DataChangeFilter" },
+ { OpcUaId_EventFilter_Encoding_DefaultBinary, parseEventFilter, "EventFilter" },
+ { OpcUaId_AggregateConfiguration_Encoding_DefaultBinary, parseAggregateConfiguration, "AggregateConfiguration" },
+ { OpcUaId_AggregateFilter_Encoding_DefaultBinary, parseAggregateFilter, "AggregateFilter" },
+ { OpcUaId_EventFilterResult_Encoding_DefaultBinary, parseEventFilterResult, "EventFilterResult" },
+ { OpcUaId_AggregateFilterResult_Encoding_DefaultBinary, parseAggregateFilterResult, "AggregateFilterResult" },
+ { OpcUaId_MonitoringParameters_Encoding_DefaultBinary, parseMonitoringParameters, "MonitoringParameters" },
+ { OpcUaId_MonitoredItemCreateRequest_Encoding_DefaultBinary, parseMonitoredItemCreateRequest, "MonitoredItemCreateRequest" },
+ { OpcUaId_MonitoredItemCreateResult_Encoding_DefaultBinary, parseMonitoredItemCreateResult, "MonitoredItemCreateResult" },
+ { OpcUaId_MonitoredItemModifyRequest_Encoding_DefaultBinary, parseMonitoredItemModifyRequest, "MonitoredItemModifyRequest" },
+ { OpcUaId_MonitoredItemModifyResult_Encoding_DefaultBinary, parseMonitoredItemModifyResult, "MonitoredItemModifyResult" },
+ { OpcUaId_NotificationMessage_Encoding_DefaultBinary, parseNotificationMessage, "NotificationMessage" },
+ { OpcUaId_DataChangeNotification_Encoding_DefaultBinary, parseDataChangeNotification, "DataChangeNotification" },
+ { OpcUaId_MonitoredItemNotification_Encoding_DefaultBinary, parseMonitoredItemNotification, "MonitoredItemNotification" },
+ { OpcUaId_EventNotificationList_Encoding_DefaultBinary, parseEventNotificationList, "EventNotificationList" },
+ { OpcUaId_EventFieldList_Encoding_DefaultBinary, parseEventFieldList, "EventFieldList" },
+ { OpcUaId_HistoryEventFieldList_Encoding_DefaultBinary, parseHistoryEventFieldList, "HistoryEventFieldList" },
+ { OpcUaId_StatusChangeNotification_Encoding_DefaultBinary, parseStatusChangeNotification, "StatusChangeNotification" },
+ { OpcUaId_SubscriptionAcknowledgement_Encoding_DefaultBinary, parseSubscriptionAcknowledgement, "SubscriptionAcknowledgement" },
+ { OpcUaId_TransferResult_Encoding_DefaultBinary, parseTransferResult, "TransferResult" },
+ { OpcUaId_ScalarTestType_Encoding_DefaultBinary, parseScalarTestType, "ScalarTestType" },
+ { OpcUaId_ArrayTestType_Encoding_DefaultBinary, parseArrayTestType, "ArrayTestType" },
+ { OpcUaId_CompositeTestType_Encoding_DefaultBinary, parseCompositeTestType, "CompositeTestType" },
+ { OpcUaId_BuildInfo_Encoding_DefaultBinary, parseBuildInfo, "BuildInfo" },
+ { OpcUaId_RedundantServerDataType_Encoding_DefaultBinary, parseRedundantServerDataType, "RedundantServerDataType" },
+ { OpcUaId_EndpointUrlListDataType_Encoding_DefaultBinary, parseEndpointUrlListDataType, "EndpointUrlListDataType" },
+ { OpcUaId_NetworkGroupDataType_Encoding_DefaultBinary, parseNetworkGroupDataType, "NetworkGroupDataType" },
+ { OpcUaId_SamplingIntervalDiagnosticsDataType_Encoding_DefaultBinary, parseSamplingIntervalDiagnosticsDataType, "SamplingIntervalDiagnosticsDataType" },
+ { OpcUaId_ServerDiagnosticsSummaryDataType_Encoding_DefaultBinary, parseServerDiagnosticsSummaryDataType, "ServerDiagnosticsSummaryDataType" },
+ { OpcUaId_ServerStatusDataType_Encoding_DefaultBinary, parseServerStatusDataType, "ServerStatusDataType" },
+ { OpcUaId_SessionDiagnosticsDataType_Encoding_DefaultBinary, parseSessionDiagnosticsDataType, "SessionDiagnosticsDataType" },
+ { OpcUaId_SessionSecurityDiagnosticsDataType_Encoding_DefaultBinary, parseSessionSecurityDiagnosticsDataType, "SessionSecurityDiagnosticsDataType" },
+ { OpcUaId_ServiceCounterDataType_Encoding_DefaultBinary, parseServiceCounterDataType, "ServiceCounterDataType" },
+ { OpcUaId_StatusResult_Encoding_DefaultBinary, parseStatusResult, "StatusResult" },
+ { OpcUaId_SubscriptionDiagnosticsDataType_Encoding_DefaultBinary, parseSubscriptionDiagnosticsDataType, "SubscriptionDiagnosticsDataType" },
+ { OpcUaId_ModelChangeStructureDataType_Encoding_DefaultBinary, parseModelChangeStructureDataType, "ModelChangeStructureDataType" },
+ { OpcUaId_SemanticChangeStructureDataType_Encoding_DefaultBinary, parseSemanticChangeStructureDataType, "SemanticChangeStructureDataType" },
+ { OpcUaId_Range_Encoding_DefaultBinary, parseRange, "Range" },
+ { OpcUaId_EUInformation_Encoding_DefaultBinary, parseEUInformation, "EUInformation" },
+ { OpcUaId_ComplexNumberType_Encoding_DefaultBinary, parseComplexNumberType, "ComplexNumberType" },
+ { OpcUaId_DoubleComplexNumberType_Encoding_DefaultBinary, parseDoubleComplexNumberType, "DoubleComplexNumberType" },
+ { OpcUaId_AxisInformation_Encoding_DefaultBinary, parseAxisInformation, "AxisInformation" },
+ { OpcUaId_XVType_Encoding_DefaultBinary, parseXVType, "XVType" },
+ { OpcUaId_ProgramDiagnosticDataType_Encoding_DefaultBinary, parseProgramDiagnosticDataType, "ProgramDiagnosticDataType" },
+ { OpcUaId_Annotation_Encoding_DefaultBinary, parseAnnotation, "Annotation" },
+};
+const int g_NumTypes = sizeof(g_arExtensionObjectParserTable) / sizeof(ExtensionObjectParserEntry);
+
+/** Dispatch all extension objects to a special parser function. */
+void dispatchExtensionObjectType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int TypeId)
+{
+ gint iOffset = *pOffset;
+ int indx = 0;
+ int bFound = 0;
+ gint32 iLen = 0;
+
+ /* get the length of the body */
+ iLen = tvb_get_letohl(tvb, iOffset);
+ iOffset += 4;
+
+ while (indx < g_NumTypes)
+ {
+ if (g_arExtensionObjectParserTable[indx].iRequestId == TypeId)
+ {
+ bFound = 1;
+ (*g_arExtensionObjectParserTable[indx].pParser)(tree, tvb, pinfo, &iOffset, g_arExtensionObjectParserTable[indx].typeName);
+ break;
+ }
+ indx++;
+ }
+
+ /* display contained object as ByteString if unknown type */
+ if (bFound == 0)
+ {
+ if (iLen == -1)
+ {
+ proto_tree_add_bytes_format_value(tree, hf_opcua_ByteString, tvb, *pOffset, 4, NULL, "[OpcUa Null ByteString]");
+ }
+ else if (iLen >= 0)
+ {
+ proto_tree_add_item(tree, hf_opcua_ByteString, tvb, iOffset, iLen, ENC_NA);
+ iOffset += iLen; /* eat the whole bytestring */
+ }
+ else
+ {
+ proto_tree_add_bytes_format_value(tree, hf_opcua_ByteString, tvb, *pOffset, 4, NULL, "[Invalid ByteString] Invalid length: %d", iLen);
+ }
+ }
+
+ *pOffset = iOffset;
+}
+
diff --git a/plugins/epan/opcua/opcua_hfindeces.c b/plugins/epan/opcua/opcua_hfindeces.c
new file mode 100644
index 00000000..255927f9
--- /dev/null
+++ b/plugins/epan/opcua/opcua_hfindeces.c
@@ -0,0 +1,630 @@
+/******************************************************************************
+** Copyright (C) 2006-2015 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: This file contains protocol field handles.
+**
+** This file was autogenerated on 13.10.2015.
+** DON'T MODIFY THIS FILE!
+**
+******************************************************************************/
+
+#include "config.h"
+
+#include <epan/packet.h>
+
+#include "opcua_hfindeces.h"
+
+int hf_opcua_AccessLevel = -1;
+int hf_opcua_ActualSessionTimeout = -1;
+int hf_opcua_AddResults = -1;
+int hf_opcua_Algorithm = -1;
+int hf_opcua_Alias = -1;
+int hf_opcua_AnnotationTime = -1;
+int hf_opcua_ApplicationUri = -1;
+int hf_opcua_ArrayDimensions = -1;
+int hf_opcua_AuditEntryId = -1;
+int hf_opcua_AuthenticationMechanism = -1;
+int hf_opcua_AvailableSequenceNumbers = -1;
+int hf_opcua_AxisSteps = -1;
+int hf_opcua_Boolean = -1;
+int hf_opcua_Booleans = -1;
+int hf_opcua_BuildDate = -1;
+int hf_opcua_BuildNumber = -1;
+int hf_opcua_Byte = -1;
+int hf_opcua_ByteString = -1;
+int hf_opcua_ByteStrings = -1;
+int hf_opcua_CancelCount = -1;
+int hf_opcua_CertificateData = -1;
+int hf_opcua_ChannelId = -1;
+int hf_opcua_ChannelLifetime = -1;
+int hf_opcua_ClientCertificate = -1;
+int hf_opcua_ClientConnectionTime = -1;
+int hf_opcua_ClientHandle = -1;
+int hf_opcua_ClientLastContactTime = -1;
+int hf_opcua_ClientNonce = -1;
+int hf_opcua_ClientProtocolVersion = -1;
+int hf_opcua_ClientUserIdHistory = -1;
+int hf_opcua_ClientUserIdOfSession = -1;
+int hf_opcua_ComplianceDate = -1;
+int hf_opcua_ComplianceTool = -1;
+int hf_opcua_ConfigurationResults = -1;
+int hf_opcua_ContainsNoLoops = -1;
+int hf_opcua_ContinuationPoint = -1;
+int hf_opcua_ContinuationPoints = -1;
+int hf_opcua_CreateClientName = -1;
+int hf_opcua_CreatedAt = -1;
+int hf_opcua_CumulatedSessionCount = -1;
+int hf_opcua_CumulatedSubscriptionCount = -1;
+int hf_opcua_CurrentKeepAliveCount = -1;
+int hf_opcua_CurrentLifetimeCount = -1;
+int hf_opcua_CurrentMonitoredItemsCount = -1;
+int hf_opcua_CurrentPublishRequestsInQueue = -1;
+int hf_opcua_CurrentSessionCount = -1;
+int hf_opcua_CurrentSubscriptionCount = -1;
+int hf_opcua_CurrentSubscriptionsCount = -1;
+int hf_opcua_CurrentTime = -1;
+int hf_opcua_DataChangeNotificationsCount = -1;
+int hf_opcua_DataStatusCodes = -1;
+int hf_opcua_DateTime = -1;
+int hf_opcua_DateTimes = -1;
+int hf_opcua_DaylightSavingInOffset = -1;
+int hf_opcua_DeadbandType = -1;
+int hf_opcua_DeadbandValue = -1;
+int hf_opcua_DeleteBidirectional = -1;
+int hf_opcua_DeleteSubscriptions = -1;
+int hf_opcua_DeleteTargetReferences = -1;
+int hf_opcua_DisableCount = -1;
+int hf_opcua_DisabledMonitoredItemCount = -1;
+int hf_opcua_DiscardOldest = -1;
+int hf_opcua_DiscardedMessageCount = -1;
+int hf_opcua_DiscoveryProfileUri = -1;
+int hf_opcua_DiscoveryUrl = -1;
+int hf_opcua_DiscoveryUrls = -1;
+int hf_opcua_Double = -1;
+int hf_opcua_Doubles = -1;
+int hf_opcua_EnableCount = -1;
+int hf_opcua_Encoding = -1;
+int hf_opcua_EncryptionAlgorithm = -1;
+int hf_opcua_EndTime = -1;
+int hf_opcua_EndpointUrl = -1;
+int hf_opcua_EndpointUrlList = -1;
+int hf_opcua_ErrorCount = -1;
+int hf_opcua_EventIds = -1;
+int hf_opcua_EventNotificationsCount = -1;
+int hf_opcua_EventNotifier = -1;
+int hf_opcua_EventQueueOverFlowCount = -1;
+int hf_opcua_Executable = -1;
+int hf_opcua_Float = -1;
+int hf_opcua_Floats = -1;
+int hf_opcua_GatewayServerUri = -1;
+int hf_opcua_Guid = -1;
+int hf_opcua_Guids = -1;
+int hf_opcua_High = -1;
+int hf_opcua_Historizing = -1;
+int hf_opcua_Imaginary = -1;
+int hf_opcua_IncludeSubTypes = -1;
+int hf_opcua_IncludeSubtypes = -1;
+int hf_opcua_Index = -1;
+int hf_opcua_IndexRange = -1;
+int hf_opcua_InputArgumentResults = -1;
+int hf_opcua_Int16 = -1;
+int hf_opcua_Int16s = -1;
+int hf_opcua_Int32 = -1;
+int hf_opcua_Int32s = -1;
+int hf_opcua_Int64 = -1;
+int hf_opcua_Int64s = -1;
+int hf_opcua_InvocationCreationTime = -1;
+int hf_opcua_IsAbstract = -1;
+int hf_opcua_IsDeleteModified = -1;
+int hf_opcua_IsForward = -1;
+int hf_opcua_IsInverse = -1;
+int hf_opcua_IsOnline = -1;
+int hf_opcua_IsReadModified = -1;
+int hf_opcua_IssueDate = -1;
+int hf_opcua_IssuedBy = -1;
+int hf_opcua_IssuedTokenType = -1;
+int hf_opcua_IssuerCertificates = -1;
+int hf_opcua_IssuerCrls = -1;
+int hf_opcua_IssuerEndpointUrl = -1;
+int hf_opcua_Iteration = -1;
+int hf_opcua_LastCounterResetTime = -1;
+int hf_opcua_LastMethodCall = -1;
+int hf_opcua_LastMethodCallTime = -1;
+int hf_opcua_LastTransitionTime = -1;
+int hf_opcua_LatePublishRequestCount = -1;
+int hf_opcua_LinksToAdd = -1;
+int hf_opcua_LinksToRemove = -1;
+int hf_opcua_LocaleIds = -1;
+int hf_opcua_Low = -1;
+int hf_opcua_ManufacturerName = -1;
+int hf_opcua_MaxAge = -1;
+int hf_opcua_MaxArrayLength = -1;
+int hf_opcua_MaxBufferSize = -1;
+int hf_opcua_MaxByteStringLength = -1;
+int hf_opcua_MaxDataSetsToReturn = -1;
+int hf_opcua_MaxKeepAliveCount = -1;
+int hf_opcua_MaxLifetimeCount = -1;
+int hf_opcua_MaxMessageSize = -1;
+int hf_opcua_MaxMonitoredItemCount = -1;
+int hf_opcua_MaxNotificationsPerPublish = -1;
+int hf_opcua_MaxRecordsToReturn = -1;
+int hf_opcua_MaxReferencesToReturn = -1;
+int hf_opcua_MaxRequestMessageSize = -1;
+int hf_opcua_MaxResponseMessageSize = -1;
+int hf_opcua_MaxStringLength = -1;
+int hf_opcua_MdnsServerName = -1;
+int hf_opcua_Message = -1;
+int hf_opcua_MinimumSamplingInterval = -1;
+int hf_opcua_ModificationTime = -1;
+int hf_opcua_ModifyCount = -1;
+int hf_opcua_MonitoredItemCount = -1;
+int hf_opcua_MonitoredItemId = -1;
+int hf_opcua_MonitoredItemIds = -1;
+int hf_opcua_MonitoringQueueOverflowCount = -1;
+int hf_opcua_MoreNotifications = -1;
+int hf_opcua_Name = -1;
+int hf_opcua_NamespaceUri = -1;
+int hf_opcua_NextSequenceNumber = -1;
+int hf_opcua_NotificationsCount = -1;
+int hf_opcua_NumValuesPerNode = -1;
+int hf_opcua_Offset = -1;
+int hf_opcua_OperandStatusCodes = -1;
+int hf_opcua_OperationResults = -1;
+int hf_opcua_OperationTimeout = -1;
+int hf_opcua_OrganizationUri = -1;
+int hf_opcua_Password = -1;
+int hf_opcua_PercentDataBad = -1;
+int hf_opcua_PercentDataGood = -1;
+int hf_opcua_PolicyId = -1;
+int hf_opcua_Priority = -1;
+int hf_opcua_ProcessingInterval = -1;
+int hf_opcua_ProductName = -1;
+int hf_opcua_ProductUri = -1;
+int hf_opcua_ProfileId = -1;
+int hf_opcua_ProfileUris = -1;
+int hf_opcua_PublishRequestCount = -1;
+int hf_opcua_PublishTime = -1;
+int hf_opcua_PublishingEnabled = -1;
+int hf_opcua_PublishingInterval = -1;
+int hf_opcua_PublishingIntervalCount = -1;
+int hf_opcua_QueueSize = -1;
+int hf_opcua_Real = -1;
+int hf_opcua_RecordId = -1;
+int hf_opcua_RejectedRequestsCount = -1;
+int hf_opcua_RejectedSessionCount = -1;
+int hf_opcua_ReleaseContinuationPoint = -1;
+int hf_opcua_ReleaseContinuationPoints = -1;
+int hf_opcua_RemainingPathIndex = -1;
+int hf_opcua_RemoveResults = -1;
+int hf_opcua_RepublishMessageCount = -1;
+int hf_opcua_RepublishMessageRequestCount = -1;
+int hf_opcua_RepublishRequestCount = -1;
+int hf_opcua_ReqTimes = -1;
+int hf_opcua_RequestHandle = -1;
+int hf_opcua_RequestedLifetime = -1;
+int hf_opcua_RequestedLifetimeCount = -1;
+int hf_opcua_RequestedMaxKeepAliveCount = -1;
+int hf_opcua_RequestedMaxReferencesPerNode = -1;
+int hf_opcua_RequestedPublishingInterval = -1;
+int hf_opcua_RequestedSessionTimeout = -1;
+int hf_opcua_Results = -1;
+int hf_opcua_RetransmitSequenceNumber = -1;
+int hf_opcua_ReturnBounds = -1;
+int hf_opcua_ReturnDiagnostics = -1;
+int hf_opcua_RevisedContinuationPoint = -1;
+int hf_opcua_RevisedLifetime = -1;
+int hf_opcua_RevisedLifetimeCount = -1;
+int hf_opcua_RevisedMaxKeepAliveCount = -1;
+int hf_opcua_RevisedProcessingInterval = -1;
+int hf_opcua_RevisedPublishingInterval = -1;
+int hf_opcua_RevisedQueueSize = -1;
+int hf_opcua_RevisedSamplingInterval = -1;
+int hf_opcua_RevisedSessionTimeout = -1;
+int hf_opcua_RevisedStartTime = -1;
+int hf_opcua_SByte = -1;
+int hf_opcua_SBytes = -1;
+int hf_opcua_SamplingInterval = -1;
+int hf_opcua_SecondsTillShutdown = -1;
+int hf_opcua_SecurityLevel = -1;
+int hf_opcua_SecurityPolicyUri = -1;
+int hf_opcua_SecurityRejectedRequestsCount = -1;
+int hf_opcua_SecurityRejectedSessionCount = -1;
+int hf_opcua_SecurityTokenLifetime = -1;
+int hf_opcua_SelectClauseResults = -1;
+int hf_opcua_SemaphoreFilePath = -1;
+int hf_opcua_SendInitialValues = -1;
+int hf_opcua_SequenceNumber = -1;
+int hf_opcua_ServerCapabilities = -1;
+int hf_opcua_ServerCapabilityFilter = -1;
+int hf_opcua_ServerCertificate = -1;
+int hf_opcua_ServerId = -1;
+int hf_opcua_ServerName = -1;
+int hf_opcua_ServerNonce = -1;
+int hf_opcua_ServerProtocolVersion = -1;
+int hf_opcua_ServerUri = -1;
+int hf_opcua_ServerUris = -1;
+int hf_opcua_ServerViewCount = -1;
+int hf_opcua_ServiceLevel = -1;
+int hf_opcua_ServiceResult = -1;
+int hf_opcua_SessionAbortCount = -1;
+int hf_opcua_SessionName = -1;
+int hf_opcua_SessionTimeoutCount = -1;
+int hf_opcua_Signature = -1;
+int hf_opcua_SoftwareVersion = -1;
+int hf_opcua_SpecifiedAttributes = -1;
+int hf_opcua_SpecifiedLists = -1;
+int hf_opcua_StartTime = -1;
+int hf_opcua_StartingRecordId = -1;
+int hf_opcua_Status = -1;
+int hf_opcua_StatusCode = -1;
+int hf_opcua_StatusCodes = -1;
+int hf_opcua_String = -1;
+int hf_opcua_StringTable = -1;
+int hf_opcua_Strings = -1;
+int hf_opcua_SubscriptionId = -1;
+int hf_opcua_SubscriptionIds = -1;
+int hf_opcua_Symmetric = -1;
+int hf_opcua_TargetServerUri = -1;
+int hf_opcua_TestId = -1;
+int hf_opcua_TicketData = -1;
+int hf_opcua_TimeoutHint = -1;
+int hf_opcua_Timestamp = -1;
+int hf_opcua_TokenData = -1;
+int hf_opcua_TokenId = -1;
+int hf_opcua_TotalCount = -1;
+int hf_opcua_TransferRequestCount = -1;
+int hf_opcua_TransferredToAltClientCount = -1;
+int hf_opcua_TransferredToSameClientCount = -1;
+int hf_opcua_TransportProfileUri = -1;
+int hf_opcua_TransportProtocol = -1;
+int hf_opcua_TreatUncertainAsBad = -1;
+int hf_opcua_TriggeringItemId = -1;
+int hf_opcua_TrustedCertificates = -1;
+int hf_opcua_TrustedCrls = -1;
+int hf_opcua_UInt16 = -1;
+int hf_opcua_UInt16s = -1;
+int hf_opcua_UInt32 = -1;
+int hf_opcua_UInt32s = -1;
+int hf_opcua_UInt64 = -1;
+int hf_opcua_UInt64s = -1;
+int hf_opcua_UnacknowledgedMessageCount = -1;
+int hf_opcua_UnauthorizedRequestCount = -1;
+int hf_opcua_UnitId = -1;
+int hf_opcua_UnsupportedUnitIds = -1;
+int hf_opcua_UseBinaryEncoding = -1;
+int hf_opcua_UseServerCapabilitiesDefaults = -1;
+int hf_opcua_UseSimpleBounds = -1;
+int hf_opcua_UseSlopedExtrapolation = -1;
+int hf_opcua_UserAccessLevel = -1;
+int hf_opcua_UserExecutable = -1;
+int hf_opcua_UserName = -1;
+int hf_opcua_UserWriteMask = -1;
+int hf_opcua_ValidBits = -1;
+int hf_opcua_Value = -1;
+int hf_opcua_ValueRank = -1;
+int hf_opcua_VendorName = -1;
+int hf_opcua_VendorProductCertificate = -1;
+int hf_opcua_Verb = -1;
+int hf_opcua_ViewVersion = -1;
+int hf_opcua_WriteMask = -1;
+int hf_opcua_X = -1;
+int hf_opcua_XmlElement = -1;
+int hf_opcua_XmlElements = -1;
+
+/** Register field types. */
+void registerFieldTypes(int proto)
+{
+ /** header field definitions */
+ static hf_register_info hf[] =
+ {
+ { &hf_opcua_AccessLevel, { "AccessLevel", "opcua.AccessLevel", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ActualSessionTimeout, { "ActualSessionTimeout", "opcua.ActualSessionTimeout", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_AddResults, { "AddResults", "opcua.AddResults", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Algorithm, { "Algorithm", "opcua.Algorithm", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Alias, { "Alias", "opcua.Alias", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_AnnotationTime, { "AnnotationTime", "opcua.AnnotationTime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ApplicationUri, { "ApplicationUri", "opcua.ApplicationUri", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ArrayDimensions, { "ArrayDimensions", "opcua.ArrayDimensions", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_AuditEntryId, { "AuditEntryId", "opcua.AuditEntryId", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_AuthenticationMechanism, { "AuthenticationMechanism", "opcua.AuthenticationMechanism", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_AvailableSequenceNumbers, { "AvailableSequenceNumbers", "opcua.AvailableSequenceNumbers", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_AxisSteps, { "AxisSteps", "opcua.AxisSteps", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Boolean, { "Boolean", "opcua.Boolean", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Booleans, { "Booleans", "opcua.Booleans", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_BuildDate, { "BuildDate", "opcua.BuildDate", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_BuildNumber, { "BuildNumber", "opcua.BuildNumber", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Byte, { "Byte", "opcua.Byte", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ByteString, { "ByteString", "opcua.ByteString", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ByteStrings, { "ByteStrings", "opcua.ByteStrings", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_CancelCount, { "CancelCount", "opcua.CancelCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_CertificateData, { "CertificateData", "opcua.CertificateData", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ChannelId, { "ChannelId", "opcua.ChannelId", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ChannelLifetime, { "ChannelLifetime", "opcua.ChannelLifetime", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ClientCertificate, { "ClientCertificate", "opcua.ClientCertificate", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ClientConnectionTime, { "ClientConnectionTime", "opcua.ClientConnectionTime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ClientHandle, { "ClientHandle", "opcua.ClientHandle", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ClientLastContactTime, { "ClientLastContactTime", "opcua.ClientLastContactTime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ClientNonce, { "ClientNonce", "opcua.ClientNonce", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ClientProtocolVersion, { "ClientProtocolVersion", "opcua.ClientProtocolVersion", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ClientUserIdHistory, { "ClientUserIdHistory", "opcua.ClientUserIdHistory", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ClientUserIdOfSession, { "ClientUserIdOfSession", "opcua.ClientUserIdOfSession", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ComplianceDate, { "ComplianceDate", "opcua.ComplianceDate", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ComplianceTool, { "ComplianceTool", "opcua.ComplianceTool", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ConfigurationResults, { "ConfigurationResults", "opcua.ConfigurationResults", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ContainsNoLoops, { "ContainsNoLoops", "opcua.ContainsNoLoops", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ContinuationPoint, { "ContinuationPoint", "opcua.ContinuationPoint", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ContinuationPoints, { "ContinuationPoints", "opcua.ContinuationPoints", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_CreateClientName, { "CreateClientName", "opcua.CreateClientName", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_CreatedAt, { "CreatedAt", "opcua.CreatedAt", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_CumulatedSessionCount, { "CumulatedSessionCount", "opcua.CumulatedSessionCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_CumulatedSubscriptionCount, { "CumulatedSubscriptionCount", "opcua.CumulatedSubscriptionCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_CurrentKeepAliveCount, { "CurrentKeepAliveCount", "opcua.CurrentKeepAliveCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_CurrentLifetimeCount, { "CurrentLifetimeCount", "opcua.CurrentLifetimeCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_CurrentMonitoredItemsCount, { "CurrentMonitoredItemsCount", "opcua.CurrentMonitoredItemsCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_CurrentPublishRequestsInQueue, { "CurrentPublishRequestsInQueue", "opcua.CurrentPublishRequestsInQueue", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_CurrentSessionCount, { "CurrentSessionCount", "opcua.CurrentSessionCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_CurrentSubscriptionCount, { "CurrentSubscriptionCount", "opcua.CurrentSubscriptionCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_CurrentSubscriptionsCount, { "CurrentSubscriptionsCount", "opcua.CurrentSubscriptionsCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_CurrentTime, { "CurrentTime", "opcua.CurrentTime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DataChangeNotificationsCount, { "DataChangeNotificationsCount", "opcua.DataChangeNotificationsCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DataStatusCodes, { "DataStatusCodes", "opcua.DataStatusCodes", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DateTime, { "DateTime", "opcua.DateTime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DateTimes, { "DateTimes", "opcua.DateTimes", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DaylightSavingInOffset, { "DaylightSavingInOffset", "opcua.DaylightSavingInOffset", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DeadbandType, { "DeadbandType", "opcua.DeadbandType", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DeadbandValue, { "DeadbandValue", "opcua.DeadbandValue", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DeleteBidirectional, { "DeleteBidirectional", "opcua.DeleteBidirectional", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DeleteSubscriptions, { "DeleteSubscriptions", "opcua.DeleteSubscriptions", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DeleteTargetReferences, { "DeleteTargetReferences", "opcua.DeleteTargetReferences", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DisableCount, { "DisableCount", "opcua.DisableCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DisabledMonitoredItemCount, { "DisabledMonitoredItemCount", "opcua.DisabledMonitoredItemCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DiscardOldest, { "DiscardOldest", "opcua.DiscardOldest", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DiscardedMessageCount, { "DiscardedMessageCount", "opcua.DiscardedMessageCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DiscoveryProfileUri, { "DiscoveryProfileUri", "opcua.DiscoveryProfileUri", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DiscoveryUrl, { "DiscoveryUrl", "opcua.DiscoveryUrl", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_DiscoveryUrls, { "DiscoveryUrls", "opcua.DiscoveryUrls", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Double, { "Double", "opcua.Double", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Doubles, { "Doubles", "opcua.Doubles", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_EnableCount, { "EnableCount", "opcua.EnableCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Encoding, { "Encoding", "opcua.Encoding", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_EncryptionAlgorithm, { "EncryptionAlgorithm", "opcua.EncryptionAlgorithm", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_EndTime, { "EndTime", "opcua.EndTime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_EndpointUrl, { "EndpointUrl", "opcua.EndpointUrl", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_EndpointUrlList, { "EndpointUrlList", "opcua.EndpointUrlList", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ErrorCount, { "ErrorCount", "opcua.ErrorCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_EventIds, { "EventIds", "opcua.EventIds", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_EventNotificationsCount, { "EventNotificationsCount", "opcua.EventNotificationsCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_EventNotifier, { "EventNotifier", "opcua.EventNotifier", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_EventQueueOverFlowCount, { "EventQueueOverFlowCount", "opcua.EventQueueOverFlowCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Executable, { "Executable", "opcua.Executable", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Float, { "Float", "opcua.Float", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Floats, { "Floats", "opcua.Floats", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_GatewayServerUri, { "GatewayServerUri", "opcua.GatewayServerUri", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Guid, { "Guid", "opcua.Guid", FT_GUID, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Guids, { "Guids", "opcua.Guids", FT_GUID, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_High, { "High", "opcua.High", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Historizing, { "Historizing", "opcua.Historizing", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Imaginary, { "Imaginary", "opcua.Imaginary", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_IncludeSubTypes, { "IncludeSubTypes", "opcua.IncludeSubTypes", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_IncludeSubtypes, { "IncludeSubtypes", "opcua.IncludeSubtypes", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Index, { "Index", "opcua.Index", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_IndexRange, { "IndexRange", "opcua.IndexRange", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_InputArgumentResults, { "InputArgumentResults", "opcua.InputArgumentResults", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Int16, { "Int16", "opcua.Int16", FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Int16s, { "Int16s", "opcua.Int16s", FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Int32, { "Int32", "opcua.Int32", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Int32s, { "Int32s", "opcua.Int32s", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Int64, { "Int64", "opcua.Int64", FT_INT64, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Int64s, { "Int64s", "opcua.Int64s", FT_INT64, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_InvocationCreationTime, { "InvocationCreationTime", "opcua.InvocationCreationTime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_IsAbstract, { "IsAbstract", "opcua.IsAbstract", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_IsDeleteModified, { "IsDeleteModified", "opcua.IsDeleteModified", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_IsForward, { "IsForward", "opcua.IsForward", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_IsInverse, { "IsInverse", "opcua.IsInverse", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_IsOnline, { "IsOnline", "opcua.IsOnline", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_IsReadModified, { "IsReadModified", "opcua.IsReadModified", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_IssueDate, { "IssueDate", "opcua.IssueDate", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_IssuedBy, { "IssuedBy", "opcua.IssuedBy", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_IssuedTokenType, { "IssuedTokenType", "opcua.IssuedTokenType", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_IssuerCertificates, { "IssuerCertificates", "opcua.IssuerCertificates", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_IssuerCrls, { "IssuerCrls", "opcua.IssuerCrls", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_IssuerEndpointUrl, { "IssuerEndpointUrl", "opcua.IssuerEndpointUrl", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Iteration, { "Iteration", "opcua.Iteration", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_LastCounterResetTime, { "LastCounterResetTime", "opcua.LastCounterResetTime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_LastMethodCall, { "LastMethodCall", "opcua.LastMethodCall", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_LastMethodCallTime, { "LastMethodCallTime", "opcua.LastMethodCallTime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_LastTransitionTime, { "LastTransitionTime", "opcua.LastTransitionTime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_LatePublishRequestCount, { "LatePublishRequestCount", "opcua.LatePublishRequestCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_LinksToAdd, { "LinksToAdd", "opcua.LinksToAdd", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_LinksToRemove, { "LinksToRemove", "opcua.LinksToRemove", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_LocaleIds, { "LocaleIds", "opcua.LocaleIds", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Low, { "Low", "opcua.Low", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ManufacturerName, { "ManufacturerName", "opcua.ManufacturerName", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MaxAge, { "MaxAge", "opcua.MaxAge", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MaxArrayLength, { "MaxArrayLength", "opcua.MaxArrayLength", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MaxBufferSize, { "MaxBufferSize", "opcua.MaxBufferSize", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MaxByteStringLength, { "MaxByteStringLength", "opcua.MaxByteStringLength", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MaxDataSetsToReturn, { "MaxDataSetsToReturn", "opcua.MaxDataSetsToReturn", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MaxKeepAliveCount, { "MaxKeepAliveCount", "opcua.MaxKeepAliveCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MaxLifetimeCount, { "MaxLifetimeCount", "opcua.MaxLifetimeCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MaxMessageSize, { "MaxMessageSize", "opcua.MaxMessageSize", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MaxMonitoredItemCount, { "MaxMonitoredItemCount", "opcua.MaxMonitoredItemCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MaxNotificationsPerPublish, { "MaxNotificationsPerPublish", "opcua.MaxNotificationsPerPublish", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MaxRecordsToReturn, { "MaxRecordsToReturn", "opcua.MaxRecordsToReturn", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MaxReferencesToReturn, { "MaxReferencesToReturn", "opcua.MaxReferencesToReturn", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MaxRequestMessageSize, { "MaxRequestMessageSize", "opcua.MaxRequestMessageSize", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MaxResponseMessageSize, { "MaxResponseMessageSize", "opcua.MaxResponseMessageSize", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MaxStringLength, { "MaxStringLength", "opcua.MaxStringLength", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MdnsServerName, { "MdnsServerName", "opcua.MdnsServerName", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Message, { "Message", "opcua.Message", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MinimumSamplingInterval, { "MinimumSamplingInterval", "opcua.MinimumSamplingInterval", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ModificationTime, { "ModificationTime", "opcua.ModificationTime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ModifyCount, { "ModifyCount", "opcua.ModifyCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MonitoredItemCount, { "MonitoredItemCount", "opcua.MonitoredItemCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MonitoredItemId, { "MonitoredItemId", "opcua.MonitoredItemId", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MonitoredItemIds, { "MonitoredItemIds", "opcua.MonitoredItemIds", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MonitoringQueueOverflowCount, { "MonitoringQueueOverflowCount", "opcua.MonitoringQueueOverflowCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_MoreNotifications, { "MoreNotifications", "opcua.MoreNotifications", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Name, { "Name", "opcua.Name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_NamespaceUri, { "NamespaceUri", "opcua.NamespaceUri", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_NextSequenceNumber, { "NextSequenceNumber", "opcua.NextSequenceNumber", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_NotificationsCount, { "NotificationsCount", "opcua.NotificationsCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_NumValuesPerNode, { "NumValuesPerNode", "opcua.NumValuesPerNode", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Offset, { "Offset", "opcua.Offset", FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_OperandStatusCodes, { "OperandStatusCodes", "opcua.OperandStatusCodes", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_OperationResults, { "OperationResults", "opcua.OperationResults", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_OperationTimeout, { "OperationTimeout", "opcua.OperationTimeout", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_OrganizationUri, { "OrganizationUri", "opcua.OrganizationUri", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Password, { "Password", "opcua.Password", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_PercentDataBad, { "PercentDataBad", "opcua.PercentDataBad", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_PercentDataGood, { "PercentDataGood", "opcua.PercentDataGood", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_PolicyId, { "PolicyId", "opcua.PolicyId", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Priority, { "Priority", "opcua.Priority", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ProcessingInterval, { "ProcessingInterval", "opcua.ProcessingInterval", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ProductName, { "ProductName", "opcua.ProductName", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ProductUri, { "ProductUri", "opcua.ProductUri", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ProfileId, { "ProfileId", "opcua.ProfileId", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ProfileUris, { "ProfileUris", "opcua.ProfileUris", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_PublishRequestCount, { "PublishRequestCount", "opcua.PublishRequestCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_PublishTime, { "PublishTime", "opcua.PublishTime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_PublishingEnabled, { "PublishingEnabled", "opcua.PublishingEnabled", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_PublishingInterval, { "PublishingInterval", "opcua.PublishingInterval", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_PublishingIntervalCount, { "PublishingIntervalCount", "opcua.PublishingIntervalCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_QueueSize, { "QueueSize", "opcua.QueueSize", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Real, { "Real", "opcua.Real", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RecordId, { "RecordId", "opcua.RecordId", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RejectedRequestsCount, { "RejectedRequestsCount", "opcua.RejectedRequestsCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RejectedSessionCount, { "RejectedSessionCount", "opcua.RejectedSessionCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ReleaseContinuationPoint, { "ReleaseContinuationPoint", "opcua.ReleaseContinuationPoint", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ReleaseContinuationPoints, { "ReleaseContinuationPoints", "opcua.ReleaseContinuationPoints", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RemainingPathIndex, { "RemainingPathIndex", "opcua.RemainingPathIndex", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RemoveResults, { "RemoveResults", "opcua.RemoveResults", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RepublishMessageCount, { "RepublishMessageCount", "opcua.RepublishMessageCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RepublishMessageRequestCount, { "RepublishMessageRequestCount", "opcua.RepublishMessageRequestCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RepublishRequestCount, { "RepublishRequestCount", "opcua.RepublishRequestCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ReqTimes, { "ReqTimes", "opcua.ReqTimes", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RequestHandle, { "RequestHandle", "opcua.RequestHandle", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RequestedLifetime, { "RequestedLifetime", "opcua.RequestedLifetime", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RequestedLifetimeCount, { "RequestedLifetimeCount", "opcua.RequestedLifetimeCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RequestedMaxKeepAliveCount, { "RequestedMaxKeepAliveCount", "opcua.RequestedMaxKeepAliveCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RequestedMaxReferencesPerNode, { "RequestedMaxReferencesPerNode", "opcua.RequestedMaxReferencesPerNode", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RequestedPublishingInterval, { "RequestedPublishingInterval", "opcua.RequestedPublishingInterval", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RequestedSessionTimeout, { "RequestedSessionTimeout", "opcua.RequestedSessionTimeout", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Results, { "Results", "opcua.Results", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RetransmitSequenceNumber, { "RetransmitSequenceNumber", "opcua.RetransmitSequenceNumber", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ReturnBounds, { "ReturnBounds", "opcua.ReturnBounds", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ReturnDiagnostics, { "ReturnDiagnostics", "opcua.ReturnDiagnostics", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RevisedContinuationPoint, { "RevisedContinuationPoint", "opcua.RevisedContinuationPoint", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RevisedLifetime, { "RevisedLifetime", "opcua.RevisedLifetime", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RevisedLifetimeCount, { "RevisedLifetimeCount", "opcua.RevisedLifetimeCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RevisedMaxKeepAliveCount, { "RevisedMaxKeepAliveCount", "opcua.RevisedMaxKeepAliveCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RevisedProcessingInterval, { "RevisedProcessingInterval", "opcua.RevisedProcessingInterval", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RevisedPublishingInterval, { "RevisedPublishingInterval", "opcua.RevisedPublishingInterval", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RevisedQueueSize, { "RevisedQueueSize", "opcua.RevisedQueueSize", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RevisedSamplingInterval, { "RevisedSamplingInterval", "opcua.RevisedSamplingInterval", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RevisedSessionTimeout, { "RevisedSessionTimeout", "opcua.RevisedSessionTimeout", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_RevisedStartTime, { "RevisedStartTime", "opcua.RevisedStartTime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SByte, { "SByte", "opcua.SByte", FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SBytes, { "SBytes", "opcua.SBytes", FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SamplingInterval, { "SamplingInterval", "opcua.SamplingInterval", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SecondsTillShutdown, { "SecondsTillShutdown", "opcua.SecondsTillShutdown", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SecurityLevel, { "SecurityLevel", "opcua.SecurityLevel", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SecurityPolicyUri, { "SecurityPolicyUri", "opcua.SecurityPolicyUri", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SecurityRejectedRequestsCount, { "SecurityRejectedRequestsCount", "opcua.SecurityRejectedRequestsCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SecurityRejectedSessionCount, { "SecurityRejectedSessionCount", "opcua.SecurityRejectedSessionCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SecurityTokenLifetime, { "SecurityTokenLifetime", "opcua.SecurityTokenLifetime", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SelectClauseResults, { "SelectClauseResults", "opcua.SelectClauseResults", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SemaphoreFilePath, { "SemaphoreFilePath", "opcua.SemaphoreFilePath", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SendInitialValues, { "SendInitialValues", "opcua.SendInitialValues", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SequenceNumber, { "SequenceNumber", "opcua.SequenceNumber", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ServerCapabilities, { "ServerCapabilities", "opcua.ServerCapabilities", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ServerCapabilityFilter, { "ServerCapabilityFilter", "opcua.ServerCapabilityFilter", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ServerCertificate, { "ServerCertificate", "opcua.ServerCertificate", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ServerId, { "ServerId", "opcua.ServerId", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ServerName, { "ServerName", "opcua.ServerName", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ServerNonce, { "ServerNonce", "opcua.ServerNonce", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ServerProtocolVersion, { "ServerProtocolVersion", "opcua.ServerProtocolVersion", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ServerUri, { "ServerUri", "opcua.ServerUri", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ServerUris, { "ServerUris", "opcua.ServerUris", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ServerViewCount, { "ServerViewCount", "opcua.ServerViewCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ServiceLevel, { "ServiceLevel", "opcua.ServiceLevel", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ServiceResult, { "ServiceResult", "opcua.ServiceResult", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SessionAbortCount, { "SessionAbortCount", "opcua.SessionAbortCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SessionName, { "SessionName", "opcua.SessionName", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SessionTimeoutCount, { "SessionTimeoutCount", "opcua.SessionTimeoutCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Signature, { "Signature", "opcua.Signature", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SoftwareVersion, { "SoftwareVersion", "opcua.SoftwareVersion", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SpecifiedAttributes, { "SpecifiedAttributes", "opcua.SpecifiedAttributes", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SpecifiedLists, { "SpecifiedLists", "opcua.SpecifiedLists", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_StartTime, { "StartTime", "opcua.StartTime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_StartingRecordId, { "StartingRecordId", "opcua.StartingRecordId", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Status, { "Status", "opcua.Status", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_StatusCode, { "StatusCode", "opcua.StatusCode", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_StatusCodes, { "StatusCodes", "opcua.StatusCodes", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_String, { "String", "opcua.String", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_StringTable, { "StringTable", "opcua.StringTable", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Strings, { "Strings", "opcua.Strings", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SubscriptionId, { "SubscriptionId", "opcua.SubscriptionId", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_SubscriptionIds, { "SubscriptionIds", "opcua.SubscriptionIds", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Symmetric, { "Symmetric", "opcua.Symmetric", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_TargetServerUri, { "TargetServerUri", "opcua.TargetServerUri", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_TestId, { "TestId", "opcua.TestId", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_TicketData, { "TicketData", "opcua.TicketData", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_TimeoutHint, { "TimeoutHint", "opcua.TimeoutHint", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Timestamp, { "Timestamp", "opcua.Timestamp", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_TokenData, { "TokenData", "opcua.TokenData", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_TokenId, { "TokenId", "opcua.TokenId", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_TotalCount, { "TotalCount", "opcua.TotalCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_TransferRequestCount, { "TransferRequestCount", "opcua.TransferRequestCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_TransferredToAltClientCount, { "TransferredToAltClientCount", "opcua.TransferredToAltClientCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_TransferredToSameClientCount, { "TransferredToSameClientCount", "opcua.TransferredToSameClientCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_TransportProfileUri, { "TransportProfileUri", "opcua.TransportProfileUri", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_TransportProtocol, { "TransportProtocol", "opcua.TransportProtocol", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_TreatUncertainAsBad, { "TreatUncertainAsBad", "opcua.TreatUncertainAsBad", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_TriggeringItemId, { "TriggeringItemId", "opcua.TriggeringItemId", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_TrustedCertificates, { "TrustedCertificates", "opcua.TrustedCertificates", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_TrustedCrls, { "TrustedCrls", "opcua.TrustedCrls", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UInt16, { "UInt16", "opcua.UInt16", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UInt16s, { "UInt16s", "opcua.UInt16s", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UInt32, { "UInt32", "opcua.UInt32", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UInt32s, { "UInt32s", "opcua.UInt32s", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UInt64, { "UInt64", "opcua.UInt64", FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UInt64s, { "UInt64s", "opcua.UInt64s", FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UnacknowledgedMessageCount, { "UnacknowledgedMessageCount", "opcua.UnacknowledgedMessageCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UnauthorizedRequestCount, { "UnauthorizedRequestCount", "opcua.UnauthorizedRequestCount", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UnitId, { "UnitId", "opcua.UnitId", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UnsupportedUnitIds, { "UnsupportedUnitIds", "opcua.UnsupportedUnitIds", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UseBinaryEncoding, { "UseBinaryEncoding", "opcua.UseBinaryEncoding", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UseServerCapabilitiesDefaults, { "UseServerCapabilitiesDefaults", "opcua.UseServerCapabilitiesDefaults", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UseSimpleBounds, { "UseSimpleBounds", "opcua.UseSimpleBounds", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UseSlopedExtrapolation, { "UseSlopedExtrapolation", "opcua.UseSlopedExtrapolation", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UserAccessLevel, { "UserAccessLevel", "opcua.UserAccessLevel", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UserExecutable, { "UserExecutable", "opcua.UserExecutable", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UserName, { "UserName", "opcua.UserName", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_UserWriteMask, { "UserWriteMask", "opcua.UserWriteMask", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ValidBits, { "ValidBits", "opcua.ValidBits", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Value, { "Value", "opcua.Value", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ValueRank, { "ValueRank", "opcua.ValueRank", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_VendorName, { "VendorName", "opcua.VendorName", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_VendorProductCertificate, { "VendorProductCertificate", "opcua.VendorProductCertificate", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_Verb, { "Verb", "opcua.Verb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_ViewVersion, { "ViewVersion", "opcua.ViewVersion", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_WriteMask, { "WriteMask", "opcua.WriteMask", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_X, { "X", "opcua.X", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_XmlElement, { "XmlElement", "opcua.XmlElement", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ { &hf_opcua_XmlElements, { "XmlElements", "opcua.XmlElements", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
+ };
+
+ proto_register_field_array(proto, hf, array_length(hf));
+}
+
+
+
diff --git a/plugins/epan/opcua/opcua_hfindeces.h b/plugins/epan/opcua/opcua_hfindeces.h
new file mode 100644
index 00000000..0c1bd2cf
--- /dev/null
+++ b/plugins/epan/opcua/opcua_hfindeces.h
@@ -0,0 +1,322 @@
+/******************************************************************************
+** Copyright (C) 2006-2015 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: This file contains protocol field handles.
+**
+** This file was autogenerated on 13.10.2015.
+** DON'T MODIFY THIS FILE!
+** XXX - well, except that you may have to. See the README.
+**
+******************************************************************************/
+
+#include <glib.h>
+#include <epan/packet.h>
+
+extern int hf_opcua_AccessLevel;
+extern int hf_opcua_ActualSessionTimeout;
+extern int hf_opcua_AddResults;
+extern int hf_opcua_Algorithm;
+extern int hf_opcua_Alias;
+extern int hf_opcua_AnnotationTime;
+extern int hf_opcua_ApplicationUri;
+extern int hf_opcua_ArrayDimensions;
+extern int hf_opcua_AuditEntryId;
+extern int hf_opcua_AuthenticationMechanism;
+extern int hf_opcua_AvailableSequenceNumbers;
+extern int hf_opcua_AxisSteps;
+extern int hf_opcua_Boolean;
+extern int hf_opcua_Booleans;
+extern int hf_opcua_BuildDate;
+extern int hf_opcua_BuildNumber;
+extern int hf_opcua_Byte;
+extern int hf_opcua_ByteString;
+extern int hf_opcua_ByteStrings;
+extern int hf_opcua_CancelCount;
+extern int hf_opcua_CertificateData;
+extern int hf_opcua_ChannelId;
+extern int hf_opcua_ChannelLifetime;
+extern int hf_opcua_ClientCertificate;
+extern int hf_opcua_ClientConnectionTime;
+extern int hf_opcua_ClientHandle;
+extern int hf_opcua_ClientLastContactTime;
+extern int hf_opcua_ClientNonce;
+extern int hf_opcua_ClientProtocolVersion;
+extern int hf_opcua_ClientUserIdHistory;
+extern int hf_opcua_ClientUserIdOfSession;
+extern int hf_opcua_ComplianceDate;
+extern int hf_opcua_ComplianceTool;
+extern int hf_opcua_ConfigurationResults;
+extern int hf_opcua_ContainsNoLoops;
+extern int hf_opcua_ContinuationPoint;
+extern int hf_opcua_ContinuationPoints;
+extern int hf_opcua_CreateClientName;
+extern int hf_opcua_CreatedAt;
+extern int hf_opcua_CumulatedSessionCount;
+extern int hf_opcua_CumulatedSubscriptionCount;
+extern int hf_opcua_CurrentKeepAliveCount;
+extern int hf_opcua_CurrentLifetimeCount;
+extern int hf_opcua_CurrentMonitoredItemsCount;
+extern int hf_opcua_CurrentPublishRequestsInQueue;
+extern int hf_opcua_CurrentSessionCount;
+extern int hf_opcua_CurrentSubscriptionCount;
+extern int hf_opcua_CurrentSubscriptionsCount;
+extern int hf_opcua_CurrentTime;
+extern int hf_opcua_DataChangeNotificationsCount;
+extern int hf_opcua_DataStatusCodes;
+extern int hf_opcua_DateTime;
+extern int hf_opcua_DateTimes;
+extern int hf_opcua_DaylightSavingInOffset;
+extern int hf_opcua_DeadbandType;
+extern int hf_opcua_DeadbandValue;
+extern int hf_opcua_DeleteBidirectional;
+extern int hf_opcua_DeleteSubscriptions;
+extern int hf_opcua_DeleteTargetReferences;
+extern int hf_opcua_DisableCount;
+extern int hf_opcua_DisabledMonitoredItemCount;
+extern int hf_opcua_DiscardOldest;
+extern int hf_opcua_DiscardedMessageCount;
+extern int hf_opcua_DiscoveryProfileUri;
+extern int hf_opcua_DiscoveryUrl;
+extern int hf_opcua_DiscoveryUrls;
+extern int hf_opcua_Double;
+extern int hf_opcua_Doubles;
+extern int hf_opcua_EnableCount;
+extern int hf_opcua_Encoding;
+extern int hf_opcua_EncryptionAlgorithm;
+extern int hf_opcua_EndTime;
+extern int hf_opcua_EndpointUrl;
+extern int hf_opcua_EndpointUrlList;
+extern int hf_opcua_ErrorCount;
+extern int hf_opcua_EventIds;
+extern int hf_opcua_EventNotificationsCount;
+extern int hf_opcua_EventNotifier;
+extern int hf_opcua_EventQueueOverFlowCount;
+extern int hf_opcua_Executable;
+extern int hf_opcua_Float;
+extern int hf_opcua_Floats;
+extern int hf_opcua_GatewayServerUri;
+extern int hf_opcua_Guid;
+extern int hf_opcua_Guids;
+extern int hf_opcua_High;
+extern int hf_opcua_Historizing;
+extern int hf_opcua_Imaginary;
+extern int hf_opcua_IncludeSubTypes;
+extern int hf_opcua_IncludeSubtypes;
+extern int hf_opcua_Index;
+extern int hf_opcua_IndexRange;
+extern int hf_opcua_InputArgumentResults;
+extern int hf_opcua_Int16;
+extern int hf_opcua_Int16s;
+extern int hf_opcua_Int32;
+extern int hf_opcua_Int32s;
+extern int hf_opcua_Int64;
+extern int hf_opcua_Int64s;
+extern int hf_opcua_InvocationCreationTime;
+extern int hf_opcua_IsAbstract;
+extern int hf_opcua_IsDeleteModified;
+extern int hf_opcua_IsForward;
+extern int hf_opcua_IsInverse;
+extern int hf_opcua_IsOnline;
+extern int hf_opcua_IsReadModified;
+extern int hf_opcua_IssueDate;
+extern int hf_opcua_IssuedBy;
+extern int hf_opcua_IssuedTokenType;
+extern int hf_opcua_IssuerCertificates;
+extern int hf_opcua_IssuerCrls;
+extern int hf_opcua_IssuerEndpointUrl;
+extern int hf_opcua_Iteration;
+extern int hf_opcua_LastCounterResetTime;
+extern int hf_opcua_LastMethodCall;
+extern int hf_opcua_LastMethodCallTime;
+extern int hf_opcua_LastTransitionTime;
+extern int hf_opcua_LatePublishRequestCount;
+extern int hf_opcua_LinksToAdd;
+extern int hf_opcua_LinksToRemove;
+extern int hf_opcua_LocaleIds;
+extern int hf_opcua_Low;
+extern int hf_opcua_ManufacturerName;
+extern int hf_opcua_MaxAge;
+extern int hf_opcua_MaxArrayLength;
+extern int hf_opcua_MaxBufferSize;
+extern int hf_opcua_MaxByteStringLength;
+extern int hf_opcua_MaxDataSetsToReturn;
+extern int hf_opcua_MaxKeepAliveCount;
+extern int hf_opcua_MaxLifetimeCount;
+extern int hf_opcua_MaxMessageSize;
+extern int hf_opcua_MaxMonitoredItemCount;
+extern int hf_opcua_MaxNotificationsPerPublish;
+extern int hf_opcua_MaxRecordsToReturn;
+extern int hf_opcua_MaxReferencesToReturn;
+extern int hf_opcua_MaxRequestMessageSize;
+extern int hf_opcua_MaxResponseMessageSize;
+extern int hf_opcua_MaxStringLength;
+extern int hf_opcua_MdnsServerName;
+extern int hf_opcua_Message;
+extern int hf_opcua_MinimumSamplingInterval;
+extern int hf_opcua_ModificationTime;
+extern int hf_opcua_ModifyCount;
+extern int hf_opcua_MonitoredItemCount;
+extern int hf_opcua_MonitoredItemId;
+extern int hf_opcua_MonitoredItemIds;
+extern int hf_opcua_MonitoringQueueOverflowCount;
+extern int hf_opcua_MoreNotifications;
+extern int hf_opcua_Name;
+extern int hf_opcua_NamespaceUri;
+extern int hf_opcua_NextSequenceNumber;
+extern int hf_opcua_NotificationsCount;
+extern int hf_opcua_NumValuesPerNode;
+extern int hf_opcua_Offset;
+extern int hf_opcua_OperandStatusCodes;
+extern int hf_opcua_OperationResults;
+extern int hf_opcua_OperationTimeout;
+extern int hf_opcua_OrganizationUri;
+extern int hf_opcua_Password;
+extern int hf_opcua_PercentDataBad;
+extern int hf_opcua_PercentDataGood;
+extern int hf_opcua_PolicyId;
+extern int hf_opcua_Priority;
+extern int hf_opcua_ProcessingInterval;
+extern int hf_opcua_ProductName;
+extern int hf_opcua_ProductUri;
+extern int hf_opcua_ProfileId;
+extern int hf_opcua_ProfileUris;
+extern int hf_opcua_PublishRequestCount;
+extern int hf_opcua_PublishTime;
+extern int hf_opcua_PublishingEnabled;
+extern int hf_opcua_PublishingInterval;
+extern int hf_opcua_PublishingIntervalCount;
+extern int hf_opcua_QueueSize;
+extern int hf_opcua_Real;
+extern int hf_opcua_RecordId;
+extern int hf_opcua_RejectedRequestsCount;
+extern int hf_opcua_RejectedSessionCount;
+extern int hf_opcua_ReleaseContinuationPoint;
+extern int hf_opcua_ReleaseContinuationPoints;
+extern int hf_opcua_RemainingPathIndex;
+extern int hf_opcua_RemoveResults;
+extern int hf_opcua_RepublishMessageCount;
+extern int hf_opcua_RepublishMessageRequestCount;
+extern int hf_opcua_RepublishRequestCount;
+extern int hf_opcua_ReqTimes;
+extern int hf_opcua_RequestHandle;
+extern int hf_opcua_RequestedLifetime;
+extern int hf_opcua_RequestedLifetimeCount;
+extern int hf_opcua_RequestedMaxKeepAliveCount;
+extern int hf_opcua_RequestedMaxReferencesPerNode;
+extern int hf_opcua_RequestedPublishingInterval;
+extern int hf_opcua_RequestedSessionTimeout;
+extern int hf_opcua_Results;
+extern int hf_opcua_RetransmitSequenceNumber;
+extern int hf_opcua_ReturnBounds;
+extern int hf_opcua_ReturnDiagnostics;
+extern int hf_opcua_RevisedContinuationPoint;
+extern int hf_opcua_RevisedLifetime;
+extern int hf_opcua_RevisedLifetimeCount;
+extern int hf_opcua_RevisedMaxKeepAliveCount;
+extern int hf_opcua_RevisedProcessingInterval;
+extern int hf_opcua_RevisedPublishingInterval;
+extern int hf_opcua_RevisedQueueSize;
+extern int hf_opcua_RevisedSamplingInterval;
+extern int hf_opcua_RevisedSessionTimeout;
+extern int hf_opcua_RevisedStartTime;
+extern int hf_opcua_SByte;
+extern int hf_opcua_SBytes;
+extern int hf_opcua_SamplingInterval;
+extern int hf_opcua_SecondsTillShutdown;
+extern int hf_opcua_SecurityLevel;
+extern int hf_opcua_SecurityPolicyUri;
+extern int hf_opcua_SecurityRejectedRequestsCount;
+extern int hf_opcua_SecurityRejectedSessionCount;
+extern int hf_opcua_SecurityTokenLifetime;
+extern int hf_opcua_SelectClauseResults;
+extern int hf_opcua_SemaphoreFilePath;
+extern int hf_opcua_SendInitialValues;
+extern int hf_opcua_SequenceNumber;
+extern int hf_opcua_ServerCapabilities;
+extern int hf_opcua_ServerCapabilityFilter;
+extern int hf_opcua_ServerCertificate;
+extern int hf_opcua_ServerId;
+extern int hf_opcua_ServerName;
+extern int hf_opcua_ServerNonce;
+extern int hf_opcua_ServerProtocolVersion;
+extern int hf_opcua_ServerUri;
+extern int hf_opcua_ServerUris;
+extern int hf_opcua_ServerViewCount;
+extern int hf_opcua_ServiceLevel;
+extern int hf_opcua_ServiceResult;
+extern int hf_opcua_SessionAbortCount;
+extern int hf_opcua_SessionName;
+extern int hf_opcua_SessionTimeoutCount;
+extern int hf_opcua_Signature;
+extern int hf_opcua_SoftwareVersion;
+extern int hf_opcua_SpecifiedAttributes;
+extern int hf_opcua_SpecifiedLists;
+extern int hf_opcua_StartTime;
+extern int hf_opcua_StartingRecordId;
+extern int hf_opcua_Status;
+extern int hf_opcua_StatusCode;
+extern int hf_opcua_StatusCodes;
+extern int hf_opcua_String;
+extern int hf_opcua_StringTable;
+extern int hf_opcua_Strings;
+extern int hf_opcua_SubscriptionId;
+extern int hf_opcua_SubscriptionIds;
+extern int hf_opcua_Symmetric;
+extern int hf_opcua_TargetServerUri;
+extern int hf_opcua_TestId;
+extern int hf_opcua_TicketData;
+extern int hf_opcua_TimeoutHint;
+extern int hf_opcua_Timestamp;
+extern int hf_opcua_TokenData;
+extern int hf_opcua_TokenId;
+extern int hf_opcua_TotalCount;
+extern int hf_opcua_TransferRequestCount;
+extern int hf_opcua_TransferredToAltClientCount;
+extern int hf_opcua_TransferredToSameClientCount;
+extern int hf_opcua_TransportProfileUri;
+extern int hf_opcua_TransportProtocol;
+extern int hf_opcua_TreatUncertainAsBad;
+extern int hf_opcua_TriggeringItemId;
+extern int hf_opcua_TrustedCertificates;
+extern int hf_opcua_TrustedCrls;
+extern int hf_opcua_UInt16;
+extern int hf_opcua_UInt16s;
+extern int hf_opcua_UInt32;
+extern int hf_opcua_UInt32s;
+extern int hf_opcua_UInt64;
+extern int hf_opcua_UInt64s;
+extern int hf_opcua_UnacknowledgedMessageCount;
+extern int hf_opcua_UnauthorizedRequestCount;
+extern int hf_opcua_UnitId;
+extern int hf_opcua_UnsupportedUnitIds;
+extern int hf_opcua_UseBinaryEncoding;
+extern int hf_opcua_UseServerCapabilitiesDefaults;
+extern int hf_opcua_UseSimpleBounds;
+extern int hf_opcua_UseSlopedExtrapolation;
+extern int hf_opcua_UserAccessLevel;
+extern int hf_opcua_UserExecutable;
+extern int hf_opcua_UserName;
+extern int hf_opcua_UserWriteMask;
+extern int hf_opcua_ValidBits;
+extern int hf_opcua_Value;
+extern int hf_opcua_ValueRank;
+extern int hf_opcua_VendorName;
+extern int hf_opcua_VendorProductCertificate;
+extern int hf_opcua_Verb;
+extern int hf_opcua_ViewVersion;
+extern int hf_opcua_WriteMask;
+extern int hf_opcua_X;
+extern int hf_opcua_XmlElement;
+extern int hf_opcua_XmlElements;
+
+/** Register field types. */
+void registerFieldTypes(int proto);
+
diff --git a/plugins/epan/opcua/opcua_identifiers.h b/plugins/epan/opcua/opcua_identifiers.h
new file mode 100644
index 00000000..2cff1b29
--- /dev/null
+++ b/plugins/epan/opcua/opcua_identifiers.h
@@ -0,0 +1,43 @@
+/******************************************************************************
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: Parser type definitions.
+**
+** This file was autogenerated on 6/10/2007 2:35:22 AM.
+** DON'T MODIFY THIS FILE!
+** XXX - well, except that you may have to. See the README.
+**
+******************************************************************************/
+
+#include <glib.h>
+#include <epan/packet.h>
+
+/* declare service parser function prototype */
+typedef void (*fctServiceParser)(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+/* declare enum parser function prototype */
+typedef void (*fctEnumParser)(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+/* declare type parser function prototype */
+typedef void (*fctComplexTypeParser)(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+/* declare type parser function prototype */
+typedef proto_item* (*fctSimpleTypeParser)(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+
+typedef struct _ParserEntry
+{
+ int iRequestId;
+ fctServiceParser pParser;
+} ParserEntry;
+
+typedef struct _ExtensionObjectParserEntry
+{
+ int iRequestId;
+ fctComplexTypeParser pParser;
+ const gchar *typeName;
+} ExtensionObjectParserEntry;
diff --git a/plugins/epan/opcua/opcua_security_layer.c b/plugins/epan/opcua/opcua_security_layer.c
new file mode 100644
index 00000000..933fd981
--- /dev/null
+++ b/plugins/epan/opcua/opcua_security_layer.c
@@ -0,0 +1,60 @@
+/******************************************************************************
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: OpcUa Security Layer Decoder.
+**
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>
+******************************************************************************/
+
+#include "config.h"
+
+#include <epan/packet.h>
+#include "opcua_security_layer.h"
+
+static int hf_opcua_security_tokenid = -1;
+static int hf_opcua_security_seq = -1;
+static int hf_opcua_security_rqid = -1;
+
+/** Register security layer types. */
+void registerSecurityLayerTypes(int proto)
+{
+ static hf_register_info hf[] =
+ {
+ /* id full name abbreviation type display strings bitmask blurb HFILL */
+ {&hf_opcua_security_tokenid, {"Security Token Id", "opcua.security.tokenid", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_security_seq, {"Security Sequence Number", "opcua.security.seq", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_security_rqid, {"Security RequestId", "opcua.security.rqid", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}}
+ };
+ proto_register_field_array(proto, hf, array_length(hf));
+}
+
+/* Security Layer: message parsers
+ * Only works for Security Policy "NoSecurity" at the moment.
+ */
+void parseSecurityLayer(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_security_tokenid, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ proto_tree_add_item(tree, hf_opcua_security_seq, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ proto_tree_add_item(tree, hf_opcua_security_rqid, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+}
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
diff --git a/plugins/epan/opcua/opcua_security_layer.h b/plugins/epan/opcua/opcua_security_layer.h
new file mode 100644
index 00000000..d5b36ce0
--- /dev/null
+++ b/plugins/epan/opcua/opcua_security_layer.h
@@ -0,0 +1,18 @@
+/******************************************************************************
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: OpcUa Security Layer Decoder.
+**
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>
+******************************************************************************/
+
+void registerSecurityLayerTypes(int proto);
+void parseSecurityLayer(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
diff --git a/plugins/epan/opcua/opcua_serviceids.h b/plugins/epan/opcua/opcua_serviceids.h
new file mode 100644
index 00000000..9911a927
--- /dev/null
+++ b/plugins/epan/opcua/opcua_serviceids.h
@@ -0,0 +1,187 @@
+/******************************************************************************
+** Copyright (C) 2006-2015 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: OpcUa Service IDs
+**
+** This file was autogenerated on 13.10.2015.
+** DON'T MODIFY THIS FILE!
+** XXX - well, except that you may have to. See the README.
+**
+******************************************************************************/
+
+#define OpcUaId_ServiceFault_Encoding_DefaultBinary 397
+#define OpcUaId_FindServersRequest_Encoding_DefaultBinary 422
+#define OpcUaId_FindServersResponse_Encoding_DefaultBinary 425
+#define OpcUaId_FindServersOnNetworkRequest_Encoding_DefaultBinary 12208
+#define OpcUaId_FindServersOnNetworkResponse_Encoding_DefaultBinary 12209
+#define OpcUaId_GetEndpointsRequest_Encoding_DefaultBinary 428
+#define OpcUaId_GetEndpointsResponse_Encoding_DefaultBinary 431
+#define OpcUaId_RegisterServerRequest_Encoding_DefaultBinary 437
+#define OpcUaId_RegisterServerResponse_Encoding_DefaultBinary 440
+#define OpcUaId_RegisterServer2Request_Encoding_DefaultBinary 12211
+#define OpcUaId_RegisterServer2Response_Encoding_DefaultBinary 12212
+#define OpcUaId_OpenSecureChannelRequest_Encoding_DefaultBinary 446
+#define OpcUaId_OpenSecureChannelResponse_Encoding_DefaultBinary 449
+#define OpcUaId_CloseSecureChannelRequest_Encoding_DefaultBinary 452
+#define OpcUaId_CloseSecureChannelResponse_Encoding_DefaultBinary 455
+#define OpcUaId_CreateSessionRequest_Encoding_DefaultBinary 461
+#define OpcUaId_CreateSessionResponse_Encoding_DefaultBinary 464
+#define OpcUaId_ActivateSessionRequest_Encoding_DefaultBinary 467
+#define OpcUaId_ActivateSessionResponse_Encoding_DefaultBinary 470
+#define OpcUaId_CloseSessionRequest_Encoding_DefaultBinary 473
+#define OpcUaId_CloseSessionResponse_Encoding_DefaultBinary 476
+#define OpcUaId_CancelRequest_Encoding_DefaultBinary 479
+#define OpcUaId_CancelResponse_Encoding_DefaultBinary 482
+#define OpcUaId_AddNodesRequest_Encoding_DefaultBinary 488
+#define OpcUaId_AddNodesResponse_Encoding_DefaultBinary 491
+#define OpcUaId_AddReferencesRequest_Encoding_DefaultBinary 494
+#define OpcUaId_AddReferencesResponse_Encoding_DefaultBinary 497
+#define OpcUaId_DeleteNodesRequest_Encoding_DefaultBinary 500
+#define OpcUaId_DeleteNodesResponse_Encoding_DefaultBinary 503
+#define OpcUaId_DeleteReferencesRequest_Encoding_DefaultBinary 506
+#define OpcUaId_DeleteReferencesResponse_Encoding_DefaultBinary 509
+#define OpcUaId_BrowseRequest_Encoding_DefaultBinary 527
+#define OpcUaId_BrowseResponse_Encoding_DefaultBinary 530
+#define OpcUaId_BrowseNextRequest_Encoding_DefaultBinary 533
+#define OpcUaId_BrowseNextResponse_Encoding_DefaultBinary 536
+#define OpcUaId_TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultBinary 554
+#define OpcUaId_TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultBinary 557
+#define OpcUaId_RegisterNodesRequest_Encoding_DefaultBinary 560
+#define OpcUaId_RegisterNodesResponse_Encoding_DefaultBinary 563
+#define OpcUaId_UnregisterNodesRequest_Encoding_DefaultBinary 566
+#define OpcUaId_UnregisterNodesResponse_Encoding_DefaultBinary 569
+#define OpcUaId_QueryFirstRequest_Encoding_DefaultBinary 615
+#define OpcUaId_QueryFirstResponse_Encoding_DefaultBinary 618
+#define OpcUaId_QueryNextRequest_Encoding_DefaultBinary 621
+#define OpcUaId_QueryNextResponse_Encoding_DefaultBinary 624
+#define OpcUaId_ReadRequest_Encoding_DefaultBinary 631
+#define OpcUaId_ReadResponse_Encoding_DefaultBinary 634
+#define OpcUaId_HistoryReadRequest_Encoding_DefaultBinary 664
+#define OpcUaId_HistoryReadResponse_Encoding_DefaultBinary 667
+#define OpcUaId_WriteRequest_Encoding_DefaultBinary 673
+#define OpcUaId_WriteResponse_Encoding_DefaultBinary 676
+#define OpcUaId_HistoryUpdateRequest_Encoding_DefaultBinary 700
+#define OpcUaId_HistoryUpdateResponse_Encoding_DefaultBinary 703
+#define OpcUaId_CallRequest_Encoding_DefaultBinary 712
+#define OpcUaId_CallResponse_Encoding_DefaultBinary 715
+#define OpcUaId_CreateMonitoredItemsRequest_Encoding_DefaultBinary 751
+#define OpcUaId_CreateMonitoredItemsResponse_Encoding_DefaultBinary 754
+#define OpcUaId_ModifyMonitoredItemsRequest_Encoding_DefaultBinary 763
+#define OpcUaId_ModifyMonitoredItemsResponse_Encoding_DefaultBinary 766
+#define OpcUaId_SetMonitoringModeRequest_Encoding_DefaultBinary 769
+#define OpcUaId_SetMonitoringModeResponse_Encoding_DefaultBinary 772
+#define OpcUaId_SetTriggeringRequest_Encoding_DefaultBinary 775
+#define OpcUaId_SetTriggeringResponse_Encoding_DefaultBinary 778
+#define OpcUaId_DeleteMonitoredItemsRequest_Encoding_DefaultBinary 781
+#define OpcUaId_DeleteMonitoredItemsResponse_Encoding_DefaultBinary 784
+#define OpcUaId_CreateSubscriptionRequest_Encoding_DefaultBinary 787
+#define OpcUaId_CreateSubscriptionResponse_Encoding_DefaultBinary 790
+#define OpcUaId_ModifySubscriptionRequest_Encoding_DefaultBinary 793
+#define OpcUaId_ModifySubscriptionResponse_Encoding_DefaultBinary 796
+#define OpcUaId_SetPublishingModeRequest_Encoding_DefaultBinary 799
+#define OpcUaId_SetPublishingModeResponse_Encoding_DefaultBinary 802
+#define OpcUaId_PublishRequest_Encoding_DefaultBinary 826
+#define OpcUaId_PublishResponse_Encoding_DefaultBinary 829
+#define OpcUaId_RepublishRequest_Encoding_DefaultBinary 832
+#define OpcUaId_RepublishResponse_Encoding_DefaultBinary 835
+#define OpcUaId_TransferSubscriptionsRequest_Encoding_DefaultBinary 841
+#define OpcUaId_TransferSubscriptionsResponse_Encoding_DefaultBinary 844
+#define OpcUaId_DeleteSubscriptionsRequest_Encoding_DefaultBinary 847
+#define OpcUaId_DeleteSubscriptionsResponse_Encoding_DefaultBinary 850
+#define OpcUaId_TestStackRequest_Encoding_DefaultBinary 410
+#define OpcUaId_TestStackResponse_Encoding_DefaultBinary 413
+#define OpcUaId_TestStackExRequest_Encoding_DefaultBinary 416
+#define OpcUaId_TestStackExResponse_Encoding_DefaultBinary 419
+
+#define OpcUaId_ServiceFault_Encoding_DefaultXml 396
+#define OpcUaId_FindServersRequest_Encoding_DefaultXml 421
+#define OpcUaId_FindServersResponse_Encoding_DefaultXml 424
+#define OpcUaId_FindServersOnNetworkRequest_Encoding_DefaultXml 12196
+#define OpcUaId_FindServersOnNetworkResponse_Encoding_DefaultXml 12197
+#define OpcUaId_GetEndpointsRequest_Encoding_DefaultXml 427
+#define OpcUaId_GetEndpointsResponse_Encoding_DefaultXml 430
+#define OpcUaId_RegisterServerRequest_Encoding_DefaultXml 436
+#define OpcUaId_RegisterServerResponse_Encoding_DefaultXml 439
+#define OpcUaId_RegisterServer2Request_Encoding_DefaultXml 12199
+#define OpcUaId_RegisterServer2Response_Encoding_DefaultXml 12200
+#define OpcUaId_OpenSecureChannelRequest_Encoding_DefaultXml 445
+#define OpcUaId_OpenSecureChannelResponse_Encoding_DefaultXml 448
+#define OpcUaId_CloseSecureChannelRequest_Encoding_DefaultXml 451
+#define OpcUaId_CloseSecureChannelResponse_Encoding_DefaultXml 454
+#define OpcUaId_CreateSessionRequest_Encoding_DefaultXml 460
+#define OpcUaId_CreateSessionResponse_Encoding_DefaultXml 463
+#define OpcUaId_ActivateSessionRequest_Encoding_DefaultXml 466
+#define OpcUaId_ActivateSessionResponse_Encoding_DefaultXml 469
+#define OpcUaId_CloseSessionRequest_Encoding_DefaultXml 472
+#define OpcUaId_CloseSessionResponse_Encoding_DefaultXml 475
+#define OpcUaId_CancelRequest_Encoding_DefaultXml 478
+#define OpcUaId_CancelResponse_Encoding_DefaultXml 481
+#define OpcUaId_AddNodesRequest_Encoding_DefaultXml 487
+#define OpcUaId_AddNodesResponse_Encoding_DefaultXml 490
+#define OpcUaId_AddReferencesRequest_Encoding_DefaultXml 493
+#define OpcUaId_AddReferencesResponse_Encoding_DefaultXml 496
+#define OpcUaId_DeleteNodesRequest_Encoding_DefaultXml 499
+#define OpcUaId_DeleteNodesResponse_Encoding_DefaultXml 502
+#define OpcUaId_DeleteReferencesRequest_Encoding_DefaultXml 505
+#define OpcUaId_DeleteReferencesResponse_Encoding_DefaultXml 508
+#define OpcUaId_BrowseRequest_Encoding_DefaultXml 526
+#define OpcUaId_BrowseResponse_Encoding_DefaultXml 529
+#define OpcUaId_BrowseNextRequest_Encoding_DefaultXml 532
+#define OpcUaId_BrowseNextResponse_Encoding_DefaultXml 535
+#define OpcUaId_TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultXml 553
+#define OpcUaId_TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultXml 556
+#define OpcUaId_RegisterNodesRequest_Encoding_DefaultXml 559
+#define OpcUaId_RegisterNodesResponse_Encoding_DefaultXml 562
+#define OpcUaId_UnregisterNodesRequest_Encoding_DefaultXml 565
+#define OpcUaId_UnregisterNodesResponse_Encoding_DefaultXml 568
+#define OpcUaId_QueryFirstRequest_Encoding_DefaultXml 614
+#define OpcUaId_QueryFirstResponse_Encoding_DefaultXml 617
+#define OpcUaId_QueryNextRequest_Encoding_DefaultXml 620
+#define OpcUaId_QueryNextResponse_Encoding_DefaultXml 623
+#define OpcUaId_ReadRequest_Encoding_DefaultXml 630
+#define OpcUaId_ReadResponse_Encoding_DefaultXml 633
+#define OpcUaId_HistoryReadRequest_Encoding_DefaultXml 663
+#define OpcUaId_HistoryReadResponse_Encoding_DefaultXml 666
+#define OpcUaId_WriteRequest_Encoding_DefaultXml 672
+#define OpcUaId_WriteResponse_Encoding_DefaultXml 675
+#define OpcUaId_HistoryUpdateRequest_Encoding_DefaultXml 699
+#define OpcUaId_HistoryUpdateResponse_Encoding_DefaultXml 702
+#define OpcUaId_CallRequest_Encoding_DefaultXml 711
+#define OpcUaId_CallResponse_Encoding_DefaultXml 714
+#define OpcUaId_CreateMonitoredItemsRequest_Encoding_DefaultXml 750
+#define OpcUaId_CreateMonitoredItemsResponse_Encoding_DefaultXml 753
+#define OpcUaId_ModifyMonitoredItemsRequest_Encoding_DefaultXml 762
+#define OpcUaId_ModifyMonitoredItemsResponse_Encoding_DefaultXml 765
+#define OpcUaId_SetMonitoringModeRequest_Encoding_DefaultXml 768
+#define OpcUaId_SetMonitoringModeResponse_Encoding_DefaultXml 771
+#define OpcUaId_SetTriggeringRequest_Encoding_DefaultXml 774
+#define OpcUaId_SetTriggeringResponse_Encoding_DefaultXml 777
+#define OpcUaId_DeleteMonitoredItemsRequest_Encoding_DefaultXml 780
+#define OpcUaId_DeleteMonitoredItemsResponse_Encoding_DefaultXml 783
+#define OpcUaId_CreateSubscriptionRequest_Encoding_DefaultXml 786
+#define OpcUaId_CreateSubscriptionResponse_Encoding_DefaultXml 789
+#define OpcUaId_ModifySubscriptionRequest_Encoding_DefaultXml 792
+#define OpcUaId_ModifySubscriptionResponse_Encoding_DefaultXml 795
+#define OpcUaId_SetPublishingModeRequest_Encoding_DefaultXml 798
+#define OpcUaId_SetPublishingModeResponse_Encoding_DefaultXml 801
+#define OpcUaId_PublishRequest_Encoding_DefaultXml 825
+#define OpcUaId_PublishResponse_Encoding_DefaultXml 828
+#define OpcUaId_RepublishRequest_Encoding_DefaultXml 831
+#define OpcUaId_RepublishResponse_Encoding_DefaultXml 834
+#define OpcUaId_TransferSubscriptionsRequest_Encoding_DefaultXml 840
+#define OpcUaId_TransferSubscriptionsResponse_Encoding_DefaultXml 843
+#define OpcUaId_DeleteSubscriptionsRequest_Encoding_DefaultXml 846
+#define OpcUaId_DeleteSubscriptionsResponse_Encoding_DefaultXml 849
+#define OpcUaId_TestStackRequest_Encoding_DefaultXml 409
+#define OpcUaId_TestStackResponse_Encoding_DefaultXml 412
+#define OpcUaId_TestStackExRequest_Encoding_DefaultXml 415
+#define OpcUaId_TestStackExResponse_Encoding_DefaultXml 418
+
diff --git a/plugins/epan/opcua/opcua_serviceparser.c b/plugins/epan/opcua/opcua_serviceparser.c
new file mode 100644
index 00000000..d71b6781
--- /dev/null
+++ b/plugins/epan/opcua/opcua_serviceparser.c
@@ -0,0 +1,1317 @@
+/******************************************************************************
+** Copyright (C) 2006-2015 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: OpcUa Complex Type Parser
+**
+** This file was autogenerated on 13.10.2015.
+** DON'T MODIFY THIS FILE!
+**
+******************************************************************************/
+
+#include "config.h"
+
+#include <epan/packet.h>
+#include "opcua_complextypeparser.h"
+#include "opcua_enumparser.h"
+#include "opcua_simpletypes.h"
+#include "opcua_hfindeces.h"
+#include "opcua_serviceparser.h"
+
+gint ett_opcua_ServiceFault = -1;
+gint ett_opcua_array_ServiceFault = -1;
+gint ett_opcua_FindServersRequest = -1;
+gint ett_opcua_array_FindServersRequest = -1;
+gint ett_opcua_FindServersResponse = -1;
+gint ett_opcua_array_FindServersResponse = -1;
+gint ett_opcua_FindServersOnNetworkRequest = -1;
+gint ett_opcua_array_FindServersOnNetworkRequest = -1;
+gint ett_opcua_FindServersOnNetworkResponse = -1;
+gint ett_opcua_array_FindServersOnNetworkResponse = -1;
+gint ett_opcua_GetEndpointsRequest = -1;
+gint ett_opcua_array_GetEndpointsRequest = -1;
+gint ett_opcua_GetEndpointsResponse = -1;
+gint ett_opcua_array_GetEndpointsResponse = -1;
+gint ett_opcua_RegisterServerRequest = -1;
+gint ett_opcua_array_RegisterServerRequest = -1;
+gint ett_opcua_RegisterServerResponse = -1;
+gint ett_opcua_array_RegisterServerResponse = -1;
+gint ett_opcua_RegisterServer2Request = -1;
+gint ett_opcua_array_RegisterServer2Request = -1;
+gint ett_opcua_RegisterServer2Response = -1;
+gint ett_opcua_array_RegisterServer2Response = -1;
+gint ett_opcua_OpenSecureChannelRequest = -1;
+gint ett_opcua_array_OpenSecureChannelRequest = -1;
+gint ett_opcua_OpenSecureChannelResponse = -1;
+gint ett_opcua_array_OpenSecureChannelResponse = -1;
+gint ett_opcua_CloseSecureChannelRequest = -1;
+gint ett_opcua_array_CloseSecureChannelRequest = -1;
+gint ett_opcua_CloseSecureChannelResponse = -1;
+gint ett_opcua_array_CloseSecureChannelResponse = -1;
+gint ett_opcua_CreateSessionRequest = -1;
+gint ett_opcua_array_CreateSessionRequest = -1;
+gint ett_opcua_CreateSessionResponse = -1;
+gint ett_opcua_array_CreateSessionResponse = -1;
+gint ett_opcua_ActivateSessionRequest = -1;
+gint ett_opcua_array_ActivateSessionRequest = -1;
+gint ett_opcua_ActivateSessionResponse = -1;
+gint ett_opcua_array_ActivateSessionResponse = -1;
+gint ett_opcua_CloseSessionRequest = -1;
+gint ett_opcua_array_CloseSessionRequest = -1;
+gint ett_opcua_CloseSessionResponse = -1;
+gint ett_opcua_array_CloseSessionResponse = -1;
+gint ett_opcua_CancelRequest = -1;
+gint ett_opcua_array_CancelRequest = -1;
+gint ett_opcua_CancelResponse = -1;
+gint ett_opcua_array_CancelResponse = -1;
+gint ett_opcua_AddNodesRequest = -1;
+gint ett_opcua_array_AddNodesRequest = -1;
+gint ett_opcua_AddNodesResponse = -1;
+gint ett_opcua_array_AddNodesResponse = -1;
+gint ett_opcua_AddReferencesRequest = -1;
+gint ett_opcua_array_AddReferencesRequest = -1;
+gint ett_opcua_AddReferencesResponse = -1;
+gint ett_opcua_array_AddReferencesResponse = -1;
+gint ett_opcua_DeleteNodesRequest = -1;
+gint ett_opcua_array_DeleteNodesRequest = -1;
+gint ett_opcua_DeleteNodesResponse = -1;
+gint ett_opcua_array_DeleteNodesResponse = -1;
+gint ett_opcua_DeleteReferencesRequest = -1;
+gint ett_opcua_array_DeleteReferencesRequest = -1;
+gint ett_opcua_DeleteReferencesResponse = -1;
+gint ett_opcua_array_DeleteReferencesResponse = -1;
+gint ett_opcua_BrowseRequest = -1;
+gint ett_opcua_array_BrowseRequest = -1;
+gint ett_opcua_BrowseResponse = -1;
+gint ett_opcua_array_BrowseResponse = -1;
+gint ett_opcua_BrowseNextRequest = -1;
+gint ett_opcua_array_BrowseNextRequest = -1;
+gint ett_opcua_BrowseNextResponse = -1;
+gint ett_opcua_array_BrowseNextResponse = -1;
+gint ett_opcua_TranslateBrowsePathsToNodeIdsRequest = -1;
+gint ett_opcua_array_TranslateBrowsePathsToNodeIdsRequest = -1;
+gint ett_opcua_TranslateBrowsePathsToNodeIdsResponse = -1;
+gint ett_opcua_array_TranslateBrowsePathsToNodeIdsResponse = -1;
+gint ett_opcua_RegisterNodesRequest = -1;
+gint ett_opcua_array_RegisterNodesRequest = -1;
+gint ett_opcua_RegisterNodesResponse = -1;
+gint ett_opcua_array_RegisterNodesResponse = -1;
+gint ett_opcua_UnregisterNodesRequest = -1;
+gint ett_opcua_array_UnregisterNodesRequest = -1;
+gint ett_opcua_UnregisterNodesResponse = -1;
+gint ett_opcua_array_UnregisterNodesResponse = -1;
+gint ett_opcua_QueryFirstRequest = -1;
+gint ett_opcua_array_QueryFirstRequest = -1;
+gint ett_opcua_QueryFirstResponse = -1;
+gint ett_opcua_array_QueryFirstResponse = -1;
+gint ett_opcua_QueryNextRequest = -1;
+gint ett_opcua_array_QueryNextRequest = -1;
+gint ett_opcua_QueryNextResponse = -1;
+gint ett_opcua_array_QueryNextResponse = -1;
+gint ett_opcua_ReadRequest = -1;
+gint ett_opcua_array_ReadRequest = -1;
+gint ett_opcua_ReadResponse = -1;
+gint ett_opcua_array_ReadResponse = -1;
+gint ett_opcua_HistoryReadRequest = -1;
+gint ett_opcua_array_HistoryReadRequest = -1;
+gint ett_opcua_HistoryReadResponse = -1;
+gint ett_opcua_array_HistoryReadResponse = -1;
+gint ett_opcua_WriteRequest = -1;
+gint ett_opcua_array_WriteRequest = -1;
+gint ett_opcua_WriteResponse = -1;
+gint ett_opcua_array_WriteResponse = -1;
+gint ett_opcua_HistoryUpdateRequest = -1;
+gint ett_opcua_array_HistoryUpdateRequest = -1;
+gint ett_opcua_HistoryUpdateResponse = -1;
+gint ett_opcua_array_HistoryUpdateResponse = -1;
+gint ett_opcua_CallRequest = -1;
+gint ett_opcua_array_CallRequest = -1;
+gint ett_opcua_CallResponse = -1;
+gint ett_opcua_array_CallResponse = -1;
+gint ett_opcua_CreateMonitoredItemsRequest = -1;
+gint ett_opcua_array_CreateMonitoredItemsRequest = -1;
+gint ett_opcua_CreateMonitoredItemsResponse = -1;
+gint ett_opcua_array_CreateMonitoredItemsResponse = -1;
+gint ett_opcua_ModifyMonitoredItemsRequest = -1;
+gint ett_opcua_array_ModifyMonitoredItemsRequest = -1;
+gint ett_opcua_ModifyMonitoredItemsResponse = -1;
+gint ett_opcua_array_ModifyMonitoredItemsResponse = -1;
+gint ett_opcua_SetMonitoringModeRequest = -1;
+gint ett_opcua_array_SetMonitoringModeRequest = -1;
+gint ett_opcua_SetMonitoringModeResponse = -1;
+gint ett_opcua_array_SetMonitoringModeResponse = -1;
+gint ett_opcua_SetTriggeringRequest = -1;
+gint ett_opcua_array_SetTriggeringRequest = -1;
+gint ett_opcua_SetTriggeringResponse = -1;
+gint ett_opcua_array_SetTriggeringResponse = -1;
+gint ett_opcua_DeleteMonitoredItemsRequest = -1;
+gint ett_opcua_array_DeleteMonitoredItemsRequest = -1;
+gint ett_opcua_DeleteMonitoredItemsResponse = -1;
+gint ett_opcua_array_DeleteMonitoredItemsResponse = -1;
+gint ett_opcua_CreateSubscriptionRequest = -1;
+gint ett_opcua_array_CreateSubscriptionRequest = -1;
+gint ett_opcua_CreateSubscriptionResponse = -1;
+gint ett_opcua_array_CreateSubscriptionResponse = -1;
+gint ett_opcua_ModifySubscriptionRequest = -1;
+gint ett_opcua_array_ModifySubscriptionRequest = -1;
+gint ett_opcua_ModifySubscriptionResponse = -1;
+gint ett_opcua_array_ModifySubscriptionResponse = -1;
+gint ett_opcua_SetPublishingModeRequest = -1;
+gint ett_opcua_array_SetPublishingModeRequest = -1;
+gint ett_opcua_SetPublishingModeResponse = -1;
+gint ett_opcua_array_SetPublishingModeResponse = -1;
+gint ett_opcua_PublishRequest = -1;
+gint ett_opcua_array_PublishRequest = -1;
+gint ett_opcua_PublishResponse = -1;
+gint ett_opcua_array_PublishResponse = -1;
+gint ett_opcua_RepublishRequest = -1;
+gint ett_opcua_array_RepublishRequest = -1;
+gint ett_opcua_RepublishResponse = -1;
+gint ett_opcua_array_RepublishResponse = -1;
+gint ett_opcua_TransferSubscriptionsRequest = -1;
+gint ett_opcua_array_TransferSubscriptionsRequest = -1;
+gint ett_opcua_TransferSubscriptionsResponse = -1;
+gint ett_opcua_array_TransferSubscriptionsResponse = -1;
+gint ett_opcua_DeleteSubscriptionsRequest = -1;
+gint ett_opcua_array_DeleteSubscriptionsRequest = -1;
+gint ett_opcua_DeleteSubscriptionsResponse = -1;
+gint ett_opcua_array_DeleteSubscriptionsResponse = -1;
+gint ett_opcua_TestStackRequest = -1;
+gint ett_opcua_array_TestStackRequest = -1;
+gint ett_opcua_TestStackResponse = -1;
+gint ett_opcua_array_TestStackResponse = -1;
+gint ett_opcua_TestStackExRequest = -1;
+gint ett_opcua_array_TestStackExRequest = -1;
+gint ett_opcua_TestStackExResponse = -1;
+gint ett_opcua_array_TestStackExResponse = -1;
+
+void parseServiceFault(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_ServiceFault, &ti, "ServiceFault");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseFindServersRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_FindServersRequest, &ti, "FindServersRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_EndpointUrl);
+ /* Array length field ignored: NoOfLocaleIds */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "LocaleIds", "String", hf_opcua_LocaleIds, parseString, ett_opcua_array_String);
+ /* Array length field ignored: NoOfServerUris */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "ServerUris", "String", hf_opcua_ServerUris, parseString, ett_opcua_array_String);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseFindServersResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_FindServersResponse, &ti, "FindServersResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfServers */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Servers", "ApplicationDescription", parseApplicationDescription, ett_opcua_array_ApplicationDescription);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseFindServersOnNetworkRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_FindServersOnNetworkRequest, &ti, "FindServersOnNetworkRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_StartingRecordId);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxRecordsToReturn);
+ /* Array length field ignored: NoOfServerCapabilityFilter */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "ServerCapabilityFilter", "String", hf_opcua_ServerCapabilityFilter, parseString, ett_opcua_array_String);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseFindServersOnNetworkResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_FindServersOnNetworkResponse, &ti, "FindServersOnNetworkResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ parseDateTime(subtree, tvb, pinfo, pOffset, hf_opcua_LastCounterResetTime);
+ /* Array length field ignored: NoOfServers */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Servers", "ServerOnNetwork", parseServerOnNetwork, ett_opcua_array_ServerOnNetwork);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseGetEndpointsRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_GetEndpointsRequest, &ti, "GetEndpointsRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_EndpointUrl);
+ /* Array length field ignored: NoOfLocaleIds */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "LocaleIds", "String", hf_opcua_LocaleIds, parseString, ett_opcua_array_String);
+ /* Array length field ignored: NoOfProfileUris */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "ProfileUris", "String", hf_opcua_ProfileUris, parseString, ett_opcua_array_String);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseGetEndpointsResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_GetEndpointsResponse, &ti, "GetEndpointsResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfEndpoints */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Endpoints", "EndpointDescription", parseEndpointDescription, ett_opcua_array_EndpointDescription);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseRegisterServerRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_RegisterServerRequest, &ti, "RegisterServerRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseRegisteredServer(subtree, tvb, pinfo, pOffset, "Server");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseRegisterServerResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_RegisterServerResponse, &ti, "RegisterServerResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseRegisterServer2Request(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_RegisterServer2Request, &ti, "RegisterServer2Request");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseRegisteredServer(subtree, tvb, pinfo, pOffset, "Server");
+ /* Array length field ignored: NoOfDiscoveryConfiguration */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiscoveryConfiguration", "ExtensionObject", parseExtensionObject, ett_opcua_array_ExtensionObject);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseRegisterServer2Response(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_RegisterServer2Response, &ti, "RegisterServer2Response");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfConfigurationResults */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "ConfigurationResults", "StatusCode", hf_opcua_ConfigurationResults, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseOpenSecureChannelRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_OpenSecureChannelRequest, &ti, "OpenSecureChannelRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ClientProtocolVersion);
+ parseSecurityTokenRequestType(subtree, tvb, pinfo, pOffset);
+ parseMessageSecurityMode(subtree, tvb, pinfo, pOffset);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ClientNonce);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RequestedLifetime);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseOpenSecureChannelResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_OpenSecureChannelResponse, &ti, "OpenSecureChannelResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_ServerProtocolVersion);
+ parseChannelSecurityToken(subtree, tvb, pinfo, pOffset, "SecurityToken");
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerNonce);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCloseSecureChannelRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_CloseSecureChannelRequest, &ti, "CloseSecureChannelRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCloseSecureChannelResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_CloseSecureChannelResponse, &ti, "CloseSecureChannelResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCreateSessionRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_CreateSessionRequest, &ti, "CreateSessionRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseApplicationDescription(subtree, tvb, pinfo, pOffset, "ClientDescription");
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerUri);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_EndpointUrl);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_SessionName);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ClientNonce);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ClientCertificate);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_RequestedSessionTimeout);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxResponseMessageSize);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCreateSessionResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_CreateSessionResponse, &ti, "CreateSessionResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ parseNodeId(subtree, tvb, pinfo, pOffset, "SessionId");
+ parseNodeId(subtree, tvb, pinfo, pOffset, "AuthenticationToken");
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedSessionTimeout);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerNonce);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerCertificate);
+ /* Array length field ignored: NoOfServerEndpoints */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "ServerEndpoints", "EndpointDescription", parseEndpointDescription, ett_opcua_array_EndpointDescription);
+ /* Array length field ignored: NoOfServerSoftwareCertificates */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "ServerSoftwareCertificates", "SignedSoftwareCertificate", parseSignedSoftwareCertificate, ett_opcua_array_SignedSoftwareCertificate);
+ parseSignatureData(subtree, tvb, pinfo, pOffset, "ServerSignature");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxRequestMessageSize);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseActivateSessionRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_ActivateSessionRequest, &ti, "ActivateSessionRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseSignatureData(subtree, tvb, pinfo, pOffset, "ClientSignature");
+ /* Array length field ignored: NoOfClientSoftwareCertificates */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "ClientSoftwareCertificates", "SignedSoftwareCertificate", parseSignedSoftwareCertificate, ett_opcua_array_SignedSoftwareCertificate);
+ /* Array length field ignored: NoOfLocaleIds */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "LocaleIds", "String", hf_opcua_LocaleIds, parseString, ett_opcua_array_String);
+ parseExtensionObject(subtree, tvb, pinfo, pOffset, "UserIdentityToken");
+ parseSignatureData(subtree, tvb, pinfo, pOffset, "UserTokenSignature");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseActivateSessionResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_ActivateSessionResponse, &ti, "ActivateSessionResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ServerNonce);
+ /* Array length field ignored: NoOfResults */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Results", "StatusCode", hf_opcua_Results, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCloseSessionRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_CloseSessionRequest, &ti, "CloseSessionRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_DeleteSubscriptions);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCloseSessionResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_CloseSessionResponse, &ti, "CloseSessionResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCancelRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_CancelRequest, &ti, "CancelRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RequestHandle);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCancelResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_CancelResponse, &ti, "CancelResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_CancelCount);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseAddNodesRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_AddNodesRequest, &ti, "AddNodesRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ /* Array length field ignored: NoOfNodesToAdd */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "NodesToAdd", "AddNodesItem", parseAddNodesItem, ett_opcua_array_AddNodesItem);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseAddNodesResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_AddNodesResponse, &ti, "AddNodesResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Results", "AddNodesResult", parseAddNodesResult, ett_opcua_array_AddNodesResult);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseAddReferencesRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_AddReferencesRequest, &ti, "AddReferencesRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ /* Array length field ignored: NoOfReferencesToAdd */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "ReferencesToAdd", "AddReferencesItem", parseAddReferencesItem, ett_opcua_array_AddReferencesItem);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseAddReferencesResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_AddReferencesResponse, &ti, "AddReferencesResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Results", "StatusCode", hf_opcua_Results, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDeleteNodesRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_DeleteNodesRequest, &ti, "DeleteNodesRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ /* Array length field ignored: NoOfNodesToDelete */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "NodesToDelete", "DeleteNodesItem", parseDeleteNodesItem, ett_opcua_array_DeleteNodesItem);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDeleteNodesResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_DeleteNodesResponse, &ti, "DeleteNodesResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Results", "StatusCode", hf_opcua_Results, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDeleteReferencesRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_DeleteReferencesRequest, &ti, "DeleteReferencesRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ /* Array length field ignored: NoOfReferencesToDelete */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "ReferencesToDelete", "DeleteReferencesItem", parseDeleteReferencesItem, ett_opcua_array_DeleteReferencesItem);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDeleteReferencesResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_DeleteReferencesResponse, &ti, "DeleteReferencesResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Results", "StatusCode", hf_opcua_Results, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseBrowseRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_BrowseRequest, &ti, "BrowseRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseViewDescription(subtree, tvb, pinfo, pOffset, "View");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RequestedMaxReferencesPerNode);
+ /* Array length field ignored: NoOfNodesToBrowse */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "NodesToBrowse", "BrowseDescription", parseBrowseDescription, ett_opcua_array_BrowseDescription);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseBrowseResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_BrowseResponse, &ti, "BrowseResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Results", "BrowseResult", parseBrowseResult, ett_opcua_array_BrowseResult);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseBrowseNextRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_BrowseNextRequest, &ti, "BrowseNextRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_ReleaseContinuationPoints);
+ /* Array length field ignored: NoOfContinuationPoints */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "ContinuationPoints", "ByteString", hf_opcua_ContinuationPoints, parseByteString, ett_opcua_array_ByteString);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseBrowseNextResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_BrowseNextResponse, &ti, "BrowseNextResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Results", "BrowseResult", parseBrowseResult, ett_opcua_array_BrowseResult);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseTranslateBrowsePathsToNodeIdsRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_TranslateBrowsePathsToNodeIdsRequest, &ti, "TranslateBrowsePathsToNodeIdsRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ /* Array length field ignored: NoOfBrowsePaths */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "BrowsePaths", "BrowsePath", parseBrowsePath, ett_opcua_array_BrowsePath);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseTranslateBrowsePathsToNodeIdsResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_TranslateBrowsePathsToNodeIdsResponse, &ti, "TranslateBrowsePathsToNodeIdsResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Results", "BrowsePathResult", parseBrowsePathResult, ett_opcua_array_BrowsePathResult);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseRegisterNodesRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_RegisterNodesRequest, &ti, "RegisterNodesRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ /* Array length field ignored: NoOfNodesToRegister */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "NodesToRegister", "NodeId", parseNodeId, ett_opcua_array_NodeId);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseRegisterNodesResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_RegisterNodesResponse, &ti, "RegisterNodesResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfRegisteredNodeIds */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "RegisteredNodeIds", "NodeId", parseNodeId, ett_opcua_array_NodeId);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseUnregisterNodesRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_UnregisterNodesRequest, &ti, "UnregisterNodesRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ /* Array length field ignored: NoOfNodesToUnregister */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "NodesToUnregister", "NodeId", parseNodeId, ett_opcua_array_NodeId);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseUnregisterNodesResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_UnregisterNodesResponse, &ti, "UnregisterNodesResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseQueryFirstRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_QueryFirstRequest, &ti, "QueryFirstRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseViewDescription(subtree, tvb, pinfo, pOffset, "View");
+ /* Array length field ignored: NoOfNodeTypes */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "NodeTypes", "NodeTypeDescription", parseNodeTypeDescription, ett_opcua_array_NodeTypeDescription);
+ parseContentFilter(subtree, tvb, pinfo, pOffset, "Filter");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxDataSetsToReturn);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxReferencesToReturn);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseQueryFirstResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_QueryFirstResponse, &ti, "QueryFirstResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfQueryDataSets */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "QueryDataSets", "QueryDataSet", parseQueryDataSet, ett_opcua_array_QueryDataSet);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ContinuationPoint);
+ /* Array length field ignored: NoOfParsingResults */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "ParsingResults", "ParsingResult", parseParsingResult, ett_opcua_array_ParsingResult);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ parseContentFilterResult(subtree, tvb, pinfo, pOffset, "FilterResult");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseQueryNextRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_QueryNextRequest, &ti, "QueryNextRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_ReleaseContinuationPoint);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_ContinuationPoint);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseQueryNextResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_QueryNextResponse, &ti, "QueryNextResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfQueryDataSets */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "QueryDataSets", "QueryDataSet", parseQueryDataSet, ett_opcua_array_QueryDataSet);
+ parseByteString(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedContinuationPoint);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseReadRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_ReadRequest, &ti, "ReadRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_MaxAge);
+ parseTimestampsToReturn(subtree, tvb, pinfo, pOffset);
+ /* Array length field ignored: NoOfNodesToRead */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "NodesToRead", "ReadValueId", parseReadValueId, ett_opcua_array_ReadValueId);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseReadResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_ReadResponse, &ti, "ReadResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Results", "DataValue", parseDataValue, ett_opcua_array_DataValue);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseHistoryReadRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_HistoryReadRequest, &ti, "HistoryReadRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseExtensionObject(subtree, tvb, pinfo, pOffset, "HistoryReadDetails");
+ parseTimestampsToReturn(subtree, tvb, pinfo, pOffset);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_ReleaseContinuationPoints);
+ /* Array length field ignored: NoOfNodesToRead */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "NodesToRead", "HistoryReadValueId", parseHistoryReadValueId, ett_opcua_array_HistoryReadValueId);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseHistoryReadResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_HistoryReadResponse, &ti, "HistoryReadResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Results", "HistoryReadResult", parseHistoryReadResult, ett_opcua_array_HistoryReadResult);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseWriteRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_WriteRequest, &ti, "WriteRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ /* Array length field ignored: NoOfNodesToWrite */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "NodesToWrite", "WriteValue", parseWriteValue, ett_opcua_array_WriteValue);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseWriteResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_WriteResponse, &ti, "WriteResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Results", "StatusCode", hf_opcua_Results, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseHistoryUpdateRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_HistoryUpdateRequest, &ti, "HistoryUpdateRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ /* Array length field ignored: NoOfHistoryUpdateDetails */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "HistoryUpdateDetails", "ExtensionObject", parseExtensionObject, ett_opcua_array_ExtensionObject);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseHistoryUpdateResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_HistoryUpdateResponse, &ti, "HistoryUpdateResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Results", "HistoryUpdateResult", parseHistoryUpdateResult, ett_opcua_array_HistoryUpdateResult);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCallRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_CallRequest, &ti, "CallRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ /* Array length field ignored: NoOfMethodsToCall */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "MethodsToCall", "CallMethodRequest", parseCallMethodRequest, ett_opcua_array_CallMethodRequest);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCallResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_CallResponse, &ti, "CallResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Results", "CallMethodResult", parseCallMethodResult, ett_opcua_array_CallMethodResult);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCreateMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_CreateMonitoredItemsRequest, &ti, "CreateMonitoredItemsRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SubscriptionId);
+ parseTimestampsToReturn(subtree, tvb, pinfo, pOffset);
+ /* Array length field ignored: NoOfItemsToCreate */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "ItemsToCreate", "MonitoredItemCreateRequest", parseMonitoredItemCreateRequest, ett_opcua_array_MonitoredItemCreateRequest);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCreateMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_CreateMonitoredItemsResponse, &ti, "CreateMonitoredItemsResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Results", "MonitoredItemCreateResult", parseMonitoredItemCreateResult, ett_opcua_array_MonitoredItemCreateResult);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseModifyMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_ModifyMonitoredItemsRequest, &ti, "ModifyMonitoredItemsRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SubscriptionId);
+ parseTimestampsToReturn(subtree, tvb, pinfo, pOffset);
+ /* Array length field ignored: NoOfItemsToModify */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "ItemsToModify", "MonitoredItemModifyRequest", parseMonitoredItemModifyRequest, ett_opcua_array_MonitoredItemModifyRequest);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseModifyMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_ModifyMonitoredItemsResponse, &ti, "ModifyMonitoredItemsResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Results", "MonitoredItemModifyResult", parseMonitoredItemModifyResult, ett_opcua_array_MonitoredItemModifyResult);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSetMonitoringModeRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_SetMonitoringModeRequest, &ti, "SetMonitoringModeRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SubscriptionId);
+ parseMonitoringMode(subtree, tvb, pinfo, pOffset);
+ /* Array length field ignored: NoOfMonitoredItemIds */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "MonitoredItemIds", "UInt32", hf_opcua_MonitoredItemIds, parseUInt32, ett_opcua_array_UInt32);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSetMonitoringModeResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_SetMonitoringModeResponse, &ti, "SetMonitoringModeResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Results", "StatusCode", hf_opcua_Results, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSetTriggeringRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_SetTriggeringRequest, &ti, "SetTriggeringRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SubscriptionId);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_TriggeringItemId);
+ /* Array length field ignored: NoOfLinksToAdd */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "LinksToAdd", "UInt32", hf_opcua_LinksToAdd, parseUInt32, ett_opcua_array_UInt32);
+ /* Array length field ignored: NoOfLinksToRemove */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "LinksToRemove", "UInt32", hf_opcua_LinksToRemove, parseUInt32, ett_opcua_array_UInt32);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSetTriggeringResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_SetTriggeringResponse, &ti, "SetTriggeringResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfAddResults */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "AddResults", "StatusCode", hf_opcua_AddResults, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfAddDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "AddDiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ /* Array length field ignored: NoOfRemoveResults */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "RemoveResults", "StatusCode", hf_opcua_RemoveResults, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfRemoveDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "RemoveDiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDeleteMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_DeleteMonitoredItemsRequest, &ti, "DeleteMonitoredItemsRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SubscriptionId);
+ /* Array length field ignored: NoOfMonitoredItemIds */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "MonitoredItemIds", "UInt32", hf_opcua_MonitoredItemIds, parseUInt32, ett_opcua_array_UInt32);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDeleteMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_DeleteMonitoredItemsResponse, &ti, "DeleteMonitoredItemsResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Results", "StatusCode", hf_opcua_Results, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCreateSubscriptionRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_CreateSubscriptionRequest, &ti, "CreateSubscriptionRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_RequestedPublishingInterval);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RequestedLifetimeCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RequestedMaxKeepAliveCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxNotificationsPerPublish);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_PublishingEnabled);
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_Priority);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseCreateSubscriptionResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_CreateSubscriptionResponse, &ti, "CreateSubscriptionResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SubscriptionId);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedPublishingInterval);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedLifetimeCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedMaxKeepAliveCount);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseModifySubscriptionRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_ModifySubscriptionRequest, &ti, "ModifySubscriptionRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SubscriptionId);
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_RequestedPublishingInterval);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RequestedLifetimeCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RequestedMaxKeepAliveCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_MaxNotificationsPerPublish);
+ parseByte(subtree, tvb, pinfo, pOffset, hf_opcua_Priority);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseModifySubscriptionResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_ModifySubscriptionResponse, &ti, "ModifySubscriptionResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ parseDouble(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedPublishingInterval);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedLifetimeCount);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RevisedMaxKeepAliveCount);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSetPublishingModeRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_SetPublishingModeRequest, &ti, "SetPublishingModeRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_PublishingEnabled);
+ /* Array length field ignored: NoOfSubscriptionIds */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "SubscriptionIds", "UInt32", hf_opcua_SubscriptionIds, parseUInt32, ett_opcua_array_UInt32);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseSetPublishingModeResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_SetPublishingModeResponse, &ti, "SetPublishingModeResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Results", "StatusCode", hf_opcua_Results, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parsePublishRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_PublishRequest, &ti, "PublishRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ /* Array length field ignored: NoOfSubscriptionAcknowledgements */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "SubscriptionAcknowledgements", "SubscriptionAcknowledgement", parseSubscriptionAcknowledgement, ett_opcua_array_SubscriptionAcknowledgement);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parsePublishResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_PublishResponse, &ti, "PublishResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SubscriptionId);
+ /* Array length field ignored: NoOfAvailableSequenceNumbers */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "AvailableSequenceNumbers", "UInt32", hf_opcua_AvailableSequenceNumbers, parseUInt32, ett_opcua_array_UInt32);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_MoreNotifications);
+ parseNotificationMessage(subtree, tvb, pinfo, pOffset, "NotificationMessage");
+ /* Array length field ignored: NoOfResults */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Results", "StatusCode", hf_opcua_Results, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseRepublishRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_RepublishRequest, &ti, "RepublishRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_SubscriptionId);
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_RetransmitSequenceNumber);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseRepublishResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_RepublishResponse, &ti, "RepublishResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ parseNotificationMessage(subtree, tvb, pinfo, pOffset, "NotificationMessage");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseTransferSubscriptionsRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_TransferSubscriptionsRequest, &ti, "TransferSubscriptionsRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ /* Array length field ignored: NoOfSubscriptionIds */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "SubscriptionIds", "UInt32", hf_opcua_SubscriptionIds, parseUInt32, ett_opcua_array_UInt32);
+ parseBoolean(subtree, tvb, pinfo, pOffset, hf_opcua_SendInitialValues);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseTransferSubscriptionsResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_TransferSubscriptionsResponse, &ti, "TransferSubscriptionsResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "Results", "TransferResult", parseTransferResult, ett_opcua_array_TransferResult);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDeleteSubscriptionsRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_DeleteSubscriptionsRequest, &ti, "DeleteSubscriptionsRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ /* Array length field ignored: NoOfSubscriptionIds */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "SubscriptionIds", "UInt32", hf_opcua_SubscriptionIds, parseUInt32, ett_opcua_array_UInt32);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseDeleteSubscriptionsResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_DeleteSubscriptionsResponse, &ti, "DeleteSubscriptionsResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ /* Array length field ignored: NoOfResults */
+ parseArraySimple(subtree, tvb, pinfo, pOffset, "Results", "StatusCode", hf_opcua_Results, parseStatusCode, ett_opcua_array_StatusCode);
+ /* Array length field ignored: NoOfDiagnosticInfos */
+ parseArrayComplex(subtree, tvb, pinfo, pOffset, "DiagnosticInfos", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo);
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseTestStackRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_TestStackRequest, &ti, "TestStackRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_TestId);
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_Iteration);
+ parseVariant(subtree, tvb, pinfo, pOffset, "Input");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseTestStackResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_TestStackResponse, &ti, "TestStackResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ parseVariant(subtree, tvb, pinfo, pOffset, "Output");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseTestStackExRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_TestStackExRequest, &ti, "TestStackExRequest");
+
+ parseRequestHeader(subtree, tvb, pinfo, pOffset, "RequestHeader");
+ parseUInt32(subtree, tvb, pinfo, pOffset, hf_opcua_TestId);
+ parseInt32(subtree, tvb, pinfo, pOffset, hf_opcua_Iteration);
+ parseCompositeTestType(subtree, tvb, pinfo, pOffset, "Input");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+void parseTestStackExResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_TestStackExResponse, &ti, "TestStackExResponse");
+
+ parseResponseHeader(subtree, tvb, pinfo, pOffset, "ResponseHeader");
+ parseCompositeTestType(subtree, tvb, pinfo, pOffset, "Output");
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+
+/** Setup protocol subtree array */
+static gint *ett[] =
+{
+ &ett_opcua_ServiceFault,
+ &ett_opcua_array_ServiceFault,
+ &ett_opcua_FindServersRequest,
+ &ett_opcua_array_FindServersRequest,
+ &ett_opcua_FindServersResponse,
+ &ett_opcua_array_FindServersResponse,
+ &ett_opcua_FindServersOnNetworkRequest,
+ &ett_opcua_array_FindServersOnNetworkRequest,
+ &ett_opcua_FindServersOnNetworkResponse,
+ &ett_opcua_array_FindServersOnNetworkResponse,
+ &ett_opcua_GetEndpointsRequest,
+ &ett_opcua_array_GetEndpointsRequest,
+ &ett_opcua_GetEndpointsResponse,
+ &ett_opcua_array_GetEndpointsResponse,
+ &ett_opcua_RegisterServerRequest,
+ &ett_opcua_array_RegisterServerRequest,
+ &ett_opcua_RegisterServerResponse,
+ &ett_opcua_array_RegisterServerResponse,
+ &ett_opcua_RegisterServer2Request,
+ &ett_opcua_array_RegisterServer2Request,
+ &ett_opcua_RegisterServer2Response,
+ &ett_opcua_array_RegisterServer2Response,
+ &ett_opcua_OpenSecureChannelRequest,
+ &ett_opcua_array_OpenSecureChannelRequest,
+ &ett_opcua_OpenSecureChannelResponse,
+ &ett_opcua_array_OpenSecureChannelResponse,
+ &ett_opcua_CloseSecureChannelRequest,
+ &ett_opcua_array_CloseSecureChannelRequest,
+ &ett_opcua_CloseSecureChannelResponse,
+ &ett_opcua_array_CloseSecureChannelResponse,
+ &ett_opcua_CreateSessionRequest,
+ &ett_opcua_array_CreateSessionRequest,
+ &ett_opcua_CreateSessionResponse,
+ &ett_opcua_array_CreateSessionResponse,
+ &ett_opcua_ActivateSessionRequest,
+ &ett_opcua_array_ActivateSessionRequest,
+ &ett_opcua_ActivateSessionResponse,
+ &ett_opcua_array_ActivateSessionResponse,
+ &ett_opcua_CloseSessionRequest,
+ &ett_opcua_array_CloseSessionRequest,
+ &ett_opcua_CloseSessionResponse,
+ &ett_opcua_array_CloseSessionResponse,
+ &ett_opcua_CancelRequest,
+ &ett_opcua_array_CancelRequest,
+ &ett_opcua_CancelResponse,
+ &ett_opcua_array_CancelResponse,
+ &ett_opcua_AddNodesRequest,
+ &ett_opcua_array_AddNodesRequest,
+ &ett_opcua_AddNodesResponse,
+ &ett_opcua_array_AddNodesResponse,
+ &ett_opcua_AddReferencesRequest,
+ &ett_opcua_array_AddReferencesRequest,
+ &ett_opcua_AddReferencesResponse,
+ &ett_opcua_array_AddReferencesResponse,
+ &ett_opcua_DeleteNodesRequest,
+ &ett_opcua_array_DeleteNodesRequest,
+ &ett_opcua_DeleteNodesResponse,
+ &ett_opcua_array_DeleteNodesResponse,
+ &ett_opcua_DeleteReferencesRequest,
+ &ett_opcua_array_DeleteReferencesRequest,
+ &ett_opcua_DeleteReferencesResponse,
+ &ett_opcua_array_DeleteReferencesResponse,
+ &ett_opcua_BrowseRequest,
+ &ett_opcua_array_BrowseRequest,
+ &ett_opcua_BrowseResponse,
+ &ett_opcua_array_BrowseResponse,
+ &ett_opcua_BrowseNextRequest,
+ &ett_opcua_array_BrowseNextRequest,
+ &ett_opcua_BrowseNextResponse,
+ &ett_opcua_array_BrowseNextResponse,
+ &ett_opcua_TranslateBrowsePathsToNodeIdsRequest,
+ &ett_opcua_array_TranslateBrowsePathsToNodeIdsRequest,
+ &ett_opcua_TranslateBrowsePathsToNodeIdsResponse,
+ &ett_opcua_array_TranslateBrowsePathsToNodeIdsResponse,
+ &ett_opcua_RegisterNodesRequest,
+ &ett_opcua_array_RegisterNodesRequest,
+ &ett_opcua_RegisterNodesResponse,
+ &ett_opcua_array_RegisterNodesResponse,
+ &ett_opcua_UnregisterNodesRequest,
+ &ett_opcua_array_UnregisterNodesRequest,
+ &ett_opcua_UnregisterNodesResponse,
+ &ett_opcua_array_UnregisterNodesResponse,
+ &ett_opcua_QueryFirstRequest,
+ &ett_opcua_array_QueryFirstRequest,
+ &ett_opcua_QueryFirstResponse,
+ &ett_opcua_array_QueryFirstResponse,
+ &ett_opcua_QueryNextRequest,
+ &ett_opcua_array_QueryNextRequest,
+ &ett_opcua_QueryNextResponse,
+ &ett_opcua_array_QueryNextResponse,
+ &ett_opcua_ReadRequest,
+ &ett_opcua_array_ReadRequest,
+ &ett_opcua_ReadResponse,
+ &ett_opcua_array_ReadResponse,
+ &ett_opcua_HistoryReadRequest,
+ &ett_opcua_array_HistoryReadRequest,
+ &ett_opcua_HistoryReadResponse,
+ &ett_opcua_array_HistoryReadResponse,
+ &ett_opcua_WriteRequest,
+ &ett_opcua_array_WriteRequest,
+ &ett_opcua_WriteResponse,
+ &ett_opcua_array_WriteResponse,
+ &ett_opcua_HistoryUpdateRequest,
+ &ett_opcua_array_HistoryUpdateRequest,
+ &ett_opcua_HistoryUpdateResponse,
+ &ett_opcua_array_HistoryUpdateResponse,
+ &ett_opcua_CallRequest,
+ &ett_opcua_array_CallRequest,
+ &ett_opcua_CallResponse,
+ &ett_opcua_array_CallResponse,
+ &ett_opcua_CreateMonitoredItemsRequest,
+ &ett_opcua_array_CreateMonitoredItemsRequest,
+ &ett_opcua_CreateMonitoredItemsResponse,
+ &ett_opcua_array_CreateMonitoredItemsResponse,
+ &ett_opcua_ModifyMonitoredItemsRequest,
+ &ett_opcua_array_ModifyMonitoredItemsRequest,
+ &ett_opcua_ModifyMonitoredItemsResponse,
+ &ett_opcua_array_ModifyMonitoredItemsResponse,
+ &ett_opcua_SetMonitoringModeRequest,
+ &ett_opcua_array_SetMonitoringModeRequest,
+ &ett_opcua_SetMonitoringModeResponse,
+ &ett_opcua_array_SetMonitoringModeResponse,
+ &ett_opcua_SetTriggeringRequest,
+ &ett_opcua_array_SetTriggeringRequest,
+ &ett_opcua_SetTriggeringResponse,
+ &ett_opcua_array_SetTriggeringResponse,
+ &ett_opcua_DeleteMonitoredItemsRequest,
+ &ett_opcua_array_DeleteMonitoredItemsRequest,
+ &ett_opcua_DeleteMonitoredItemsResponse,
+ &ett_opcua_array_DeleteMonitoredItemsResponse,
+ &ett_opcua_CreateSubscriptionRequest,
+ &ett_opcua_array_CreateSubscriptionRequest,
+ &ett_opcua_CreateSubscriptionResponse,
+ &ett_opcua_array_CreateSubscriptionResponse,
+ &ett_opcua_ModifySubscriptionRequest,
+ &ett_opcua_array_ModifySubscriptionRequest,
+ &ett_opcua_ModifySubscriptionResponse,
+ &ett_opcua_array_ModifySubscriptionResponse,
+ &ett_opcua_SetPublishingModeRequest,
+ &ett_opcua_array_SetPublishingModeRequest,
+ &ett_opcua_SetPublishingModeResponse,
+ &ett_opcua_array_SetPublishingModeResponse,
+ &ett_opcua_PublishRequest,
+ &ett_opcua_array_PublishRequest,
+ &ett_opcua_PublishResponse,
+ &ett_opcua_array_PublishResponse,
+ &ett_opcua_RepublishRequest,
+ &ett_opcua_array_RepublishRequest,
+ &ett_opcua_RepublishResponse,
+ &ett_opcua_array_RepublishResponse,
+ &ett_opcua_TransferSubscriptionsRequest,
+ &ett_opcua_array_TransferSubscriptionsRequest,
+ &ett_opcua_TransferSubscriptionsResponse,
+ &ett_opcua_array_TransferSubscriptionsResponse,
+ &ett_opcua_DeleteSubscriptionsRequest,
+ &ett_opcua_array_DeleteSubscriptionsRequest,
+ &ett_opcua_DeleteSubscriptionsResponse,
+ &ett_opcua_array_DeleteSubscriptionsResponse,
+ &ett_opcua_TestStackRequest,
+ &ett_opcua_array_TestStackRequest,
+ &ett_opcua_TestStackResponse,
+ &ett_opcua_array_TestStackResponse,
+ &ett_opcua_TestStackExRequest,
+ &ett_opcua_array_TestStackExRequest,
+ &ett_opcua_TestStackExResponse,
+ &ett_opcua_array_TestStackExResponse,
+};
+
+void registerServiceTypes(void)
+{
+ proto_register_subtree_array(ett, array_length(ett));
+}
+
diff --git a/plugins/epan/opcua/opcua_serviceparser.h b/plugins/epan/opcua/opcua_serviceparser.h
new file mode 100644
index 00000000..db8e6c42
--- /dev/null
+++ b/plugins/epan/opcua/opcua_serviceparser.h
@@ -0,0 +1,273 @@
+/******************************************************************************
+** Copyright (C) 2006-2015 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: OpcUa Service Type Parser
+**
+** This file was autogenerated on 13.10.2015.
+** DON'T MODIFY THIS FILE!
+** XXX - well, except that you may have to. See the README.
+**
+******************************************************************************/
+
+#include <glib.h>
+#include <epan/packet.h>
+
+extern gint ett_opcua_ServiceFault;
+extern gint ett_opcua_array_ServiceFault;
+extern gint ett_opcua_FindServersRequest;
+extern gint ett_opcua_array_FindServersRequest;
+extern gint ett_opcua_FindServersResponse;
+extern gint ett_opcua_array_FindServersResponse;
+extern gint ett_opcua_FindServersOnNetworkRequest;
+extern gint ett_opcua_array_FindServersOnNetworkRequest;
+extern gint ett_opcua_FindServersOnNetworkResponse;
+extern gint ett_opcua_array_FindServersOnNetworkResponse;
+extern gint ett_opcua_GetEndpointsRequest;
+extern gint ett_opcua_array_GetEndpointsRequest;
+extern gint ett_opcua_GetEndpointsResponse;
+extern gint ett_opcua_array_GetEndpointsResponse;
+extern gint ett_opcua_RegisterServerRequest;
+extern gint ett_opcua_array_RegisterServerRequest;
+extern gint ett_opcua_RegisterServerResponse;
+extern gint ett_opcua_array_RegisterServerResponse;
+extern gint ett_opcua_RegisterServer2Request;
+extern gint ett_opcua_array_RegisterServer2Request;
+extern gint ett_opcua_RegisterServer2Response;
+extern gint ett_opcua_array_RegisterServer2Response;
+extern gint ett_opcua_OpenSecureChannelRequest;
+extern gint ett_opcua_array_OpenSecureChannelRequest;
+extern gint ett_opcua_OpenSecureChannelResponse;
+extern gint ett_opcua_array_OpenSecureChannelResponse;
+extern gint ett_opcua_CloseSecureChannelRequest;
+extern gint ett_opcua_array_CloseSecureChannelRequest;
+extern gint ett_opcua_CloseSecureChannelResponse;
+extern gint ett_opcua_array_CloseSecureChannelResponse;
+extern gint ett_opcua_CreateSessionRequest;
+extern gint ett_opcua_array_CreateSessionRequest;
+extern gint ett_opcua_CreateSessionResponse;
+extern gint ett_opcua_array_CreateSessionResponse;
+extern gint ett_opcua_ActivateSessionRequest;
+extern gint ett_opcua_array_ActivateSessionRequest;
+extern gint ett_opcua_ActivateSessionResponse;
+extern gint ett_opcua_array_ActivateSessionResponse;
+extern gint ett_opcua_CloseSessionRequest;
+extern gint ett_opcua_array_CloseSessionRequest;
+extern gint ett_opcua_CloseSessionResponse;
+extern gint ett_opcua_array_CloseSessionResponse;
+extern gint ett_opcua_CancelRequest;
+extern gint ett_opcua_array_CancelRequest;
+extern gint ett_opcua_CancelResponse;
+extern gint ett_opcua_array_CancelResponse;
+extern gint ett_opcua_AddNodesRequest;
+extern gint ett_opcua_array_AddNodesRequest;
+extern gint ett_opcua_AddNodesResponse;
+extern gint ett_opcua_array_AddNodesResponse;
+extern gint ett_opcua_AddReferencesRequest;
+extern gint ett_opcua_array_AddReferencesRequest;
+extern gint ett_opcua_AddReferencesResponse;
+extern gint ett_opcua_array_AddReferencesResponse;
+extern gint ett_opcua_DeleteNodesRequest;
+extern gint ett_opcua_array_DeleteNodesRequest;
+extern gint ett_opcua_DeleteNodesResponse;
+extern gint ett_opcua_array_DeleteNodesResponse;
+extern gint ett_opcua_DeleteReferencesRequest;
+extern gint ett_opcua_array_DeleteReferencesRequest;
+extern gint ett_opcua_DeleteReferencesResponse;
+extern gint ett_opcua_array_DeleteReferencesResponse;
+extern gint ett_opcua_BrowseRequest;
+extern gint ett_opcua_array_BrowseRequest;
+extern gint ett_opcua_BrowseResponse;
+extern gint ett_opcua_array_BrowseResponse;
+extern gint ett_opcua_BrowseNextRequest;
+extern gint ett_opcua_array_BrowseNextRequest;
+extern gint ett_opcua_BrowseNextResponse;
+extern gint ett_opcua_array_BrowseNextResponse;
+extern gint ett_opcua_TranslateBrowsePathsToNodeIdsRequest;
+extern gint ett_opcua_array_TranslateBrowsePathsToNodeIdsRequest;
+extern gint ett_opcua_TranslateBrowsePathsToNodeIdsResponse;
+extern gint ett_opcua_array_TranslateBrowsePathsToNodeIdsResponse;
+extern gint ett_opcua_RegisterNodesRequest;
+extern gint ett_opcua_array_RegisterNodesRequest;
+extern gint ett_opcua_RegisterNodesResponse;
+extern gint ett_opcua_array_RegisterNodesResponse;
+extern gint ett_opcua_UnregisterNodesRequest;
+extern gint ett_opcua_array_UnregisterNodesRequest;
+extern gint ett_opcua_UnregisterNodesResponse;
+extern gint ett_opcua_array_UnregisterNodesResponse;
+extern gint ett_opcua_QueryFirstRequest;
+extern gint ett_opcua_array_QueryFirstRequest;
+extern gint ett_opcua_QueryFirstResponse;
+extern gint ett_opcua_array_QueryFirstResponse;
+extern gint ett_opcua_QueryNextRequest;
+extern gint ett_opcua_array_QueryNextRequest;
+extern gint ett_opcua_QueryNextResponse;
+extern gint ett_opcua_array_QueryNextResponse;
+extern gint ett_opcua_ReadRequest;
+extern gint ett_opcua_array_ReadRequest;
+extern gint ett_opcua_ReadResponse;
+extern gint ett_opcua_array_ReadResponse;
+extern gint ett_opcua_HistoryReadRequest;
+extern gint ett_opcua_array_HistoryReadRequest;
+extern gint ett_opcua_HistoryReadResponse;
+extern gint ett_opcua_array_HistoryReadResponse;
+extern gint ett_opcua_WriteRequest;
+extern gint ett_opcua_array_WriteRequest;
+extern gint ett_opcua_WriteResponse;
+extern gint ett_opcua_array_WriteResponse;
+extern gint ett_opcua_HistoryUpdateRequest;
+extern gint ett_opcua_array_HistoryUpdateRequest;
+extern gint ett_opcua_HistoryUpdateResponse;
+extern gint ett_opcua_array_HistoryUpdateResponse;
+extern gint ett_opcua_CallRequest;
+extern gint ett_opcua_array_CallRequest;
+extern gint ett_opcua_CallResponse;
+extern gint ett_opcua_array_CallResponse;
+extern gint ett_opcua_CreateMonitoredItemsRequest;
+extern gint ett_opcua_array_CreateMonitoredItemsRequest;
+extern gint ett_opcua_CreateMonitoredItemsResponse;
+extern gint ett_opcua_array_CreateMonitoredItemsResponse;
+extern gint ett_opcua_ModifyMonitoredItemsRequest;
+extern gint ett_opcua_array_ModifyMonitoredItemsRequest;
+extern gint ett_opcua_ModifyMonitoredItemsResponse;
+extern gint ett_opcua_array_ModifyMonitoredItemsResponse;
+extern gint ett_opcua_SetMonitoringModeRequest;
+extern gint ett_opcua_array_SetMonitoringModeRequest;
+extern gint ett_opcua_SetMonitoringModeResponse;
+extern gint ett_opcua_array_SetMonitoringModeResponse;
+extern gint ett_opcua_SetTriggeringRequest;
+extern gint ett_opcua_array_SetTriggeringRequest;
+extern gint ett_opcua_SetTriggeringResponse;
+extern gint ett_opcua_array_SetTriggeringResponse;
+extern gint ett_opcua_DeleteMonitoredItemsRequest;
+extern gint ett_opcua_array_DeleteMonitoredItemsRequest;
+extern gint ett_opcua_DeleteMonitoredItemsResponse;
+extern gint ett_opcua_array_DeleteMonitoredItemsResponse;
+extern gint ett_opcua_CreateSubscriptionRequest;
+extern gint ett_opcua_array_CreateSubscriptionRequest;
+extern gint ett_opcua_CreateSubscriptionResponse;
+extern gint ett_opcua_array_CreateSubscriptionResponse;
+extern gint ett_opcua_ModifySubscriptionRequest;
+extern gint ett_opcua_array_ModifySubscriptionRequest;
+extern gint ett_opcua_ModifySubscriptionResponse;
+extern gint ett_opcua_array_ModifySubscriptionResponse;
+extern gint ett_opcua_SetPublishingModeRequest;
+extern gint ett_opcua_array_SetPublishingModeRequest;
+extern gint ett_opcua_SetPublishingModeResponse;
+extern gint ett_opcua_array_SetPublishingModeResponse;
+extern gint ett_opcua_PublishRequest;
+extern gint ett_opcua_array_PublishRequest;
+extern gint ett_opcua_PublishResponse;
+extern gint ett_opcua_array_PublishResponse;
+extern gint ett_opcua_RepublishRequest;
+extern gint ett_opcua_array_RepublishRequest;
+extern gint ett_opcua_RepublishResponse;
+extern gint ett_opcua_array_RepublishResponse;
+extern gint ett_opcua_TransferSubscriptionsRequest;
+extern gint ett_opcua_array_TransferSubscriptionsRequest;
+extern gint ett_opcua_TransferSubscriptionsResponse;
+extern gint ett_opcua_array_TransferSubscriptionsResponse;
+extern gint ett_opcua_DeleteSubscriptionsRequest;
+extern gint ett_opcua_array_DeleteSubscriptionsRequest;
+extern gint ett_opcua_DeleteSubscriptionsResponse;
+extern gint ett_opcua_array_DeleteSubscriptionsResponse;
+extern gint ett_opcua_TestStackRequest;
+extern gint ett_opcua_array_TestStackRequest;
+extern gint ett_opcua_TestStackResponse;
+extern gint ett_opcua_array_TestStackResponse;
+extern gint ett_opcua_TestStackExRequest;
+extern gint ett_opcua_array_TestStackExRequest;
+extern gint ett_opcua_TestStackExResponse;
+extern gint ett_opcua_array_TestStackExResponse;
+
+void parseServiceFault(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseFindServersRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseFindServersResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseFindServersOnNetworkRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseFindServersOnNetworkResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseGetEndpointsRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseGetEndpointsResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseRegisterServerRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseRegisterServerResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseRegisterServer2Request(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseRegisterServer2Response(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseOpenSecureChannelRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseOpenSecureChannelResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseCloseSecureChannelRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseCloseSecureChannelResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseCreateSessionRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseCreateSessionResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseActivateSessionRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseActivateSessionResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseCloseSessionRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseCloseSessionResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseCancelRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseCancelResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseAddNodesRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseAddNodesResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseAddReferencesRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseAddReferencesResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseDeleteNodesRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseDeleteNodesResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseDeleteReferencesRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseDeleteReferencesResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseBrowseRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseBrowseResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseBrowseNextRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseBrowseNextResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseTranslateBrowsePathsToNodeIdsRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseTranslateBrowsePathsToNodeIdsResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseRegisterNodesRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseRegisterNodesResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseUnregisterNodesRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseUnregisterNodesResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseQueryFirstRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseQueryFirstResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseQueryNextRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseQueryNextResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseReadRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseReadResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseHistoryReadRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseHistoryReadResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseWriteRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseWriteResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseHistoryUpdateRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseHistoryUpdateResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseCallRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseCallResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseCreateMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseCreateMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseModifyMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseModifyMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseSetMonitoringModeRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseSetMonitoringModeResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseSetTriggeringRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseSetTriggeringResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseDeleteMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseDeleteMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseCreateSubscriptionRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseCreateSubscriptionResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseModifySubscriptionRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseModifySubscriptionResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseSetPublishingModeRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseSetPublishingModeResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parsePublishRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parsePublishResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseRepublishRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseRepublishResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseTransferSubscriptionsRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseTransferSubscriptionsResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseDeleteSubscriptionsRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseDeleteSubscriptionsResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseTestStackRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseTestStackResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseTestStackExRequest(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseTestStackExResponse(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void registerServiceTypes(void);
diff --git a/plugins/epan/opcua/opcua_servicetable.c b/plugins/epan/opcua/opcua_servicetable.c
new file mode 100644
index 00000000..b800da92
--- /dev/null
+++ b/plugins/epan/opcua/opcua_servicetable.c
@@ -0,0 +1,300 @@
+/******************************************************************************
+** Copyright (C) 2006-2015 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: Service table and service dispatcher.
+**
+** This file was autogenerated on 13.10.2015.
+** DON'T MODIFY THIS FILE!
+**
+******************************************************************************/
+
+#include "config.h"
+
+#include <epan/packet.h>
+#include "opcua_identifiers.h"
+#include "opcua_serviceparser.h"
+#include "opcua_serviceids.h"
+#include "opcua_servicetable.h"
+
+ParserEntry g_arParserTable[] = {
+ { OpcUaId_ServiceFault_Encoding_DefaultBinary, parseServiceFault },
+ { OpcUaId_FindServersRequest_Encoding_DefaultBinary, parseFindServersRequest },
+ { OpcUaId_FindServersResponse_Encoding_DefaultBinary, parseFindServersResponse },
+ { OpcUaId_FindServersOnNetworkRequest_Encoding_DefaultBinary, parseFindServersOnNetworkRequest },
+ { OpcUaId_FindServersOnNetworkResponse_Encoding_DefaultBinary, parseFindServersOnNetworkResponse },
+ { OpcUaId_GetEndpointsRequest_Encoding_DefaultBinary, parseGetEndpointsRequest },
+ { OpcUaId_GetEndpointsResponse_Encoding_DefaultBinary, parseGetEndpointsResponse },
+ { OpcUaId_RegisterServerRequest_Encoding_DefaultBinary, parseRegisterServerRequest },
+ { OpcUaId_RegisterServerResponse_Encoding_DefaultBinary, parseRegisterServerResponse },
+ { OpcUaId_RegisterServer2Request_Encoding_DefaultBinary, parseRegisterServer2Request },
+ { OpcUaId_RegisterServer2Response_Encoding_DefaultBinary, parseRegisterServer2Response },
+ { OpcUaId_OpenSecureChannelRequest_Encoding_DefaultBinary, parseOpenSecureChannelRequest },
+ { OpcUaId_OpenSecureChannelResponse_Encoding_DefaultBinary, parseOpenSecureChannelResponse },
+ { OpcUaId_CloseSecureChannelRequest_Encoding_DefaultBinary, parseCloseSecureChannelRequest },
+ { OpcUaId_CloseSecureChannelResponse_Encoding_DefaultBinary, parseCloseSecureChannelResponse },
+ { OpcUaId_CreateSessionRequest_Encoding_DefaultBinary, parseCreateSessionRequest },
+ { OpcUaId_CreateSessionResponse_Encoding_DefaultBinary, parseCreateSessionResponse },
+ { OpcUaId_ActivateSessionRequest_Encoding_DefaultBinary, parseActivateSessionRequest },
+ { OpcUaId_ActivateSessionResponse_Encoding_DefaultBinary, parseActivateSessionResponse },
+ { OpcUaId_CloseSessionRequest_Encoding_DefaultBinary, parseCloseSessionRequest },
+ { OpcUaId_CloseSessionResponse_Encoding_DefaultBinary, parseCloseSessionResponse },
+ { OpcUaId_CancelRequest_Encoding_DefaultBinary, parseCancelRequest },
+ { OpcUaId_CancelResponse_Encoding_DefaultBinary, parseCancelResponse },
+ { OpcUaId_AddNodesRequest_Encoding_DefaultBinary, parseAddNodesRequest },
+ { OpcUaId_AddNodesResponse_Encoding_DefaultBinary, parseAddNodesResponse },
+ { OpcUaId_AddReferencesRequest_Encoding_DefaultBinary, parseAddReferencesRequest },
+ { OpcUaId_AddReferencesResponse_Encoding_DefaultBinary, parseAddReferencesResponse },
+ { OpcUaId_DeleteNodesRequest_Encoding_DefaultBinary, parseDeleteNodesRequest },
+ { OpcUaId_DeleteNodesResponse_Encoding_DefaultBinary, parseDeleteNodesResponse },
+ { OpcUaId_DeleteReferencesRequest_Encoding_DefaultBinary, parseDeleteReferencesRequest },
+ { OpcUaId_DeleteReferencesResponse_Encoding_DefaultBinary, parseDeleteReferencesResponse },
+ { OpcUaId_BrowseRequest_Encoding_DefaultBinary, parseBrowseRequest },
+ { OpcUaId_BrowseResponse_Encoding_DefaultBinary, parseBrowseResponse },
+ { OpcUaId_BrowseNextRequest_Encoding_DefaultBinary, parseBrowseNextRequest },
+ { OpcUaId_BrowseNextResponse_Encoding_DefaultBinary, parseBrowseNextResponse },
+ { OpcUaId_TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultBinary, parseTranslateBrowsePathsToNodeIdsRequest },
+ { OpcUaId_TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultBinary, parseTranslateBrowsePathsToNodeIdsResponse },
+ { OpcUaId_RegisterNodesRequest_Encoding_DefaultBinary, parseRegisterNodesRequest },
+ { OpcUaId_RegisterNodesResponse_Encoding_DefaultBinary, parseRegisterNodesResponse },
+ { OpcUaId_UnregisterNodesRequest_Encoding_DefaultBinary, parseUnregisterNodesRequest },
+ { OpcUaId_UnregisterNodesResponse_Encoding_DefaultBinary, parseUnregisterNodesResponse },
+ { OpcUaId_QueryFirstRequest_Encoding_DefaultBinary, parseQueryFirstRequest },
+ { OpcUaId_QueryFirstResponse_Encoding_DefaultBinary, parseQueryFirstResponse },
+ { OpcUaId_QueryNextRequest_Encoding_DefaultBinary, parseQueryNextRequest },
+ { OpcUaId_QueryNextResponse_Encoding_DefaultBinary, parseQueryNextResponse },
+ { OpcUaId_ReadRequest_Encoding_DefaultBinary, parseReadRequest },
+ { OpcUaId_ReadResponse_Encoding_DefaultBinary, parseReadResponse },
+ { OpcUaId_HistoryReadRequest_Encoding_DefaultBinary, parseHistoryReadRequest },
+ { OpcUaId_HistoryReadResponse_Encoding_DefaultBinary, parseHistoryReadResponse },
+ { OpcUaId_WriteRequest_Encoding_DefaultBinary, parseWriteRequest },
+ { OpcUaId_WriteResponse_Encoding_DefaultBinary, parseWriteResponse },
+ { OpcUaId_HistoryUpdateRequest_Encoding_DefaultBinary, parseHistoryUpdateRequest },
+ { OpcUaId_HistoryUpdateResponse_Encoding_DefaultBinary, parseHistoryUpdateResponse },
+ { OpcUaId_CallRequest_Encoding_DefaultBinary, parseCallRequest },
+ { OpcUaId_CallResponse_Encoding_DefaultBinary, parseCallResponse },
+ { OpcUaId_CreateMonitoredItemsRequest_Encoding_DefaultBinary, parseCreateMonitoredItemsRequest },
+ { OpcUaId_CreateMonitoredItemsResponse_Encoding_DefaultBinary, parseCreateMonitoredItemsResponse },
+ { OpcUaId_ModifyMonitoredItemsRequest_Encoding_DefaultBinary, parseModifyMonitoredItemsRequest },
+ { OpcUaId_ModifyMonitoredItemsResponse_Encoding_DefaultBinary, parseModifyMonitoredItemsResponse },
+ { OpcUaId_SetMonitoringModeRequest_Encoding_DefaultBinary, parseSetMonitoringModeRequest },
+ { OpcUaId_SetMonitoringModeResponse_Encoding_DefaultBinary, parseSetMonitoringModeResponse },
+ { OpcUaId_SetTriggeringRequest_Encoding_DefaultBinary, parseSetTriggeringRequest },
+ { OpcUaId_SetTriggeringResponse_Encoding_DefaultBinary, parseSetTriggeringResponse },
+ { OpcUaId_DeleteMonitoredItemsRequest_Encoding_DefaultBinary, parseDeleteMonitoredItemsRequest },
+ { OpcUaId_DeleteMonitoredItemsResponse_Encoding_DefaultBinary, parseDeleteMonitoredItemsResponse },
+ { OpcUaId_CreateSubscriptionRequest_Encoding_DefaultBinary, parseCreateSubscriptionRequest },
+ { OpcUaId_CreateSubscriptionResponse_Encoding_DefaultBinary, parseCreateSubscriptionResponse },
+ { OpcUaId_ModifySubscriptionRequest_Encoding_DefaultBinary, parseModifySubscriptionRequest },
+ { OpcUaId_ModifySubscriptionResponse_Encoding_DefaultBinary, parseModifySubscriptionResponse },
+ { OpcUaId_SetPublishingModeRequest_Encoding_DefaultBinary, parseSetPublishingModeRequest },
+ { OpcUaId_SetPublishingModeResponse_Encoding_DefaultBinary, parseSetPublishingModeResponse },
+ { OpcUaId_PublishRequest_Encoding_DefaultBinary, parsePublishRequest },
+ { OpcUaId_PublishResponse_Encoding_DefaultBinary, parsePublishResponse },
+ { OpcUaId_RepublishRequest_Encoding_DefaultBinary, parseRepublishRequest },
+ { OpcUaId_RepublishResponse_Encoding_DefaultBinary, parseRepublishResponse },
+ { OpcUaId_TransferSubscriptionsRequest_Encoding_DefaultBinary, parseTransferSubscriptionsRequest },
+ { OpcUaId_TransferSubscriptionsResponse_Encoding_DefaultBinary, parseTransferSubscriptionsResponse },
+ { OpcUaId_DeleteSubscriptionsRequest_Encoding_DefaultBinary, parseDeleteSubscriptionsRequest },
+ { OpcUaId_DeleteSubscriptionsResponse_Encoding_DefaultBinary, parseDeleteSubscriptionsResponse },
+ { OpcUaId_TestStackRequest_Encoding_DefaultBinary, parseTestStackRequest },
+ { OpcUaId_TestStackResponse_Encoding_DefaultBinary, parseTestStackResponse },
+ { OpcUaId_TestStackExRequest_Encoding_DefaultBinary, parseTestStackExRequest },
+ { OpcUaId_TestStackExResponse_Encoding_DefaultBinary, parseTestStackExResponse },
+};
+const int g_NumServices = sizeof(g_arParserTable) / sizeof(ParserEntry);
+
+/** Service type table */
+const value_string g_requesttypes[] = {
+ { OpcUaId_ServiceFault_Encoding_DefaultBinary, "ServiceFault" },
+ { OpcUaId_FindServersRequest_Encoding_DefaultBinary, "FindServersRequest" },
+ { OpcUaId_FindServersResponse_Encoding_DefaultBinary, "FindServersResponse" },
+ { OpcUaId_FindServersOnNetworkRequest_Encoding_DefaultBinary, "FindServersOnNetworkRequest" },
+ { OpcUaId_FindServersOnNetworkResponse_Encoding_DefaultBinary, "FindServersOnNetworkResponse" },
+ { OpcUaId_GetEndpointsRequest_Encoding_DefaultBinary, "GetEndpointsRequest" },
+ { OpcUaId_GetEndpointsResponse_Encoding_DefaultBinary, "GetEndpointsResponse" },
+ { OpcUaId_RegisterServerRequest_Encoding_DefaultBinary, "RegisterServerRequest" },
+ { OpcUaId_RegisterServerResponse_Encoding_DefaultBinary, "RegisterServerResponse" },
+ { OpcUaId_RegisterServer2Request_Encoding_DefaultBinary, "RegisterServer2Request" },
+ { OpcUaId_RegisterServer2Response_Encoding_DefaultBinary, "RegisterServer2Response" },
+ { OpcUaId_OpenSecureChannelRequest_Encoding_DefaultBinary, "OpenSecureChannelRequest" },
+ { OpcUaId_OpenSecureChannelResponse_Encoding_DefaultBinary, "OpenSecureChannelResponse" },
+ { OpcUaId_CloseSecureChannelRequest_Encoding_DefaultBinary, "CloseSecureChannelRequest" },
+ { OpcUaId_CloseSecureChannelResponse_Encoding_DefaultBinary, "CloseSecureChannelResponse" },
+ { OpcUaId_CreateSessionRequest_Encoding_DefaultBinary, "CreateSessionRequest" },
+ { OpcUaId_CreateSessionResponse_Encoding_DefaultBinary, "CreateSessionResponse" },
+ { OpcUaId_ActivateSessionRequest_Encoding_DefaultBinary, "ActivateSessionRequest" },
+ { OpcUaId_ActivateSessionResponse_Encoding_DefaultBinary, "ActivateSessionResponse" },
+ { OpcUaId_CloseSessionRequest_Encoding_DefaultBinary, "CloseSessionRequest" },
+ { OpcUaId_CloseSessionResponse_Encoding_DefaultBinary, "CloseSessionResponse" },
+ { OpcUaId_CancelRequest_Encoding_DefaultBinary, "CancelRequest" },
+ { OpcUaId_CancelResponse_Encoding_DefaultBinary, "CancelResponse" },
+ { OpcUaId_AddNodesRequest_Encoding_DefaultBinary, "AddNodesRequest" },
+ { OpcUaId_AddNodesResponse_Encoding_DefaultBinary, "AddNodesResponse" },
+ { OpcUaId_AddReferencesRequest_Encoding_DefaultBinary, "AddReferencesRequest" },
+ { OpcUaId_AddReferencesResponse_Encoding_DefaultBinary, "AddReferencesResponse" },
+ { OpcUaId_DeleteNodesRequest_Encoding_DefaultBinary, "DeleteNodesRequest" },
+ { OpcUaId_DeleteNodesResponse_Encoding_DefaultBinary, "DeleteNodesResponse" },
+ { OpcUaId_DeleteReferencesRequest_Encoding_DefaultBinary, "DeleteReferencesRequest" },
+ { OpcUaId_DeleteReferencesResponse_Encoding_DefaultBinary, "DeleteReferencesResponse" },
+ { OpcUaId_BrowseRequest_Encoding_DefaultBinary, "BrowseRequest" },
+ { OpcUaId_BrowseResponse_Encoding_DefaultBinary, "BrowseResponse" },
+ { OpcUaId_BrowseNextRequest_Encoding_DefaultBinary, "BrowseNextRequest" },
+ { OpcUaId_BrowseNextResponse_Encoding_DefaultBinary, "BrowseNextResponse" },
+ { OpcUaId_TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultBinary, "TranslateBrowsePathsToNodeIdsRequest" },
+ { OpcUaId_TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultBinary, "TranslateBrowsePathsToNodeIdsResponse" },
+ { OpcUaId_RegisterNodesRequest_Encoding_DefaultBinary, "RegisterNodesRequest" },
+ { OpcUaId_RegisterNodesResponse_Encoding_DefaultBinary, "RegisterNodesResponse" },
+ { OpcUaId_UnregisterNodesRequest_Encoding_DefaultBinary, "UnregisterNodesRequest" },
+ { OpcUaId_UnregisterNodesResponse_Encoding_DefaultBinary, "UnregisterNodesResponse" },
+ { OpcUaId_QueryFirstRequest_Encoding_DefaultBinary, "QueryFirstRequest" },
+ { OpcUaId_QueryFirstResponse_Encoding_DefaultBinary, "QueryFirstResponse" },
+ { OpcUaId_QueryNextRequest_Encoding_DefaultBinary, "QueryNextRequest" },
+ { OpcUaId_QueryNextResponse_Encoding_DefaultBinary, "QueryNextResponse" },
+ { OpcUaId_ReadRequest_Encoding_DefaultBinary, "ReadRequest" },
+ { OpcUaId_ReadResponse_Encoding_DefaultBinary, "ReadResponse" },
+ { OpcUaId_HistoryReadRequest_Encoding_DefaultBinary, "HistoryReadRequest" },
+ { OpcUaId_HistoryReadResponse_Encoding_DefaultBinary, "HistoryReadResponse" },
+ { OpcUaId_WriteRequest_Encoding_DefaultBinary, "WriteRequest" },
+ { OpcUaId_WriteResponse_Encoding_DefaultBinary, "WriteResponse" },
+ { OpcUaId_HistoryUpdateRequest_Encoding_DefaultBinary, "HistoryUpdateRequest" },
+ { OpcUaId_HistoryUpdateResponse_Encoding_DefaultBinary, "HistoryUpdateResponse" },
+ { OpcUaId_CallRequest_Encoding_DefaultBinary, "CallRequest" },
+ { OpcUaId_CallResponse_Encoding_DefaultBinary, "CallResponse" },
+ { OpcUaId_CreateMonitoredItemsRequest_Encoding_DefaultBinary, "CreateMonitoredItemsRequest" },
+ { OpcUaId_CreateMonitoredItemsResponse_Encoding_DefaultBinary, "CreateMonitoredItemsResponse" },
+ { OpcUaId_ModifyMonitoredItemsRequest_Encoding_DefaultBinary, "ModifyMonitoredItemsRequest" },
+ { OpcUaId_ModifyMonitoredItemsResponse_Encoding_DefaultBinary, "ModifyMonitoredItemsResponse" },
+ { OpcUaId_SetMonitoringModeRequest_Encoding_DefaultBinary, "SetMonitoringModeRequest" },
+ { OpcUaId_SetMonitoringModeResponse_Encoding_DefaultBinary, "SetMonitoringModeResponse" },
+ { OpcUaId_SetTriggeringRequest_Encoding_DefaultBinary, "SetTriggeringRequest" },
+ { OpcUaId_SetTriggeringResponse_Encoding_DefaultBinary, "SetTriggeringResponse" },
+ { OpcUaId_DeleteMonitoredItemsRequest_Encoding_DefaultBinary, "DeleteMonitoredItemsRequest" },
+ { OpcUaId_DeleteMonitoredItemsResponse_Encoding_DefaultBinary, "DeleteMonitoredItemsResponse" },
+ { OpcUaId_CreateSubscriptionRequest_Encoding_DefaultBinary, "CreateSubscriptionRequest" },
+ { OpcUaId_CreateSubscriptionResponse_Encoding_DefaultBinary, "CreateSubscriptionResponse" },
+ { OpcUaId_ModifySubscriptionRequest_Encoding_DefaultBinary, "ModifySubscriptionRequest" },
+ { OpcUaId_ModifySubscriptionResponse_Encoding_DefaultBinary, "ModifySubscriptionResponse" },
+ { OpcUaId_SetPublishingModeRequest_Encoding_DefaultBinary, "SetPublishingModeRequest" },
+ { OpcUaId_SetPublishingModeResponse_Encoding_DefaultBinary, "SetPublishingModeResponse" },
+ { OpcUaId_PublishRequest_Encoding_DefaultBinary, "PublishRequest" },
+ { OpcUaId_PublishResponse_Encoding_DefaultBinary, "PublishResponse" },
+ { OpcUaId_RepublishRequest_Encoding_DefaultBinary, "RepublishRequest" },
+ { OpcUaId_RepublishResponse_Encoding_DefaultBinary, "RepublishResponse" },
+ { OpcUaId_TransferSubscriptionsRequest_Encoding_DefaultBinary, "TransferSubscriptionsRequest" },
+ { OpcUaId_TransferSubscriptionsResponse_Encoding_DefaultBinary, "TransferSubscriptionsResponse" },
+ { OpcUaId_DeleteSubscriptionsRequest_Encoding_DefaultBinary, "DeleteSubscriptionsRequest" },
+ { OpcUaId_DeleteSubscriptionsResponse_Encoding_DefaultBinary, "DeleteSubscriptionsResponse" },
+ { OpcUaId_TestStackRequest_Encoding_DefaultBinary, "TestStackRequest" },
+ { OpcUaId_TestStackResponse_Encoding_DefaultBinary, "TestStackResponse" },
+ { OpcUaId_TestStackExRequest_Encoding_DefaultBinary, "TestStackExRequest" },
+ { OpcUaId_TestStackExResponse_Encoding_DefaultBinary, "TestStackExResponse" },
+ { OpcUaId_ServiceFault_Encoding_DefaultXml, "ServiceFault (XML Encoding)" },
+ { OpcUaId_FindServersRequest_Encoding_DefaultXml, "FindServersRequest (XML Encoding)" },
+ { OpcUaId_FindServersResponse_Encoding_DefaultXml, "FindServersResponse (XML Encoding)" },
+ { OpcUaId_FindServersOnNetworkRequest_Encoding_DefaultXml, "FindServersOnNetworkRequest (XML Encoding)" },
+ { OpcUaId_FindServersOnNetworkResponse_Encoding_DefaultXml, "FindServersOnNetworkResponse (XML Encoding)" },
+ { OpcUaId_GetEndpointsRequest_Encoding_DefaultXml, "GetEndpointsRequest (XML Encoding)" },
+ { OpcUaId_GetEndpointsResponse_Encoding_DefaultXml, "GetEndpointsResponse (XML Encoding)" },
+ { OpcUaId_RegisterServerRequest_Encoding_DefaultXml, "RegisterServerRequest (XML Encoding)" },
+ { OpcUaId_RegisterServerResponse_Encoding_DefaultXml, "RegisterServerResponse (XML Encoding)" },
+ { OpcUaId_RegisterServer2Request_Encoding_DefaultXml, "RegisterServer2Request (XML Encoding)" },
+ { OpcUaId_RegisterServer2Response_Encoding_DefaultXml, "RegisterServer2Response (XML Encoding)" },
+ { OpcUaId_OpenSecureChannelRequest_Encoding_DefaultXml, "OpenSecureChannelRequest (XML Encoding)" },
+ { OpcUaId_OpenSecureChannelResponse_Encoding_DefaultXml, "OpenSecureChannelResponse (XML Encoding)" },
+ { OpcUaId_CloseSecureChannelRequest_Encoding_DefaultXml, "CloseSecureChannelRequest (XML Encoding)" },
+ { OpcUaId_CloseSecureChannelResponse_Encoding_DefaultXml, "CloseSecureChannelResponse (XML Encoding)" },
+ { OpcUaId_CreateSessionRequest_Encoding_DefaultXml, "CreateSessionRequest (XML Encoding)" },
+ { OpcUaId_CreateSessionResponse_Encoding_DefaultXml, "CreateSessionResponse (XML Encoding)" },
+ { OpcUaId_ActivateSessionRequest_Encoding_DefaultXml, "ActivateSessionRequest (XML Encoding)" },
+ { OpcUaId_ActivateSessionResponse_Encoding_DefaultXml, "ActivateSessionResponse (XML Encoding)" },
+ { OpcUaId_CloseSessionRequest_Encoding_DefaultXml, "CloseSessionRequest (XML Encoding)" },
+ { OpcUaId_CloseSessionResponse_Encoding_DefaultXml, "CloseSessionResponse (XML Encoding)" },
+ { OpcUaId_CancelRequest_Encoding_DefaultXml, "CancelRequest (XML Encoding)" },
+ { OpcUaId_CancelResponse_Encoding_DefaultXml, "CancelResponse (XML Encoding)" },
+ { OpcUaId_AddNodesRequest_Encoding_DefaultXml, "AddNodesRequest (XML Encoding)" },
+ { OpcUaId_AddNodesResponse_Encoding_DefaultXml, "AddNodesResponse (XML Encoding)" },
+ { OpcUaId_AddReferencesRequest_Encoding_DefaultXml, "AddReferencesRequest (XML Encoding)" },
+ { OpcUaId_AddReferencesResponse_Encoding_DefaultXml, "AddReferencesResponse (XML Encoding)" },
+ { OpcUaId_DeleteNodesRequest_Encoding_DefaultXml, "DeleteNodesRequest (XML Encoding)" },
+ { OpcUaId_DeleteNodesResponse_Encoding_DefaultXml, "DeleteNodesResponse (XML Encoding)" },
+ { OpcUaId_DeleteReferencesRequest_Encoding_DefaultXml, "DeleteReferencesRequest (XML Encoding)" },
+ { OpcUaId_DeleteReferencesResponse_Encoding_DefaultXml, "DeleteReferencesResponse (XML Encoding)" },
+ { OpcUaId_BrowseRequest_Encoding_DefaultXml, "BrowseRequest (XML Encoding)" },
+ { OpcUaId_BrowseResponse_Encoding_DefaultXml, "BrowseResponse (XML Encoding)" },
+ { OpcUaId_BrowseNextRequest_Encoding_DefaultXml, "BrowseNextRequest (XML Encoding)" },
+ { OpcUaId_BrowseNextResponse_Encoding_DefaultXml, "BrowseNextResponse (XML Encoding)" },
+ { OpcUaId_TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultXml, "TranslateBrowsePathsToNodeIdsRequest (XML Encoding)" },
+ { OpcUaId_TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultXml, "TranslateBrowsePathsToNodeIdsResponse (XML Encoding)" },
+ { OpcUaId_RegisterNodesRequest_Encoding_DefaultXml, "RegisterNodesRequest (XML Encoding)" },
+ { OpcUaId_RegisterNodesResponse_Encoding_DefaultXml, "RegisterNodesResponse (XML Encoding)" },
+ { OpcUaId_UnregisterNodesRequest_Encoding_DefaultXml, "UnregisterNodesRequest (XML Encoding)" },
+ { OpcUaId_UnregisterNodesResponse_Encoding_DefaultXml, "UnregisterNodesResponse (XML Encoding)" },
+ { OpcUaId_QueryFirstRequest_Encoding_DefaultXml, "QueryFirstRequest (XML Encoding)" },
+ { OpcUaId_QueryFirstResponse_Encoding_DefaultXml, "QueryFirstResponse (XML Encoding)" },
+ { OpcUaId_QueryNextRequest_Encoding_DefaultXml, "QueryNextRequest (XML Encoding)" },
+ { OpcUaId_QueryNextResponse_Encoding_DefaultXml, "QueryNextResponse (XML Encoding)" },
+ { OpcUaId_ReadRequest_Encoding_DefaultXml, "ReadRequest (XML Encoding)" },
+ { OpcUaId_ReadResponse_Encoding_DefaultXml, "ReadResponse (XML Encoding)" },
+ { OpcUaId_HistoryReadRequest_Encoding_DefaultXml, "HistoryReadRequest (XML Encoding)" },
+ { OpcUaId_HistoryReadResponse_Encoding_DefaultXml, "HistoryReadResponse (XML Encoding)" },
+ { OpcUaId_WriteRequest_Encoding_DefaultXml, "WriteRequest (XML Encoding)" },
+ { OpcUaId_WriteResponse_Encoding_DefaultXml, "WriteResponse (XML Encoding)" },
+ { OpcUaId_HistoryUpdateRequest_Encoding_DefaultXml, "HistoryUpdateRequest (XML Encoding)" },
+ { OpcUaId_HistoryUpdateResponse_Encoding_DefaultXml, "HistoryUpdateResponse (XML Encoding)" },
+ { OpcUaId_CallRequest_Encoding_DefaultXml, "CallRequest (XML Encoding)" },
+ { OpcUaId_CallResponse_Encoding_DefaultXml, "CallResponse (XML Encoding)" },
+ { OpcUaId_CreateMonitoredItemsRequest_Encoding_DefaultXml, "CreateMonitoredItemsRequest (XML Encoding)" },
+ { OpcUaId_CreateMonitoredItemsResponse_Encoding_DefaultXml, "CreateMonitoredItemsResponse (XML Encoding)" },
+ { OpcUaId_ModifyMonitoredItemsRequest_Encoding_DefaultXml, "ModifyMonitoredItemsRequest (XML Encoding)" },
+ { OpcUaId_ModifyMonitoredItemsResponse_Encoding_DefaultXml, "ModifyMonitoredItemsResponse (XML Encoding)" },
+ { OpcUaId_SetMonitoringModeRequest_Encoding_DefaultXml, "SetMonitoringModeRequest (XML Encoding)" },
+ { OpcUaId_SetMonitoringModeResponse_Encoding_DefaultXml, "SetMonitoringModeResponse (XML Encoding)" },
+ { OpcUaId_SetTriggeringRequest_Encoding_DefaultXml, "SetTriggeringRequest (XML Encoding)" },
+ { OpcUaId_SetTriggeringResponse_Encoding_DefaultXml, "SetTriggeringResponse (XML Encoding)" },
+ { OpcUaId_DeleteMonitoredItemsRequest_Encoding_DefaultXml, "DeleteMonitoredItemsRequest (XML Encoding)" },
+ { OpcUaId_DeleteMonitoredItemsResponse_Encoding_DefaultXml, "DeleteMonitoredItemsResponse (XML Encoding)" },
+ { OpcUaId_CreateSubscriptionRequest_Encoding_DefaultXml, "CreateSubscriptionRequest (XML Encoding)" },
+ { OpcUaId_CreateSubscriptionResponse_Encoding_DefaultXml, "CreateSubscriptionResponse (XML Encoding)" },
+ { OpcUaId_ModifySubscriptionRequest_Encoding_DefaultXml, "ModifySubscriptionRequest (XML Encoding)" },
+ { OpcUaId_ModifySubscriptionResponse_Encoding_DefaultXml, "ModifySubscriptionResponse (XML Encoding)" },
+ { OpcUaId_SetPublishingModeRequest_Encoding_DefaultXml, "SetPublishingModeRequest (XML Encoding)" },
+ { OpcUaId_SetPublishingModeResponse_Encoding_DefaultXml, "SetPublishingModeResponse (XML Encoding)" },
+ { OpcUaId_PublishRequest_Encoding_DefaultXml, "PublishRequest (XML Encoding)" },
+ { OpcUaId_PublishResponse_Encoding_DefaultXml, "PublishResponse (XML Encoding)" },
+ { OpcUaId_RepublishRequest_Encoding_DefaultXml, "RepublishRequest (XML Encoding)" },
+ { OpcUaId_RepublishResponse_Encoding_DefaultXml, "RepublishResponse (XML Encoding)" },
+ { OpcUaId_TransferSubscriptionsRequest_Encoding_DefaultXml, "TransferSubscriptionsRequest (XML Encoding)" },
+ { OpcUaId_TransferSubscriptionsResponse_Encoding_DefaultXml, "TransferSubscriptionsResponse (XML Encoding)" },
+ { OpcUaId_DeleteSubscriptionsRequest_Encoding_DefaultXml, "DeleteSubscriptionsRequest (XML Encoding)" },
+ { OpcUaId_DeleteSubscriptionsResponse_Encoding_DefaultXml, "DeleteSubscriptionsResponse (XML Encoding)" },
+ { OpcUaId_TestStackRequest_Encoding_DefaultXml, "TestStackRequest (XML Encoding)" },
+ { OpcUaId_TestStackResponse_Encoding_DefaultXml, "TestStackResponse (XML Encoding)" },
+ { OpcUaId_TestStackExRequest_Encoding_DefaultXml, "TestStackExRequest (XML Encoding)" },
+ { OpcUaId_TestStackExResponse_Encoding_DefaultXml, "TestStackExResponse (XML Encoding)" },
+ { 0, NULL }
+};
+
+/** Dispatch all services to a special parser function. */
+void dispatchService(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int ServiceId)
+{
+ int indx = 0;
+
+ while (indx < g_NumServices)
+ {
+ if (g_arParserTable[indx].iRequestId == ServiceId)
+ {
+ (*g_arParserTable[indx].pParser)(tree, tvb, pinfo, pOffset);
+ break;
+ }
+ indx++;
+ }
+}
+
diff --git a/plugins/epan/opcua/opcua_servicetable.h b/plugins/epan/opcua/opcua_servicetable.h
new file mode 100644
index 00000000..0b614ae6
--- /dev/null
+++ b/plugins/epan/opcua/opcua_servicetable.h
@@ -0,0 +1,17 @@
+/******************************************************************************
+** Copyright (C) 2006-2009 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: Service table and service dispatcher.
+**
+******************************************************************************/
+
+void dispatchService(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int ServiceId);
+
diff --git a/plugins/epan/opcua/opcua_simpletypes.c b/plugins/epan/opcua/opcua_simpletypes.c
new file mode 100644
index 00000000..e913ac69
--- /dev/null
+++ b/plugins/epan/opcua/opcua_simpletypes.c
@@ -0,0 +1,1398 @@
+/******************************************************************************
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: Implementation of OpcUa built-in type parsers.
+** This contains all the simple types and some complex types.
+**
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>
+******************************************************************************/
+
+#include "config.h"
+
+#include <epan/packet.h>
+#include <epan/expert.h>
+#include <epan/dissectors/packet-windows-common.h>
+#include <epan/proto_data.h>
+#include "opcua_simpletypes.h"
+#include "opcua_hfindeces.h"
+#include "opcua_statuscode.h"
+
+#define DIAGNOSTICINFO_ENCODINGMASK_SYMBOLICID_FLAG 0x01
+#define DIAGNOSTICINFO_ENCODINGMASK_NAMESPACE_FLAG 0x02
+#define DIAGNOSTICINFO_ENCODINGMASK_LOCALIZEDTEXT_FLAG 0x04
+#define DIAGNOSTICINFO_ENCODINGMASK_LOCALE_FLAG 0x08
+#define DIAGNOSTICINFO_ENCODINGMASK_ADDITIONALINFO_FLAG 0x10
+#define DIAGNOSTICINFO_ENCODINGMASK_INNERSTATUSCODE_FLAG 0x20
+#define DIAGNOSTICINFO_ENCODINGMASK_INNERDIAGNOSTICINFO_FLAG 0x40
+#define LOCALIZEDTEXT_ENCODINGBYTE_LOCALE 0x01
+#define LOCALIZEDTEXT_ENCODINGBYTE_TEXT 0x02
+#define NODEID_NAMESPACEURIFLAG 0x80
+#define NODEID_SERVERINDEXFLAG 0x40
+#define DATAVALUE_ENCODINGBYTE_VALUE 0x01
+#define DATAVALUE_ENCODINGBYTE_STATUSCODE 0x02
+#define DATAVALUE_ENCODINGBYTE_SOURCETIMESTAMP 0x04
+#define DATAVALUE_ENCODINGBYTE_SERVERTIMESTAMP 0x08
+#define DATAVALUE_ENCODINGBYTE_SOURCEPICOSECONDS 0x10
+#define DATAVALUE_ENCODINGBYTE_SERVERPICOSECONDS 0x20
+#define EXTOBJ_ENCODINGMASK_BINBODY_FLAG 0x01
+#define EXTOBJ_ENCODINGMASK_XMLBODY_FLAG 0x02
+#define STATUSCODE_STRUCTURECHANGED 0x8000
+#define STATUSCODE_SEMANTICSCHANGED 0x4000
+#define STATUSCODE_INFOTYPE_DATAVALUE 0x00000400
+#define STATUSCODE_INFOBIT_OVERFLOW 0x0080
+#define STATUSCODE_INFOBIT_HISTORIAN_PARTIAL 0x0004
+#define STATUSCODE_INFOBIT_HISTORIAN_EXTRADATA 0x0008
+#define STATUSCODE_INFOBIT_HISTORIAN_MULTIVALUE 0x0010
+#define RETURNDIAGNOSTICS_SERVICELEVEL_SYMBOLICID 0x0001
+#define RETURNDIAGNOSTICS_SERVICELEVEL_LOCALIZEDTEXT 0x0002
+#define RETURNDIAGNOSTICS_SERVICELEVEL_ADDITIONALINFO 0x0004
+#define RETURNDIAGNOSTICS_SERVICELEVEL_INNERSTATUSCODE 0x0008
+#define RETURNDIAGNOSTICS_SERVICELEVEL_INNERDIAGNOSTICS 0x0010
+#define RETURNDIAGNOSTICS_OPERATIONLEVEL_SYMBOLICID 0x0020
+#define RETURNDIAGNOSTICS_OPERATIONLEVEL_LOCALIZEDTEXT 0x0040
+#define RETURNDIAGNOSTICS_OPERATIONLEVEL_ADDITIONALINFO 0x0080
+#define RETURNDIAGNOSTICS_OPERATIONLEVEL_INNERSTATUSCODE 0x0100
+#define RETURNDIAGNOSTICS_OPERATIONLEVEL_INNERDIAGNOSTICS 0x0200
+#define NODECLASSMASK_ALL 0x0000
+#define NODECLASSMASK_OBJECT 0x0001
+#define NODECLASSMASK_VARIABLE 0x0002
+#define NODECLASSMASK_METHOD 0x0004
+#define NODECLASSMASK_OBJECTTYPE 0x0008
+#define NODECLASSMASK_VARIABLETYPE 0x0010
+#define NODECLASSMASK_REFERENCETYPE 0x0020
+#define NODECLASSMASK_DATATYPE 0x0040
+#define NODECLASSMASK_VIEW 0x0080
+#define RESULTMASK_REFERENCETYPE 0x0001
+#define RESULTMASK_ISFORWARD 0x0002
+#define RESULTMASK_NODECLASS 0x0004
+#define RESULTMASK_BROWSENAME 0x0008
+#define RESULTMASK_DISPLAYNAME 0x0010
+#define RESULTMASK_TYPEDEFINITION 0x0020
+#define RESULTMASK_ALL 0x003F
+
+
+/* Chosen arbitrarily */
+#define MAX_ARRAY_LEN 10000
+#define MAX_NESTING_DEPTH 100
+
+static int hf_opcua_diag_mask = -1;
+static int hf_opcua_diag_mask_symbolicflag = -1;
+static int hf_opcua_diag_mask_namespaceflag = -1;
+static int hf_opcua_diag_mask_localizedtextflag = -1;
+static int hf_opcua_diag_mask_localeflag = -1;
+static int hf_opcua_diag_mask_additionalinfoflag = -1;
+static int hf_opcua_diag_mask_innerstatuscodeflag = -1;
+static int hf_opcua_diag_mask_innerdiaginfoflag = -1;
+static int hf_opcua_loctext_mask = -1;
+static int hf_opcua_loctext_mask_localeflag = -1;
+static int hf_opcua_loctext_mask_textflag = -1;
+static int hf_opcua_datavalue_mask = -1;
+static int hf_opcua_datavalue_mask_valueflag = -1;
+static int hf_opcua_datavalue_mask_statuscodeflag = -1;
+static int hf_opcua_datavalue_mask_sourcetimestampflag = -1;
+static int hf_opcua_datavalue_mask_servertimestampflag = -1;
+static int hf_opcua_datavalue_mask_sourcepicoseconds = -1;
+static int hf_opcua_datavalue_mask_serverpicoseconds = -1;
+static int hf_opcua_nodeid_encodingmask = -1;
+static int hf_opcua_expandednodeid_mask = -1;
+static int hf_opcua_expandednodeid_mask_namespaceuri = -1;
+static int hf_opcua_expandednodeid_mask_serverindex = -1;
+static int hf_opcua_variant_encodingmask = -1;
+static int hf_opcua_nodeid_nsindex = -1;
+static int hf_opcua_nodeid_numeric = -1;
+static int hf_opcua_nodeid_string = -1;
+static int hf_opcua_nodeid_guid = -1;
+static int hf_opcua_nodeid_bytestring = -1;
+static int hf_opcua_localizedtext_locale = -1;
+static int hf_opcua_localizedtext_text = -1;
+static int hf_opcua_qualifiedname_id = -1;
+static int hf_opcua_qualifiedname_name = -1;
+static int hf_opcua_SourceTimestamp = -1;
+static int hf_opcua_SourcePicoseconds = -1;
+static int hf_opcua_ServerTimestamp = -1;
+static int hf_opcua_ServerPicoseconds = -1;
+static int hf_opcua_diag_symbolicid = -1;
+static int hf_opcua_diag_namespace = -1;
+static int hf_opcua_diag_localizedtext = -1;
+static int hf_opcua_diag_locale = -1;
+static int hf_opcua_diag_additionalinfo = -1;
+static int hf_opcua_diag_innerstatuscode = -1;
+static int hf_opcua_extobj_mask = -1;
+static int hf_opcua_extobj_mask_binbodyflag = -1;
+static int hf_opcua_extobj_mask_xmlbodyflag = -1;
+static int hf_opcua_ArraySize = -1;
+static int hf_opcua_ServerIndex = -1;
+static int hf_opcua_status_StructureChanged = -1;
+static int hf_opcua_status_SemanticsChanged = -1;
+static int hf_opcua_status_InfoBit_Limit_Overflow = -1;
+static int hf_opcua_status_InfoBit_Historian_Partial = -1;
+static int hf_opcua_status_InfoBit_Historian_ExtraData = -1;
+static int hf_opcua_status_InfoBit_Historian_MultiValue = -1;
+static int hf_opcua_status_InfoType = -1;
+static int hf_opcua_status_Limit = -1;
+static int hf_opcua_status_Historian = -1;
+int hf_opcua_returnDiag = -1;
+int hf_opcua_returnDiag_mask_sl_symbolicId = -1;
+int hf_opcua_returnDiag_mask_sl_localizedText = -1;
+int hf_opcua_returnDiag_mask_sl_additionalinfo = -1;
+int hf_opcua_returnDiag_mask_sl_innerstatuscode = -1;
+int hf_opcua_returnDiag_mask_sl_innerdiagnostics = -1;
+int hf_opcua_returnDiag_mask_ol_symbolicId = -1;
+int hf_opcua_returnDiag_mask_ol_localizedText = -1;
+int hf_opcua_returnDiag_mask_ol_additionalinfo = -1;
+int hf_opcua_returnDiag_mask_ol_innerstatuscode = -1;
+int hf_opcua_returnDiag_mask_ol_innerdiagnostics = -1;
+int hf_opcua_nodeClassMask = -1;
+int hf_opcua_nodeClassMask_all = -1;
+int hf_opcua_nodeClassMask_object = -1;
+int hf_opcua_nodeClassMask_variable = -1;
+int hf_opcua_nodeClassMask_method = -1;
+int hf_opcua_nodeClassMask_objecttype = -1;
+int hf_opcua_nodeClassMask_variabletype = -1;
+int hf_opcua_nodeClassMask_referencetype = -1;
+int hf_opcua_nodeClassMask_datatype = -1;
+int hf_opcua_nodeClassMask_view = -1;
+int hf_opcua_resultMask = -1;
+int hf_opcua_resultMask_all = -1;
+int hf_opcua_resultMask_referencetype = -1;
+int hf_opcua_resultMask_isforward = -1;
+int hf_opcua_resultMask_nodeclass = -1;
+int hf_opcua_resultMask_browsename = -1;
+int hf_opcua_resultMask_displayname = -1;
+int hf_opcua_resultMask_typedefinition = -1;
+
+static expert_field ei_array_length = EI_INIT;
+static expert_field ei_nesting_depth = EI_INIT;
+
+extern int proto_opcua;
+
+/** NodeId encoding mask table */
+static const value_string g_nodeidmasks[] = {
+ { 0x00, "Two byte encoded Numeric" },
+ { 0x01, "Four byte encoded Numeric" },
+ { 0x02, "Numeric of arbitrary length" },
+ { 0x03, "String" },
+ { 0x04, "GUID" },
+ { 0x05, "Opaque" },
+ { 0, NULL }
+};
+
+/** StatusCode info types */
+static const value_string g_infotype[] = {
+ { 0x00, "Not used" },
+ { 0x01, "DataValue" },
+ { 0x02, "Reserved" },
+ { 0x03, "Reserved" },
+ { 0, NULL }
+};
+
+/** StatusCode Limit types */
+static const value_string g_limit[] = {
+ { 0x00, "None" },
+ { 0x01, "Low" },
+ { 0x02, "High" },
+ { 0x03, "Constant" },
+ { 0, NULL }
+};
+
+/** StatusCode Historian types */
+static const value_string g_historian[] = {
+ { 0x00, "Raw" },
+ { 0x01, "Calculated" },
+ { 0x02, "Interpolated" },
+ { 0x03, "Reserved" },
+ { 0, NULL }
+};
+
+/** UA Variant Type enum */
+typedef enum _OpcUa_BuiltInType
+{
+ OpcUaType_Null = 0,
+ OpcUaType_Boolean = 1,
+ OpcUaType_SByte = 2,
+ OpcUaType_Byte = 3,
+ OpcUaType_Int16 = 4,
+ OpcUaType_UInt16 = 5,
+ OpcUaType_Int32 = 6,
+ OpcUaType_UInt32 = 7,
+ OpcUaType_Int64 = 8,
+ OpcUaType_UInt64 = 9,
+ OpcUaType_Float = 10,
+ OpcUaType_Double = 11,
+ OpcUaType_String = 12,
+ OpcUaType_DateTime = 13,
+ OpcUaType_Guid = 14,
+ OpcUaType_ByteString = 15,
+ OpcUaType_XmlElement = 16,
+ OpcUaType_NodeId = 17,
+ OpcUaType_ExpandedNodeId = 18,
+ OpcUaType_StatusCode = 19,
+ OpcUaType_QualifiedName = 20,
+ OpcUaType_LocalizedText = 21,
+ OpcUaType_ExtensionObject = 22,
+ OpcUaType_DataValue = 23,
+ OpcUaType_Variant = 24,
+ OpcUaType_DiagnosticInfo = 25
+}
+OpcUa_BuiltInType;
+
+/** Variant encoding mask table */
+static const value_string g_VariantTypes[] = {
+ { 0, "Null" },
+ { 1, "Boolean" },
+ { 2, "SByte" },
+ { 3, "Byte" },
+ { 4, "Int16" },
+ { 5, "UInt16" },
+ { 6, "Int32" },
+ { 7, "UInt32" },
+ { 8, "Int64" },
+ { 9, "UInt64" },
+ { 10, "Float" },
+ { 11, "Double" },
+ { 12, "String" },
+ { 13, "DateTime" },
+ { 14, "Guid" },
+ { 15, "ByteString" },
+ { 16, "XmlElement" },
+ { 17, "NodeId" },
+ { 18, "ExpandedNodeId" },
+ { 19, "StatusCode" },
+ { 20, "QualifiedName" },
+ { 21, "LocalizedText" },
+ { 22, "ExtensionObject" },
+ { 23, "DataValue" },
+ { 24, "Variant" },
+ { 25, "DiagnosticInfo" },
+ { 0x80, "Array of Null" },
+ { 0x80+1, "Array of Boolean" },
+ { 0x80+2, "Array of SByte" },
+ { 0x80+3, "Array of Byte" },
+ { 0x80+4, "Array of Int16" },
+ { 0x80+5, "Array of UInt16" },
+ { 0x80+6, "Array of Int32" },
+ { 0x80+7, "Array of UInt32" },
+ { 0x80+8, "Array of Int64" },
+ { 0x80+9, "Array of UInt64" },
+ { 0x80+10, "Array of Float" },
+ { 0x80+11, "Array of Double" },
+ { 0x80+12, "Array of String" },
+ { 0x80+13, "Array of DateTime" },
+ { 0x80+14, "Array of Guid" },
+ { 0x80+15, "Array of ByteString" },
+ { 0x80+16, "Array of XmlElement" },
+ { 0x80+17, "Array of NodeId" },
+ { 0x80+18, "Array of ExpandedNodeId" },
+ { 0x80+19, "Array of StatusCode" },
+ { 0x80+20, "Array of QualifiedName" },
+ { 0x80+21, "Array of LocalizedText" },
+ { 0x80+22, "Array of ExtensionObject" },
+ { 0x80+23, "Array of DataValue" },
+ { 0x80+24, "Array of Variant" },
+ { 0x80+25, "Array of DiagnosticInfo" },
+ { 0xC0, "Matrix of Null" },
+ { 0xC0+1, "Matrix of Boolean" },
+ { 0xC0+2, "Matrix of SByte" },
+ { 0xC0+3, "Matrix of Byte" },
+ { 0xC0+4, "Matrix of Int16" },
+ { 0xC0+5, "Matrix of UInt16" },
+ { 0xC0+6, "Matrix of Int32" },
+ { 0xC0+7, "Matrix of UInt32" },
+ { 0xC0+8, "Matrix of Int64" },
+ { 0xC0+9, "Matrix of UInt64" },
+ { 0xC0+10, "Matrix of Float" },
+ { 0xC0+11, "Matrix of Double" },
+ { 0xC0+12, "Matrix of String" },
+ { 0xC0+13, "Matrix of DateTime" },
+ { 0xC0+14, "Matrix of Guid" },
+ { 0xC0+15, "Matrix of ByteString" },
+ { 0xC0+16, "Matrix of XmlElement" },
+ { 0xC0+17, "Matrix of NodeId" },
+ { 0xC0+18, "Matrix of ExpandedNodeId" },
+ { 0xC0+19, "Matrix of StatusCode" },
+ { 0xC0+20, "Matrix of QualifiedName" },
+ { 0xC0+21, "Matrix of LocalizedText" },
+ { 0xC0+22, "Matrix of ExtensionObject" },
+ { 0xC0+23, "Matrix of DataValue" },
+ { 0xC0+24, "Matrix of Variant" },
+ { 0xC0+25, "Matrix of DiagnosticInfo" },
+ { 0, NULL }
+};
+#define VARIANT_ARRAYDIMENSIONS 0x40
+#define VARIANT_ARRAYMASK 0x80
+
+/** BrowseRequest's BrowseDescription's NodeClassMaskTable enum table */
+static const value_string g_NodeClassMask[] = {
+ { NODECLASSMASK_ALL, "All" },
+ { 0, NULL }
+};
+
+/* BrowseRequest's BrowseDescription's ResultMaskTable enum table */
+static const value_string g_ResultMask[] = {
+ { RESULTMASK_ALL, "All" },
+ { 0, NULL }
+};
+
+/* trees */
+static gint ett_opcua_diagnosticinfo = -1;
+static gint ett_opcua_diagnosticinfo_encodingmask = -1;
+static gint ett_opcua_nodeid = -1;
+static gint ett_opcua_expandednodeid = -1;
+static gint ett_opcua_expandednodeid_encodingmask = -1;
+static gint ett_opcua_localizedtext = -1;
+static gint ett_opcua_localizedtext_encodingmask = -1;
+static gint ett_opcua_qualifiedname = -1;
+static gint ett_opcua_datavalue = -1;
+static gint ett_opcua_datavalue_encodingmask = -1;
+static gint ett_opcua_variant = -1;
+static gint ett_opcua_variant_arraydims = -1;
+static gint ett_opcua_extensionobject = -1;
+static gint ett_opcua_extensionobject_encodingmask = -1;
+static gint ett_opcua_statuscode = -1;
+static gint ett_opcua_statuscode_info = -1;
+gint ett_opcua_array_Boolean = -1;
+gint ett_opcua_array_SByte = -1;
+gint ett_opcua_array_Byte = -1;
+gint ett_opcua_array_Int16 = -1;
+gint ett_opcua_array_UInt16 = -1;
+gint ett_opcua_array_Int32 = -1;
+gint ett_opcua_array_UInt32 = -1;
+gint ett_opcua_array_Int64 = -1;
+gint ett_opcua_array_UInt64 = -1;
+gint ett_opcua_array_Float = -1;
+gint ett_opcua_array_Double = -1;
+gint ett_opcua_array_String = -1;
+gint ett_opcua_array_DateTime = -1;
+gint ett_opcua_array_Guid = -1;
+gint ett_opcua_array_ByteString = -1;
+gint ett_opcua_array_XmlElement = -1;
+gint ett_opcua_array_NodeId = -1;
+gint ett_opcua_array_ExpandedNodeId = -1;
+gint ett_opcua_array_StatusCode = -1;
+gint ett_opcua_array_DiagnosticInfo = -1;
+gint ett_opcua_array_QualifiedName = -1;
+gint ett_opcua_array_LocalizedText = -1;
+gint ett_opcua_array_ExtensionObject = -1;
+gint ett_opcua_array_DataValue = -1;
+gint ett_opcua_array_Variant = -1;
+gint ett_opcua_returnDiagnostics = -1;
+gint ett_opcua_nodeClassMask = -1;
+gint ett_opcua_resultMask = -1;
+
+static gint *ett[] =
+{
+ &ett_opcua_diagnosticinfo,
+ &ett_opcua_diagnosticinfo_encodingmask,
+ &ett_opcua_nodeid,
+ &ett_opcua_expandednodeid,
+ &ett_opcua_expandednodeid_encodingmask,
+ &ett_opcua_localizedtext,
+ &ett_opcua_localizedtext_encodingmask,
+ &ett_opcua_qualifiedname,
+ &ett_opcua_datavalue,
+ &ett_opcua_datavalue_encodingmask,
+ &ett_opcua_variant,
+ &ett_opcua_variant_arraydims,
+ &ett_opcua_extensionobject,
+ &ett_opcua_extensionobject_encodingmask,
+ &ett_opcua_statuscode,
+ &ett_opcua_statuscode_info,
+ &ett_opcua_array_Boolean,
+ &ett_opcua_array_SByte,
+ &ett_opcua_array_Byte,
+ &ett_opcua_array_Int16,
+ &ett_opcua_array_UInt16,
+ &ett_opcua_array_Int32,
+ &ett_opcua_array_UInt32,
+ &ett_opcua_array_Int64,
+ &ett_opcua_array_UInt64,
+ &ett_opcua_array_Float,
+ &ett_opcua_array_Double,
+ &ett_opcua_array_String,
+ &ett_opcua_array_DateTime,
+ &ett_opcua_array_Guid,
+ &ett_opcua_array_ByteString,
+ &ett_opcua_array_XmlElement,
+ &ett_opcua_array_NodeId,
+ &ett_opcua_array_ExpandedNodeId,
+ &ett_opcua_array_StatusCode,
+ &ett_opcua_array_DiagnosticInfo,
+ &ett_opcua_array_QualifiedName,
+ &ett_opcua_array_LocalizedText,
+ &ett_opcua_array_ExtensionObject,
+ &ett_opcua_array_DataValue,
+ &ett_opcua_array_Variant,
+ &ett_opcua_returnDiagnostics,
+ &ett_opcua_nodeClassMask,
+ &ett_opcua_resultMask
+};
+
+void registerSimpleTypes(int proto)
+{
+ expert_module_t* expert_proto;
+
+ static hf_register_info hf[] =
+ {
+ /* id full name abbreviation type display strings bitmask blurb HFILL */
+ {&hf_opcua_diag_mask, {"EncodingMask", "opcua.diag.mask", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_diag_mask_symbolicflag, {"has symbolic id", "opcua.diag.has_symbolic_id", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_SYMBOLICID_FLAG, NULL, HFILL}},
+ {&hf_opcua_diag_mask_namespaceflag, {"has namespace", "opcua.diag.has_namespace", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_NAMESPACE_FLAG, NULL, HFILL}},
+ {&hf_opcua_diag_mask_localizedtextflag, {"has localizedtext", "opcua.diag.has_localizedtext", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_LOCALIZEDTEXT_FLAG, NULL, HFILL}},
+ {&hf_opcua_diag_mask_localeflag, {"has locale", "opcua.diag.has_locale", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_LOCALE_FLAG, NULL, HFILL}},
+ {&hf_opcua_diag_mask_additionalinfoflag, {"has additional info", "opcua.diag.has_additional_info", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_ADDITIONALINFO_FLAG, NULL, HFILL}},
+ {&hf_opcua_diag_mask_innerstatuscodeflag, {"has inner statuscode", "opcua.diag.has_inner_statuscode", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_INNERSTATUSCODE_FLAG, NULL, HFILL}},
+ {&hf_opcua_diag_mask_innerdiaginfoflag, {"has inner diagnostic info", "opcua.diag.has_inner_diagnostic_code", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_INNERDIAGNOSTICINFO_FLAG, NULL, HFILL}},
+ {&hf_opcua_loctext_mask, {"EncodingMask", "opcua.loctext.mask", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_loctext_mask_localeflag, {"has locale information", "opcua.loctext.has_locale_information", FT_BOOLEAN, 8, NULL, LOCALIZEDTEXT_ENCODINGBYTE_LOCALE, NULL, HFILL}},
+ {&hf_opcua_loctext_mask_textflag, {"has text", "opcua.loctext.has_text", FT_BOOLEAN, 8, NULL, LOCALIZEDTEXT_ENCODINGBYTE_TEXT, NULL, HFILL}},
+ {&hf_opcua_nodeid_encodingmask, {"EncodingMask", "opcua.nodeid.encodingmask", FT_UINT8, BASE_HEX, VALS(g_nodeidmasks), 0x0F, NULL, HFILL}},
+ {&hf_opcua_nodeid_nsindex, {"Namespace Index", "opcua.nodeid.nsindex", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_nodeid_numeric, {"Identifier Numeric", "opcua.nodeid.numeric", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_nodeid_string, {"Identifier String", "opcua.nodeid.string", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_nodeid_guid, {"Identifier Guid", "opcua.nodeid.guid", FT_GUID, BASE_NONE, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_nodeid_bytestring, {"Identifier ByteString", "opcua.nodeid.bytestring", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_expandednodeid_mask, {"EncodingMask", "opcua.expandednodeid.mask", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_expandednodeid_mask_namespaceuri, {"has namespace uri", "opcua.expandednodeid.has_namespace_uri", FT_BOOLEAN, 8, NULL, NODEID_NAMESPACEURIFLAG, NULL, HFILL}},
+ {&hf_opcua_expandednodeid_mask_serverindex, {"has server index", "opcua.expandednodeid.has_server_index", FT_BOOLEAN, 8, NULL, NODEID_SERVERINDEXFLAG, NULL, HFILL}},
+ {&hf_opcua_localizedtext_locale, {"Locale", "opcua.loctext.Locale", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_localizedtext_text, {"Text", "opcua.loctext.Text", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_qualifiedname_id, {"Id", "opcua.qualname.Id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_qualifiedname_name, {"Name", "opcua.qualname.Name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_datavalue_mask, {"EncodingMask", "opcua.datavalue.mask", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_datavalue_mask_valueflag, {"has value", "opcua.datavalue.has_value", FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_VALUE, NULL, HFILL}},
+ {&hf_opcua_datavalue_mask_statuscodeflag, {"has statuscode", "opcua.datavalue.has_statuscode", FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_STATUSCODE, NULL, HFILL}},
+ {&hf_opcua_datavalue_mask_sourcetimestampflag, {"has source timestamp", "opcua.datavalue.has_source_timestamp", FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_SOURCETIMESTAMP, NULL, HFILL}},
+ {&hf_opcua_datavalue_mask_servertimestampflag, {"has server timestamp", "opcua.datavalue.has_server_timestamp", FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_SERVERTIMESTAMP, NULL, HFILL}},
+ {&hf_opcua_datavalue_mask_sourcepicoseconds, {"has source picoseconds", "opcua.datavalue.has_source_picoseconds", FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_SOURCEPICOSECONDS, NULL, HFILL}},
+ {&hf_opcua_datavalue_mask_serverpicoseconds, {"has server picoseconds", "opcua.datavalue.has_server_picoseconds", FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_SERVERPICOSECONDS, NULL, HFILL}},
+ {&hf_opcua_variant_encodingmask, {"Variant Type", "opcua.variant.has_value", FT_UINT8, BASE_HEX, VALS(g_VariantTypes), 0x0, NULL, HFILL}},
+ {&hf_opcua_SourceTimestamp, {"SourceTimestamp", "opcua.datavalue.SourceTimestamp", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_SourcePicoseconds, {"SourcePicoseconds", "opcua.datavalue.SourcePicoseconds", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_ServerTimestamp, {"ServerTimestamp", "opcua.datavalue.ServerTimestamp", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_ServerPicoseconds, {"ServerPicoseconds", "opcua.datavalue.ServerPicoseconds", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_diag_symbolicid, {"SymbolicId", "opcua.diag.SymbolicId", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_diag_namespace, {"Namespace", "opcua.diag.Namespace", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_diag_localizedtext, {"LocalizedText", "opcua.diag.LocalizedText", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_diag_locale, {"Locale", "opcua.diag.Locale", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_diag_additionalinfo, {"AdditionalInfo", "opcua.diag.AdditionalInfo", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_diag_innerstatuscode, {"InnerStatusCode", "opcua.diag.InnerStatusCode", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_extobj_mask, {"EncodingMask", "opcua.extobj.mask", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_extobj_mask_binbodyflag, {"has binary body", "opcua.extobj.has_binary_body", FT_BOOLEAN, 8, NULL, EXTOBJ_ENCODINGMASK_BINBODY_FLAG, NULL, HFILL}},
+ {&hf_opcua_extobj_mask_xmlbodyflag, {"has xml body", "opcua.extobj.has_xml_body", FT_BOOLEAN, 8, NULL, EXTOBJ_ENCODINGMASK_XMLBODY_FLAG, NULL, HFILL}},
+ {&hf_opcua_ArraySize, {"ArraySize", "opcua.variant.ArraySize", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_ServerIndex, {"ServerIndex", "opcua.expandednodeid.ServerIndex", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_status_StructureChanged, {"StructureChanged", "opcua.statuscode.structureChanged", FT_BOOLEAN, 16, NULL, STATUSCODE_STRUCTURECHANGED, NULL, HFILL}},
+ {&hf_opcua_status_SemanticsChanged, {"SemanticsChanged", "opcua.statuscode.semanticsChanged", FT_BOOLEAN, 16, NULL, STATUSCODE_SEMANTICSCHANGED, NULL, HFILL}},
+ {&hf_opcua_status_InfoBit_Limit_Overflow, {"Overflow", "opcua.statuscode.overflow", FT_BOOLEAN, 16, NULL, STATUSCODE_INFOBIT_OVERFLOW, NULL, HFILL}},
+ {&hf_opcua_status_InfoBit_Historian_Partial, {"HistorianBit: Partial", "opcua.statuscode.historian.partial", FT_BOOLEAN, 16, NULL, STATUSCODE_INFOBIT_HISTORIAN_PARTIAL, NULL, HFILL}},
+ {&hf_opcua_status_InfoBit_Historian_ExtraData, {"HistorianBit: ExtraData", "opcua.statuscode.historian.extraData", FT_BOOLEAN, 16, NULL, STATUSCODE_INFOBIT_HISTORIAN_EXTRADATA, NULL, HFILL}},
+ {&hf_opcua_status_InfoBit_Historian_MultiValue, {"HistorianBit: MultiValue", "opcua.statuscode.historian.multiValue", FT_BOOLEAN, 16, NULL, STATUSCODE_INFOBIT_HISTORIAN_MULTIVALUE, NULL, HFILL}},
+ {&hf_opcua_status_InfoType, {"InfoType", "opcua.statuscode.infoType", FT_UINT16, BASE_HEX, VALS(g_infotype), 0x0C00, NULL, HFILL}},
+ {&hf_opcua_status_Limit, {"Limit", "opcua.statuscode.limit", FT_UINT16, BASE_HEX, VALS(g_limit), 0x0300, NULL, HFILL}},
+ {&hf_opcua_status_Historian, {"Historian", "opcua.statuscode.historian", FT_UINT16, BASE_HEX, VALS(g_historian), 0x0003, NULL, HFILL}},
+ {&hf_opcua_returnDiag, {"Return Diagnostics", "opcua.returndiag", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_returnDiag_mask_sl_symbolicId, {"ServiceLevel / SymbolicId", "opcua.returndiag.servicelevel.symbolicid", FT_BOOLEAN, 16, NULL, RETURNDIAGNOSTICS_SERVICELEVEL_SYMBOLICID, NULL, HFILL}},
+ {&hf_opcua_returnDiag_mask_sl_localizedText, {"ServiceLevel / LocalizedText", "opcua.returndiag.servicelevel.localizedtext", FT_BOOLEAN, 16, NULL, RETURNDIAGNOSTICS_SERVICELEVEL_LOCALIZEDTEXT, NULL, HFILL}},
+ {&hf_opcua_returnDiag_mask_sl_additionalinfo, {"ServiceLevel / AdditionalInfo", "opcua.returndiag.servicelevel.additionalinfo", FT_BOOLEAN, 16, NULL, RETURNDIAGNOSTICS_SERVICELEVEL_ADDITIONALINFO, NULL, HFILL}},
+ {&hf_opcua_returnDiag_mask_sl_innerstatuscode, {"ServiceLevel / Inner StatusCode", "opcua.returndiag.servicelevel.innerstatuscode", FT_BOOLEAN, 16, NULL, RETURNDIAGNOSTICS_SERVICELEVEL_INNERSTATUSCODE, NULL, HFILL}},
+ {&hf_opcua_returnDiag_mask_sl_innerdiagnostics, {"ServiceLevel / Inner Diagnostics", "opcua.returndiag.servicelevel.innerdiagnostics", FT_BOOLEAN, 16, NULL, RETURNDIAGNOSTICS_SERVICELEVEL_INNERDIAGNOSTICS, NULL, HFILL}},
+ {&hf_opcua_returnDiag_mask_ol_symbolicId, {"OperationLevel / SymbolicId", "opcua.returndiag.operationlevel.symbolicid", FT_BOOLEAN, 16, NULL, RETURNDIAGNOSTICS_OPERATIONLEVEL_SYMBOLICID, NULL, HFILL}},
+ {&hf_opcua_returnDiag_mask_ol_localizedText, {"OperationLevel / LocalizedText", "opcua.returndiag.operationlevel.localizedtext", FT_BOOLEAN, 16, NULL, RETURNDIAGNOSTICS_OPERATIONLEVEL_LOCALIZEDTEXT, NULL, HFILL}},
+ {&hf_opcua_returnDiag_mask_ol_additionalinfo, {"OperationLevel / AdditionalInfo", "opcua.returndiag.operationlevel.additionalinfo", FT_BOOLEAN, 16, NULL, RETURNDIAGNOSTICS_OPERATIONLEVEL_ADDITIONALINFO, NULL, HFILL}},
+ {&hf_opcua_returnDiag_mask_ol_innerstatuscode, {"OperationLevel / Inner StatusCode", "opcua.returndiag.operationlevel.innerstatuscode", FT_BOOLEAN, 16, NULL, RETURNDIAGNOSTICS_OPERATIONLEVEL_INNERSTATUSCODE, NULL, HFILL}},
+ {&hf_opcua_returnDiag_mask_ol_innerdiagnostics, {"OperationLevel / Inner Diagnostics", "opcua.returndiag.operationlevel.innerdiagnostics", FT_BOOLEAN, 16, NULL, RETURNDIAGNOSTICS_OPERATIONLEVEL_INNERDIAGNOSTICS, NULL, HFILL}},
+ {&hf_opcua_nodeClassMask, {"Node Class Mask", "opcua.nodeclassmask", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_nodeClassMask_all, {"Node Class Mask", "opcua.nodeclassmask.all", FT_UINT32, BASE_HEX, VALS(g_NodeClassMask), 0x0, NULL, HFILL}},
+ {&hf_opcua_nodeClassMask_object, {"Object", "opcua.nodeclassmask.object", FT_BOOLEAN, 16, NULL, NODECLASSMASK_OBJECT, NULL, HFILL}},
+ {&hf_opcua_nodeClassMask_variable, {"Variable", "opcua.nodeclassmask.variable", FT_BOOLEAN, 16, NULL, NODECLASSMASK_VARIABLE, NULL, HFILL}},
+ {&hf_opcua_nodeClassMask_method, {"Method", "opcua.nodeclassmask.method", FT_BOOLEAN, 16, NULL, NODECLASSMASK_METHOD, NULL, HFILL}},
+ {&hf_opcua_nodeClassMask_objecttype, {"ObjectType", "opcua.nodeclassmask.objecttype", FT_BOOLEAN, 16, NULL, NODECLASSMASK_OBJECTTYPE, NULL, HFILL}},
+ {&hf_opcua_nodeClassMask_variabletype, {"VariableType", "opcua.nodeclassmask.variabletype", FT_BOOLEAN, 16, NULL, NODECLASSMASK_VARIABLETYPE, NULL, HFILL}},
+ {&hf_opcua_nodeClassMask_referencetype, {"ReferenceType", "opcua.nodeclassmask.referencetype", FT_BOOLEAN, 16, NULL, NODECLASSMASK_REFERENCETYPE, NULL, HFILL}},
+ {&hf_opcua_nodeClassMask_datatype, {"DataType", "opcua.nodeclassmask.datatype", FT_BOOLEAN, 16, NULL, NODECLASSMASK_DATATYPE, NULL, HFILL}},
+ {&hf_opcua_nodeClassMask_view, {"View", "opcua.nodeclassmask.view", FT_BOOLEAN, 16, NULL, NODECLASSMASK_VIEW, NULL, HFILL}},
+ {&hf_opcua_resultMask, {"Result Mask", "opcua.resultmask", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_resultMask_referencetype, {"Reference Type", "opcua.resultmask.referencetype", FT_BOOLEAN, 16, NULL, RESULTMASK_REFERENCETYPE, NULL, HFILL}},
+ {&hf_opcua_resultMask_isforward, {"Is Forward", "opcua.resultmask.isforward", FT_BOOLEAN, 16, NULL, RESULTMASK_ISFORWARD, NULL, HFILL}},
+ {&hf_opcua_resultMask_nodeclass, {"Node Class", "opcua.resultmask.nodeclass", FT_BOOLEAN, 16, NULL, RESULTMASK_NODECLASS, NULL, HFILL}},
+ {&hf_opcua_resultMask_browsename, {"Browse Name", "opcua.resultmask.browsename", FT_BOOLEAN, 16, NULL, RESULTMASK_BROWSENAME, NULL, HFILL}},
+ {&hf_opcua_resultMask_displayname, {"Display Name", "opcua.resultmask.displayname", FT_BOOLEAN, 16, NULL, RESULTMASK_DISPLAYNAME, NULL, HFILL}},
+ {&hf_opcua_resultMask_typedefinition, {"Type Definition", "opcua.resultmask.typedefinition", FT_BOOLEAN, 16, NULL, RESULTMASK_TYPEDEFINITION, NULL, HFILL}},
+ {&hf_opcua_resultMask_all, {"Result Mask", "opcua.resultmask.all", FT_UINT32, BASE_HEX, VALS(g_ResultMask), 0x0, NULL, HFILL}},
+ };
+
+ static ei_register_info ei[] = {
+ { &ei_array_length, { "opcua.array.length", PI_UNDECODED, PI_ERROR, "Max array length exceeded", EXPFILL }},
+ { &ei_nesting_depth, { "opcua.nestingdepth", PI_UNDECODED, PI_ERROR, "Max nesting depth exceeded", EXPFILL }},
+ };
+
+ proto_register_field_array(proto, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+
+ expert_proto = expert_register_protocol(proto);
+ expert_register_field_array(expert_proto, ei, array_length(ei));
+}
+
+proto_item* parseBoolean(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset, int hfIndex)
+{
+ proto_item *item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 1, ENC_LITTLE_ENDIAN);
+ *pOffset+=1;
+ return item;
+}
+
+proto_item* parseByte(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset, int hfIndex)
+{
+ proto_item *item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 1, ENC_LITTLE_ENDIAN);
+ *pOffset+=1;
+ return item;
+}
+
+proto_item* parseSByte(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset, int hfIndex)
+{
+ proto_item *item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 1, ENC_LITTLE_ENDIAN);
+ *pOffset+=1;
+ return item;
+}
+
+proto_item* parseUInt16(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset, int hfIndex)
+{
+ proto_item *item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 2, ENC_LITTLE_ENDIAN);
+ *pOffset+=2;
+ return item;
+}
+
+proto_item* parseInt16(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset, int hfIndex)
+{
+ proto_item *item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 2, ENC_LITTLE_ENDIAN);
+ *pOffset+=2;
+ return item;
+}
+
+proto_item* parseUInt32(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset, int hfIndex)
+{
+ proto_item *item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN);
+ *pOffset+=4;
+ return item;
+}
+
+proto_item* parseInt32(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset, int hfIndex)
+{
+ proto_item *item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN);
+ *pOffset+=4;
+ return item;
+}
+
+proto_item* parseUInt64(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset, int hfIndex)
+{
+ proto_item *item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 8, ENC_LITTLE_ENDIAN);
+ *pOffset+=8;
+ return item;
+}
+
+proto_item* parseInt64(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset, int hfIndex)
+{
+ proto_item *item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 8, ENC_LITTLE_ENDIAN);
+ *pOffset+=8;
+ return item;
+}
+
+proto_item* parseString(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset, int hfIndex)
+{
+ proto_item *item = NULL;
+ char *szValue;
+ gint iOffset = *pOffset;
+ gint32 iLen = tvb_get_letohl(tvb, *pOffset);
+ iOffset+=4;
+
+ if (iLen == -1)
+ {
+ item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 0, ENC_NA);
+ proto_item_append_text(item, "[OpcUa Null String]");
+ proto_item_set_end(item, tvb, *pOffset + 4);
+ }
+ else if (iLen == 0)
+ {
+ item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 0, ENC_NA);
+ proto_item_append_text(item, "[OpcUa Empty String]");
+ proto_item_set_end(item, tvb, *pOffset + 4);
+ }
+ else if (iLen > 0)
+ {
+ item = proto_tree_add_item(tree, hfIndex, tvb, iOffset, iLen, ENC_UTF_8|ENC_NA);
+ iOffset += iLen; /* eat the whole string */
+ }
+ else
+ {
+ item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 0, ENC_NA);
+ szValue = wmem_strdup_printf(pinfo->pool, "[Invalid String] Invalid length: %d", iLen);
+ proto_item_append_text(item, "%s", szValue);
+ proto_item_set_end(item, tvb, *pOffset + 4);
+ }
+
+ *pOffset = iOffset;
+ return item;
+}
+
+proto_item* parseStatusCode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset, int hfIndex)
+{
+ proto_item *item = NULL;
+ guint32 uStatusCode = 0;
+ const gchar *szStatusCode = NULL;
+
+ item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN);
+
+ uStatusCode = tvb_get_letohl(tvb, *pOffset);
+ szStatusCode = val_to_str_const(uStatusCode & 0xFFFF0000, g_statusCodes, "Unknown Status Code");
+ proto_item_append_text(item, " [%s]", szStatusCode);
+
+ /* check for status code info flags */
+ if (uStatusCode & 0x0000FFFF)
+ {
+ gint iOffset = *pOffset;
+ proto_tree *flags_tree;
+ proto_item *ti_inner;
+
+ flags_tree = proto_item_add_subtree(item, ett_opcua_statuscode);
+
+ proto_tree_add_item(flags_tree, hf_opcua_status_StructureChanged, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(flags_tree, hf_opcua_status_SemanticsChanged, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ ti_inner = proto_tree_add_item(flags_tree, hf_opcua_status_InfoType, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+
+ switch (uStatusCode & 0x00000C00)
+ {
+ case STATUSCODE_INFOTYPE_DATAVALUE:
+ {
+ /* InfoType == DataValue */
+ proto_tree *tree_inner;
+
+ tree_inner = proto_item_add_subtree(ti_inner, ett_opcua_statuscode_info);
+
+ proto_tree_add_item(tree_inner, hf_opcua_status_Limit, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree_inner, hf_opcua_status_InfoBit_Limit_Overflow, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree_inner, hf_opcua_status_InfoBit_Historian_MultiValue, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree_inner, hf_opcua_status_InfoBit_Historian_ExtraData, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree_inner, hf_opcua_status_InfoBit_Historian_Partial, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree_inner, hf_opcua_status_Historian, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ }
+ default:
+ break;
+ }
+ }
+
+ *pOffset += 4;
+ return item;
+}
+
+void parseLocalizedText(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ static int * const loctext_mask[] = {&hf_opcua_loctext_mask_localeflag,
+ &hf_opcua_loctext_mask_textflag,
+ NULL};
+
+ gint iOffset = *pOffset;
+ guint8 EncodingMask;
+ proto_tree *subtree;
+ proto_item *ti;
+
+ subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_localizedtext, &ti, "%s: LocalizedText", szFieldName);
+
+ /* parse encoding mask */
+ EncodingMask = tvb_get_guint8(tvb, iOffset);
+ proto_tree_add_bitmask(subtree, tvb, iOffset, hf_opcua_loctext_mask, ett_opcua_localizedtext_encodingmask, loctext_mask, ENC_LITTLE_ENDIAN);
+ iOffset++;
+
+ if (EncodingMask & LOCALIZEDTEXT_ENCODINGBYTE_LOCALE)
+ {
+ parseString(subtree, tvb, pinfo, &iOffset, hf_opcua_localizedtext_locale);
+ }
+
+ if (EncodingMask & LOCALIZEDTEXT_ENCODINGBYTE_TEXT)
+ {
+ parseString(subtree, tvb, pinfo, &iOffset, hf_opcua_localizedtext_text);
+ }
+
+ proto_item_set_end(ti, tvb, iOffset);
+ *pOffset = iOffset;
+}
+
+proto_item* parseGuid(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset, int hfIndex)
+{
+ proto_item *item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, GUID_LEN, ENC_LITTLE_ENDIAN);
+ *pOffset+=GUID_LEN;
+ return item;
+}
+
+proto_item* parseByteString(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset, int hfIndex)
+{
+ proto_item *item = NULL;
+ char *szValue;
+ int iOffset = *pOffset;
+ gint32 iLen = tvb_get_letohl(tvb, iOffset);
+ iOffset += 4;
+
+ if (iLen == -1)
+ {
+ item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 0, ENC_NA);
+ proto_item_append_text(item, "[OpcUa Null ByteString]");
+ proto_item_set_end(item, tvb, *pOffset + 4);
+ }
+ else if (iLen == 0)
+ {
+ item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 0, ENC_NA);
+ proto_item_append_text(item, "[OpcUa Empty ByteString]");
+ proto_item_set_end(item, tvb, *pOffset + 4);
+ }
+ else if (iLen > 0)
+ {
+ item = proto_tree_add_item(tree, hfIndex, tvb, iOffset, iLen, ENC_NA);
+ iOffset += iLen; /* eat the whole bytestring */
+ }
+ else
+ {
+ item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 0, ENC_NA);
+ szValue = wmem_strdup_printf(pinfo->pool, "[Invalid ByteString] Invalid length: %d", iLen);
+ proto_item_append_text(item, "%s", szValue);
+ proto_item_set_end(item, tvb, *pOffset + 4);
+ }
+
+ *pOffset = iOffset;
+ return item;
+}
+
+proto_item* parseXmlElement(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex)
+{
+ return parseByteString(tree, tvb, pinfo, pOffset, hfIndex);
+}
+
+proto_item* parseFloat(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset, int hfIndex)
+{
+ proto_item *item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, (int)sizeof(gfloat), ENC_LITTLE_ENDIAN);
+ *pOffset += (int)sizeof(gfloat);
+ return item;
+}
+
+proto_item* parseDouble(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset, int hfIndex)
+{
+ proto_item *item = proto_tree_add_item(tree, hfIndex, tvb, *pOffset, (int)sizeof(gdouble), ENC_LITTLE_ENDIAN);
+ *pOffset += (int)sizeof(gdouble);
+ return item;
+}
+
+proto_item* parseDateTime(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset, int hfIndex)
+{
+ proto_item *item = NULL;
+ *pOffset = dissect_nt_64bit_time_ex(tvb, tree, *pOffset, hfIndex, &item, FALSE);
+ return item;
+}
+
+void parseDiagnosticInfo(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ static int * const diag_mask[] = {&hf_opcua_diag_mask_symbolicflag,
+ &hf_opcua_diag_mask_namespaceflag,
+ &hf_opcua_diag_mask_localizedtextflag,
+ &hf_opcua_diag_mask_localeflag,
+ &hf_opcua_diag_mask_additionalinfoflag,
+ &hf_opcua_diag_mask_innerstatuscodeflag,
+ &hf_opcua_diag_mask_innerdiaginfoflag,
+ NULL};
+
+ gint iOffset = *pOffset;
+ guint8 EncodingMask;
+ proto_tree *subtree;
+ proto_item *ti;
+ guint opcua_nested_count;
+
+ subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_diagnosticinfo, &ti, "%s: DiagnosticInfo", szFieldName);
+
+ /* prevent a too high nesting depth */
+ opcua_nested_count = GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_opcua, 0));
+ if (opcua_nested_count >= MAX_NESTING_DEPTH)
+ {
+ expert_add_info(pinfo, ti, &ei_nesting_depth);
+ return;
+ }
+ opcua_nested_count++;
+ p_add_proto_data(pinfo->pool, pinfo, proto_opcua, 0, GUINT_TO_POINTER(opcua_nested_count));
+
+ /* parse encoding mask */
+ EncodingMask = tvb_get_guint8(tvb, iOffset);
+ proto_tree_add_bitmask(subtree, tvb, iOffset, hf_opcua_diag_mask, ett_opcua_diagnosticinfo_encodingmask, diag_mask, ENC_LITTLE_ENDIAN);
+ iOffset++;
+
+ if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_SYMBOLICID_FLAG)
+ {
+ parseInt32(subtree, tvb, pinfo, &iOffset, hf_opcua_diag_symbolicid);
+ }
+ if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_NAMESPACE_FLAG)
+ {
+ parseInt32(subtree, tvb, pinfo, &iOffset, hf_opcua_diag_namespace);
+ }
+ if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_LOCALE_FLAG)
+ {
+ parseInt32(subtree, tvb, pinfo, &iOffset, hf_opcua_diag_locale);
+ }
+ if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_LOCALIZEDTEXT_FLAG)
+ {
+ parseInt32(subtree, tvb, pinfo, &iOffset, hf_opcua_diag_localizedtext);
+ }
+ if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_ADDITIONALINFO_FLAG)
+ {
+ parseString(subtree, tvb, pinfo, &iOffset, hf_opcua_diag_additionalinfo);
+ }
+ if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_INNERSTATUSCODE_FLAG)
+ {
+ parseStatusCode(subtree, tvb, pinfo, &iOffset, hf_opcua_diag_innerstatuscode);
+ }
+ if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_INNERDIAGNOSTICINFO_FLAG)
+ {
+ parseDiagnosticInfo(subtree, tvb, pinfo, &iOffset, "Inner DiagnosticInfo");
+ }
+
+ proto_item_set_end(ti, tvb, iOffset);
+ *pOffset = iOffset;
+
+ opcua_nested_count--;
+ p_add_proto_data(pinfo->pool, pinfo, proto_opcua, 0, GUINT_TO_POINTER(opcua_nested_count));
+}
+
+void parseQualifiedName(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1,
+ ett_opcua_qualifiedname, &ti, "%s: QualifiedName", szFieldName);
+
+ parseUInt16(subtree, tvb, pinfo, pOffset, hf_opcua_qualifiedname_id);
+ parseString(subtree, tvb, pinfo, pOffset, hf_opcua_qualifiedname_name);
+
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+
+void parseDataValue(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ static int * const datavalue_mask[] = {&hf_opcua_datavalue_mask_valueflag,
+ &hf_opcua_datavalue_mask_statuscodeflag,
+ &hf_opcua_datavalue_mask_sourcetimestampflag,
+ &hf_opcua_datavalue_mask_servertimestampflag,
+ &hf_opcua_datavalue_mask_sourcepicoseconds,
+ &hf_opcua_datavalue_mask_serverpicoseconds,
+ NULL};
+
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1,
+ ett_opcua_datavalue, &ti, "%s: DataValue", szFieldName);
+ gint iOffset = *pOffset;
+ guint8 EncodingMask;
+
+ EncodingMask = tvb_get_guint8(tvb, iOffset);
+ proto_tree_add_bitmask(subtree, tvb, iOffset, hf_opcua_datavalue_mask, ett_opcua_datavalue_encodingmask, datavalue_mask, ENC_LITTLE_ENDIAN);
+ iOffset++;
+
+ if (EncodingMask & DATAVALUE_ENCODINGBYTE_VALUE)
+ {
+ parseVariant(subtree, tvb, pinfo, &iOffset, "Value");
+ }
+ if (EncodingMask & DATAVALUE_ENCODINGBYTE_STATUSCODE)
+ {
+ parseStatusCode(subtree, tvb, pinfo, &iOffset, hf_opcua_StatusCode);
+ }
+ if (EncodingMask & DATAVALUE_ENCODINGBYTE_SOURCETIMESTAMP)
+ {
+ parseDateTime(subtree, tvb, pinfo, &iOffset, hf_opcua_SourceTimestamp);
+ }
+ if (EncodingMask & DATAVALUE_ENCODINGBYTE_SOURCEPICOSECONDS)
+ {
+ parseUInt16(subtree, tvb, pinfo, &iOffset, hf_opcua_SourcePicoseconds);
+ }
+ if (EncodingMask & DATAVALUE_ENCODINGBYTE_SERVERTIMESTAMP)
+ {
+ parseDateTime(subtree, tvb, pinfo, &iOffset, hf_opcua_ServerTimestamp);
+ }
+ if (EncodingMask & DATAVALUE_ENCODINGBYTE_SERVERPICOSECONDS)
+ {
+ parseUInt16(subtree, tvb, pinfo, &iOffset, hf_opcua_ServerPicoseconds);
+ }
+
+ proto_item_set_end(ti, tvb, iOffset);
+ *pOffset = iOffset;
+}
+
+void parseVariant(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1,
+ ett_opcua_variant, &ti, "%s: Variant", szFieldName);
+ gint iOffset = *pOffset;
+ guint8 EncodingMask;
+ gint32 ArrayDimensions = 0;
+ guint opcua_nested_count;
+
+ /* prevent a too high nesting depth */
+ opcua_nested_count = GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_opcua, 0));
+ if (opcua_nested_count >= MAX_NESTING_DEPTH)
+ {
+ expert_add_info(pinfo, ti, &ei_nesting_depth);
+ return;
+ }
+ opcua_nested_count++;
+ p_add_proto_data(pinfo->pool, pinfo, proto_opcua, 0, GUINT_TO_POINTER(opcua_nested_count));
+
+ EncodingMask = tvb_get_guint8(tvb, iOffset);
+ proto_tree_add_item(subtree, hf_opcua_variant_encodingmask, tvb, iOffset, 1, ENC_LITTLE_ENDIAN);
+ iOffset++;
+
+ if (EncodingMask & VARIANT_ARRAYMASK)
+ {
+ /* type is encoded in bits 0-5 */
+ switch(EncodingMask & 0x3f)
+ {
+ case OpcUaType_Null: break;
+ case OpcUaType_Boolean: parseArraySimple(subtree, tvb, pinfo, &iOffset, "Boolean", "Boolean", hf_opcua_Boolean, parseBoolean, ett_opcua_array_Boolean); break;
+ case OpcUaType_SByte: parseArraySimple(subtree, tvb, pinfo, &iOffset, "SByte", "SByte", hf_opcua_SByte, parseSByte, ett_opcua_array_SByte); break;
+ case OpcUaType_Byte: parseArraySimple(subtree, tvb, pinfo, &iOffset, "Byte", "Byte", hf_opcua_Byte, parseByte, ett_opcua_array_Byte); break;
+ case OpcUaType_Int16: parseArraySimple(subtree, tvb, pinfo, &iOffset, "Int16", "Int16", hf_opcua_Int16, parseInt16, ett_opcua_array_Int16); break;
+ case OpcUaType_UInt16: parseArraySimple(subtree, tvb, pinfo, &iOffset, "UInt16", "UInt16", hf_opcua_UInt16, parseUInt16, ett_opcua_array_UInt16); break;
+ case OpcUaType_Int32: parseArraySimple(subtree, tvb, pinfo, &iOffset, "Int32", "Int32", hf_opcua_Int32, parseInt32, ett_opcua_array_Int32); break;
+ case OpcUaType_UInt32: parseArraySimple(subtree, tvb, pinfo, &iOffset, "UInt32", "UInt32", hf_opcua_UInt32, parseUInt32, ett_opcua_array_UInt32); break;
+ case OpcUaType_Int64: parseArraySimple(subtree, tvb, pinfo, &iOffset, "Int64", "Int64", hf_opcua_Int64, parseInt64, ett_opcua_array_Int64); break;
+ case OpcUaType_UInt64: parseArraySimple(subtree, tvb, pinfo, &iOffset, "UInt64", "UInt64", hf_opcua_UInt64, parseUInt64, ett_opcua_array_UInt64); break;
+ case OpcUaType_Float: parseArraySimple(subtree, tvb, pinfo, &iOffset, "Float", "Float", hf_opcua_Float, parseFloat, ett_opcua_array_Float); break;
+ case OpcUaType_Double: parseArraySimple(subtree, tvb, pinfo, &iOffset, "Double", "Double", hf_opcua_Double, parseDouble, ett_opcua_array_Double); break;
+ case OpcUaType_String: parseArraySimple(subtree, tvb, pinfo, &iOffset, "String", "String", hf_opcua_String, parseString, ett_opcua_array_String); break;
+ case OpcUaType_DateTime: parseArraySimple(subtree, tvb, pinfo, &iOffset, "DateTime", "DateTime", hf_opcua_DateTime, parseDateTime, ett_opcua_array_DateTime); break;
+ case OpcUaType_Guid: parseArraySimple(subtree, tvb, pinfo, &iOffset, "Guid", "Guid", hf_opcua_Guid, parseGuid, ett_opcua_array_Guid); break;
+ case OpcUaType_ByteString: parseArraySimple(subtree, tvb, pinfo, &iOffset, "ByteString", "ByteString", hf_opcua_ByteString, parseByteString, ett_opcua_array_ByteString); break;
+ case OpcUaType_XmlElement: parseArraySimple(subtree, tvb, pinfo, &iOffset, "XmlElement", "XmlElement", hf_opcua_XmlElement, parseXmlElement, ett_opcua_array_XmlElement); break;
+ case OpcUaType_NodeId: parseArrayComplex(subtree, tvb, pinfo, &iOffset, "NodeId", "NodeId", parseNodeId, ett_opcua_array_NodeId); break;
+ case OpcUaType_ExpandedNodeId: parseArrayComplex(subtree, tvb, pinfo, &iOffset, "ExpandedNodeId", "ExpandedNodeId", parseExpandedNodeId, ett_opcua_array_ExpandedNodeId); break;
+ case OpcUaType_StatusCode: parseArraySimple(subtree, tvb, pinfo, &iOffset, "StatusCode", "StatusCode", hf_opcua_StatusCode, parseStatusCode, ett_opcua_array_StatusCode); break;
+ case OpcUaType_DiagnosticInfo: parseArrayComplex(subtree, tvb, pinfo, &iOffset, "DiagnosticInfo", "DiagnosticInfo", parseDiagnosticInfo, ett_opcua_array_DiagnosticInfo); break;
+ case OpcUaType_QualifiedName: parseArrayComplex(subtree, tvb, pinfo, &iOffset, "QualifiedName", "QualifiedName", parseQualifiedName, ett_opcua_array_QualifiedName); break;
+ case OpcUaType_LocalizedText: parseArrayComplex(subtree, tvb, pinfo, &iOffset, "LocalizedText", "LocalizedText", parseLocalizedText, ett_opcua_array_LocalizedText); break;
+ case OpcUaType_ExtensionObject: parseArrayComplex(subtree, tvb, pinfo, &iOffset, "ExtensionObject", "ExtensionObject", parseExtensionObject, ett_opcua_array_ExtensionObject); break;
+ case OpcUaType_DataValue: parseArrayComplex(subtree, tvb, pinfo, &iOffset, "DataValue", "DataValue", parseDataValue, ett_opcua_array_DataValue); break;
+ case OpcUaType_Variant: parseArrayComplex(subtree, tvb, pinfo, &iOffset, "Variant", "Variant", parseVariant, ett_opcua_array_Variant); break;
+ }
+
+ if (EncodingMask & VARIANT_ARRAYDIMENSIONS)
+ {
+ proto_item *ti_2;
+ proto_tree *subtree_2 = proto_tree_add_subtree(subtree, tvb, iOffset, -1,
+ ett_opcua_variant_arraydims, &ti_2, "ArrayDimensions");
+ int i;
+
+ /* read array length */
+ ArrayDimensions = tvb_get_letohl(tvb, iOffset);
+ proto_tree_add_item(subtree_2, hf_opcua_ArraySize, tvb, iOffset, 4, ENC_LITTLE_ENDIAN);
+
+ if (ArrayDimensions > MAX_ARRAY_LEN)
+ {
+ proto_tree_add_expert_format(subtree_2, pinfo, &ei_array_length, tvb, iOffset, 4, "ArrayDimensions length %d too large to process", ArrayDimensions);
+ return;
+ }
+
+ iOffset += 4;
+ for (i=0; i<ArrayDimensions; i++)
+ {
+ parseInt32(subtree_2, tvb, pinfo, &iOffset, hf_opcua_Int32);
+ }
+ proto_item_set_end(ti_2, tvb, iOffset);
+ }
+ }
+ else
+ {
+ /* type is encoded in bits 0-5 */
+ switch(EncodingMask & 0x3f)
+ {
+ case OpcUaType_Null: break;
+ case OpcUaType_Boolean: parseBoolean(subtree, tvb, pinfo, &iOffset, hf_opcua_Boolean); break;
+ case OpcUaType_SByte: parseSByte(subtree, tvb, pinfo, &iOffset, hf_opcua_SByte); break;
+ case OpcUaType_Byte: parseByte(subtree, tvb, pinfo, &iOffset, hf_opcua_Byte); break;
+ case OpcUaType_Int16: parseInt16(subtree, tvb, pinfo, &iOffset, hf_opcua_Int16); break;
+ case OpcUaType_UInt16: parseUInt16(subtree, tvb, pinfo, &iOffset, hf_opcua_UInt16); break;
+ case OpcUaType_Int32: parseInt32(subtree, tvb, pinfo, &iOffset, hf_opcua_Int32); break;
+ case OpcUaType_UInt32: parseUInt32(subtree, tvb, pinfo, &iOffset, hf_opcua_UInt32); break;
+ case OpcUaType_Int64: parseInt64(subtree, tvb, pinfo, &iOffset, hf_opcua_Int64); break;
+ case OpcUaType_UInt64: parseUInt64(subtree, tvb, pinfo, &iOffset, hf_opcua_UInt64); break;
+ case OpcUaType_Float: parseFloat(subtree, tvb, pinfo, &iOffset, hf_opcua_Float); break;
+ case OpcUaType_Double: parseDouble(subtree, tvb, pinfo, &iOffset, hf_opcua_Double); break;
+ case OpcUaType_String: parseString(subtree, tvb, pinfo, &iOffset, hf_opcua_String); break;
+ case OpcUaType_DateTime: parseDateTime(subtree, tvb, pinfo, &iOffset, hf_opcua_DateTime); break;
+ case OpcUaType_Guid: parseGuid(subtree, tvb, pinfo, &iOffset, hf_opcua_Guid); break;
+ case OpcUaType_ByteString: parseByteString(subtree, tvb, pinfo, &iOffset, hf_opcua_ByteString); break;
+ case OpcUaType_XmlElement: parseXmlElement(subtree, tvb, pinfo, &iOffset, hf_opcua_XmlElement); break;
+ case OpcUaType_NodeId: parseNodeId(subtree, tvb, pinfo, &iOffset, "Value"); break;
+ case OpcUaType_ExpandedNodeId: parseExpandedNodeId(subtree, tvb, pinfo, &iOffset, "Value"); break;
+ case OpcUaType_StatusCode: parseStatusCode(subtree, tvb, pinfo, &iOffset, hf_opcua_StatusCode); break;
+ case OpcUaType_DiagnosticInfo: parseDiagnosticInfo(subtree, tvb, pinfo, &iOffset, "Value"); break;
+ case OpcUaType_QualifiedName: parseQualifiedName(subtree, tvb, pinfo, &iOffset, "Value"); break;
+ case OpcUaType_LocalizedText: parseLocalizedText(subtree, tvb, pinfo, &iOffset, "Value"); break;
+ case OpcUaType_ExtensionObject: parseExtensionObject(subtree, tvb, pinfo, &iOffset, "Value"); break;
+ case OpcUaType_DataValue: parseDataValue(subtree, tvb, pinfo, &iOffset, "Value"); break;
+ case OpcUaType_Variant: parseVariant(subtree, tvb, pinfo, &iOffset, "Value"); break;
+ }
+ }
+
+ proto_item_set_end(ti, tvb, iOffset);
+ *pOffset = iOffset;
+
+ opcua_nested_count--;
+ p_add_proto_data(pinfo->pool, pinfo, proto_opcua, 0, GUINT_TO_POINTER(opcua_nested_count));
+}
+
+/** General parsing function for arrays of simple types.
+ * All arrays have one 4 byte signed integer length information,
+ * followed by n data elements.
+ */
+void parseArraySimple(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName, const char *szTypeName, int hfIndex, fctSimpleTypeParser pParserFunction, const gint idx)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, idx, &ti, "%s: Array of %s", szFieldName, szTypeName);
+ int i;
+ gint32 iLen;
+
+ /* read array length */
+ iLen = tvb_get_letohl(tvb, *pOffset);
+ proto_tree_add_item(subtree, hf_opcua_ArraySize, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN);
+
+ if (iLen > MAX_ARRAY_LEN)
+ {
+ proto_tree_add_expert_format(subtree, pinfo, &ei_array_length, tvb, *pOffset, 4, "Array length %d too large to process", iLen);
+ return;
+ }
+
+ *pOffset += 4;
+ for (i=0; i<iLen; i++)
+ {
+ proto_item *arrayItem = (*pParserFunction)(subtree, tvb, pinfo, pOffset, hfIndex);
+ if (arrayItem != NULL)
+ {
+ proto_item_prepend_text(arrayItem, "[%i]: ", i);
+ }
+ }
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+
+/** General parsing function for arrays of enums.
+ * All arrays have one 4 byte signed integer length information,
+ * followed by n data elements.
+ */
+void parseArrayEnum(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName, const char *szTypeName, fctEnumParser pParserFunction, const gint idx)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, idx, &ti, "%s: Array of %s", szFieldName, szTypeName);
+ int i;
+ gint32 iLen;
+
+ /* read array length */
+ iLen = tvb_get_letohl(tvb, *pOffset);
+ proto_tree_add_item(subtree, hf_opcua_ArraySize, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN);
+
+ if (iLen > MAX_ARRAY_LEN)
+ {
+ proto_tree_add_expert_format(subtree, pinfo, &ei_array_length, tvb, *pOffset, 4, "Array length %d too large to process", iLen);
+ return;
+ }
+
+ *pOffset += 4;
+ for (i=0; i<iLen; i++)
+ {
+ (*pParserFunction)(subtree, tvb, pinfo, pOffset);
+ }
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+
+/** General parsing function for arrays of complex types.
+ * All arrays have one 4 byte signed integer length information,
+ * followed by n data elements.
+ */
+void parseArrayComplex(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName, const char *szTypeName, fctComplexTypeParser pParserFunction, const gint idx)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, idx, &ti, "%s: Array of %s", szFieldName, szTypeName);
+ int i;
+ gint32 iLen;
+
+ /* read array length */
+ iLen = tvb_get_letohl(tvb, *pOffset);
+ proto_tree_add_item(subtree, hf_opcua_ArraySize, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN);
+
+ if (iLen > MAX_ARRAY_LEN)
+ {
+ proto_tree_add_expert_format(subtree, pinfo, &ei_array_length, tvb, *pOffset, 4, "Array length %d too large to process", iLen);
+ return;
+ }
+
+ *pOffset += 4;
+ for (i=0; i<iLen; i++)
+ {
+ char szNum[20];
+ snprintf(szNum, 20, "[%i]", i);
+ (*pParserFunction)(subtree, tvb, pinfo, pOffset, szNum);
+ }
+ proto_item_set_end(ti, tvb, *pOffset);
+}
+
+void parseNodeId(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_nodeid, &ti, "%s: NodeId", szFieldName);
+ gint iOffset = *pOffset;
+ guint8 EncodingMask;
+
+ EncodingMask = tvb_get_guint8(tvb, iOffset);
+ proto_tree_add_item(subtree, hf_opcua_nodeid_encodingmask, tvb, iOffset, 1, ENC_LITTLE_ENDIAN);
+ iOffset++;
+
+ switch(EncodingMask)
+ {
+ case 0x00: /* two byte node id */
+ proto_tree_add_item(subtree, hf_opcua_nodeid_numeric, tvb, iOffset, 1, ENC_LITTLE_ENDIAN);
+ iOffset+=1;
+ break;
+ case 0x01: /* four byte node id */
+ proto_tree_add_item(subtree, hf_opcua_nodeid_nsindex, tvb, iOffset, 1, ENC_LITTLE_ENDIAN);
+ iOffset+=1;
+ proto_tree_add_item(subtree, hf_opcua_nodeid_numeric, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ iOffset+=2;
+ break;
+ case 0x02: /* numeric, that does not fit into four bytes */
+ proto_tree_add_item(subtree, hf_opcua_nodeid_nsindex, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ iOffset+=2;
+ proto_tree_add_item(subtree, hf_opcua_nodeid_numeric, tvb, iOffset, 4, ENC_LITTLE_ENDIAN);
+ iOffset+=4;
+ break;
+ case 0x03: /* string */
+ proto_tree_add_item(subtree, hf_opcua_nodeid_nsindex, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ iOffset+=2;
+ parseString(subtree, tvb, pinfo, &iOffset, hf_opcua_nodeid_string);
+ break;
+ case 0x04: /* guid */
+ proto_tree_add_item(subtree, hf_opcua_nodeid_nsindex, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ iOffset+=2;
+ parseGuid(subtree, tvb, pinfo, &iOffset, hf_opcua_nodeid_guid);
+ break;
+ case 0x05: /* byte string */
+ proto_tree_add_item(subtree, hf_opcua_nodeid_nsindex, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ iOffset+=2;
+ parseByteString(subtree, tvb, pinfo, &iOffset, hf_opcua_nodeid_bytestring);
+ break;
+ };
+
+ proto_item_set_end(ti, tvb, iOffset);
+ *pOffset = iOffset;
+}
+
+void parseExtensionObject(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ static int * const extobj_mask[] = {&hf_opcua_extobj_mask_binbodyflag,
+ &hf_opcua_extobj_mask_xmlbodyflag,
+ NULL};
+
+ gint iOffset = *pOffset;
+ guint8 EncodingMask;
+ guint32 TypeId;
+ proto_tree *extobj_tree;
+ proto_item *ti;
+ guint opcua_nested_count;
+
+ /* add extension object subtree */
+ extobj_tree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1, ett_opcua_extensionobject, &ti, "%s: ExtensionObject", szFieldName);
+
+ /* prevent a too high nesting depth */
+ opcua_nested_count = GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_opcua, 0));
+ if (opcua_nested_count >= MAX_NESTING_DEPTH)
+ {
+ expert_add_info(pinfo, ti, &ei_nesting_depth);
+ return;
+ }
+ opcua_nested_count++;
+ p_add_proto_data(pinfo->pool, pinfo, proto_opcua, 0, GUINT_TO_POINTER(opcua_nested_count));
+
+ /* add nodeid subtree */
+ TypeId = getExtensionObjectType(tvb, &iOffset);
+ parseNodeId(extobj_tree, tvb, pinfo, &iOffset, "TypeId");
+
+ /* parse encoding mask */
+ EncodingMask = tvb_get_guint8(tvb, iOffset);
+ proto_tree_add_bitmask(extobj_tree, tvb, iOffset, hf_opcua_extobj_mask, ett_opcua_extensionobject_encodingmask, extobj_mask, ENC_LITTLE_ENDIAN);
+ iOffset++;
+
+ if (EncodingMask & EXTOBJ_ENCODINGMASK_BINBODY_FLAG) /* has binary body ? */
+ {
+ dispatchExtensionObjectType(extobj_tree, tvb, pinfo, &iOffset, TypeId);
+ }
+
+ proto_item_set_end(ti, tvb, iOffset);
+ *pOffset = iOffset;
+
+ opcua_nested_count--;
+ p_add_proto_data(pinfo->pool, pinfo, proto_opcua, 0, GUINT_TO_POINTER(opcua_nested_count));
+}
+
+void parseExpandedNodeId(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName)
+{
+ static int * const expandednodeid_mask[] = {&hf_opcua_nodeid_encodingmask,
+ &hf_opcua_expandednodeid_mask_serverindex,
+ &hf_opcua_expandednodeid_mask_namespaceuri,
+ NULL};
+
+ proto_item *ti;
+ proto_tree *subtree = proto_tree_add_subtree_format(tree, tvb, *pOffset, -1,
+ ett_opcua_expandednodeid, &ti, "%s: ExpandedNodeId", szFieldName);
+ gint iOffset = *pOffset;
+ guint8 EncodingMask;
+
+ EncodingMask = tvb_get_guint8(tvb, iOffset);
+ proto_tree_add_bitmask(subtree, tvb, iOffset, hf_opcua_expandednodeid_mask, ett_opcua_expandednodeid_encodingmask, expandednodeid_mask, ENC_LITTLE_ENDIAN);
+ iOffset++;
+
+ switch(EncodingMask & 0x0F)
+ {
+ case 0x00: /* two byte node id */
+ proto_tree_add_item(subtree, hf_opcua_nodeid_numeric, tvb, iOffset, 1, ENC_LITTLE_ENDIAN);
+ iOffset+=1;
+ break;
+ case 0x01: /* four byte node id */
+ proto_tree_add_item(subtree, hf_opcua_nodeid_nsindex, tvb, iOffset, 1, ENC_LITTLE_ENDIAN);
+ iOffset+=1;
+ proto_tree_add_item(subtree, hf_opcua_nodeid_numeric, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ iOffset+=2;
+ break;
+ case 0x02: /* numeric, that does not fit into four bytes */
+ proto_tree_add_item(subtree, hf_opcua_nodeid_nsindex, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ iOffset+=2;
+ proto_tree_add_item(subtree, hf_opcua_nodeid_numeric, tvb, iOffset, 4, ENC_LITTLE_ENDIAN);
+ iOffset+=4;
+ break;
+ case 0x03: /* string */
+ proto_tree_add_item(subtree, hf_opcua_nodeid_nsindex, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ iOffset+=2;
+ parseString(subtree, tvb, pinfo, &iOffset, hf_opcua_nodeid_string);
+ break;
+ case 0x04: /* guid */
+ proto_tree_add_item(subtree, hf_opcua_nodeid_nsindex, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ iOffset+=2;
+ parseGuid(subtree, tvb, pinfo, &iOffset, hf_opcua_nodeid_guid);
+ break;
+ case 0x05: /* byte string */
+ proto_tree_add_item(subtree, hf_opcua_nodeid_nsindex, tvb, iOffset, 2, ENC_LITTLE_ENDIAN);
+ iOffset+=2;
+ parseByteString(subtree, tvb, pinfo, &iOffset, hf_opcua_nodeid_bytestring);
+ break;
+ };
+
+ if (EncodingMask & NODEID_NAMESPACEURIFLAG)
+ {
+ parseString(subtree, tvb, pinfo, &iOffset, hf_opcua_NamespaceUri);
+ }
+ if (EncodingMask & NODEID_SERVERINDEXFLAG)
+ {
+ parseUInt32(subtree, tvb, pinfo, &iOffset, hf_opcua_ServerIndex);
+ }
+
+ proto_item_set_end(ti, tvb, iOffset);
+ *pOffset = iOffset;
+}
+
+guint32 getExtensionObjectType(tvbuff_t *tvb, gint *pOffset)
+{
+ gint iOffset = *pOffset;
+ guint8 EncodingMask;
+ guint32 Numeric = 0;
+
+ EncodingMask = tvb_get_guint8(tvb, iOffset);
+ iOffset++;
+
+ switch(EncodingMask)
+ {
+ case 0x00: /* two byte node id */
+ Numeric = tvb_get_guint8(tvb, iOffset);
+ /*iOffset+=1;*/
+ break;
+ case 0x01: /* four byte node id */
+ iOffset+=1;
+ Numeric = tvb_get_letohs(tvb, iOffset);
+ break;
+ case 0x02: /* numeric, that does not fit into four bytes */
+ iOffset+=2;
+ Numeric = tvb_get_letohl(tvb, iOffset);
+ break;
+ case 0x03: /* string */
+ case 0x04: /* uri */
+ case 0x05: /* guid */
+ case 0x06: /* byte string */
+ /* NOT USED */
+ break;
+ };
+
+ return Numeric;
+}
+
+void parseNodeClassMask(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ static int * const nodeclass_mask[] = {
+ &hf_opcua_nodeClassMask_object,
+ &hf_opcua_nodeClassMask_variable,
+ &hf_opcua_nodeClassMask_method,
+ &hf_opcua_nodeClassMask_objecttype,
+ &hf_opcua_nodeClassMask_variabletype,
+ &hf_opcua_nodeClassMask_referencetype,
+ &hf_opcua_nodeClassMask_datatype,
+ &hf_opcua_nodeClassMask_view,
+ NULL};
+
+ guint8 NodeClassMask = tvb_get_guint8(tvb, *pOffset);
+ if(NodeClassMask == NODECLASSMASK_ALL)
+ {
+ proto_tree_add_item(tree, hf_opcua_nodeClassMask_all, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN);
+ }
+ else
+ {
+ proto_tree_add_bitmask(tree, tvb, *pOffset, hf_opcua_nodeClassMask, ett_opcua_nodeClassMask, nodeclass_mask, ENC_LITTLE_ENDIAN);
+ }
+ *pOffset+=4;
+}
+
+void parseResultMask(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ static int * const browseresult_mask[] = {
+ &hf_opcua_resultMask_referencetype,
+ &hf_opcua_resultMask_isforward,
+ &hf_opcua_resultMask_nodeclass,
+ &hf_opcua_resultMask_browsename,
+ &hf_opcua_resultMask_displayname,
+ &hf_opcua_resultMask_typedefinition,
+ NULL};
+
+ guint8 ResultMask = tvb_get_guint8(tvb, *pOffset);
+ if(ResultMask == RESULTMASK_ALL)
+ {
+ proto_tree_add_item(tree, hf_opcua_resultMask_all, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN);
+ }
+ else
+ {
+ proto_tree_add_bitmask(tree, tvb, *pOffset, hf_opcua_resultMask, ett_opcua_resultMask, browseresult_mask, ENC_LITTLE_ENDIAN);
+ }
+ *pOffset+=4;
+}
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
diff --git a/plugins/epan/opcua/opcua_simpletypes.h b/plugins/epan/opcua/opcua_simpletypes.h
new file mode 100644
index 00000000..9d88983b
--- /dev/null
+++ b/plugins/epan/opcua/opcua_simpletypes.h
@@ -0,0 +1,105 @@
+/******************************************************************************
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: Implementation of OpcUa built-in type parsers.
+** This contains all the simple types and some complex types.
+**
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>
+******************************************************************************/
+#include "opcua_identifiers.h"
+
+/* simple header fields */
+extern int hf_opcua_returnDiag;
+extern int hf_opcua_returnDiag_mask_sl_symbolicId;
+extern int hf_opcua_returnDiag_mask_sl_localizedText;
+extern int hf_opcua_returnDiag_mask_sl_additionalinfo;
+extern int hf_opcua_returnDiag_mask_sl_innerstatuscode;
+extern int hf_opcua_returnDiag_mask_sl_innerdiagnostics;
+extern int hf_opcua_returnDiag_mask_ol_symbolicId;
+extern int hf_opcua_returnDiag_mask_ol_localizedText;
+extern int hf_opcua_returnDiag_mask_ol_additionalinfo;
+extern int hf_opcua_returnDiag_mask_ol_innerstatuscode;
+extern int hf_opcua_returnDiag_mask_ol_innerdiagnostics;
+extern int hf_opcua_nodeClassMask;
+extern int hf_opcua_nodeClassMask_object;
+extern int hf_opcua_nodeClassMask_variable;
+extern int hf_opcua_nodeClassMask_method;
+extern int hf_opcua_nodeClassMask_objecttype;
+extern int hf_opcua_nodeClassMask_variabletype;
+extern int hf_opcua_nodeClassMask_referencetype;
+extern int hf_opcua_nodeClassMask_datatype;
+extern int hf_opcua_nodeClassMask_view;
+
+/* simple types trees */
+extern gint ett_opcua_array_Boolean;
+extern gint ett_opcua_array_SByte;
+extern gint ett_opcua_array_Byte;
+extern gint ett_opcua_array_Int16;
+extern gint ett_opcua_array_UInt16;
+extern gint ett_opcua_array_Int32;
+extern gint ett_opcua_array_UInt32;
+extern gint ett_opcua_array_Int64;
+extern gint ett_opcua_array_UInt64;
+extern gint ett_opcua_array_Float;
+extern gint ett_opcua_array_Double;
+extern gint ett_opcua_array_String;
+extern gint ett_opcua_array_DateTime;
+extern gint ett_opcua_array_Guid;
+extern gint ett_opcua_array_ByteString;
+extern gint ett_opcua_array_XmlElement;
+extern gint ett_opcua_array_NodeId;
+extern gint ett_opcua_array_ExpandedNodeId;
+extern gint ett_opcua_array_StatusCode;
+extern gint ett_opcua_array_DiagnosticInfo;
+extern gint ett_opcua_array_QualifiedName;
+extern gint ett_opcua_array_LocalizedText;
+extern gint ett_opcua_array_ExtensionObject;
+extern gint ett_opcua_array_DataValue;
+extern gint ett_opcua_array_Variant;
+extern gint ett_opcua_returnDiagnostics;
+
+/* simple types */
+proto_item* parseBoolean(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+proto_item* parseByte(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+proto_item* parseSByte(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+proto_item* parseUInt16(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+proto_item* parseInt16(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+proto_item* parseUInt32(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+proto_item* parseInt32(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+proto_item* parseUInt64(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+proto_item* parseInt64(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+proto_item* parseString(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+proto_item* parseGuid(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+proto_item* parseByteString(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+proto_item* parseXmlElement(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+proto_item* parseFloat(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+proto_item* parseDouble(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+proto_item* parseDateTime(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+proto_item* parseStatusCode(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int hfIndex);
+/* complex types */
+void parseLocalizedText(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseNodeId(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseDiagnosticInfo(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseExtensionObject(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseQualifiedName(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseDataValue(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseVariant(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseExpandedNodeId(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName);
+void parseArraySimple(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName, const char *szTypeName, int hfIndex, fctSimpleTypeParser pParserFunction, const gint idx);
+void parseArrayEnum(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName, const char *szTypeName, fctEnumParser pParserFunction, const gint idx);
+void parseArrayComplex(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, const char *szFieldName, const char *szTypeName, fctComplexTypeParser pParserFunction, const gint idx);
+void registerSimpleTypes(int proto);
+guint32 getExtensionObjectType(tvbuff_t *tvb, gint *pOffset);
+void parseNodeClassMask(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void parseResultMask(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+
+void dispatchExtensionObjectType(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset, int TypeId);
+
diff --git a/plugins/epan/opcua/opcua_statuscode.c b/plugins/epan/opcua/opcua_statuscode.c
new file mode 100644
index 00000000..78447d77
--- /dev/null
+++ b/plugins/epan/opcua/opcua_statuscode.c
@@ -0,0 +1,267 @@
+/******************************************************************************
+** Copyright (C) 2014 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Author: Hannes Mezger <hannes.mezger@ascolab.com>
+**
+** This file was autogenerated on 10.06.2014.
+** DON'T MODIFY THIS FILE!
+**
+******************************************************************************/
+
+#include "config.h"
+
+#include <epan/value_string.h>
+
+const value_string g_statusCodes[] = {
+ {0x00000000, "Good"},
+ {0x40000000, "Uncertain"},
+ {0x80000000, "Bad"},
+ {0x80010000, "BadUnexpectedError"},
+ {0x80020000, "BadInternalError"},
+ {0x80030000, "BadOutOfMemory"},
+ {0x80040000, "BadResourceUnavailable"},
+ {0x80050000, "BadCommunicationError"},
+ {0x80060000, "BadEncodingError"},
+ {0x80070000, "BadDecodingError"},
+ {0x80080000, "BadEncodingLimitsExceeded"},
+ {0x80B80000, "BadRequestTooLarge"},
+ {0x80B90000, "BadResponseTooLarge"},
+ {0x80090000, "BadUnknownResponse"},
+ {0x800A0000, "BadTimeout"},
+ {0x800B0000, "BadServiceUnsupported"},
+ {0x800C0000, "BadShutdown"},
+ {0x800D0000, "BadServerNotConnected"},
+ {0x800E0000, "BadServerHalted"},
+ {0x800F0000, "BadNothingToDo"},
+ {0x80100000, "BadTooManyOperations"},
+ {0x80DB0000, "BadTooManyMonitoredItems"},
+ {0x80110000, "BadDataTypeIdUnknown"},
+ {0x80120000, "BadCertificateInvalid"},
+ {0x80130000, "BadSecurityChecksFailed"},
+ {0x80140000, "BadCertificateTimeInvalid"},
+ {0x80150000, "BadCertificateIssuerTimeInvalid"},
+ {0x80160000, "BadCertificateHostNameInvalid"},
+ {0x80170000, "BadCertificateUriInvalid"},
+ {0x80180000, "BadCertificateUseNotAllowed"},
+ {0x80190000, "BadCertificateIssuerUseNotAllowed"},
+ {0x801A0000, "BadCertificateUntrusted"},
+ {0x801B0000, "BadCertificateRevocationUnknown"},
+ {0x801C0000, "BadCertificateIssuerRevocationUnknown"},
+ {0x801D0000, "BadCertificateRevoked"},
+ {0x801E0000, "BadCertificateIssuerRevoked"},
+ {0x810D0000, "BadCertificateChainIncomplete"},
+ {0x801F0000, "BadUserAccessDenied"},
+ {0x80200000, "BadIdentityTokenInvalid"},
+ {0x80210000, "BadIdentityTokenRejected"},
+ {0x80220000, "BadSecureChannelIdInvalid"},
+ {0x80230000, "BadInvalidTimestamp"},
+ {0x80240000, "BadNonceInvalid"},
+ {0x80250000, "BadSessionIdInvalid"},
+ {0x80260000, "BadSessionClosed"},
+ {0x80270000, "BadSessionNotActivated"},
+ {0x80280000, "BadSubscriptionIdInvalid"},
+ {0x802A0000, "BadRequestHeaderInvalid"},
+ {0x802B0000, "BadTimestampsToReturnInvalid"},
+ {0x802C0000, "BadRequestCancelledByClient"},
+ {0x80E50000, "BadTooManyArguments"},
+ {0x002D0000, "GoodSubscriptionTransferred"},
+ {0x002E0000, "GoodCompletesAsynchronously"},
+ {0x002F0000, "GoodOverload"},
+ {0x00300000, "GoodClamped"},
+ {0x80310000, "BadNoCommunication"},
+ {0x80320000, "BadWaitingForInitialData"},
+ {0x80330000, "BadNodeIdInvalid"},
+ {0x80340000, "BadNodeIdUnknown"},
+ {0x80350000, "BadAttributeIdInvalid"},
+ {0x80360000, "BadIndexRangeInvalid"},
+ {0x80370000, "BadIndexRangeNoData"},
+ {0x80380000, "BadDataEncodingInvalid"},
+ {0x80390000, "BadDataEncodingUnsupported"},
+ {0x803A0000, "BadNotReadable"},
+ {0x803B0000, "BadNotWritable"},
+ {0x803C0000, "BadOutOfRange"},
+ {0x803D0000, "BadNotSupported"},
+ {0x803E0000, "BadNotFound"},
+ {0x803F0000, "BadObjectDeleted"},
+ {0x80400000, "BadNotImplemented"},
+ {0x80410000, "BadMonitoringModeInvalid"},
+ {0x80420000, "BadMonitoredItemIdInvalid"},
+ {0x80430000, "BadMonitoredItemFilterInvalid"},
+ {0x80440000, "BadMonitoredItemFilterUnsupported"},
+ {0x80450000, "BadFilterNotAllowed"},
+ {0x80460000, "BadStructureMissing"},
+ {0x80470000, "BadEventFilterInvalid"},
+ {0x80480000, "BadContentFilterInvalid"},
+ {0x80C10000, "BadFilterOperatorInvalid"},
+ {0x80C20000, "BadFilterOperatorUnsupported"},
+ {0x80C30000, "BadFilterOperandCountMismatch"},
+ {0x80490000, "BadFilterOperandInvalid"},
+ {0x80C40000, "BadFilterElementInvalid"},
+ {0x80C50000, "BadFilterLiteralInvalid"},
+ {0x804A0000, "BadContinuationPointInvalid"},
+ {0x804B0000, "BadNoContinuationPoints"},
+ {0x804C0000, "BadReferenceTypeIdInvalid"},
+ {0x804D0000, "BadBrowseDirectionInvalid"},
+ {0x804E0000, "BadNodeNotInView"},
+ {0x804F0000, "BadServerUriInvalid"},
+ {0x80500000, "BadServerNameMissing"},
+ {0x80510000, "BadDiscoveryUrlMissing"},
+ {0x80520000, "BadSemaphoreFileMissing"},
+ {0x80530000, "BadRequestTypeInvalid"},
+ {0x80540000, "BadSecurityModeRejected"},
+ {0x80550000, "BadSecurityPolicyRejected"},
+ {0x80560000, "BadTooManySessions"},
+ {0x80570000, "BadUserSignatureInvalid"},
+ {0x80580000, "BadApplicationSignatureInvalid"},
+ {0x80590000, "BadNoValidCertificates"},
+ {0x80C60000, "BadIdentityChangeNotSupported"},
+ {0x805A0000, "BadRequestCancelledByRequest"},
+ {0x805B0000, "BadParentNodeIdInvalid"},
+ {0x805C0000, "BadReferenceNotAllowed"},
+ {0x805D0000, "BadNodeIdRejected"},
+ {0x805E0000, "BadNodeIdExists"},
+ {0x805F0000, "BadNodeClassInvalid"},
+ {0x80600000, "BadBrowseNameInvalid"},
+ {0x80610000, "BadBrowseNameDuplicated"},
+ {0x80620000, "BadNodeAttributesInvalid"},
+ {0x80630000, "BadTypeDefinitionInvalid"},
+ {0x80640000, "BadSourceNodeIdInvalid"},
+ {0x80650000, "BadTargetNodeIdInvalid"},
+ {0x80660000, "BadDuplicateReferenceNotAllowed"},
+ {0x80670000, "BadInvalidSelfReference"},
+ {0x80680000, "BadReferenceLocalOnly"},
+ {0x80690000, "BadNoDeleteRights"},
+ {0x40BC0000, "UncertainReferenceNotDeleted"},
+ {0x806A0000, "BadServerIndexInvalid"},
+ {0x806B0000, "BadViewIdUnknown"},
+ {0x80C90000, "BadViewTimestampInvalid"},
+ {0x80CA0000, "BadViewParameterMismatch"},
+ {0x80CB0000, "BadViewVersionInvalid"},
+ {0x40C00000, "UncertainNotAllNodesAvailable"},
+ {0x00BA0000, "GoodResultsMayBeIncomplete"},
+ {0x80C80000, "BadNotTypeDefinition"},
+ {0x406C0000, "UncertainReferenceOutOfServer"},
+ {0x806D0000, "BadTooManyMatches"},
+ {0x806E0000, "BadQueryTooComplex"},
+ {0x806F0000, "BadNoMatch"},
+ {0x80700000, "BadMaxAgeInvalid"},
+ {0x80E60000, "BadSecurityModeInsufficient"},
+ {0x80710000, "BadHistoryOperationInvalid"},
+ {0x80720000, "BadHistoryOperationUnsupported"},
+ {0x80BD0000, "BadInvalidTimestampArgument"},
+ {0x80730000, "BadWriteNotSupported"},
+ {0x80740000, "BadTypeMismatch"},
+ {0x80750000, "BadMethodInvalid"},
+ {0x80760000, "BadArgumentsMissing"},
+ {0x80770000, "BadTooManySubscriptions"},
+ {0x80780000, "BadTooManyPublishRequests"},
+ {0x80790000, "BadNoSubscription"},
+ {0x807A0000, "BadSequenceNumberUnknown"},
+ {0x807B0000, "BadMessageNotAvailable"},
+ {0x807C0000, "BadInsufficientClientProfile"},
+ {0x80BF0000, "BadStateNotActive"},
+ {0x807D0000, "BadTcpServerTooBusy"},
+ {0x807E0000, "BadTcpMessageTypeInvalid"},
+ {0x807F0000, "BadTcpSecureChannelUnknown"},
+ {0x80800000, "BadTcpMessageTooLarge"},
+ {0x80810000, "BadTcpNotEnoughResources"},
+ {0x80820000, "BadTcpInternalError"},
+ {0x80830000, "BadTcpEndpointUrlInvalid"},
+ {0x80840000, "BadRequestInterrupted"},
+ {0x80850000, "BadRequestTimeout"},
+ {0x80860000, "BadSecureChannelClosed"},
+ {0x80870000, "BadSecureChannelTokenUnknown"},
+ {0x80880000, "BadSequenceNumberInvalid"},
+ {0x80BE0000, "BadProtocolVersionUnsupported"},
+ {0x80890000, "BadConfigurationError"},
+ {0x808A0000, "BadNotConnected"},
+ {0x808B0000, "BadDeviceFailure"},
+ {0x808C0000, "BadSensorFailure"},
+ {0x808D0000, "BadOutOfService"},
+ {0x808E0000, "BadDeadbandFilterInvalid"},
+ {0x408F0000, "UncertainNoCommunicationLastUsableValue"},
+ {0x40900000, "UncertainLastUsableValue"},
+ {0x40910000, "UncertainSubstituteValue"},
+ {0x40920000, "UncertainInitialValue"},
+ {0x40930000, "UncertainSensorNotAccurate"},
+ {0x40940000, "UncertainEngineeringUnitsExceeded"},
+ {0x40950000, "UncertainSubNormal"},
+ {0x00960000, "GoodLocalOverride"},
+ {0x80970000, "BadRefreshInProgress"},
+ {0x80980000, "BadConditionAlreadyDisabled"},
+ {0x80CC0000, "BadConditionAlreadyEnabled"},
+ {0x80990000, "BadConditionDisabled"},
+ {0x809A0000, "BadEventIdUnknown"},
+ {0x80BB0000, "BadEventNotAcknowledgeable"},
+ {0x80CD0000, "BadDialogNotActive"},
+ {0x80CE0000, "BadDialogResponseInvalid"},
+ {0x80CF0000, "BadConditionBranchAlreadyAcked"},
+ {0x80D00000, "BadConditionBranchAlreadyConfirmed"},
+ {0x80D10000, "BadConditionAlreadyShelved"},
+ {0x80D20000, "BadConditionNotShelved"},
+ {0x80D30000, "BadShelvingTimeOutOfRange"},
+ {0x809B0000, "BadNoData"},
+ {0x80D70000, "BadBoundNotFound"},
+ {0x80D80000, "BadBoundNotSupported"},
+ {0x809D0000, "BadDataLost"},
+ {0x809E0000, "BadDataUnavailable"},
+ {0x809F0000, "BadEntryExists"},
+ {0x80A00000, "BadNoEntryExists"},
+ {0x80A10000, "BadTimestampNotSupported"},
+ {0x00A20000, "GoodEntryInserted"},
+ {0x00A30000, "GoodEntryReplaced"},
+ {0x40A40000, "UncertainDataSubNormal"},
+ {0x00A50000, "GoodNoData"},
+ {0x00A60000, "GoodMoreData"},
+ {0x80D40000, "BadAggregateListMismatch"},
+ {0x80D50000, "BadAggregateNotSupported"},
+ {0x80D60000, "BadAggregateInvalidInputs"},
+ {0x80DA0000, "BadAggregateConfigurationRejected"},
+ {0x00D90000, "GoodDataIgnored"},
+ {0x80E40000, "BadRequestNotAllowed"},
+ {0x00DC0000, "GoodEdited"},
+ {0x00DD0000, "GoodPostActionFailed"},
+ {0x40DE0000, "UncertainDominantValueChanged"},
+ {0x00E00000, "GoodDependentValueChanged"},
+ {0x80E10000, "BadDominantValueChanged"},
+ {0x40E20000, "UncertainDependentValueChanged"},
+ {0x80E30000, "BadDependentValueChanged"},
+ {0x00A70000, "GoodCommunicationEvent"},
+ {0x00A80000, "GoodShutdownEvent"},
+ {0x00A90000, "GoodCallAgain"},
+ {0x00AA0000, "GoodNonCriticalTimeout"},
+ {0x80AB0000, "BadInvalidArgument"},
+ {0x80AC0000, "BadConnectionRejected"},
+ {0x80AD0000, "BadDisconnect"},
+ {0x80AE0000, "BadConnectionClosed"},
+ {0x80AF0000, "BadInvalidState"},
+ {0x80B00000, "BadEndOfStream"},
+ {0x80B10000, "BadNoDataAvailable"},
+ {0x80B20000, "BadWaitingForResponse"},
+ {0x80B30000, "BadOperationAbandoned"},
+ {0x80B40000, "BadExpectedStreamToBlock"},
+ {0x80B50000, "BadWouldBlock"},
+ {0x80B60000, "BadSyntaxError"},
+ {0x80B70000, "BadMaxConnectionsReached"},
+ {0x81000000, "StartOfStackStatusCodes"},
+ {0x81010000, "BadSignatureInvalid"},
+ {0x81040000, "BadExtensibleParameterInvalid"},
+ {0x81050000, "BadExtensibleParameterUnsupported"},
+ {0x81060000, "BadHostUnknown"},
+ {0x81070000, "BadTooManyPosts"},
+ {0x81080000, "BadSecurityConfig"},
+ {0x81090000, "BadFileNotFound"},
+ {0x810A0000, "BadContinue"},
+ {0x810B0000, "BadHttpMethodNotAllowed"},
+ {0x810C0000, "BadFileExists"},
+ {0x810D0000, "BadCertificateChainIncomplete"},
+ {0, NULL}
+};
diff --git a/plugins/epan/opcua/opcua_statuscode.h b/plugins/epan/opcua/opcua_statuscode.h
new file mode 100644
index 00000000..a48c2666
--- /dev/null
+++ b/plugins/epan/opcua/opcua_statuscode.h
@@ -0,0 +1,16 @@
+/******************************************************************************
+** Copyright (C) 2014 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Author: Hannes Mezger <hannes.mezger@ascolab.com>
+**
+******************************************************************************/
+
+extern const value_string g_statusCodes[];
diff --git a/plugins/epan/opcua/opcua_transport_layer.c b/plugins/epan/opcua/opcua_transport_layer.c
new file mode 100644
index 00000000..31fdca3b
--- /dev/null
+++ b/plugins/epan/opcua/opcua_transport_layer.c
@@ -0,0 +1,245 @@
+/******************************************************************************
+** Copyright (C) 2006-2009 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: OpcUa Transport Layer Decoder.
+**
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>
+******************************************************************************/
+
+#include "config.h"
+
+#include <epan/packet.h>
+#include "opcua_security_layer.h"
+#include "opcua_application_layer.h"
+#include "opcua_simpletypes.h"
+#include "opcua_transport_layer.h"
+#include "opcua_servicetable.h"
+
+static int hf_opcua_transport_type = -1;
+static int hf_opcua_transport_chunk = -1;
+static int hf_opcua_transport_size = -1;
+static int hf_opcua_transport_ver = -1;
+static int hf_opcua_transport_scid = -1;
+static int hf_opcua_transport_rbs = -1;
+static int hf_opcua_transport_sbs = -1;
+static int hf_opcua_transport_mms = -1;
+static int hf_opcua_transport_mcc = -1;
+static int hf_opcua_transport_endpoint = -1;
+static int hf_opcua_transport_suri = -1;
+static int hf_opcua_transport_error = -1;
+static int hf_opcua_transport_reason = -1;
+static int hf_opcua_transport_spu = -1;
+static int hf_opcua_transport_scert = -1;
+static int hf_opcua_transport_rcthumb = -1;
+static int hf_opcua_transport_seq = -1;
+static int hf_opcua_transport_rqid = -1;
+
+/** subtree types */
+extern gint ett_opcua_nodeid;
+extern gint ett_opcua_extensionobject;
+
+/** Register transport layer types. */
+void registerTransportLayerTypes(int proto)
+{
+ static hf_register_info hf[] =
+ {
+ /* id full name abbreviation type display strings bitmask blurb HFILL */
+ {&hf_opcua_transport_type, {"Message Type", "opcua.transport.type", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_chunk, {"Chunk Type", "opcua.transport.chunk", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_size, {"Message Size", "opcua.transport.size", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_ver, {"Version", "opcua.transport.ver", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_scid, {"SecureChannelId", "opcua.transport.scid", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_rbs, {"ReceiveBufferSize", "opcua.transport.rbs", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_sbs, {"SendBufferSize", "opcua.transport.sbs", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_mms, {"MaxMessageSize", "opcua.transport.mms", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_mcc, {"MaxChunkCount", "opcua.transport.mcc", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_endpoint, {"EndpointUrl", "opcua.transport.endpoint", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_suri, {"ServerUri", "opcua.transport.suri", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_error, {"Error", "opcua.transport.error", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_reason, {"Reason", "opcua.transport.reason", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_spu, {"SecurityPolicyUri", "opcua.security.spu", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_scert, {"SenderCertificate", "opcua.security.scert", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_rcthumb, {"ReceiverCertificateThumbprint", "opcua.security.rcthumb", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_seq, {"SequenceNumber", "opcua.security.seq", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ {&hf_opcua_transport_rqid, {"RequestId", "opcua.security.rqid", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+ };
+
+ proto_register_field_array(proto, hf, array_length(hf));
+}
+
+/* Transport Layer: message parsers */
+int parseHello(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_transport_type, tvb, *pOffset, 3, ENC_ASCII|ENC_NA); *pOffset+=3;
+ proto_tree_add_item(tree, hf_opcua_transport_chunk, tvb, *pOffset, 1, ENC_ASCII|ENC_NA); *pOffset+=1;
+ proto_tree_add_item(tree, hf_opcua_transport_size, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ proto_tree_add_item(tree, hf_opcua_transport_ver, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ proto_tree_add_item(tree, hf_opcua_transport_rbs, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ proto_tree_add_item(tree, hf_opcua_transport_sbs, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ proto_tree_add_item(tree, hf_opcua_transport_mms, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ proto_tree_add_item(tree, hf_opcua_transport_mcc, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ parseString(tree, tvb, pinfo, pOffset, hf_opcua_transport_endpoint);
+ return -1;
+}
+
+int parseAcknowledge(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_transport_type, tvb, *pOffset, 3, ENC_ASCII|ENC_NA); *pOffset+=3;
+ proto_tree_add_item(tree, hf_opcua_transport_chunk, tvb, *pOffset, 1, ENC_ASCII|ENC_NA); *pOffset+=1;
+ proto_tree_add_item(tree, hf_opcua_transport_size, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ proto_tree_add_item(tree, hf_opcua_transport_ver, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ proto_tree_add_item(tree, hf_opcua_transport_rbs, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ proto_tree_add_item(tree, hf_opcua_transport_sbs, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ proto_tree_add_item(tree, hf_opcua_transport_mms, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ proto_tree_add_item(tree, hf_opcua_transport_mcc, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ return -1;
+}
+
+int parseError(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_transport_type, tvb, *pOffset, 3, ENC_ASCII|ENC_NA); *pOffset+=3;
+ proto_tree_add_item(tree, hf_opcua_transport_chunk, tvb, *pOffset, 1, ENC_ASCII|ENC_NA); *pOffset+=1;
+ proto_tree_add_item(tree, hf_opcua_transport_size, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ parseStatusCode(tree, tvb, pinfo, pOffset, hf_opcua_transport_error);
+ parseString(tree, tvb, pinfo, pOffset, hf_opcua_transport_reason);
+ return -1;
+}
+
+int parseReverseHello(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_transport_type, tvb, *pOffset, 3, ENC_ASCII|ENC_NA); *pOffset+=3;
+ proto_tree_add_item(tree, hf_opcua_transport_chunk, tvb, *pOffset, 1, ENC_ASCII|ENC_NA); *pOffset+=1;
+ proto_tree_add_item(tree, hf_opcua_transport_size, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ parseString(tree, tvb, pinfo, pOffset, hf_opcua_transport_suri);
+ parseString(tree, tvb, pinfo, pOffset, hf_opcua_transport_endpoint);
+ return -1;
+}
+
+int parseMessage(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ proto_tree_add_item(tree, hf_opcua_transport_type, tvb, *pOffset, 3, ENC_ASCII|ENC_NA); *pOffset+=3;
+ proto_tree_add_item(tree, hf_opcua_transport_chunk, tvb, *pOffset, 1, ENC_ASCII|ENC_NA); *pOffset+=1;
+ proto_tree_add_item(tree, hf_opcua_transport_size, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ proto_tree_add_item(tree, hf_opcua_transport_scid, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+
+ /* message data contains the security layer */
+ parseSecurityLayer(tree, tvb, pOffset);
+
+ return -1;
+}
+
+int parseAbort(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, gint *pOffset)
+{
+ parseStatusCode(tree, tvb, pinfo, pOffset, hf_opcua_transport_error);
+ parseString(tree, tvb, pinfo, pOffset, hf_opcua_transport_reason);
+
+ return -1;
+}
+
+int parseService(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_item *ti_inner;
+ proto_tree *encobj_tree;
+ proto_tree *nodeid_tree;
+ int ServiceId = 0;
+
+ /* AT THE MOMENT NO SECURITY IS IMPLEMENTED IN UA.
+ * WE CAN JUST JUMP INTO THE APPLICATION LAYER DATA.
+ * THIS WILL CHAHNGE IN THE FUTURE. */
+
+ /* add encodeable object subtree */
+ encobj_tree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_extensionobject, &ti, "OpcUa Service : Encodeable Object");
+
+ /* add nodeid subtree */
+ nodeid_tree = proto_tree_add_subtree(encobj_tree, tvb, *pOffset, -1, ett_opcua_nodeid, &ti_inner, "TypeId : ExpandedNodeId");
+ ServiceId = parseServiceNodeId(nodeid_tree, tvb, pOffset);
+ proto_item_set_end(ti_inner, tvb, *pOffset);
+
+ dispatchService(encobj_tree, tvb, pinfo, pOffset, ServiceId);
+
+ proto_item_set_end(ti, tvb, *pOffset);
+ return ServiceId;
+}
+
+int parseOpenSecureChannel(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_item *ti_inner;
+ proto_tree *encobj_tree;
+ proto_tree *nodeid_tree;
+ int ServiceId = 0;
+
+ proto_tree_add_item(tree, hf_opcua_transport_type, tvb, *pOffset, 3, ENC_ASCII|ENC_NA); *pOffset+=3;
+ proto_tree_add_item(tree, hf_opcua_transport_chunk, tvb, *pOffset, 1, ENC_ASCII|ENC_NA); *pOffset+=1;
+ proto_tree_add_item(tree, hf_opcua_transport_size, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ proto_tree_add_item(tree, hf_opcua_transport_scid, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ parseString(tree, tvb, pinfo, pOffset, hf_opcua_transport_spu);
+ parseByteString(tree, tvb, pinfo, pOffset, hf_opcua_transport_scert);
+ parseByteString(tree, tvb, pinfo, pOffset, hf_opcua_transport_rcthumb);
+ proto_tree_add_item(tree, hf_opcua_transport_seq, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ proto_tree_add_item(tree, hf_opcua_transport_rqid, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+
+ /* add encodeable object subtree */
+ encobj_tree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_extensionobject, &ti, "Message : Encodeable Object");
+
+ /* add nodeid subtree */
+ nodeid_tree = proto_tree_add_subtree(encobj_tree, tvb, *pOffset, -1, ett_opcua_nodeid, &ti_inner, "TypeId : ExpandedNodeId");
+ ServiceId = parseServiceNodeId(nodeid_tree, tvb, pOffset);
+ proto_item_set_end(ti_inner, tvb, *pOffset);
+
+ dispatchService(encobj_tree, tvb, pinfo, pOffset, ServiceId);
+
+ proto_item_set_end(ti, tvb, *pOffset);
+ return ServiceId;
+}
+
+int parseCloseSecureChannel(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset)
+{
+ proto_item *ti;
+ proto_item *ti_inner;
+ proto_tree *encobj_tree;
+ proto_tree *nodeid_tree;
+ int ServiceId = 0;
+
+ proto_tree_add_item(tree, hf_opcua_transport_type, tvb, *pOffset, 3, ENC_ASCII|ENC_NA); *pOffset+=3;
+ proto_tree_add_item(tree, hf_opcua_transport_chunk, tvb, *pOffset, 1, ENC_ASCII|ENC_NA); *pOffset+=1;
+ proto_tree_add_item(tree, hf_opcua_transport_size, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+ proto_tree_add_item(tree, hf_opcua_transport_scid, tvb, *pOffset, 4, ENC_LITTLE_ENDIAN); *pOffset+=4;
+
+ parseSecurityLayer(tree, tvb, pOffset);
+
+ /* add encodeable object subtree */
+ encobj_tree = proto_tree_add_subtree(tree, tvb, *pOffset, -1, ett_opcua_extensionobject, &ti, "Message : Encodeable Object");
+
+ /* add nodeid subtree */
+ nodeid_tree = proto_tree_add_subtree(encobj_tree, tvb, *pOffset, -1, ett_opcua_nodeid, &ti_inner, "TypeId : ExpandedNodeId");
+ ServiceId = parseServiceNodeId(nodeid_tree, tvb, pOffset);
+ proto_item_set_end(ti_inner, tvb, *pOffset);
+
+ dispatchService(encobj_tree, tvb, pinfo, pOffset, ServiceId);
+
+ proto_item_set_end(ti, tvb, *pOffset);
+ return ServiceId;
+}
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
diff --git a/plugins/epan/opcua/opcua_transport_layer.h b/plugins/epan/opcua/opcua_transport_layer.h
new file mode 100644
index 00000000..4e63aa5a
--- /dev/null
+++ b/plugins/epan/opcua/opcua_transport_layer.h
@@ -0,0 +1,27 @@
+/******************************************************************************
+** Copyright (C) 2006-2009 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+**
+** SPDX-License-Identifier: GPL-2.0-or-later
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** Project: OpcUa Wireshark Plugin
+**
+** Description: OpcUa Transport Layer Decoder.
+**
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>
+******************************************************************************/
+
+/* Transport Layer: message parsers */
+int parseHello(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+int parseAcknowledge(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+int parseError(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+int parseReverseHello(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+int parseMessage(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+int parseAbort(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+int parseService(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+int parseOpenSecureChannel(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+int parseCloseSecureChannel(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint *pOffset);
+void registerTransportLayerTypes(int proto);