diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
commit | e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch) | |
tree | 68cb5ef9081156392f1dd62a00c6ccc1451b93df /plugins/epan/opcua | |
parent | Initial commit. (diff) | |
download | wireshark-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')
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); |