from Gerhard Gappmeier (ascolab):
authorulfl <ulfl@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 14 May 2007 13:58:54 +0000 (13:58 +0000)
committerulfl <ulfl@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 14 May 2007 13:58:54 +0000 (13:58 +0000)
new dissector for OPCUA protocol

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@21760 f5534014-38df-0310-8fa8-9805f1628bb7

34 files changed:
Makefile.am
Makefile.nmake
configure.in
plugins/Makefile.am
plugins/Makefile.nmake
plugins/opcua/AUTHORS [new file with mode: 0644]
plugins/opcua/COPYING [new file with mode: 0644]
plugins/opcua/ChangeLog [new file with mode: 0644]
plugins/opcua/Doxyfile [new file with mode: 0644]
plugins/opcua/Makefile.am [new file with mode: 0644]
plugins/opcua/Makefile.common [new file with mode: 0644]
plugins/opcua/Makefile.nmake [new file with mode: 0644]
plugins/opcua/README [new file with mode: 0644]
plugins/opcua/moduleinfo.h [new file with mode: 0644]
plugins/opcua/opcua.c [new file with mode: 0644]
plugins/opcua/opcua_complextypeparser.c [new file with mode: 0644]
plugins/opcua/opcua_complextypeparser.h [new file with mode: 0644]
plugins/opcua/opcua_enumparser.c [new file with mode: 0644]
plugins/opcua/opcua_enumparser.h [new file with mode: 0644]
plugins/opcua/opcua_hfindeces.c [new file with mode: 0644]
plugins/opcua/opcua_hfindeces.h [new file with mode: 0644]
plugins/opcua/opcua_identifiers.h [new file with mode: 0644]
plugins/opcua/opcua_serviceparser.c [new file with mode: 0644]
plugins/opcua/opcua_serviceparser.h [new file with mode: 0644]
plugins/opcua/opcua_servicetable.c [new file with mode: 0644]
plugins/opcua/opcua_simpletypes.c [new file with mode: 0644]
plugins/opcua/opcua_simpletypes.h [new file with mode: 0644]
plugins/opcua/plugin.c [new file with mode: 0644]
plugins/opcua/ua_application_layer.c [new file with mode: 0644]
plugins/opcua/ua_application_layer.h [new file with mode: 0644]
plugins/opcua/ua_security_layer.c [new file with mode: 0644]
plugins/opcua/ua_security_layer.h [new file with mode: 0644]
plugins/opcua/ua_transport_layer.c [new file with mode: 0644]
plugins/opcua/ua_transport_layer.h [new file with mode: 0644]

index 49c05e7addeaa539eeeaebf5b50b4d6be8a1c6d6..9c00fb6d4a08f34f0b8517c672d4ed68a66a2dcd 100644 (file)
@@ -225,6 +225,7 @@ plugin_ldadd = \
        -dlopen plugins/lwres/lwres.la \
        -dlopen plugins/mate/mate.la \
        -dlopen plugins/mgcp/mgcp.la \
+       -dlopen plugins/opcua/opcua.la \
        -dlopen plugins/opsi/opsi.la \
        -dlopen plugins/pcli/pcli.la \
        -dlopen plugins/profinet/profinet.la \
index 3de64a8d4a2ccff027409fa3866c9f26c94bd635..c53e728ca1db0fd1a4f0b8dd675b4552887f9a9b 100644 (file)
@@ -902,6 +902,7 @@ install-common-files:
        xcopy ".\plugins\lwres\lwres.dll" $(INSTALL_DIR)\plugins\$(VERSION) /d
        xcopy ".\plugins\mate\mate.dll" $(INSTALL_DIR)\plugins\$(VERSION) /d
        xcopy ".\plugins\mgcp\mgcp.dll" $(INSTALL_DIR)\plugins\$(VERSION) /d
+       xcopy ".\plugins\opcua\opcua.dll" $(INSTALL_DIR)\plugins\$(VERSION) /d
        xcopy ".\plugins\opsi\opsi.dll" $(INSTALL_DIR)\plugins\$(VERSION) /d
        xcopy ".\plugins\pcli\pcli.dll" $(INSTALL_DIR)\plugins\$(VERSION) /d
        xcopy ".\plugins\profinet\profinet.dll" $(INSTALL_DIR)\plugins\$(VERSION) /d
index 0cdfa14146de0eaf6eba1da84e9537321623c851..fa1201fd6ad53d54ed8386fe7be2702c69a42acf 100644 (file)
@@ -1480,6 +1480,7 @@ AC_OUTPUT(
   plugins/lwres/Makefile
   plugins/mate/Makefile
   plugins/mgcp/Makefile
+  plugins/opcua/Makefile
   plugins/opsi/Makefile
   plugins/pcli/Makefile
   plugins/profinet/Makefile
index 2c0063d58c0cfa567b16be96987f8021bd14fadd..f5bc40880a6a5d3510ebaf513731ee63b4eeddfd 100644 (file)
@@ -35,6 +35,7 @@ SUBDIRS = \
        lwres \
        mate \
        mgcp \
+       opcua \
        opsi \
        pcli \
        profinet \
@@ -55,3 +56,4 @@ EXTRA_DIST = \
 MAINTAINERCLEANFILES = \
        Makefile.in
 
+
index 4c518ca4864d99d7a8ea0145942dbf9da0dc6f39..97ca78da8fd9555b4341a0e211071613745b9723 100644 (file)
@@ -21,6 +21,7 @@ all: \
        lwres \
        mate \
        mgcp \
+       opcua \
        opsi \
        pcli \
        profinet \
@@ -99,6 +100,12 @@ mgcp::
        cd mgcp
        $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake
        cd .. 
+
+opcua::
+       cd opcua
+       $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake
+       cd ..
+
 opsi::
        cd opsi
        $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake
@@ -185,6 +192,9 @@ clean:
        cd mgcp
        $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
        cd ..
+       cd opcua
+       $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
+       cd ..
        cd opsi
        $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
        cd ..
@@ -254,6 +264,9 @@ distclean: clean
        cd mgcp
        $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
        cd ..
+       cd opcua
+       $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
+       cd ..
        cd opsi
        $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
        cd ..
@@ -323,6 +336,9 @@ maintainer-clean: distclean
        cd mgcp
        $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
        cd ..
+       cd opcua
+       $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
+       cd ..
        cd opsi
        $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
        cd ..
@@ -371,6 +387,7 @@ install-plugins:
        xcopy lwres\*.dll $(VERSION) /d
        xcopy mate\*.dll $(VERSION) /d
        xcopy mgcp\*.dll $(VERSION) /d
+       xcopy opcua\*.dll $(VERSION) /d
        xcopy opsi\*.dll $(VERSION) /d
        xcopy pcli\*.dll $(VERSION) /d
        xcopy profinet\*.dll $(VERSION) /d
@@ -387,3 +404,4 @@ clean-deps:
        rm -rf $(VERSION)
 
 
+
diff --git a/plugins/opcua/AUTHORS b/plugins/opcua/AUTHORS
new file mode 100644 (file)
index 0000000..d4abe79
--- /dev/null
@@ -0,0 +1,6 @@
+Author :\r
+Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>\r
+ascolab GmbH\r
+http://www.ascolab.com\r
+\r
+\r
diff --git a/plugins/opcua/COPYING b/plugins/opcua/COPYING
new file mode 100644 (file)
index 0000000..fbdd65f
--- /dev/null
@@ -0,0 +1,340 @@
+                   GNU GENERAL PUBLIC LICENSE\r
+                      Version 2, June 1991\r
+\r
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.\r
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ Everyone is permitted to copy and distribute verbatim copies\r
+ of this license document, but changing it is not allowed.\r
+\r
+                           Preamble\r
+\r
+  The licenses for most software are designed to take away your\r
+freedom to share and change it.  By contrast, the GNU General Public\r
+License is intended to guarantee your freedom to share and change free\r
+software--to make sure the software is free for all its users.  This\r
+General Public License applies to most of the Free Software\r
+Foundation's software and to any other program whose authors commit to\r
+using it.  (Some other Free Software Foundation software is covered by\r
+the GNU Library General Public License instead.)  You can apply it to\r
+your programs, too.\r
+\r
+  When we speak of free software, we are referring to freedom, not\r
+price.  Our General Public Licenses are designed to make sure that you\r
+have the freedom to distribute copies of free software (and charge for\r
+this service if you wish), that you receive source code or can get it\r
+if you want it, that you can change the software or use pieces of it\r
+in new free programs; and that you know you can do these things.\r
+\r
+  To protect your rights, we need to make restrictions that forbid\r
+anyone to deny you these rights or to ask you to surrender the rights.\r
+These restrictions translate to certain responsibilities for you if you\r
+distribute copies of the software, or if you modify it.\r
+\r
+  For example, if you distribute copies of such a program, whether\r
+gratis or for a fee, you must give the recipients all the rights that\r
+you have.  You must make sure that they, too, receive or can get the\r
+source code.  And you must show them these terms so they know their\r
+rights.\r
+\r
+  We protect your rights with two steps: (1) copyright the software, and\r
+(2) offer you this license which gives you legal permission to copy,\r
+distribute and/or modify the software.\r
+\r
+  Also, for each author's protection and ours, we want to make certain\r
+that everyone understands that there is no warranty for this free\r
+software.  If the software is modified by someone else and passed on, we\r
+want its recipients to know that what they have is not the original, so\r
+that any problems introduced by others will not reflect on the original\r
+authors' reputations.\r
+\r
+  Finally, any free program is threatened constantly by software\r
+patents.  We wish to avoid the danger that redistributors of a free\r
+program will individually obtain patent licenses, in effect making the\r
+program proprietary.  To prevent this, we have made it clear that any\r
+patent must be licensed for everyone's free use or not licensed at all.\r
+\r
+  The precise terms and conditions for copying, distribution and\r
+modification follow.\r
+\f\r
+                   GNU GENERAL PUBLIC LICENSE\r
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r
+\r
+  0. This License applies to any program or other work which contains\r
+a notice placed by the copyright holder saying it may be distributed\r
+under the terms of this General Public License.  The "Program", below,\r
+refers to any such program or work, and a "work based on the Program"\r
+means either the Program or any derivative work under copyright law:\r
+that is to say, a work containing the Program or a portion of it,\r
+either verbatim or with modifications and/or translated into another\r
+language.  (Hereinafter, translation is included without limitation in\r
+the term "modification".)  Each licensee is addressed as "you".\r
+\r
+Activities other than copying, distribution and modification are not\r
+covered by this License; they are outside its scope.  The act of\r
+running the Program is not restricted, and the output from the Program\r
+is covered only if its contents constitute a work based on the\r
+Program (independent of having been made by running the Program).\r
+Whether that is true depends on what the Program does.\r
+\r
+  1. You may copy and distribute verbatim copies of the Program's\r
+source code as you receive it, in any medium, provided that you\r
+conspicuously and appropriately publish on each copy an appropriate\r
+copyright notice and disclaimer of warranty; keep intact all the\r
+notices that refer to this License and to the absence of any warranty;\r
+and give any other recipients of the Program a copy of this License\r
+along with the Program.\r
+\r
+You may charge a fee for the physical act of transferring a copy, and\r
+you may at your option offer warranty protection in exchange for a fee.\r
+\r
+  2. You may modify your copy or copies of the Program or any portion\r
+of it, thus forming a work based on the Program, and copy and\r
+distribute such modifications or work under the terms of Section 1\r
+above, provided that you also meet all of these conditions:\r
+\r
+    a) You must cause the modified files to carry prominent notices\r
+    stating that you changed the files and the date of any change.\r
+\r
+    b) You must cause any work that you distribute or publish, that in\r
+    whole or in part contains or is derived from the Program or any\r
+    part thereof, to be licensed as a whole at no charge to all third\r
+    parties under the terms of this License.\r
+\r
+    c) If the modified program normally reads commands interactively\r
+    when run, you must cause it, when started running for such\r
+    interactive use in the most ordinary way, to print or display an\r
+    announcement including an appropriate copyright notice and a\r
+    notice that there is no warranty (or else, saying that you provide\r
+    a warranty) and that users may redistribute the program under\r
+    these conditions, and telling the user how to view a copy of this\r
+    License.  (Exception: if the Program itself is interactive but\r
+    does not normally print such an announcement, your work based on\r
+    the Program is not required to print an announcement.)\r
+\f\r
+These requirements apply to the modified work as a whole.  If\r
+identifiable sections of that work are not derived from the Program,\r
+and can be reasonably considered independent and separate works in\r
+themselves, then this License, and its terms, do not apply to those\r
+sections when you distribute them as separate works.  But when you\r
+distribute the same sections as part of a whole which is a work based\r
+on the Program, the distribution of the whole must be on the terms of\r
+this License, whose permissions for other licensees extend to the\r
+entire whole, and thus to each and every part regardless of who wrote it.\r
+\r
+Thus, it is not the intent of this section to claim rights or contest\r
+your rights to work written entirely by you; rather, the intent is to\r
+exercise the right to control the distribution of derivative or\r
+collective works based on the Program.\r
+\r
+In addition, mere aggregation of another work not based on the Program\r
+with the Program (or with a work based on the Program) on a volume of\r
+a storage or distribution medium does not bring the other work under\r
+the scope of this License.\r
+\r
+  3. You may copy and distribute the Program (or a work based on it,\r
+under Section 2) in object code or executable form under the terms of\r
+Sections 1 and 2 above provided that you also do one of the following:\r
+\r
+    a) Accompany it with the complete corresponding machine-readable\r
+    source code, which must be distributed under the terms of Sections\r
+    1 and 2 above on a medium customarily used for software interchange; or,\r
+\r
+    b) Accompany it with a written offer, valid for at least three\r
+    years, to give any third party, for a charge no more than your\r
+    cost of physically performing source distribution, a complete\r
+    machine-readable copy of the corresponding source code, to be\r
+    distributed under the terms of Sections 1 and 2 above on a medium\r
+    customarily used for software interchange; or,\r
+\r
+    c) Accompany it with the information you received as to the offer\r
+    to distribute corresponding source code.  (This alternative is\r
+    allowed only for noncommercial distribution and only if you\r
+    received the program in object code or executable form with such\r
+    an offer, in accord with Subsection b above.)\r
+\r
+The source code for a work means the preferred form of the work for\r
+making modifications to it.  For an executable work, complete source\r
+code means all the source code for all modules it contains, plus any\r
+associated interface definition files, plus the scripts used to\r
+control compilation and installation of the executable.  However, as a\r
+special exception, the source code distributed need not include\r
+anything that is normally distributed (in either source or binary\r
+form) with the major components (compiler, kernel, and so on) of the\r
+operating system on which the executable runs, unless that component\r
+itself accompanies the executable.\r
+\r
+If distribution of executable or object code is made by offering\r
+access to copy from a designated place, then offering equivalent\r
+access to copy the source code from the same place counts as\r
+distribution of the source code, even though third parties are not\r
+compelled to copy the source along with the object code.\r
+\f\r
+  4. You may not copy, modify, sublicense, or distribute the Program\r
+except as expressly provided under this License.  Any attempt\r
+otherwise to copy, modify, sublicense or distribute the Program is\r
+void, and will automatically terminate your rights under this License.\r
+However, parties who have received copies, or rights, from you under\r
+this License will not have their licenses terminated so long as such\r
+parties remain in full compliance.\r
+\r
+  5. You are not required to accept this License, since you have not\r
+signed it.  However, nothing else grants you permission to modify or\r
+distribute the Program or its derivative works.  These actions are\r
+prohibited by law if you do not accept this License.  Therefore, by\r
+modifying or distributing the Program (or any work based on the\r
+Program), you indicate your acceptance of this License to do so, and\r
+all its terms and conditions for copying, distributing or modifying\r
+the Program or works based on it.\r
+\r
+  6. Each time you redistribute the Program (or any work based on the\r
+Program), the recipient automatically receives a license from the\r
+original licensor to copy, distribute or modify the Program subject to\r
+these terms and conditions.  You may not impose any further\r
+restrictions on the recipients' exercise of the rights granted herein.\r
+You are not responsible for enforcing compliance by third parties to\r
+this License.\r
+\r
+  7. If, as a consequence of a court judgment or allegation of patent\r
+infringement or for any other reason (not limited to patent issues),\r
+conditions are imposed on you (whether by court order, agreement or\r
+otherwise) that contradict the conditions of this License, they do not\r
+excuse you from the conditions of this License.  If you cannot\r
+distribute so as to satisfy simultaneously your obligations under this\r
+License and any other pertinent obligations, then as a consequence you\r
+may not distribute the Program at all.  For example, if a patent\r
+license would not permit royalty-free redistribution of the Program by\r
+all those who receive copies directly or indirectly through you, then\r
+the only way you could satisfy both it and this License would be to\r
+refrain entirely from distribution of the Program.\r
+\r
+If any portion of this section is held invalid or unenforceable under\r
+any particular circumstance, the balance of the section is intended to\r
+apply and the section as a whole is intended to apply in other\r
+circumstances.\r
+\r
+It is not the purpose of this section to induce you to infringe any\r
+patents or other property right claims or to contest validity of any\r
+such claims; this section has the sole purpose of protecting the\r
+integrity of the free software distribution system, which is\r
+implemented by public license practices.  Many people have made\r
+generous contributions to the wide range of software distributed\r
+through that system in reliance on consistent application of that\r
+system; it is up to the author/donor to decide if he or she is willing\r
+to distribute software through any other system and a licensee cannot\r
+impose that choice.\r
+\r
+This section is intended to make thoroughly clear what is believed to\r
+be a consequence of the rest of this License.\r
+\f\r
+  8. If the distribution and/or use of the Program is restricted in\r
+certain countries either by patents or by copyrighted interfaces, the\r
+original copyright holder who places the Program under this License\r
+may add an explicit geographical distribution limitation excluding\r
+those countries, so that distribution is permitted only in or among\r
+countries not thus excluded.  In such case, this License incorporates\r
+the limitation as if written in the body of this License.\r
+\r
+  9. The Free Software Foundation may publish revised and/or new versions\r
+of the General Public License from time to time.  Such new versions will\r
+be similar in spirit to the present version, but may differ in detail to\r
+address new problems or concerns.\r
+\r
+Each version is given a distinguishing version number.  If the Program\r
+specifies a version number of this License which applies to it and "any\r
+later version", you have the option of following the terms and conditions\r
+either of that version or of any later version published by the Free\r
+Software Foundation.  If the Program does not specify a version number of\r
+this License, you may choose any version ever published by the Free Software\r
+Foundation.\r
+\r
+  10. If you wish to incorporate parts of the Program into other free\r
+programs whose distribution conditions are different, write to the author\r
+to ask for permission.  For software which is copyrighted by the Free\r
+Software Foundation, write to the Free Software Foundation; we sometimes\r
+make exceptions for this.  Our decision will be guided by the two goals\r
+of preserving the free status of all derivatives of our free software and\r
+of promoting the sharing and reuse of software generally.\r
+\r
+                           NO WARRANTY\r
+\r
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\r
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\r
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\r
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\r
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\r
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\r
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\r
+REPAIR OR CORRECTION.\r
+\r
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\r
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\r
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\r
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\r
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\r
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\r
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\r
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\r
+POSSIBILITY OF SUCH DAMAGES.\r
+\r
+                    END OF TERMS AND CONDITIONS\r
+\f\r
+           How to Apply These Terms to Your New Programs\r
+\r
+  If you develop a new program, and you want it to be of the greatest\r
+possible use to the public, the best way to achieve this is to make it\r
+free software which everyone can redistribute and change under these terms.\r
+\r
+  To do so, attach the following notices to the program.  It is safest\r
+to attach them to the start of each source file to most effectively\r
+convey the exclusion of warranty; and each file should have at least\r
+the "copyright" line and a pointer to where the full notice is found.\r
+\r
+    <one line to give the program's name and a brief idea of what it does.>\r
+    Copyright (C) <year>  <name of author>\r
+\r
+    This program is free software; you can redistribute it and/or modify\r
+    it under the terms of the GNU General Public License as published by\r
+    the Free Software Foundation; either version 2 of the License, or\r
+    (at your option) any later version.\r
+\r
+    This program is distributed in the hope that it will be useful,\r
+    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+    GNU General Public License for more details.\r
+\r
+    You should have received a copy of the GNU General Public License\r
+    along with this program; if not, write to the Free Software\r
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+\r
+\r
+Also add information on how to contact you by electronic and paper mail.\r
+\r
+If the program is interactive, make it output a short notice like this\r
+when it starts in an interactive mode:\r
+\r
+    Gnomovision version 69, Copyright (C) year  name of author\r
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\r
+    This is free software, and you are welcome to redistribute it\r
+    under certain conditions; type `show c' for details.\r
+\r
+The hypothetical commands `show w' and `show c' should show the appropriate\r
+parts of the General Public License.  Of course, the commands you use may\r
+be called something other than `show w' and `show c'; they could even be\r
+mouse-clicks or menu items--whatever suits your program.\r
+\r
+You should also get your employer (if you work as a programmer) or your\r
+school, if any, to sign a "copyright disclaimer" for the program, if\r
+necessary.  Here is a sample; alter the names:\r
+\r
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\r
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.\r
+\r
+  <signature of Ty Coon>, 1 April 1989\r
+  Ty Coon, President of Vice\r
+\r
+This General Public License does not permit incorporating your program into\r
+proprietary programs.  If your program is a subroutine library, you may\r
+consider it more useful to permit linking proprietary applications with the\r
+library.  If this is what you want to do, use the GNU Library General\r
+Public License instead of this License.\r
diff --git a/plugins/opcua/ChangeLog b/plugins/opcua/ChangeLog
new file mode 100644 (file)
index 0000000..93e3e97
--- /dev/null
@@ -0,0 +1,8 @@
+$Id: ChangeLog,v 1.1.1.1 2006/07/12 09:17:41 gergap Exp $\r
+\r
+Overview of changes in OpcUa plugin:\r
+\r
+Version 0.0.1:\r
+\r
+* initial implementation without security\r
+\r
diff --git a/plugins/opcua/Doxyfile b/plugins/opcua/Doxyfile
new file mode 100644 (file)
index 0000000..2955c7b
--- /dev/null
@@ -0,0 +1,275 @@
+# Doxyfile 1.4.1-KDevelop\r
+\r
+#---------------------------------------------------------------------------\r
+# Project related configuration options\r
+#---------------------------------------------------------------------------\r
+PROJECT_NAME           = opcua.kdevelop\r
+PROJECT_NUMBER         = $VERSION$\r
+OUTPUT_DIRECTORY       = \r
+CREATE_SUBDIRS         = NO\r
+OUTPUT_LANGUAGE        = English\r
+USE_WINDOWS_ENCODING   = NO\r
+BRIEF_MEMBER_DESC      = YES\r
+REPEAT_BRIEF           = YES\r
+ABBREVIATE_BRIEF       = "The $name class" \\r
+                         "The $name widget" \\r
+                         "The $name file" \\r
+                         is \\r
+                         provides \\r
+                         specifies \\r
+                         contains \\r
+                         represents \\r
+                         a \\r
+                         an \\r
+                         the\r
+ALWAYS_DETAILED_SEC    = NO\r
+INLINE_INHERITED_MEMB  = NO\r
+FULL_PATH_NAMES        = YES\r
+STRIP_FROM_PATH        = /home/gergap/\r
+STRIP_FROM_INC_PATH    = \r
+SHORT_NAMES            = NO\r
+JAVADOC_AUTOBRIEF      = NO\r
+MULTILINE_CPP_IS_BRIEF = NO\r
+DETAILS_AT_TOP         = NO\r
+INHERIT_DOCS           = YES\r
+DISTRIBUTE_GROUP_DOC   = NO\r
+TAB_SIZE               = 8\r
+ALIASES                = \r
+OPTIMIZE_OUTPUT_FOR_C  = NO\r
+OPTIMIZE_OUTPUT_JAVA   = NO\r
+SUBGROUPING            = YES\r
+#---------------------------------------------------------------------------\r
+# Build related configuration options\r
+#---------------------------------------------------------------------------\r
+EXTRACT_ALL            = NO\r
+EXTRACT_PRIVATE        = NO\r
+EXTRACT_STATIC         = NO\r
+EXTRACT_LOCAL_CLASSES  = YES\r
+EXTRACT_LOCAL_METHODS  = NO\r
+HIDE_UNDOC_MEMBERS     = NO\r
+HIDE_UNDOC_CLASSES     = NO\r
+HIDE_FRIEND_COMPOUNDS  = NO\r
+HIDE_IN_BODY_DOCS      = NO\r
+INTERNAL_DOCS          = NO\r
+CASE_SENSE_NAMES       = YES\r
+HIDE_SCOPE_NAMES       = NO\r
+SHOW_INCLUDE_FILES     = YES\r
+INLINE_INFO            = YES\r
+SORT_MEMBER_DOCS       = YES\r
+SORT_BRIEF_DOCS        = NO\r
+SORT_BY_SCOPE_NAME     = NO\r
+GENERATE_TODOLIST      = YES\r
+GENERATE_TESTLIST      = YES\r
+GENERATE_BUGLIST       = YES\r
+GENERATE_DEPRECATEDLIST= YES\r
+ENABLED_SECTIONS       = \r
+MAX_INITIALIZER_LINES  = 30\r
+SHOW_USED_FILES        = YES\r
+SHOW_DIRECTORIES       = YES\r
+FILE_VERSION_FILTER    = \r
+#---------------------------------------------------------------------------\r
+# configuration options related to warning and progress messages\r
+#---------------------------------------------------------------------------\r
+QUIET                  = NO\r
+WARNINGS               = YES\r
+WARN_IF_UNDOCUMENTED   = YES\r
+WARN_IF_DOC_ERROR      = YES\r
+WARN_NO_PARAMDOC       = NO\r
+WARN_FORMAT            = "$file:$line: $text"\r
+WARN_LOGFILE           = \r
+#---------------------------------------------------------------------------\r
+# configuration options related to the input files\r
+#---------------------------------------------------------------------------\r
+INPUT                  = /home/gergap/work/wireshark/plugins/opcua\r
+FILE_PATTERNS          = *.c \\r
+                         *.cc \\r
+                         *.cxx \\r
+                         *.cpp \\r
+                         *.c++ \\r
+                         *.java \\r
+                         *.ii \\r
+                         *.ixx \\r
+                         *.ipp \\r
+                         *.i++ \\r
+                         *.inl \\r
+                         *.h \\r
+                         *.hh \\r
+                         *.hxx \\r
+                         *.hpp \\r
+                         *.h++ \\r
+                         *.idl \\r
+                         *.odl \\r
+                         *.cs \\r
+                         *.php \\r
+                         *.php3 \\r
+                         *.inc \\r
+                         *.m \\r
+                         *.mm \\r
+                         *.dox \\r
+                         *.C \\r
+                         *.CC \\r
+                         *.C++ \\r
+                         *.II \\r
+                         *.I++ \\r
+                         *.H \\r
+                         *.HH \\r
+                         *.H++ \\r
+                         *.CS \\r
+                         *.PHP \\r
+                         *.PHP3 \\r
+                         *.M \\r
+                         *.MM \\r
+                         *.C \\r
+                         *.H \\r
+                         *.tlh \\r
+                         *.diff \\r
+                         *.patch \\r
+                         *.moc \\r
+                         *.xpm \\r
+                         *.dox\r
+RECURSIVE              = yes\r
+EXCLUDE                = \r
+EXCLUDE_SYMLINKS       = NO\r
+EXCLUDE_PATTERNS       = \r
+EXAMPLE_PATH           = \r
+EXAMPLE_PATTERNS       = *\r
+EXAMPLE_RECURSIVE      = NO\r
+IMAGE_PATH             = \r
+INPUT_FILTER           = \r
+FILTER_PATTERNS        = \r
+FILTER_SOURCE_FILES    = NO\r
+#---------------------------------------------------------------------------\r
+# configuration options related to source browsing\r
+#---------------------------------------------------------------------------\r
+SOURCE_BROWSER         = NO\r
+INLINE_SOURCES         = NO\r
+STRIP_CODE_COMMENTS    = YES\r
+REFERENCED_BY_RELATION = YES\r
+REFERENCES_RELATION    = YES\r
+VERBATIM_HEADERS       = YES\r
+#---------------------------------------------------------------------------\r
+# configuration options related to the alphabetical class index\r
+#---------------------------------------------------------------------------\r
+ALPHABETICAL_INDEX     = NO\r
+COLS_IN_ALPHA_INDEX    = 5\r
+IGNORE_PREFIX          = \r
+#---------------------------------------------------------------------------\r
+# configuration options related to the HTML output\r
+#---------------------------------------------------------------------------\r
+GENERATE_HTML          = YES\r
+HTML_OUTPUT            = html\r
+HTML_FILE_EXTENSION    = .html\r
+HTML_HEADER            = \r
+HTML_FOOTER            = \r
+HTML_STYLESHEET        = \r
+HTML_ALIGN_MEMBERS     = YES\r
+GENERATE_HTMLHELP      = NO\r
+CHM_FILE               = \r
+HHC_LOCATION           = \r
+GENERATE_CHI           = NO\r
+BINARY_TOC             = NO\r
+TOC_EXPAND             = NO\r
+DISABLE_INDEX          = NO\r
+ENUM_VALUES_PER_LINE   = 4\r
+GENERATE_TREEVIEW      = NO\r
+TREEVIEW_WIDTH         = 250\r
+#---------------------------------------------------------------------------\r
+# configuration options related to the LaTeX output\r
+#---------------------------------------------------------------------------\r
+GENERATE_LATEX         = YES\r
+LATEX_OUTPUT           = latex\r
+LATEX_CMD_NAME         = latex\r
+MAKEINDEX_CMD_NAME     = makeindex\r
+COMPACT_LATEX          = NO\r
+PAPER_TYPE             = a4wide\r
+EXTRA_PACKAGES         = \r
+LATEX_HEADER           = \r
+PDF_HYPERLINKS         = NO\r
+USE_PDFLATEX           = NO\r
+LATEX_BATCHMODE        = NO\r
+LATEX_HIDE_INDICES     = NO\r
+#---------------------------------------------------------------------------\r
+# configuration options related to the RTF output\r
+#---------------------------------------------------------------------------\r
+GENERATE_RTF           = NO\r
+RTF_OUTPUT             = rtf\r
+COMPACT_RTF            = NO\r
+RTF_HYPERLINKS         = NO\r
+RTF_STYLESHEET_FILE    = \r
+RTF_EXTENSIONS_FILE    = \r
+#---------------------------------------------------------------------------\r
+# configuration options related to the man page output\r
+#---------------------------------------------------------------------------\r
+GENERATE_MAN           = NO\r
+MAN_OUTPUT             = man\r
+MAN_EXTENSION          = .3\r
+MAN_LINKS              = NO\r
+#---------------------------------------------------------------------------\r
+# configuration options related to the XML output\r
+#---------------------------------------------------------------------------\r
+GENERATE_XML           = yes\r
+XML_OUTPUT             = xml\r
+XML_SCHEMA             = \r
+XML_DTD                = \r
+XML_PROGRAMLISTING     = YES\r
+#---------------------------------------------------------------------------\r
+# configuration options for the AutoGen Definitions output\r
+#---------------------------------------------------------------------------\r
+GENERATE_AUTOGEN_DEF   = NO\r
+#---------------------------------------------------------------------------\r
+# configuration options related to the Perl module output\r
+#---------------------------------------------------------------------------\r
+GENERATE_PERLMOD       = NO\r
+PERLMOD_LATEX          = NO\r
+PERLMOD_PRETTY         = YES\r
+PERLMOD_MAKEVAR_PREFIX = \r
+#---------------------------------------------------------------------------\r
+# Configuration options related to the preprocessor   \r
+#---------------------------------------------------------------------------\r
+ENABLE_PREPROCESSING   = YES\r
+MACRO_EXPANSION        = NO\r
+EXPAND_ONLY_PREDEF     = NO\r
+SEARCH_INCLUDES        = YES\r
+INCLUDE_PATH           = \r
+INCLUDE_FILE_PATTERNS  = \r
+PREDEFINED             = \r
+EXPAND_AS_DEFINED      = \r
+SKIP_FUNCTION_MACROS   = YES\r
+#---------------------------------------------------------------------------\r
+# Configuration::additions related to external references   \r
+#---------------------------------------------------------------------------\r
+TAGFILES               = \r
+GENERATE_TAGFILE       = opcua.tag\r
+ALLEXTERNALS           = NO\r
+EXTERNAL_GROUPS        = YES\r
+PERL_PATH              = /usr/bin/perl\r
+#---------------------------------------------------------------------------\r
+# Configuration options related to the dot tool   \r
+#---------------------------------------------------------------------------\r
+CLASS_DIAGRAMS         = YES\r
+HIDE_UNDOC_RELATIONS   = YES\r
+HAVE_DOT               = NO\r
+CLASS_GRAPH            = YES\r
+COLLABORATION_GRAPH    = YES\r
+GROUP_GRAPHS           = YES\r
+UML_LOOK               = NO\r
+TEMPLATE_RELATIONS     = NO\r
+INCLUDE_GRAPH          = YES\r
+INCLUDED_BY_GRAPH      = YES\r
+CALL_GRAPH             = NO\r
+GRAPHICAL_HIERARCHY    = YES\r
+DIRECTORY_GRAPH        = YES\r
+DOT_IMAGE_FORMAT       = png\r
+DOT_PATH               = \r
+DOTFILE_DIRS           = \r
+MAX_DOT_GRAPH_WIDTH    = 1024\r
+MAX_DOT_GRAPH_HEIGHT   = 1024\r
+MAX_DOT_GRAPH_DEPTH    = 1000\r
+DOT_TRANSPARENT        = NO\r
+DOT_MULTI_TARGETS      = NO\r
+GENERATE_LEGEND        = YES\r
+DOT_CLEANUP            = YES\r
+#---------------------------------------------------------------------------\r
+# Configuration::additions related to the search engine   \r
+#---------------------------------------------------------------------------\r
+SEARCHENGINE           = NO\r
diff --git a/plugins/opcua/Makefile.am b/plugins/opcua/Makefile.am
new file mode 100644 (file)
index 0000000..3e87a73
--- /dev/null
@@ -0,0 +1,119 @@
+# Makefile.am\r
+# Automake file for OpcUa plugin\r
+#\r
+# $Id: Makefile.am,v 1.1.1.1 2006/07/12 09:17:41 gergap Exp $\r
+#\r
+# Adapted by Gerhard Gappmeier for OpcUa\r
+# Wireshark - Network traffic analyzer\r
+# By Gerald Combs <gerald@wireshark.org>\r
+# Copyright 1998 Gerald Combs\r
+# \r
+# This program is free software; you can redistribute it and/or\r
+# modify it under the terms of the GNU General Public License\r
+# as published by the Free Software Foundation; either version 2\r
+# of the License, or (at your option) any later version.\r
+# \r
+# This program is distributed in the hope that it will be useful,\r
+# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+# GNU General Public License for more details.\r
+# \r
+# You should have received a copy of the GNU General Public License\r
+# along with this program; if not, write to the Free Software\r
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+#\r
+\r
+INCLUDES = -I$(top_srcdir) -I$(includedir)\r
+\r
+include Makefile.common\r
+\r
+plugindir = @plugindir@\r
+\r
+plugin_LTLIBRARIES = opcua.la\r
+opcua_la_SOURCES = \\r
+       plugin.c \\r
+       moduleinfo.h \\r
+       $(DISSECTOR_SRC) \\r
+       $(DISSECTOR_INCLUDES)\r
+opcua_la_LDFLAGS = -module -avoid-version\r
+opcua_la_LIBADD = @PLUGIN_LIBS@\r
+\r
+# Libs must be cleared, or else libtool won't create a shared module.\r
+# If your module needs to be linked against any particular libraries,\r
+# add them here.\r
+LIBS =\r
+\r
+#\r
+# Build plugin.c, which contains the plugin version[] string, a\r
+# function plugin_register() that calls the register routines for all\r
+# protocols, and a function plugin_reg_handoff() that calls the handoff\r
+# registration routines for all protocols.\r
+#\r
+# We do this by scanning sources.  If that turns out to be too slow,\r
+# maybe we could just require every .o file to have an register routine\r
+# of a given name (packet-aarp.o -> proto_register_aarp, etc.).\r
+#\r
+# Formatting conventions:  The name of the proto_register_* routines an\r
+# proto_reg_handoff_* routines must start in column zero, or must be\r
+# preceded only by "void " starting in column zero, and must not be\r
+# inside #if.\r
+#\r
+# DISSECTOR_SRC is assumed to have all the files that need to be scanned.\r
+#\r
+# For some unknown reason, having a big "for" loop in the Makefile\r
+# to scan all the files doesn't work with some "make"s; they seem to\r
+# pass only the first few names in the list to the shell, for some\r
+# reason.\r
+#\r
+# Therefore, we have a script to generate the plugin.c file.\r
+# The shell script runs slowly, as multiple greps and seds are run\r
+# for each input file; this is especially slow on Windows.  Therefore,\r
+# if Python is present (as indicated by PYTHON being defined), we run\r
+# a faster Python script to do that work instead.\r
+#\r
+# The first argument is the directory in which the source files live.\r
+# The second argument is "plugin", to indicate that we should build\r
+# a plugin.c file for a plugin.\r
+# All subsequent arguments are the files to scan.\r
+#\r
+plugin.c: $(DISSECTOR_SRC) $(top_srcdir)/tools/make-dissector-reg \\r
+    $(top_srcdir)/tools/make-dissector-reg.py\r
+       @if test -n $(PYTHON); then \\r
+               echo Making plugin.c with python ; \\r
+               $(PYTHON) $(top_srcdir)/tools/make-dissector-reg.py $(srcdir) \\r
+                   plugin $(DISSECTOR_SRC) ; \\r
+       else \\r
+               echo Making plugin.c with shell script ; \\r
+               $(top_srcdir)/tools/make-dissector-reg $(srcdir) \\r
+                   $(plugin_src) plugin $(DISSECTOR_SRC) ; \\r
+       fi\r
+\r
+#\r
+# Currently plugin.c can be included in the distribution because\r
+# we always build all protocol dissectors. We used to have to check\r
+# whether or not to build the snmp dissector. If we again need to\r
+# variably build something, making plugin.c non-portable, uncomment\r
+# the dist-hook line below.\r
+#\r
+# Oh, yuk.  We don't want to include "plugin.c" in the distribution, as\r
+# its contents depend on the configuration, and therefore we want it\r
+# to be built when the first "make" is done; however, Automake insists\r
+# on putting *all* source into the distribution.\r
+#\r
+# We work around this by having a "dist-hook" rule that deletes\r
+# "plugin.c", so that "dist" won't pick it up.\r
+#\r
+#dist-hook:\r
+#      @rm -f $(distdir)/plugin.c\r
+\r
+CLEANFILES = \\r
+       opcua \\r
+       *~\r
+\r
+MAINTAINERCLEANFILES = \\r
+       Makefile.in     \\r
+       plugin.c\r
+\r
+EXTRA_DIST = \\r
+       Makefile.common         \\r
+       Makefile.nmake\r
diff --git a/plugins/opcua/Makefile.common b/plugins/opcua/Makefile.common
new file mode 100644 (file)
index 0000000..a07fab8
--- /dev/null
@@ -0,0 +1,41 @@
+# Makefile.common for OpcUa plugin\r
+#     Contains the stuff from Makefile.am and Makefile.nmake that is\r
+#     a) common to both files and\r
+#     b) portable between both files\r
+#\r
+# $Id: Makefile.common,v 1.3 2007/02/08 11:29:50 gergap Exp $\r
+#\r
+# Adapted by Gerhard Gappmeier for OpcUa\r
+# Wireshark - Network traffic analyzer\r
+# By Gerald Combs <gerald@wireshark.org>\r
+# Copyright 1998 Gerald Combs\r
+#\r
+# This program is free software; you can redistribute it and/or\r
+# modify it under the terms of the GNU General Public License\r
+# as published by the Free Software Foundation; either version 2\r
+# of the License, or (at your option) any later version.\r
+#\r
+# This program is distributed in the hope that it will be useful,\r
+# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+# GNU General Public License for more details.\r
+#\r
+# You should have received a copy of the GNU General Public License\r
+# along with this program; if not, write to the Free Software\r
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+\r
+# the name of the plugin\r
+PLUGIN_NAME = opcua\r
+\r
+# the dissector sources (without any helpers)\r
+DISSECTOR_SRC = \\r
+       opcua.c \\r
+       ua_transport_layer.c \\r
+       ua_security_layer.c \\r
+       ua_application_layer.c \\r
+       opcua_serviceparser.c \\r
+       opcua_complextypeparser.c \\r
+       opcua_enumparser.c \\r
+       opcua_simpletypes.c \\r
+       opcua_servicetable.c \\r
+       opcua_hfindeces.c\r
diff --git a/plugins/opcua/Makefile.nmake b/plugins/opcua/Makefile.nmake
new file mode 100644 (file)
index 0000000..d1fb45c
--- /dev/null
@@ -0,0 +1,79 @@
+# Makefile.nmake\r
+# nmake file for OpcUa plugin\r
+#\r
+# $Id: Makefile.nmake,v 1.1.1.1 2006/07/12 09:17:41 gergap Exp $\r
+#\r
+\r
+include ..\..\config.nmake\r
+\r
+############### no need to modify below this line #########\r
+\r
+include Makefile.common\r
+\r
+CFLAGS=/DHAVE_CONFIG_H /I../.. /I../../wiretap $(GLIB_CFLAGS) \\r
+       /I$(PCAP_DIR)\include -D_U_="" $(LOCAL_CFLAGS)\r
+\r
+LDFLAGS = /NOLOGO /INCREMENTAL:no /MACHINE:I386 $(LOCAL_LDFLAGS)\r
+\r
+!IFDEF ENABLE_LIBWIRESHARK\r
+LINK_PLUGIN_WITH=..\..\epan\libwireshark.lib ..\..\epan\dissectors\dissectors.lib\r
+CFLAGS=/DHAVE_WIN32_LIBWIRESHARK_LIB /D_NEED_VAR_IMPORT_ $(CFLAGS)\r
+\r
+DISSECTOR_OBJECTS = $(DISSECTOR_SRC:.c=.obj)\r
+\r
+OBJECTS=$(DISSECTOR_OBJECTS) plugin.obj\r
+\r
+opcua.dll opcua.exp opcua.lib : $(OBJECTS) $(LINK_PLUGIN_WITH) \r
+       link -dll /out:opcua.dll $(LDFLAGS) $(OBJECTS) $(LINK_PLUGIN_WITH)  \\r
+       $(GLIB_LIBS)\r
+\r
+#\r
+# Build plugin.c, which contains the plugin version[] string, a\r
+# function plugin_register() that calls the register routines for all\r
+# protocols, and a function plugin_reg_handoff() that calls the handoff\r
+# registration routines for all protocols.\r
+#\r
+# We do this by scanning sources.  If that turns out to be too slow,\r
+# maybe we could just require every .o file to have an register routine\r
+# of a given name (packet-aarp.o -> proto_register_aarp, etc.).\r
+#\r
+# Formatting conventions:  The name of the proto_register_* routines an\r
+# proto_reg_handoff_* routines must start in column zero, or must be\r
+# preceded only by "void " starting in column zero, and must not be\r
+# inside #if.\r
+#\r
+# DISSECTOR_SRC is assumed to have all the files that need to be scanned.\r
+#\r
+# For some unknown reason, having a big "for" loop in the Makefile\r
+# to scan all the files doesn't work with some "make"s; they seem to\r
+# pass only the first few names in the list to the shell, for some\r
+# reason.\r
+#\r
+# Therefore, we have a script to generate the plugin.c file.\r
+# The shell script runs slowly, as multiple greps and seds are run\r
+# for each input file; this is especially slow on Windows.  Therefore,\r
+# if Python is present (as indicated by PYTHON being defined), we run\r
+# a faster Python script to do that work instead.\r
+#\r
+# The first argument is the directory in which the source files live.\r
+# The second argument is "plugin", to indicate that we should build\r
+# a plugin.c file for a plugin.\r
+# All subsequent arguments are the files to scan.\r
+#\r
+plugin.c: $(DISSECTOR_SRC)\r
+!IFDEF PYTHON\r
+       @echo Making plugin.c (using python)\r
+       @$(PYTHON) ../../tools/make-dissector-reg.py . plugin $(DISSECTOR_SRC)\r
+!ELSE\r
+       @echo Making plugin.c (using sh)\r
+       @$(SH) ../../tools/make-dissector-reg . plugin $(DISSECTOR_SRC)\r
+!ENDIF\r
+\r
+!ENDIF\r
+\r
+clean:\r
+       rm -f $(OBJECTS) opcua.dll opcua.exp opcua.lib *.pdb\r
+\r
+distclean: clean\r
+\r
+maintainer-clean: distclean\r
diff --git a/plugins/opcua/README b/plugins/opcua/README
new file mode 100644 (file)
index 0000000..40646bd
--- /dev/null
@@ -0,0 +1,58 @@
+OpcUa Plugin:\r
+=============\r
+\r
+This plugin implements the dissection of the OpcUa Binary Protocol.\r
+Author: Gerhard Gappmeier\r
+        ascolab GmbH\r
+        http://www.ascolab.com\r
+       \r
+Overview:\r
+=========\r
+\r
+OpcUa (OPC Unified Architecture) is a vendor and platform independent\r
+protocol for automation technology. It is the successor of the\r
+COM/DCOM based specifications OPC DA, OPC Alarm & Events, OPC HDA, etc.\r
+It unifies all this technologies into a single protocol.\r
+\r
+The specification describes abstract services that are independent\r
+of the underlying protocol. For now there exist protocol mappings\r
+to a Binary TCP based protocol and a SOAP based Webservice.\r
+Also a hybrid version will be available where the Binary messages are transported\r
+by a single webservice command called "Invoke".\r
+\r
+More information about the technology you can find on\r
+http://www.ascolab.com/index.php?file=ua&lang=en.\r
+\r
+Protocol Mappings:\r
+==================\r
+\r
+Binary (TCP): The fastest and most flexible version (small footprint, no XML and SOAP necessary)\r
+              can easily be tunneled (SSH, IPSEC, etc.), redirected, ...\r
+SOAP version: Easy to implement with verious tools like .Net, JAVA, gSOAP, etc.\r
+              Better to communicate through firewalls via HTTP.\r
+SOAP with Binary Attchment: Combines the advantages of both.\r
+              The messages are encoded as Binary, and transported via SOAP as binary\r
+              attachment.\r
+\r
+The OPC Foundation offers a free Opc Ua stack implementation in ANSI C\r
+for all members. This stack implements the binary protocol as well\r
+as the SOAP version. It's easily portable to different kinds of operating\r
+systems from embedded devices to servers.\r
+This makes it easy to implement Opc Ua applications based on this stack\r
+and it is expected that the binary protocol will be the most used\r
+protocol.\r
+Nevertheless it's free to everbody to implement an own stack according\r
+to the specification. An own implementation of the SOAP version \r
+should be easy with the various SOAP toolkits.\r
+\r
+For more information see http://www.opcfoundation.org\r
+\r
+Known limitations:\r
+==================\r
+\r
+* In this version the security layer contains only dummy data.\r
+  The plugin decodes the transport layer, skips the security dummy data\r
+  and decodes the application layer.\r
+  Security implementation will follow when it has been implemented in the\r
+  Opc Ua stack. \r
+  \r
diff --git a/plugins/opcua/moduleinfo.h b/plugins/opcua/moduleinfo.h
new file mode 100644 (file)
index 0000000..118adb7
--- /dev/null
@@ -0,0 +1,17 @@
+/* Included *after* config.h, in order to re-define these macros */\r
+\r
+#ifdef PACKAGE\r
+#undef PACKAGE\r
+#endif\r
+\r
+/* Name of package */\r
+#define PACKAGE "opcua"\r
+\r
+\r
+#ifdef VERSION\r
+#undef VERSION\r
+#endif\r
+\r
+/* Version number of package */\r
+#define VERSION "0.0.1"\r
+\r
diff --git a/plugins/opcua/opcua.c b/plugins/opcua/opcua.c
new file mode 100644 (file)
index 0000000..76be7b1
--- /dev/null
@@ -0,0 +1,255 @@
+/******************************************************************************\r
+** $Id: opcua.c,v 1.5 2007/02/08 11:29:45 gergap Exp $\r
+**\r
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.\r
+** Web: http://www.ascolab.com\r
+** \r
+** This program is free software; you can redistribute it and/or\r
+** modify it under the terms of the GNU General Public License\r
+** as published by the Free Software Foundation; either version 2\r
+** of the License, or (at your option) any later version.\r
+** \r
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\r
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
+** \r
+** Project: OpcUa Wireshark Plugin\r
+**\r
+** Description: OpcUa Protocol Decoder.\r
+**\r
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>\r
+** Last change by: $Author: gergap $\r
+**\r
+******************************************************************************/\r
+\r
+#ifdef HAVE_CONFIG_H\r
+# include "config.h"\r
+#endif\r
+\r
+#include <gmodule.h>\r
+#include <epan/packet.h>\r
+#include <epan/emem.h>\r
+#include <epan/dissectors/packet-tcp.h>\r
+#include <epan/prefs.h>\r
+#include "ua_transport_layer.h"\r
+#include "ua_security_layer.h"\r
+#include "ua_application_layer.h"\r
+#include "opcua_complextypeparser.h"\r
+#include "opcua_serviceparser.h"\r
+#include "opcua_enumparser.h"\r
+#include "opcua_simpletypes.h"\r
+#include "opcua_hfindeces.h"\r
+\r
+/* forward reference */\r
+void proto_register_opcua (void);\r
+void proto_reg_handoff_opcua (void);\r
+static void dissect_opcua(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);\r
+static void dissect_opcua_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);\r
+\r
+/* declare parse function pointer */\r
+typedef void (*FctParse)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);\r
+\r
+static int proto_opcua = -1;\r
+/** Official IANA registered port for OPC UA Binary Protocol. */\r
+static int global_opcua_port = 4840;\r
+static dissector_handle_t opcua_handle;\r
+\r
+/** subtree types */\r
+gint ett_opcua_transport = -1;\r
+gint ett_opcua_extensionobject = -1;\r
+gint ett_opcua_nodeid = -1;\r
+\r
+/** OpcUa Transport Message Types */\r
+enum MessageType\r
+{\r
+    MSG_HELLO = 0,\r
+    MSG_ACKNOWLEDGE,\r
+    MSG_DISCONNECT,\r
+    MSG_DATA_LAST_CHUNK,\r
+    MSG_DATA,\r
+    MSG_ABORT,\r
+    MSG_ERROR,\r
+    MSG_INVALID,\r
+    MSG_UNKNOWN\r
+};\r
+\r
+/** OpcUa Transport Message Type Names */\r
+static char* g_szMessageTypes[] =\r
+{\r
+    "Hello message",\r
+    "Acknowledge message",\r
+    "Disconnect message",\r
+    "Data message, last chunk in message.",\r
+    "Data message, further chunks must follow.",\r
+    "Abort message",\r
+    "Error message",\r
+    "Invalid message",\r
+    "Unknown message"\r
+};\r
+\r
+\r
+/** Setup protocol subtree array */\r
+static gint *ett[] =\r
+{\r
+    &ett_opcua_transport,\r
+    &ett_opcua_extensionobject,\r
+    &ett_opcua_nodeid,\r
+};\r
+\r
+/** plugin entry functions.\r
+ * This registers the OpcUa protocol.\r
+ */\r
+void proto_register_opcua(void)\r
+{\r
+    module_t *opcua_module;\r
+    \r
+    if (proto_opcua == -1)\r
+    {\r
+        proto_opcua = proto_register_protocol(\r
+            "OpcUa Binary Protocol", /* name */\r
+            "OpcUa",                 /* short name */\r
+            "opcua"                  /* abbrev */\r
+            );\r
+    }\r
+    opcua_module = prefs_register_protocol(proto_opcua, proto_reg_handoff_opcua);\r
+    \r
+    registerTransportLayerTypes(proto_opcua);\r
+    registerSecurityLayerTypes(proto_opcua);\r
+    registerApplicationLayerTypes(proto_opcua);\r
+    registerSimpleTypes(proto_opcua);\r
+    registerEnumTypes(proto_opcua);\r
+    registerComplexTypes();\r
+    registerServiceTypes();\r
+    registerFieldTypes(proto_opcua);\r
+\r
+    proto_register_subtree_array(ett, array_length(ett));    \r
+}\r
+\r
+/** Register sub protocol. \r
+  * For TCP port 4840.\r
+  */\r
+void proto_reg_handoff_opcua(void)\r
+{\r
+    static int Initialized=FALSE;\r
+    \r
+    if (!Initialized)\r
+    {\r
+        opcua_handle = create_dissector_handle(dissect_opcua, proto_opcua);\r
+        dissector_add("tcp.port", global_opcua_port, opcua_handle);\r
+    }\r
+}\r
+\r
+/** header length that is needed to compute\r
+  * the pdu length.\r
+  * @see get_opcua_message_len\r
+  */\r
+#define FRAME_HEADER_LEN 8\r
+\r
+/** returns the length of an OpcUa message.\r
+  * This function reads the length information from\r
+  * the transport header.\r
+  */\r
+static guint get_opcua_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset)\r
+{\r
+    gint32 plen;\r
+\r
+    /* the message length starts at offset 4 */\r
+    plen = tvb_get_letohl(tvb, offset + 4);\r
+\r
+    return plen;\r
+}\r
+\r
+/** The main OpcUa dissector functions.\r
+  * It uses tcp_dissect_pdus from packet-tcp.h\r
+  * to reassemble the TCP data.\r
+  */\r
+static void dissect_opcua(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)\r
+{\r
+    tcp_dissect_pdus(tvb, pinfo, tree, TRUE, FRAME_HEADER_LEN,\r
+      get_opcua_message_len, dissect_opcua_message);\r
+}\r
+\r
+/** The OpcUa message dissector.\r
+  * This method dissects full OpcUa messages.\r
+  * It gets only called with reassembled data\r
+  * from tcp_dissect_pdus.\r
+  */\r
+static void dissect_opcua_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)\r
+{\r
+    FctParse pfctParse = NULL;\r
+    enum MessageType msgtype = MSG_INVALID;\r
+\r
+    if (check_col(pinfo->cinfo, COL_PROTOCOL))\r
+    {\r
+        col_set_str(pinfo->cinfo, COL_PROTOCOL, "OpcUa");\r
+    }\r
+\r
+    /* parse message type */\r
+    if (tvb->real_data[0] == 'U' && tvb->real_data[1] == 'A')\r
+    {\r
+        if (tvb->real_data[2] == 'T')\r
+        {\r
+            switch(tvb->real_data[3])\r
+            {\r
+            case 'H': msgtype = MSG_HELLO;\r
+                pfctParse = parseHello;\r
+                break;\r
+            case 'A': msgtype = MSG_ACKNOWLEDGE;\r
+                pfctParse = parseAcknowledge;\r
+                break;\r
+            case 'D': msgtype = MSG_DISCONNECT;\r
+                pfctParse = parseDisconnect;\r
+                break;\r
+            default: msgtype = MSG_INVALID;\r
+                break;\r
+            }                \r
+        }\r
+        else if (tvb->real_data[2] == 'M')\r
+        {\r
+            switch(tvb->real_data[3])\r
+            {\r
+            case 'G': msgtype = MSG_DATA_LAST_CHUNK;\r
+                pfctParse = parseData;\r
+                break;\r
+            case 'C': msgtype = MSG_DATA;\r
+                pfctParse = parseData;\r
+                break;\r
+            case 'A': msgtype = MSG_ABORT;\r
+                pfctParse = parseAbort;\r
+                break;\r
+            case 'E': msgtype = MSG_ERROR;\r
+                pfctParse = parseError;\r
+                break;\r
+            default: msgtype = MSG_INVALID;\r
+                break;\r
+            }                \r
+        }\r
+    }\r
+    else\r
+    {\r
+        msgtype = MSG_UNKNOWN;\r
+    }\r
+\r
+    /* Clear out stuff in the info column */\r
+    if(check_col(pinfo->cinfo, COL_INFO))\r
+    {\r
+        col_set_str(pinfo->cinfo, COL_INFO, g_szMessageTypes[msgtype]);\r
+    }\r
+\r
+    if (tree && pfctParse)\r
+    {\r
+        gint offset = 0;\r
+\r
+        /* we are being asked for details */\r
+        proto_item *ti = NULL;\r
+        proto_tree *transport_tree = NULL;\r
+\r
+        ti = proto_tree_add_item(tree, proto_opcua, tvb, 0, -1, FALSE);\r
+        transport_tree = proto_item_add_subtree(ti, ett_opcua_transport);\r
+\r
+        /* call the transport message dissector */\r
+        (*pfctParse)(transport_tree, tvb, &offset);\r
+\r
+    }\r
+}    \r
+\r
+\r
diff --git a/plugins/opcua/opcua_complextypeparser.c b/plugins/opcua/opcua_complextypeparser.c
new file mode 100644 (file)
index 0000000..6723353
--- /dev/null
@@ -0,0 +1,1749 @@
+/******************************************************************************
+** $Id$
+**
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+** 
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License
+** as published by the Free Software Foundation; either version 2
+** of the License, or (at your option) any later version.
+** 
+** 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 8.5.2007 18:53:26.
+** DON'T MODIFY THIS FILE!
+**
+******************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gmodule.h>
+#include <epan/packet.h>
+#include "opcua_complextypeparser.h"
+#include "opcua_enumparser.h"
+#include "opcua_simpletypes.h"
+#include "opcua_hfindeces.h"
+
+\r
+gint ett_opcua_ReferenceNode = -1;\r
+void parseReferenceNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReferenceNode", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReferenceNode);\r
+
+  parseNodeId(subtree, tvb, pOffset, "ReferenceTypeId");
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IsInverse);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_ServerIndex);
+  parseExpandedNodeId(subtree, tvb, pOffset, "TargetId");\r
+}\r
+\r
+gint ett_opcua_Node = -1;\r
+void parseNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : Node", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_Node);\r
+
+  parseNodeId(subtree, tvb, pOffset, "NodeId");
+  parseInt32(subtree, tvb, pOffset, hf_opcua_NodeClass);
+  parseQualifiedName(subtree, tvb, pOffset, "BrowseName");
+  parseLocalizedText(subtree, tvb, pOffset, "DisplayName");
+  parseLocalizedText(subtree, tvb, pOffset, "Description");
+  parseArrayComplex(subtree, tvb, pOffset, "References", parseReferenceNode);\r
+}\r
+\r
+gint ett_opcua_ObjectNode = -1;\r
+void parseObjectNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ObjectNode", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ObjectNode);\r
+  /* parse base class members */ 
+  parseNode(subtree, tvb, pOffset, "[Node]");
+  /* parse additional members */
+  parseByte(subtree, tvb, pOffset, hf_opcua_EventNotifier);\r
+}\r
+\r
+gint ett_opcua_ObjectTypeNode = -1;\r
+void parseObjectTypeNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ObjectTypeNode", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ObjectTypeNode);\r
+  /* parse base class members */ 
+  parseNode(subtree, tvb, pOffset, "[Node]");
+  /* parse additional members */
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IsAbstract);\r
+}\r
+\r
+gint ett_opcua_VariableNode = -1;\r
+void parseVariableNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : VariableNode", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_VariableNode);\r
+  /* parse base class members */ 
+  parseNode(subtree, tvb, pOffset, "[Node]");
+  /* parse additional members */
+  parseVariant(subtree, tvb, pOffset, "Value");
+  parseNodeId(subtree, tvb, pOffset, "DataType");
+  parseInt32(subtree, tvb, pOffset, hf_opcua_ArraySize);
+  parseByte(subtree, tvb, pOffset, hf_opcua_AccessLevel);
+  parseByte(subtree, tvb, pOffset, hf_opcua_UserAccessLevel);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_MinimumSamplingInterval);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_Historizing);\r
+}\r
+\r
+gint ett_opcua_VariableTypeNode = -1;\r
+void parseVariableTypeNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : VariableTypeNode", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_VariableTypeNode);\r
+  /* parse base class members */ 
+  parseNode(subtree, tvb, pOffset, "[Node]");
+  /* parse additional members */
+  parseVariant(subtree, tvb, pOffset, "Value");
+  parseNodeId(subtree, tvb, pOffset, "DataType");
+  parseInt32(subtree, tvb, pOffset, hf_opcua_ArraySize);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IsAbstract);\r
+}\r
+\r
+gint ett_opcua_ReferenceTypeNode = -1;\r
+void parseReferenceTypeNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReferenceTypeNode", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReferenceTypeNode);\r
+  /* parse base class members */ 
+  parseNode(subtree, tvb, pOffset, "[Node]");
+  /* parse additional members */
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IsAbstract);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_Symmetric);
+  parseLocalizedText(subtree, tvb, pOffset, "InverseName");\r
+}\r
+\r
+gint ett_opcua_MethodNode = -1;\r
+void parseMethodNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MethodNode", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MethodNode);\r
+  /* parse base class members */ 
+  parseNode(subtree, tvb, pOffset, "[Node]");
+  /* parse additional members */
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_Executable);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_UserExecutable);\r
+}\r
+\r
+gint ett_opcua_ViewNode = -1;\r
+void parseViewNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ViewNode", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ViewNode);\r
+  /* parse base class members */ 
+  parseNode(subtree, tvb, pOffset, "[Node]");
+  /* parse additional members */
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_ContainsNoLoops);
+  parseByte(subtree, tvb, pOffset, hf_opcua_EventNotifier);\r
+}\r
+\r
+gint ett_opcua_DataTypeNode = -1;\r
+void parseDataTypeNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DataTypeNode", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DataTypeNode);\r
+  /* parse base class members */ 
+  parseNode(subtree, tvb, pOffset, "[Node]");
+  /* parse additional members */
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IsAbstract);\r
+}\r
+\r
+gint ett_opcua_UriTableEntry = -1;\r
+void parseUriTableEntry(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : UriTableEntry", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_UriTableEntry);\r
+
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_Index);
+  parseString(subtree, tvb, pOffset, hf_opcua_Uri);\r
+}\r
+\r
+gint ett_opcua_NodeSet = -1;\r
+void parseNodeSet(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : NodeSet", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_NodeSet);\r
+
+  parseArrayComplex(subtree, tvb, pOffset, "NamespaceUris", parseUriTableEntry);
+  parseArrayComplex(subtree, tvb, pOffset, "ServerUris", parseUriTableEntry);
+  parseArrayComplex(subtree, tvb, pOffset, "Nodes", parseExtensionObject);\r
+}\r
+\r
+gint ett_opcua_Argument = -1;\r
+void parseArgument(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : Argument", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_Argument);\r
+
+  parseString(subtree, tvb, pOffset, hf_opcua_Name);
+  parseNodeId(subtree, tvb, pOffset, "DataType");
+  parseInt32(subtree, tvb, pOffset, hf_opcua_ArraySize);
+  parseLocalizedText(subtree, tvb, pOffset, "Description");\r
+}\r
+\r
+gint ett_opcua_Status = -1;\r
+void parseStatus(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : Status", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_Status);\r
+
+  parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode);
+  parseDiagnosticInfo(subtree, tvb, pOffset, "DiagnosticInfo");\r
+}\r
+\r
+gint ett_opcua_BaseEvent = -1;\r
+void parseBaseEvent(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BaseEvent", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BaseEvent);\r
+
+  parseByteString(subtree, tvb, pOffset, hf_opcua_EventId);
+  parseNodeId(subtree, tvb, pOffset, "EventType");
+  parseNodeId(subtree, tvb, pOffset, "SourceNode");
+  parseString(subtree, tvb, pOffset, hf_opcua_SourceName);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_Time);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_ReceiveTime);
+  parseLocalizedText(subtree, tvb, pOffset, "Message");
+  parseUInt16(subtree, tvb, pOffset, hf_opcua_Severity);\r
+}\r
+\r
+gint ett_opcua_SecurityPolicy = -1;\r
+void parseSecurityPolicy(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SecurityPolicy", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SecurityPolicy);\r
+
+  parseString(subtree, tvb, pOffset, hf_opcua_Uri);
+  parseString(subtree, tvb, pOffset, hf_opcua_Digest);
+  parseString(subtree, tvb, pOffset, hf_opcua_SymmetricSignature);
+  parseString(subtree, tvb, pOffset, hf_opcua_SymmetricKeyWrap);
+  parseString(subtree, tvb, pOffset, hf_opcua_SymmetricEncryption);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_SymmetricKeyLength);
+  parseString(subtree, tvb, pOffset, hf_opcua_AsymmetricSignature);
+  parseString(subtree, tvb, pOffset, hf_opcua_AsymmetricKeyWrap);
+  parseString(subtree, tvb, pOffset, hf_opcua_AsymmetricEncryption);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_MinimumAsymmetricKeyLength);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_MaximumAsymmetricKeyLength);
+  parseString(subtree, tvb, pOffset, hf_opcua_DerivedKey);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_DerivedEncryptionKeyLength);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_DerivedSignatureKeyLength);\r
+}\r
+\r
+gint ett_opcua_UserTokenPolicy = -1;\r
+void parseUserTokenPolicy(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : UserTokenPolicy", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_UserTokenPolicy);\r
+
+  parseUserTokenType(subtree, tvb, pOffset);
+  parseString(subtree, tvb, pOffset, hf_opcua_IssuerType);
+  parseString(subtree, tvb, pOffset, hf_opcua_IssuerUrl);\r
+}\r
+\r
+gint ett_opcua_ServerDescription = -1;\r
+void parseServerDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ServerDescription", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ServerDescription);\r
+
+  parseServerDescriptionType(subtree, tvb, pOffset);
+  parseString(subtree, tvb, pOffset, hf_opcua_ServerUri);
+  parseLocalizedText(subtree, tvb, pOffset, "ServerName");
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_DiscoveryUrls, parseString);\r
+}\r
+\r
+gint ett_opcua_EndpointDescription = -1;\r
+void parseEndpointDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EndpointDescription", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EndpointDescription);\r
+
+  parseServerDescription(subtree, tvb, pOffset, "Server");
+  parseString(subtree, tvb, pOffset, hf_opcua_EndpointUrl);
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ServerCertificate);
+  parseMessageSecurityMode(subtree, tvb, pOffset);
+  parseString(subtree, tvb, pOffset, hf_opcua_SecurityPolicyUri);
+  parseArrayComplex(subtree, tvb, pOffset, "UserIdentityTokens", parseUserTokenPolicy);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_SupportedProfiles, parseString);\r
+}\r
+\r
+gint ett_opcua_EndpointConfiguration = -1;\r
+void parseEndpointConfiguration(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EndpointConfiguration", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EndpointConfiguration);\r
+
+  parseInt32(subtree, tvb, pOffset, hf_opcua_SendTimeout);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_OperationTimeout);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_UseBinaryEncoding);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_MaxMessageSize);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_MaxArrayLength);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_MaxStringLength);\r
+}\r
+\r
+gint ett_opcua_UserIdentityToken = -1;\r
+void parseUserIdentityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : UserIdentityToken", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_UserIdentityToken);\r
\r
+}\r
+\r
+gint ett_opcua_UserNameIdentityToken = -1;\r
+void parseUserNameIdentityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : UserNameIdentityToken", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_UserNameIdentityToken);\r
+  /* parse base class members */ 
+  parseUserIdentityToken(subtree, tvb, pOffset, "[UserIdentityToken]");
+  /* parse additional members */
+  parseString(subtree, tvb, pOffset, hf_opcua_UserName);
+  parseString(subtree, tvb, pOffset, hf_opcua_Password);
+  parseString(subtree, tvb, pOffset, hf_opcua_HashAlgorithm);\r
+}\r
+\r
+gint ett_opcua_X509IdentityToken = -1;\r
+void parseX509IdentityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : X509IdentityToken", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_X509IdentityToken);\r
+  /* parse base class members */ 
+  parseUserIdentityToken(subtree, tvb, pOffset, "[UserIdentityToken]");
+  /* parse additional members */
+  parseByteString(subtree, tvb, pOffset, hf_opcua_CertificateData);\r
+}\r
+\r
+gint ett_opcua_WssIdentityToken = -1;\r
+void parseWssIdentityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : WssIdentityToken", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_WssIdentityToken);\r
+  /* parse base class members */ 
+  parseUserIdentityToken(subtree, tvb, pOffset, "[UserIdentityToken]");
+  /* parse additional members */
+  parseXmlElement(subtree, tvb, pOffset, hf_opcua_TokenData);\r
+}\r
+\r
+gint ett_opcua_SupportedProfile = -1;\r
+void parseSupportedProfile(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SupportedProfile", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SupportedProfile);\r
+
+  parseString(subtree, tvb, pOffset, hf_opcua_ProfileUri);
+  parseString(subtree, tvb, pOffset, hf_opcua_ProfileName);
+  parseComplianceLevel(subtree, tvb, pOffset);\r
+}\r
+\r
+gint ett_opcua_BuildInfo = -1;\r
+void parseBuildInfo(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BuildInfo", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BuildInfo);\r
+
+  parseString(subtree, tvb, pOffset, hf_opcua_ApplicationUri);
+  parseString(subtree, tvb, pOffset, hf_opcua_ManufacturerName);
+  parseString(subtree, tvb, pOffset, hf_opcua_ApplicationName);
+  parseString(subtree, tvb, pOffset, hf_opcua_SoftwareVersion);
+  parseString(subtree, tvb, pOffset, hf_opcua_BuildNumber);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_BuildDate);\r
+}\r
+\r
+gint ett_opcua_SoftwareCertificate = -1;\r
+void parseSoftwareCertificate(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SoftwareCertificate", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SoftwareCertificate);\r
+
+  parseBuildInfo(subtree, tvb, pOffset, "ServerInfo");
+  parseString(subtree, tvb, pOffset, hf_opcua_IssuedBy);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_IssuedDate);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_ExpirationDate);
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ApplicationCertificate);
+  parseString(subtree, tvb, pOffset, hf_opcua_IssuerCertificateThumbprint);
+  parseString(subtree, tvb, pOffset, hf_opcua_IssuerSignatureAlgorithm);
+  parseArrayComplex(subtree, tvb, pOffset, "SupportedProfiles", parseSupportedProfile);\r
+}\r
+\r
+gint ett_opcua_SignedSoftwareCertificate = -1;\r
+void parseSignedSoftwareCertificate(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SignedSoftwareCertificate", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SignedSoftwareCertificate);\r
+
+  parseByteString(subtree, tvb, pOffset, hf_opcua_CertificateData);
+  parseByteString(subtree, tvb, pOffset, hf_opcua_IssuerSignature);\r
+}\r
+\r
+gint ett_opcua_NodeAttributes = -1;\r
+void parseNodeAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : NodeAttributes", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_NodeAttributes);\r
+
+  parseLocalizedText(subtree, tvb, pOffset, "DisplayName");
+  parseLocalizedText(subtree, tvb, pOffset, "Description");\r
+}\r
+\r
+gint ett_opcua_ObjectAttributes = -1;\r
+void parseObjectAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ObjectAttributes", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ObjectAttributes);\r
+  /* parse base class members */ 
+  parseNodeAttributes(subtree, tvb, pOffset, "[NodeAttributes]");
+  /* parse additional members */
+  parseByte(subtree, tvb, pOffset, hf_opcua_EventNotifier);\r
+}\r
+\r
+gint ett_opcua_ObjectTypeAttributes = -1;\r
+void parseObjectTypeAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ObjectTypeAttributes", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ObjectTypeAttributes);\r
+  /* parse base class members */ 
+  parseNodeAttributes(subtree, tvb, pOffset, "[NodeAttributes]");
+  /* parse additional members */
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IsAbstract);\r
+}\r
+\r
+gint ett_opcua_VariableAttributes = -1;\r
+void parseVariableAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : VariableAttributes", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_VariableAttributes);\r
+  /* parse base class members */ 
+  parseNodeAttributes(subtree, tvb, pOffset, "[NodeAttributes]");
+  /* parse additional members */
+  parseVariant(subtree, tvb, pOffset, "Value");
+  parseNodeId(subtree, tvb, pOffset, "DataType");
+  parseInt32(subtree, tvb, pOffset, hf_opcua_ArraySize);
+  parseByte(subtree, tvb, pOffset, hf_opcua_AccessLevel);
+  parseByte(subtree, tvb, pOffset, hf_opcua_UserAccessLevel);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_MinimumSamplingInterval);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_Historizing);\r
+}\r
+\r
+gint ett_opcua_VariableTypeAttributes = -1;\r
+void parseVariableTypeAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : VariableTypeAttributes", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_VariableTypeAttributes);\r
+  /* parse base class members */ 
+  parseNodeAttributes(subtree, tvb, pOffset, "[NodeAttributes]");
+  /* parse additional members */
+  parseVariant(subtree, tvb, pOffset, "Value");
+  parseNodeId(subtree, tvb, pOffset, "DataType");
+  parseInt32(subtree, tvb, pOffset, hf_opcua_ArraySize);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IsAbstract);\r
+}\r
+\r
+gint ett_opcua_ReferenceTypeAttributes = -1;\r
+void parseReferenceTypeAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReferenceTypeAttributes", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReferenceTypeAttributes);\r
+  /* parse base class members */ 
+  parseNodeAttributes(subtree, tvb, pOffset, "[NodeAttributes]");
+  /* parse additional members */
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IsAbstract);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_Symmetric);
+  parseLocalizedText(subtree, tvb, pOffset, "InverseName");\r
+}\r
+\r
+gint ett_opcua_MethodAttributes = -1;\r
+void parseMethodAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MethodAttributes", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MethodAttributes);\r
+  /* parse base class members */ 
+  parseNodeAttributes(subtree, tvb, pOffset, "[NodeAttributes]");
+  /* parse additional members */
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_Executable);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_UserExecutable);\r
+}\r
+\r
+gint ett_opcua_ViewAttributes = -1;\r
+void parseViewAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ViewAttributes", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ViewAttributes);\r
+  /* parse base class members */ 
+  parseNodeAttributes(subtree, tvb, pOffset, "[NodeAttributes]");
+  /* parse additional members */
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_ContainsNoLoops);
+  parseByte(subtree, tvb, pOffset, hf_opcua_EventNotifier);\r
+}\r
+\r
+gint ett_opcua_AddNodesItem = -1;\r
+void parseAddNodesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : AddNodesItem", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddNodesItem);\r
+
+  parseExpandedNodeId(subtree, tvb, pOffset, "ParentNodeId");
+  parseNodeId(subtree, tvb, pOffset, "ReferenceTypeId");
+  parseExpandedNodeId(subtree, tvb, pOffset, "RequestedNewNodeId");
+  parseQualifiedName(subtree, tvb, pOffset, "BrowseName");
+  parseInt32(subtree, tvb, pOffset, hf_opcua_NodeClass);
+  parseExtensionObject(subtree, tvb, pOffset, "NodeAttributes");
+  parseExpandedNodeId(subtree, tvb, pOffset, "TypeDefinition");\r
+}\r
+\r
+gint ett_opcua_AddReferencesItem = -1;\r
+void parseAddReferencesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : AddReferencesItem", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddReferencesItem);\r
+
+  parseNodeId(subtree, tvb, pOffset, "SourceNodeId");
+  parseNodeId(subtree, tvb, pOffset, "ReferenceTypeId");
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IsForward);
+  parseString(subtree, tvb, pOffset, hf_opcua_TargetServerUri);
+  parseExpandedNodeId(subtree, tvb, pOffset, "TargetNodeId");
+  parseInt32(subtree, tvb, pOffset, hf_opcua_TargetNodeClass);\r
+}\r
+\r
+gint ett_opcua_DeleteNodesItem = -1;\r
+void parseDeleteNodesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DeleteNodesItem", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteNodesItem);\r
+
+  parseNodeId(subtree, tvb, pOffset, "NodeId");
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_DeleteTargetReferences);\r
+}\r
+\r
+gint ett_opcua_DeleteReferencesItem = -1;\r
+void parseDeleteReferencesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DeleteReferencesItem", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteReferencesItem);\r
+
+  parseNodeId(subtree, tvb, pOffset, "SourceNodeId");
+  parseNodeId(subtree, tvb, pOffset, "ReferenceTypeId");
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IsForward);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_ServerIndex);
+  parseExpandedNodeId(subtree, tvb, pOffset, "TargetNodeId");\r
+}\r
+\r
+gint ett_opcua_RedundantServerDataType = -1;\r
+void parseRedundantServerDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : RedundantServerDataType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RedundantServerDataType);\r
+
+  parseString(subtree, tvb, pOffset, hf_opcua_ServerId);
+  parseSByte(subtree, tvb, pOffset, hf_opcua_ServiceLevel);
+  parseServerState(subtree, tvb, pOffset);\r
+}\r
+\r
+gint ett_opcua_SamplingRateDiagnosticsDataType = -1;\r
+void parseSamplingRateDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SamplingRateDiagnosticsDataType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SamplingRateDiagnosticsDataType);\r
+
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SamplingRate);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SamplingErrorCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SampledMonitoredItemsCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_MaxSampledMonitoredItemsCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_DisabledMonitoredItemsSamplingCount);\r
+}\r
+\r
+gint ett_opcua_ServerDiagnosticsSummaryDataType = -1;\r
+void parseServerDiagnosticsSummaryDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ServerDiagnosticsSummaryDataType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ServerDiagnosticsSummaryDataType);\r
+
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_ServerViewCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_CurrentSessionCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_CumulatedSessionCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SecurityRejectedSessionCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RejectSessionCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SessionTimeoutCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SessionAbortCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SamplingRateCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_PublishingRateCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_CurrentSubscriptionCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_CumulatedSubscriptionCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SecurityRejectedRequestsCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RejectedRequestsCount);\r
+}\r
+\r
+gint ett_opcua_ServerStatusDataType = -1;\r
+void parseServerStatusDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ServerStatusDataType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ServerStatusDataType);\r
+
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_StartTime);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_CurrentTime);
+  parseServerState(subtree, tvb, pOffset);
+  parseBuildInfo(subtree, tvb, pOffset, "BuildInfo");\r
+}\r
+\r
+gint ett_opcua_ServiceCounterDataType = -1;\r
+void parseServiceCounterDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ServiceCounterDataType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ServiceCounterDataType);\r
+
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_TotalCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_UnauthorizedCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_ErrorCount);\r
+}\r
+\r
+gint ett_opcua_SessionDiagnosticsDataType = -1;\r
+void parseSessionDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SessionDiagnosticsDataType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SessionDiagnosticsDataType);\r
+
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SessionId);
+  parseString(subtree, tvb, pOffset, hf_opcua_ClientName);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_LocaleIds, parseString);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_ActualSessionTimeout);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_ClientConnectionTime);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_ClientLastContactTime);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_CurrentSubscriptionsCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_CurrentMonitoredItemsCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_CurrentPublishRequestsInQueue);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_CurrentPublishTimerExpirations);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_KeepAliveCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_CurrentRepublishRequestsInQueue);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_MaxRepublishRequestsInQueue);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RepublishCounter);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_PublishingCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_PublishingQueueOverflowCount);
+  parseServiceCounterDataType(subtree, tvb, pOffset, "ReadCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "HistoryReadCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "WriteCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "HistoryUpdateCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "CallCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "CreateMonitoredItemsCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "ModifyMonitoredItemsCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "SetMonitoringModeCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "SetTriggeringCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "DeleteMonitoredItemsCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "CreateSubscriptionCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "ModifySubscriptionCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "SetPublishingModeCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "PublishCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "RepublishCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "TransferSubscriptionCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "DeleteSubscriptionsCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "AddNodesCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "AddReferencesCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "DeleteNodesCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "DeleteReferencesCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "BrowseCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "BrowseNextCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "TranslateBrowsePathsToNodeIdsCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "QueryFirstCount");
+  parseServiceCounterDataType(subtree, tvb, pOffset, "QueryNextCount");\r
+}\r
+\r
+gint ett_opcua_SessionSecurityDiagnosticsDataType = -1;\r
+void parseSessionSecurityDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SessionSecurityDiagnosticsDataType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SessionSecurityDiagnosticsDataType);\r
+
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SessionId);
+  parseString(subtree, tvb, pOffset, hf_opcua_ClientUserIdOfSession);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_ClientUserIdHistory, parseString);
+  parseString(subtree, tvb, pOffset, hf_opcua_AuthenticationMechanism);
+  parseString(subtree, tvb, pOffset, hf_opcua_Encoding);
+  parseString(subtree, tvb, pOffset, hf_opcua_TransportProtocol);
+  parseString(subtree, tvb, pOffset, hf_opcua_SecurityPolicy);\r
+}\r
+\r
+gint ett_opcua_SubscriptionDiagnosticsDataType = -1;\r
+void parseSubscriptionDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SubscriptionDiagnosticsDataType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SubscriptionDiagnosticsDataType);\r
+
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SessionId);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_PublishingInterval);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_MaxKeepAliveCount);
+  parseByte(subtree, tvb, pOffset, hf_opcua_Priority);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_PublishingEnabled);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_ModifyCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_EnableCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_DisableCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RepublishRequestCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RepublishMessageRequestCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RepublishMessageCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_TransferRequestCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_TransferredToAltClientCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_TransferredToSameClientCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_PublishRequestCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_DataChangeNotificationsCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_EventNotificationsCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_NotificationsCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_LateStateCount);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_KeepAliveStateCount);\r
+}\r
+\r
+gint ett_opcua_Range = -1;\r
+void parseRange(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : Range", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_Range);\r
+
+  parseDouble(subtree, tvb, pOffset, hf_opcua_Low);
+  parseDouble(subtree, tvb, pOffset, hf_opcua_High);\r
+}\r
+\r
+gint ett_opcua_EUInformation = -1;\r
+void parseEUInformation(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EUInformation", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EUInformation);\r
+
+  parseString(subtree, tvb, pOffset, hf_opcua_NamespaceUri);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_UnitId);
+  parseLocalizedText(subtree, tvb, pOffset, "DisplayName");
+  parseLocalizedText(subtree, tvb, pOffset, "Description");\r
+}\r
+\r
+gint ett_opcua_Annotation = -1;\r
+void parseAnnotation(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : Annotation", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_Annotation);\r
+
+  parseString(subtree, tvb, pOffset, hf_opcua_Message);
+  parseString(subtree, tvb, pOffset, hf_opcua_UserName);
+  parseExtensionObject(subtree, tvb, pOffset, "UserIdentity");
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_AnnotationTime);\r
+}\r
+\r
+gint ett_opcua_BaseStructureDataType = -1;\r
+void parseBaseStructureDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BaseStructureDataType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BaseStructureDataType);\r
+
+  parseInt32(subtree, tvb, pOffset, hf_opcua_Id);
+  parseString(subtree, tvb, pOffset, hf_opcua_Name);\r
+}\r
+\r
+gint ett_opcua_DerivedStructureDataType = -1;\r
+void parseDerivedStructureDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DerivedStructureDataType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DerivedStructureDataType);\r
+  /* parse base class members */ 
+  parseBaseStructureDataType(subtree, tvb, pOffset, "[BaseStructureDataType]");
+  /* parse additional members */
+  parseString(subtree, tvb, pOffset, hf_opcua_Description);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_Timestamp);\r
+}\r
+\r
+gint ett_opcua_ScalarValuesDataType = -1;\r
+void parseScalarValuesDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ScalarValuesDataType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ScalarValuesDataType);\r
+
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_Boolean);
+  parseSByte(subtree, tvb, pOffset, hf_opcua_SByte);
+  parseByte(subtree, tvb, pOffset, hf_opcua_Byte);
+  parseInt16(subtree, tvb, pOffset, hf_opcua_Int16);
+  parseUInt16(subtree, tvb, pOffset, hf_opcua_UInt16);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_Int32);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_UInt32);
+  parseInt64(subtree, tvb, pOffset, hf_opcua_Int64);
+  parseUInt64(subtree, tvb, pOffset, hf_opcua_UInt64);
+  parseFloat(subtree, tvb, pOffset, hf_opcua_Float);
+  parseDouble(subtree, tvb, pOffset, hf_opcua_Double);
+  parseString(subtree, tvb, pOffset, hf_opcua_String);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_DateTime);
+  parseGuid(subtree, tvb, pOffset, hf_opcua_Guid);
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ByteString);
+  parseXmlElement(subtree, tvb, pOffset, hf_opcua_XmlElement);
+  parseNodeId(subtree, tvb, pOffset, "NodeId");
+  parseExpandedNodeId(subtree, tvb, pOffset, "ExpandedNodeId");
+  parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode);
+  parseDiagnosticInfo(subtree, tvb, pOffset, "DiagnosticInfo");
+  parseQualifiedName(subtree, tvb, pOffset, "QualifiedName");
+  parseLocalizedText(subtree, tvb, pOffset, "LocalizedText");
+  parseExtensionObject(subtree, tvb, pOffset, "ExtensionObject");
+  parseDataValue(subtree, tvb, pOffset, "DataValue");
+  parseVariant(subtree, tvb, pOffset, "Variant");
+  parseBaseStructureDataType(subtree, tvb, pOffset, "Structure");
+  parseColorsDataType(subtree, tvb, pOffset);\r
+}\r
+\r
+gint ett_opcua_ArrayValuesDataType = -1;\r
+void parseArrayValuesDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ArrayValuesDataType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ArrayValuesDataType);\r
+
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Boolean, parseBoolean);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_SByte, parseSByte);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Int16, parseInt16);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_UInt16, parseUInt16);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Int32, parseInt32);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_UInt32, parseUInt32);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Int64, parseInt64);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_UInt64, parseUInt64);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Float, parseFloat);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Double, parseDouble);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_String, parseString);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_DateTime, parseDateTime);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Guid, parseGuid);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_ByteString, parseByteString);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_XmlElement, parseXmlElement);
+  parseArrayComplex(subtree, tvb, pOffset, "NodeId", parseNodeId);
+  parseArrayComplex(subtree, tvb, pOffset, "ExpandedNodeId", parseExpandedNodeId);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_StatusCode, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfo", parseDiagnosticInfo);
+  parseArrayComplex(subtree, tvb, pOffset, "QualifiedName", parseQualifiedName);
+  parseArrayComplex(subtree, tvb, pOffset, "LocalizedText", parseLocalizedText);
+  parseArrayComplex(subtree, tvb, pOffset, "ExtensionObject", parseExtensionObject);
+  parseArrayComplex(subtree, tvb, pOffset, "DataValue", parseDataValue);
+  parseArrayComplex(subtree, tvb, pOffset, "Variant", parseVariant);
+  parseArrayComplex(subtree, tvb, pOffset, "Structure", parseBaseStructureDataType);
+  parseArrayEnum(subtree, tvb, pOffset, parseColorsDataType);\r
+}\r
+\r
+gint ett_opcua_RequestHeader = -1;\r
+void parseRequestHeader(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : RequestHeader", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RequestHeader);\r
+
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SessionId);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_Timestamp);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RequestId);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_ReturnDiagnostics);
+  parseString(subtree, tvb, pOffset, hf_opcua_AuditLogEntryId);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_TimeoutHint);
+  parseExtensionObject(subtree, tvb, pOffset, "AdditionalHeaders");\r
+}\r
+\r
+gint ett_opcua_ResponseHeader = -1;\r
+void parseResponseHeader(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ResponseHeader", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ResponseHeader);\r
+
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SessionId);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_Timestamp);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RequestId);
+  parseStatusCode(subtree, tvb, pOffset, hf_opcua_ServiceResult);
+  parseDiagnosticInfo(subtree, tvb, pOffset, "ServiceDiagnostics");
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_StringTable, parseString);
+  parseExtensionObject(subtree, tvb, pOffset, "AdditionalHeaders");\r
+}\r
+\r
+gint ett_opcua_ServiceFault = -1;\r
+void parseServiceFault(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ServiceFault", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ServiceFault);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");\r
+}\r
+\r
+gint ett_opcua_ComplexTestType = -1;\r
+void parseComplexTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ComplexTestType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ComplexTestType);\r
+
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_Value1);
+  parseArrayEnum(subtree, tvb, pOffset, parseEnumeratedTestType);\r
+}\r
+\r
+gint ett_opcua_BaseTestType = -1;\r
+void parseBaseTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BaseTestType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BaseTestType);\r
+
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_Value1);\r
+}\r
+\r
+gint ett_opcua_DerivedTestType = -1;\r
+void parseDerivedTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DerivedTestType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DerivedTestType);\r
+  /* parse base class members */ 
+  parseBaseTestType(subtree, tvb, pOffset, "[BaseTestType]");
+  /* parse additional members */
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_Value2);\r
+}\r
+\r
+gint ett_opcua_ScalarTestType = -1;\r
+void parseScalarTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ScalarTestType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ScalarTestType);\r
+
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_Boolean);
+  parseSByte(subtree, tvb, pOffset, hf_opcua_SByte);
+  parseByte(subtree, tvb, pOffset, hf_opcua_Byte);
+  parseInt16(subtree, tvb, pOffset, hf_opcua_Int16);
+  parseUInt16(subtree, tvb, pOffset, hf_opcua_UInt16);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_Int32);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_UInt32);
+  parseInt64(subtree, tvb, pOffset, hf_opcua_Int64);
+  parseUInt64(subtree, tvb, pOffset, hf_opcua_UInt64);
+  parseFloat(subtree, tvb, pOffset, hf_opcua_Float);
+  parseDouble(subtree, tvb, pOffset, hf_opcua_Double);
+  parseString(subtree, tvb, pOffset, hf_opcua_String);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_DateTime);
+  parseGuid(subtree, tvb, pOffset, hf_opcua_Guid);
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ByteString);
+  parseXmlElement(subtree, tvb, pOffset, hf_opcua_XmlElement);
+  parseNodeId(subtree, tvb, pOffset, "NodeId");
+  parseExpandedNodeId(subtree, tvb, pOffset, "ExpandedNodeId");
+  parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode);
+  parseDiagnosticInfo(subtree, tvb, pOffset, "DiagnosticInfo");
+  parseQualifiedName(subtree, tvb, pOffset, "QualifiedName");
+  parseLocalizedText(subtree, tvb, pOffset, "LocalizedText");
+  parseExtensionObject(subtree, tvb, pOffset, "ExtensionObject");
+  parseDataValue(subtree, tvb, pOffset, "DataValue");
+  parseVariant(subtree, tvb, pOffset, "Variant");
+  parseComplexTestType(subtree, tvb, pOffset, "ComplexValue");
+  parseEnumeratedTestType(subtree, tvb, pOffset);\r
+}\r
+\r
+gint ett_opcua_ArrayTestType = -1;\r
+void parseArrayTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ArrayTestType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ArrayTestType);\r
+
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Booleans, parseBoolean);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_SBytes, parseSByte);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Int16s, parseInt16);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_UInt16s, parseUInt16);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Int32s, parseInt32);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_UInt32s, parseUInt32);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Int64s, parseInt64);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_UInt64s, parseUInt64);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Floats, parseFloat);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Doubles, parseDouble);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Strings, parseString);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_DateTimes, parseDateTime);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Guids, parseGuid);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_ByteStrings, parseByteString);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_XmlElements, parseXmlElement);
+  parseArrayComplex(subtree, tvb, pOffset, "NodeIds", parseNodeId);
+  parseArrayComplex(subtree, tvb, pOffset, "ExpandedNodeIds", parseExpandedNodeId);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_StatusCodes, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);
+  parseArrayComplex(subtree, tvb, pOffset, "QualifiedNames", parseQualifiedName);
+  parseArrayComplex(subtree, tvb, pOffset, "LocalizedTexts", parseLocalizedText);
+  parseArrayComplex(subtree, tvb, pOffset, "ExtensionObjects", parseExtensionObject);
+  parseArrayComplex(subtree, tvb, pOffset, "DataValues", parseDataValue);
+  parseArrayComplex(subtree, tvb, pOffset, "Variants", parseVariant);
+  parseArrayComplex(subtree, tvb, pOffset, "ComplexValues", parseComplexTestType);
+  parseArrayEnum(subtree, tvb, pOffset, parseEnumeratedTestType);\r
+}\r
+\r
+gint ett_opcua_CompositeTestType = -1;\r
+void parseCompositeTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : CompositeTestType", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CompositeTestType);\r
+
+  parseScalarTestType(subtree, tvb, pOffset, "Input1");
+  parseArrayTestType(subtree, tvb, pOffset, "Input2");\r
+}\r
+\r
+gint ett_opcua_RegisteredServer = -1;\r
+void parseRegisteredServer(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : RegisteredServer", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RegisteredServer);\r
+
+  parseServerDescriptionType(subtree, tvb, pOffset);
+  parseString(subtree, tvb, pOffset, hf_opcua_ServerUri);
+  parseArrayComplex(subtree, tvb, pOffset, "ServerNames", parseLocalizedText);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_DiscoveryUrls, parseString);
+  parseString(subtree, tvb, pOffset, hf_opcua_SemaphoreFilePath);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IsOnline);\r
+}\r
+\r
+gint ett_opcua_ChannelSecurityToken = -1;\r
+void parseChannelSecurityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ChannelSecurityToken", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ChannelSecurityToken);\r
+
+  parseGuid(subtree, tvb, pOffset, hf_opcua_ChannelId);
+  parseString(subtree, tvb, pOffset, hf_opcua_TokenId);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_CreatedAt);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_RevisedLifetime);\r
+}\r
+\r
+gint ett_opcua_SignatureData = -1;\r
+void parseSignatureData(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SignatureData", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SignatureData);\r
+
+  parseString(subtree, tvb, pOffset, hf_opcua_Algorithm);
+  parseByteString(subtree, tvb, pOffset, hf_opcua_Signature);\r
+}\r
+\r
+gint ett_opcua_AddNodesResult = -1;\r
+void parseAddNodesResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : AddNodesResult", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddNodesResult);\r
+
+  parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode);
+  parseNodeId(subtree, tvb, pOffset, "AddedNodeId");\r
+}\r
+\r
+gint ett_opcua_BrowsePropertiesPropertyResult = -1;\r
+void parseBrowsePropertiesPropertyResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BrowsePropertiesPropertyResult", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowsePropertiesPropertyResult);\r
+
+  parseQualifiedName(subtree, tvb, pOffset, "PropertyName");
+  parseLocalizedText(subtree, tvb, pOffset, "PropertyDisplayName");
+  parseNodeId(subtree, tvb, pOffset, "PropertyNodeId");
+  parseStatusCode(subtree, tvb, pOffset, hf_opcua_PropertyStatusCode);\r
+}\r
+\r
+gint ett_opcua_BrowsePropertiesResult = -1;\r
+void parseBrowsePropertiesResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BrowsePropertiesResult", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowsePropertiesResult);\r
+
+  parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "PropertyResults", parseBrowsePropertiesPropertyResult);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_ReferenceDescription = -1;\r
+void parseReferenceDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReferenceDescription", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReferenceDescription);\r
+
+  parseNodeId(subtree, tvb, pOffset, "ReferenceTypeId");
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IsForward);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_ServerIndex);
+  parseExpandedNodeId(subtree, tvb, pOffset, "NodeId");
+  parseQualifiedName(subtree, tvb, pOffset, "BrowseName");
+  parseLocalizedText(subtree, tvb, pOffset, "DisplayName");
+  parseInt32(subtree, tvb, pOffset, hf_opcua_NodeClass);
+  parseExpandedNodeId(subtree, tvb, pOffset, "TypeDefinition");\r
+}\r
+\r
+gint ett_opcua_ViewDescription = -1;\r
+void parseViewDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ViewDescription", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ViewDescription);\r
+
+  parseNodeId(subtree, tvb, pOffset, "ViewId");
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_Timestamp);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_ViewVersion);\r
+}\r
+\r
+gint ett_opcua_BrowsePath = -1;\r
+void parseBrowsePath(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BrowsePath", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowsePath);\r
+
+  parseNodeId(subtree, tvb, pOffset, "StartingNode");
+  parseString(subtree, tvb, pOffset, hf_opcua_RelativePath);\r
+}\r
+\r
+gint ett_opcua_TranslateBrowsePathResult = -1;\r
+void parseTranslateBrowsePathResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : TranslateBrowsePathResult", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TranslateBrowsePathResult);\r
+
+  parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "MatchingNodeIds", parseNodeId);\r
+}\r
+\r
+gint ett_opcua_AttributeDescription = -1;\r
+void parseAttributeDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : AttributeDescription", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AttributeDescription);\r
+
+  parseString(subtree, tvb, pOffset, hf_opcua_RelativePath);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_AttributeId);
+  parseString(subtree, tvb, pOffset, hf_opcua_IndexRange);\r
+}\r
+\r
+gint ett_opcua_NodeTypeDescription = -1;\r
+void parseNodeTypeDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : NodeTypeDescription", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_NodeTypeDescription);\r
+
+  parseNodeId(subtree, tvb, pOffset, "TypeDefinitionNode");
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IncludeSubTypes);
+  parseArrayComplex(subtree, tvb, pOffset, "AttributesToReturn", parseAttributeDescription);\r
+}\r
+\r
+gint ett_opcua_QueryDataSet = -1;\r
+void parseQueryDataSet(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : QueryDataSet", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryDataSet);\r
+
+  parseExpandedNodeId(subtree, tvb, pOffset, "NodeId");
+  parseNodeId(subtree, tvb, pOffset, "TypeDefinitionNodeId");
+  parseArrayComplex(subtree, tvb, pOffset, "Values", parseVariant);\r
+}\r
+\r
+gint ett_opcua_NodeReference = -1;\r
+void parseNodeReference(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : NodeReference", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_NodeReference);\r
+
+  parseNodeId(subtree, tvb, pOffset, "NodeId");
+  parseNodeId(subtree, tvb, pOffset, "ReferenceTypeId");
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IsForward);
+  parseArrayComplex(subtree, tvb, pOffset, "ReferencedNodeIds", parseNodeId);\r
+}\r
+\r
+gint ett_opcua_ContentFilterElement = -1;\r
+void parseContentFilterElement(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ContentFilterElement", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ContentFilterElement);\r
+
+  parseFilterOperator(subtree, tvb, pOffset);
+  parseArrayComplex(subtree, tvb, pOffset, "FilterOperands", parseExtensionObject);\r
+}\r
+\r
+gint ett_opcua_ContentFilter = -1;\r
+void parseContentFilter(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ContentFilter", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ContentFilter);\r
+
+  parseArrayComplex(subtree, tvb, pOffset, "Elements", parseContentFilterElement);\r
+}\r
+\r
+gint ett_opcua_FilterOperand = -1;\r
+void parseFilterOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : FilterOperand", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_FilterOperand);\r
\r
+}\r
+\r
+gint ett_opcua_ElementOperand = -1;\r
+void parseElementOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ElementOperand", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ElementOperand);\r
+  /* parse base class members */ 
+  parseFilterOperand(subtree, tvb, pOffset, "[FilterOperand]");
+  /* parse additional members */
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_Index);\r
+}\r
+\r
+gint ett_opcua_LiteralOperand = -1;\r
+void parseLiteralOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : LiteralOperand", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_LiteralOperand);\r
+  /* parse base class members */ 
+  parseFilterOperand(subtree, tvb, pOffset, "[FilterOperand]");
+  /* parse additional members */
+  parseVariant(subtree, tvb, pOffset, "Value");\r
+}\r
+\r
+gint ett_opcua_AttributeOperand = -1;\r
+void parseAttributeOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : AttributeOperand", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AttributeOperand);\r
+  /* parse base class members */ 
+  parseFilterOperand(subtree, tvb, pOffset, "[FilterOperand]");
+  /* parse additional members */
+  parseNodeId(subtree, tvb, pOffset, "NodeId");
+  parseString(subtree, tvb, pOffset, hf_opcua_Alias);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_AttributeId);
+  parseString(subtree, tvb, pOffset, hf_opcua_IndexRange);\r
+}\r
+\r
+gint ett_opcua_PropertyOperand = -1;\r
+void parsePropertyOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : PropertyOperand", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_PropertyOperand);\r
+  /* parse base class members */ 
+  parseFilterOperand(subtree, tvb, pOffset, "[FilterOperand]");
+  /* parse additional members */
+  parseNodeId(subtree, tvb, pOffset, "NodeId");
+  parseString(subtree, tvb, pOffset, hf_opcua_Alias);
+  parseQualifiedName(subtree, tvb, pOffset, "Property");
+  parseString(subtree, tvb, pOffset, hf_opcua_IndexRange);\r
+}\r
+\r
+gint ett_opcua_ContentFilterResult = -1;\r
+void parseContentFilterResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ContentFilterResult", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ContentFilterResult);\r
+
+  parseStatusCode(subtree, tvb, pOffset, hf_opcua_Result);
+  parseDiagnosticInfo(subtree, tvb, pOffset, "DiagnosticInfo");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_IndexOfInvalidElement);\r
+}\r
+\r
+gint ett_opcua_QueryResult = -1;\r
+void parseQueryResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : QueryResult", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryResult);\r
+
+  parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_AttributeStatusCodes, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "AttributeDiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_ReadValueId = -1;\r
+void parseReadValueId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReadValueId", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadValueId);\r
+
+  parseNodeId(subtree, tvb, pOffset, "NodeId");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_AttributeId);
+  parseString(subtree, tvb, pOffset, hf_opcua_IndexRange);
+  parseQualifiedName(subtree, tvb, pOffset, "Encoding");\r
+}\r
+\r
+gint ett_opcua_HistoryReadValueId = -1;\r
+void parseHistoryReadValueId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : HistoryReadValueId", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryReadValueId);\r
+
+  parseNodeId(subtree, tvb, pOffset, "NodeId");
+  parseQualifiedName(subtree, tvb, pOffset, "Encoding");
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ContinuationPoint);\r
+}\r
+\r
+gint ett_opcua_HistoryReadResult = -1;\r
+void parseHistoryReadResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : HistoryReadResult", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryReadResult);\r
+
+  parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode);
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ContinuationPoint);
+  parseExtensionObject(subtree, tvb, pOffset, "HistoryData");\r
+}\r
+\r
+gint ett_opcua_MonitoringFilter = -1;\r
+void parseMonitoringFilter(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoringFilter", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoringFilter);\r
\r
+}\r
+\r
+gint ett_opcua_EventFilter = -1;\r
+void parseEventFilter(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EventFilter", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EventFilter);\r
+  /* parse base class members */ 
+  parseMonitoringFilter(subtree, tvb, pOffset, "[MonitoringFilter]");
+  /* parse additional members */
+  parseArrayComplex(subtree, tvb, pOffset, "SelectClauses", parseNodeId);
+  parseContentFilter(subtree, tvb, pOffset, "WhereClause");\r
+}\r
+\r
+gint ett_opcua_ReadEventDetails = -1;\r
+void parseReadEventDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReadEventDetails", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadEventDetails);\r
+
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_NumValuesPerNode);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_StartTime);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_EndTime);
+  parseEventFilter(subtree, tvb, pOffset, "Filter");\r
+}\r
+\r
+gint ett_opcua_ReadRawModifiedDetails = -1;\r
+void parseReadRawModifiedDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReadRawModifiedDetails", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadRawModifiedDetails);\r
+
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IsReadModified);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_StartTime);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_EndTime);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_NumValuesPerNode);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_ReturnBounds);\r
+}\r
+\r
+gint ett_opcua_ReadProcessedDetails = -1;\r
+void parseReadProcessedDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReadProcessedDetails", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadProcessedDetails);\r
+
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_StartTime);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_EndTime);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_ResampleInterval);
+  parseNodeId(subtree, tvb, pOffset, "AggregateType");\r
+}\r
+\r
+gint ett_opcua_ReadAtTimeDetails = -1;\r
+void parseReadAtTimeDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReadAtTimeDetails", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadAtTimeDetails);\r
+
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_ReqTimes, parseDateTime);\r
+}\r
+\r
+gint ett_opcua_HistoryData = -1;\r
+void parseHistoryData(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : HistoryData", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryData);\r
+
+  parseArrayComplex(subtree, tvb, pOffset, "DataValues", parseDataValue);\r
+}\r
+\r
+gint ett_opcua_EventFieldList = -1;\r
+void parseEventFieldList(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EventFieldList", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EventFieldList);\r
+
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_ClientHandle);
+  parseArrayComplex(subtree, tvb, pOffset, "EventFields", parseVariant);\r
+}\r
+\r
+gint ett_opcua_EventNotification = -1;\r
+void parseEventNotification(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EventNotification", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EventNotification);\r
+
+  parseArrayComplex(subtree, tvb, pOffset, "Events", parseEventFieldList);\r
+}\r
+\r
+gint ett_opcua_HistoryEvent = -1;\r
+void parseHistoryEvent(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : HistoryEvent", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryEvent);\r
+
+  parseArrayComplex(subtree, tvb, pOffset, "Notifications", parseEventNotification);\r
+}\r
+\r
+gint ett_opcua_WriteValue = -1;\r
+void parseWriteValue(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : WriteValue", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_WriteValue);\r
+
+  parseNodeId(subtree, tvb, pOffset, "NodeId");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_AttributeId);
+  parseString(subtree, tvb, pOffset, hf_opcua_IndexRange);
+  parseDataValue(subtree, tvb, pOffset, "Value");\r
+}\r
+\r
+gint ett_opcua_InsertReplaceDetails = -1;\r
+void parseInsertReplaceDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : InsertReplaceDetails", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_InsertReplaceDetails);\r
+
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_PerformInsert);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_PerformReplace);
+  parseNodeId(subtree, tvb, pOffset, "NodeId");
+  parseHistoryData(subtree, tvb, pOffset, "UpdateValue");\r
+}\r
+\r
+gint ett_opcua_InsertEventDetails = -1;\r
+void parseInsertEventDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : InsertEventDetails", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_InsertEventDetails);\r
+
+  parseHistoryEvent(subtree, tvb, pOffset, "HistoryEvent");\r
+}\r
+\r
+gint ett_opcua_DeleteRawModifiedDetails = -1;\r
+void parseDeleteRawModifiedDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DeleteRawModifiedDetails", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteRawModifiedDetails);\r
+
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IsDeleteModified);
+  parseNodeId(subtree, tvb, pOffset, "NodeId");
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_StartTime);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_EndTime);\r
+}\r
+\r
+gint ett_opcua_DeleteAtTimeDetails = -1;\r
+void parseDeleteAtTimeDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DeleteAtTimeDetails", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteAtTimeDetails);\r
+
+  parseNodeId(subtree, tvb, pOffset, "NodeId");
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_ReqTimes, parseDateTime);\r
+}\r
+\r
+gint ett_opcua_DeleteEventDetails = -1;\r
+void parseDeleteEventDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DeleteEventDetails", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteEventDetails);\r
+
+  parseEventFilter(subtree, tvb, pOffset, "EventFilter");
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_StartTime);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_EndTime);\r
+}\r
+\r
+gint ett_opcua_HistoryUpdateResult = -1;\r
+void parseHistoryUpdateResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : HistoryUpdateResult", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryUpdateResult);\r
+
+  parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_OperationResult, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_CallRequestItem = -1;\r
+void parseCallRequestItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : CallRequestItem", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CallRequestItem);\r
+
+  parseNodeId(subtree, tvb, pOffset, "ObjectId");
+  parseNodeId(subtree, tvb, pOffset, "MethodId");
+  parseArrayComplex(subtree, tvb, pOffset, "InputArguments", parseVariant);\r
+}\r
+\r
+gint ett_opcua_CallResultItem = -1;\r
+void parseCallResultItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : CallResultItem", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CallResultItem);\r
+
+  parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_InputArgumentResults, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "InputArgumentDiagnosticInfos", parseDiagnosticInfo);
+  parseArrayComplex(subtree, tvb, pOffset, "OutputArguments", parseVariant);\r
+}\r
+\r
+gint ett_opcua_DataChangeFilter = -1;\r
+void parseDataChangeFilter(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DataChangeFilter", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DataChangeFilter);\r
+  /* parse base class members */ 
+  parseMonitoringFilter(subtree, tvb, pOffset, "[MonitoringFilter]");
+  /* parse additional members */
+  parseDataChangeTrigger(subtree, tvb, pOffset);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_DeadbandType);
+  parseDouble(subtree, tvb, pOffset, hf_opcua_DeadbandValue);\r
+}\r
+\r
+gint ett_opcua_MonitoringFilterResult = -1;\r
+void parseMonitoringFilterResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoringFilterResult", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoringFilterResult);\r
\r
+}\r
+\r
+gint ett_opcua_EventFilterResult = -1;\r
+void parseEventFilterResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EventFilterResult", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EventFilterResult);\r
+  /* parse base class members */ 
+  parseMonitoringFilterResult(subtree, tvb, pOffset, "[MonitoringFilterResult]");
+  /* parse additional members */
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_SelectClauseResults, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "SelectClauseDiagnosticInfos", parseDiagnosticInfo);
+  parseContentFilterResult(subtree, tvb, pOffset, "WhereClauseResult");\r
+}\r
+\r
+gint ett_opcua_MonitoringAttributes = -1;\r
+void parseMonitoringAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoringAttributes", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoringAttributes);\r
+
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_ClientHandle);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_SamplingInterval);
+  parseExtensionObject(subtree, tvb, pOffset, "Filter");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_QueueSize);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_DiscardOldest);\r
+}\r
+\r
+gint ett_opcua_MonitoredItemCreateRequest = -1;\r
+void parseMonitoredItemCreateRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoredItemCreateRequest", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoredItemCreateRequest);\r
+
+  parseReadValueId(subtree, tvb, pOffset, "ItemToMonitor");
+  parseMonitoringMode(subtree, tvb, pOffset);
+  parseMonitoringAttributes(subtree, tvb, pOffset, "RequestedAttributes");\r
+}\r
+\r
+gint ett_opcua_MonitoredItemCreateResult = -1;\r
+void parseMonitoredItemCreateResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoredItemCreateResult", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoredItemCreateResult);\r
+
+  parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_MonitoredItemId);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_RevisedSamplingInterval);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RevisedQueueSize);
+  parseExtensionObject(subtree, tvb, pOffset, "FilterResult");\r
+}\r
+\r
+gint ett_opcua_MonitoredItemModifyRequest = -1;\r
+void parseMonitoredItemModifyRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoredItemModifyRequest", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoredItemModifyRequest);\r
+
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_MonitorItemId);
+  parseMonitoringAttributes(subtree, tvb, pOffset, "RequestedAttributes");\r
+}\r
+\r
+gint ett_opcua_MonitoredItemModifyResult = -1;\r
+void parseMonitoredItemModifyResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoredItemModifyResult", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoredItemModifyResult);\r
+
+  parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_RevisedSamplingInterval);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RevisedQueueSize);
+  parseExtensionObject(subtree, tvb, pOffset, "FilterResult");\r
+}\r
+\r
+gint ett_opcua_SubscriptionAcknowledgement = -1;\r
+void parseSubscriptionAcknowledgement(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SubscriptionAcknowledgement", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SubscriptionAcknowledgement);\r
+
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SequenceNumber);\r
+}\r
+\r
+gint ett_opcua_NotificationMessage = -1;\r
+void parseNotificationMessage(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : NotificationMessage", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_NotificationMessage);\r
+
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SequenceNumber);
+  parseDateTime(subtree, tvb, pOffset, hf_opcua_PublishTime);
+  parseArrayComplex(subtree, tvb, pOffset, "NotificationData", parseExtensionObject);\r
+}\r
+\r
+gint ett_opcua_MonitoredItemNotification = -1;\r
+void parseMonitoredItemNotification(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoredItemNotification", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoredItemNotification);\r
+
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_ClientHandle);
+  parseDataValue(subtree, tvb, pOffset, "Value");\r
+}\r
+\r
+gint ett_opcua_DataChangeNotification = -1;\r
+void parseDataChangeNotification(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DataChangeNotification", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DataChangeNotification);\r
+
+  parseArrayComplex(subtree, tvb, pOffset, "MonitoredItems", parseMonitoredItemNotification);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_TransferResult = -1;\r
+void parseTransferResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : TransferResult", szFieldName);\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TransferResult);\r
+
+  parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_AvailableSequenceNumbersRanges, parseString);\r
+}\r
+
+/** Setup protocol subtree array */
+static gint *ett[] =
+{
+  &ett_opcua_ReferenceNode,
+  &ett_opcua_Node,
+  &ett_opcua_ObjectNode,
+  &ett_opcua_ObjectTypeNode,
+  &ett_opcua_VariableNode,
+  &ett_opcua_VariableTypeNode,
+  &ett_opcua_ReferenceTypeNode,
+  &ett_opcua_MethodNode,
+  &ett_opcua_ViewNode,
+  &ett_opcua_DataTypeNode,
+  &ett_opcua_UriTableEntry,
+  &ett_opcua_NodeSet,
+  &ett_opcua_Argument,
+  &ett_opcua_Status,
+  &ett_opcua_BaseEvent,
+  &ett_opcua_SecurityPolicy,
+  &ett_opcua_UserTokenPolicy,
+  &ett_opcua_ServerDescription,
+  &ett_opcua_EndpointDescription,
+  &ett_opcua_EndpointConfiguration,
+  &ett_opcua_UserIdentityToken,
+  &ett_opcua_UserNameIdentityToken,
+  &ett_opcua_X509IdentityToken,
+  &ett_opcua_WssIdentityToken,
+  &ett_opcua_SupportedProfile,
+  &ett_opcua_BuildInfo,
+  &ett_opcua_SoftwareCertificate,
+  &ett_opcua_SignedSoftwareCertificate,
+  &ett_opcua_NodeAttributes,
+  &ett_opcua_ObjectAttributes,
+  &ett_opcua_ObjectTypeAttributes,
+  &ett_opcua_VariableAttributes,
+  &ett_opcua_VariableTypeAttributes,
+  &ett_opcua_ReferenceTypeAttributes,
+  &ett_opcua_MethodAttributes,
+  &ett_opcua_ViewAttributes,
+  &ett_opcua_AddNodesItem,
+  &ett_opcua_AddReferencesItem,
+  &ett_opcua_DeleteNodesItem,
+  &ett_opcua_DeleteReferencesItem,
+  &ett_opcua_RedundantServerDataType,
+  &ett_opcua_SamplingRateDiagnosticsDataType,
+  &ett_opcua_ServerDiagnosticsSummaryDataType,
+  &ett_opcua_ServerStatusDataType,
+  &ett_opcua_ServiceCounterDataType,
+  &ett_opcua_SessionDiagnosticsDataType,
+  &ett_opcua_SessionSecurityDiagnosticsDataType,
+  &ett_opcua_SubscriptionDiagnosticsDataType,
+  &ett_opcua_Range,
+  &ett_opcua_EUInformation,
+  &ett_opcua_Annotation,
+  &ett_opcua_BaseStructureDataType,
+  &ett_opcua_DerivedStructureDataType,
+  &ett_opcua_ScalarValuesDataType,
+  &ett_opcua_ArrayValuesDataType,
+  &ett_opcua_RequestHeader,
+  &ett_opcua_ResponseHeader,
+  &ett_opcua_ServiceFault,
+  &ett_opcua_ComplexTestType,
+  &ett_opcua_BaseTestType,
+  &ett_opcua_DerivedTestType,
+  &ett_opcua_ScalarTestType,
+  &ett_opcua_ArrayTestType,
+  &ett_opcua_CompositeTestType,
+  &ett_opcua_RegisteredServer,
+  &ett_opcua_ChannelSecurityToken,
+  &ett_opcua_SignatureData,
+  &ett_opcua_AddNodesResult,
+  &ett_opcua_BrowsePropertiesPropertyResult,
+  &ett_opcua_BrowsePropertiesResult,
+  &ett_opcua_ReferenceDescription,
+  &ett_opcua_ViewDescription,
+  &ett_opcua_BrowsePath,
+  &ett_opcua_TranslateBrowsePathResult,
+  &ett_opcua_AttributeDescription,
+  &ett_opcua_NodeTypeDescription,
+  &ett_opcua_QueryDataSet,
+  &ett_opcua_NodeReference,
+  &ett_opcua_ContentFilterElement,
+  &ett_opcua_ContentFilter,
+  &ett_opcua_FilterOperand,
+  &ett_opcua_ElementOperand,
+  &ett_opcua_LiteralOperand,
+  &ett_opcua_AttributeOperand,
+  &ett_opcua_PropertyOperand,
+  &ett_opcua_ContentFilterResult,
+  &ett_opcua_QueryResult,
+  &ett_opcua_ReadValueId,
+  &ett_opcua_HistoryReadValueId,
+  &ett_opcua_HistoryReadResult,
+  &ett_opcua_MonitoringFilter,
+  &ett_opcua_EventFilter,
+  &ett_opcua_ReadEventDetails,
+  &ett_opcua_ReadRawModifiedDetails,
+  &ett_opcua_ReadProcessedDetails,
+  &ett_opcua_ReadAtTimeDetails,
+  &ett_opcua_HistoryData,
+  &ett_opcua_EventFieldList,
+  &ett_opcua_EventNotification,
+  &ett_opcua_HistoryEvent,
+  &ett_opcua_WriteValue,
+  &ett_opcua_InsertReplaceDetails,
+  &ett_opcua_InsertEventDetails,
+  &ett_opcua_DeleteRawModifiedDetails,
+  &ett_opcua_DeleteAtTimeDetails,
+  &ett_opcua_DeleteEventDetails,
+  &ett_opcua_HistoryUpdateResult,
+  &ett_opcua_CallRequestItem,
+  &ett_opcua_CallResultItem,
+  &ett_opcua_DataChangeFilter,
+  &ett_opcua_MonitoringFilterResult,
+  &ett_opcua_EventFilterResult,
+  &ett_opcua_MonitoringAttributes,
+  &ett_opcua_MonitoredItemCreateRequest,
+  &ett_opcua_MonitoredItemCreateResult,
+  &ett_opcua_MonitoredItemModifyRequest,
+  &ett_opcua_MonitoredItemModifyResult,
+  &ett_opcua_SubscriptionAcknowledgement,
+  &ett_opcua_NotificationMessage,
+  &ett_opcua_MonitoredItemNotification,
+  &ett_opcua_DataChangeNotification,
+  &ett_opcua_TransferResult,
+};
+
+void registerComplexTypes()
+{
+  proto_register_subtree_array(ett, array_length(ett));
+}
+
diff --git a/plugins/opcua/opcua_complextypeparser.h b/plugins/opcua/opcua_complextypeparser.h
new file mode 100644 (file)
index 0000000..a7f87b0
--- /dev/null
@@ -0,0 +1,153 @@
+/******************************************************************************
+** $Id$
+**
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+** 
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License
+** as published by the Free Software Foundation; either version 2
+** of the License, or (at your option) any later version.
+** 
+** 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 8.5.2007 18:53:26.
+** DON'T MODIFY THIS FILE!
+**
+******************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gmodule.h>
+#include <epan/packet.h>
+
+void parseReferenceNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseObjectNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseObjectTypeNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseVariableNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseVariableTypeNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseReferenceTypeNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseMethodNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseViewNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseDataTypeNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseUriTableEntry(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseNodeSet(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseArgument(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseStatus(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseBaseEvent(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseSecurityPolicy(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseUserTokenPolicy(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseServerDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseEndpointDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseEndpointConfiguration(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseUserIdentityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseUserNameIdentityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseX509IdentityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseWssIdentityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseSupportedProfile(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseBuildInfo(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseSoftwareCertificate(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseSignedSoftwareCertificate(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseNodeAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseObjectAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseObjectTypeAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseVariableAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseVariableTypeAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseReferenceTypeAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseMethodAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseViewAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseAddNodesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseAddReferencesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseDeleteNodesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseDeleteReferencesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseRedundantServerDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseSamplingRateDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseServerDiagnosticsSummaryDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseServerStatusDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseServiceCounterDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseSessionDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseSessionSecurityDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseSubscriptionDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseRange(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseEUInformation(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseAnnotation(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseBaseStructureDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseDerivedStructureDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseScalarValuesDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseArrayValuesDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseRequestHeader(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseResponseHeader(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseServiceFault(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseComplexTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseBaseTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseDerivedTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseScalarTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseArrayTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseCompositeTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseRegisteredServer(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseChannelSecurityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseSignatureData(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseAddNodesResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseBrowsePropertiesPropertyResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseBrowsePropertiesResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseReferenceDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseViewDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseBrowsePath(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseTranslateBrowsePathResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseAttributeDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseNodeTypeDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseQueryDataSet(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseNodeReference(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseContentFilterElement(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseContentFilter(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseFilterOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseElementOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseLiteralOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseAttributeOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parsePropertyOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseContentFilterResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseQueryResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseReadValueId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseHistoryReadValueId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseHistoryReadResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseMonitoringFilter(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseEventFilter(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseReadEventDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseReadRawModifiedDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseReadProcessedDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseReadAtTimeDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseHistoryData(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseEventFieldList(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseEventNotification(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseHistoryEvent(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseWriteValue(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseInsertReplaceDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseInsertEventDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseDeleteRawModifiedDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseDeleteAtTimeDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseDeleteEventDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseHistoryUpdateResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseCallRequestItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseCallResultItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseDataChangeFilter(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseMonitoringFilterResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseEventFilterResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseMonitoringAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseMonitoredItemCreateRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseMonitoredItemCreateResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseMonitoredItemModifyRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseMonitoredItemModifyResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseSubscriptionAcknowledgement(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseNotificationMessage(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseMonitoredItemNotification(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseDataChangeNotification(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void parseTransferResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);
+void registerComplexTypes();
diff --git a/plugins/opcua/opcua_enumparser.c b/plugins/opcua/opcua_enumparser.c
new file mode 100644 (file)
index 0000000..757d461
--- /dev/null
@@ -0,0 +1,418 @@
+/******************************************************************************
+** $Id$
+**
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+** 
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License
+** as published by the Free Software Foundation; either version 2
+** of the License, or (at your option) any later version.
+** 
+** 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 8.5.2007 18:53:26.
+** DON'T MODIFY THIS FILE!
+**
+******************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gmodule.h>
+#include <epan/packet.h>
+
+#include "opcua_enumparser.h"
+
+\r
+/** NodeClass enum table */\r
+static const value_string g_NodeClassTable[] = {
+  { 0, "Node" },
+  { 1, "Object" },
+  { 2, "Variable" },
+  { 4, "Method" },
+  { 8, "ObjectType" },
+  { 16, "VariableType" },
+  { 32, "ReferenceType" },
+  { 64, "DataType" },
+  { 128, "View" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_NodeClass = -1;\r
+\r
+void parseNodeClass(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_NodeClass, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** IdType enum table */\r
+static const value_string g_IdTypeTable[] = {
+  { 0, "Numeric" },
+  { 1, "String" },
+  { 2, "Uri" },
+  { 3, "Guid" },
+  { 4, "Opaque" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_IdType = -1;\r
+\r
+void parseIdType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_IdType, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** MessageSecurityMode enum table */\r
+static const value_string g_MessageSecurityModeTable[] = {
+  { 0, "None" },
+  { 1, "Sign" },
+  { 2, "SignAndEncrypt" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_MessageSecurityMode = -1;\r
+\r
+void parseMessageSecurityMode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_MessageSecurityMode, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** UserTokenType enum table */\r
+static const value_string g_UserTokenTypeTable[] = {
+  { 0, "Default" },
+  { 1, "UserName" },
+  { 2, "Certificate" },
+  { 3, "IssuedToken" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_UserTokenType = -1;\r
+\r
+void parseUserTokenType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_UserTokenType, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** ServerDescriptionType enum table */\r
+static const value_string g_ServerDescriptionTypeTable[] = {
+  { 0, "Standard" },
+  { 1, "Discovery" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_ServerDescriptionType = -1;\r
+\r
+void parseServerDescriptionType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_ServerDescriptionType, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** SecurityTokenRequestType enum table */\r
+static const value_string g_SecurityTokenRequestTypeTable[] = {
+  { 0, "Issue" },
+  { 1, "Renew" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_SecurityTokenRequestType = -1;\r
+\r
+void parseSecurityTokenRequestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_SecurityTokenRequestType, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** ComplianceLevel enum table */\r
+static const value_string g_ComplianceLevelTable[] = {
+  { 0, "Untested" },
+  { 1, "Partial" },
+  { 2, "SelfTested" },
+  { 3, "Certified" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_ComplianceLevel = -1;\r
+\r
+void parseComplianceLevel(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_ComplianceLevel, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** RedundancySupport enum table */\r
+static const value_string g_RedundancySupportTable[] = {
+  { 1, "None" },
+  { 2, "Cold" },
+  { 3, "Warm" },
+  { 4, "Hot" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_RedundancySupport = -1;\r
+\r
+void parseRedundancySupport(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_RedundancySupport, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** ServerState enum table */\r
+static const value_string g_ServerStateTable[] = {
+  { 1, "Running" },
+  { 2, "Failed" },
+  { 3, "NoConfiguration" },
+  { 4, "Suspended" },
+  { 5, "Shutdown" },
+  { 6, "Test" },
+  { 7, "CommunicationFault" },
+  { 8, "Unknown" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_ServerState = -1;\r
+\r
+void parseServerState(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_ServerState, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** ExceptionDeviationType enum table */\r
+static const value_string g_ExceptionDeviationTypeTable[] = {
+  { 1, "AbsoluteValue" },
+  { 2, "PercentOfRange" },
+  { 3, "PercentOfValue" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_ExceptionDeviationType = -1;\r
+\r
+void parseExceptionDeviationType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_ExceptionDeviationType, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** ColorsDataType enum table */\r
+static const value_string g_ColorsDataTypeTable[] = {
+  { 1, "Red" },
+  { 2, "Orange" },
+  { 3, "Yellow" },
+  { 4, "Green" },
+  { 5, "Blue" },
+  { 6, "DarkBlue" },
+  { 7, "Violet" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_ColorsDataType = -1;\r
+\r
+void parseColorsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_ColorsDataType, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** DiagnosticsMasks enum table */\r
+static const value_string g_DiagnosticsMasksTable[] = {
+  { 1, "ServiceSymbolicId" },
+  { 2, "ServiceLocalizedText" },
+  { 4, "ServiceAdditionalInfo" },
+  { 8, "ServiceInnerStatusCode" },
+  { 16, "ServiceInnerDiagnostics" },
+  { 3, "ServiceSymbolicIdAndText" },
+  { 15, "ServiceNoInnerStatus" },
+  { 31, "ServiceAll" },
+  { 32, "OperationSymbolicId" },
+  { 64, "OperationLocalizedText" },
+  { 128, "OperationAdditionalInfo" },
+  { 256, "OperationInnerStatusCode" },
+  { 512, "OperationInnerDiagnostics" },
+  { 96, "OperationSymbolicIdAndText" },
+  { 224, "OperationNoInnerStatus" },
+  { 992, "OperationAll" },
+  { 33, "SymbolicId" },
+  { 66, "LocalizedText" },
+  { 132, "AdditionalInfo" },
+  { 264, "InnerStatusCode" },
+  { 528, "InnerDiagnostics" },
+  { 99, "SymbolicIdAndText" },
+  { 239, "NoInnerStatus" },
+  { 1023, "All" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_DiagnosticsMasks = -1;\r
+\r
+void parseDiagnosticsMasks(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_DiagnosticsMasks, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** EnumeratedTestType enum table */\r
+static const value_string g_EnumeratedTestTypeTable[] = {
+  { 1, "Red" },
+  { 4, "Yellow" },
+  { 5, "Green" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_EnumeratedTestType = -1;\r
+\r
+void parseEnumeratedTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_EnumeratedTestType, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** BrowseDirection enum table */\r
+static const value_string g_BrowseDirectionTable[] = {
+  { 1, "Forward" },
+  { 2, "Inverse" },
+  { 3, "Both" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_BrowseDirection = -1;\r
+\r
+void parseBrowseDirection(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_BrowseDirection, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** FilterOperator enum table */\r
+static const value_string g_FilterOperatorTable[] = {
+  { 1, "Equals" },
+  { 2, "IsNull" },
+  { 3, "GreaterThan" },
+  { 4, "LessThan" },
+  { 5, "GreaterThanOrEqual" },
+  { 6, "LessThanOrEqual" },
+  { 7, "Like" },
+  { 8, "Not" },
+  { 9, "Between" },
+  { 10, "InList" },
+  { 11, "And" },
+  { 12, "Or" },
+  { 13, "InView" },
+  { 14, "OfType" },
+  { 15, "RelatedTo" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_FilterOperator = -1;\r
+\r
+void parseFilterOperator(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_FilterOperator, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** TimestampsToReturn enum table */\r
+static const value_string g_TimestampsToReturnTable[] = {
+  { 1, "Source" },
+  { 2, "Server" },
+  { 3, "Both" },
+  { 4, "Neither" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_TimestampsToReturn = -1;\r
+\r
+void parseTimestampsToReturn(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_TimestampsToReturn, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** MonitoringMode enum table */\r
+static const value_string g_MonitoringModeTable[] = {
+  { 0, "Disabled" },
+  { 1, "Sampling" },
+  { 2, "Reporting" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_MonitoringMode = -1;\r
+\r
+void parseMonitoringMode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_MonitoringMode, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** DataChangeTrigger enum table */\r
+static const value_string g_DataChangeTriggerTable[] = {
+  { 0, "Status" },
+  { 1, "StatusValue" },
+  { 2, "StatusValueTimestamp" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_DataChangeTrigger = -1;\r
+\r
+void parseDataChangeTrigger(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_DataChangeTrigger, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+/** DeadbandType enum table */\r
+static const value_string g_DeadbandTypeTable[] = {
+  { 0, "None" },
+  { 1, "Absolute" },
+  { 2, "Percentage" },\r
+  { 0, NULL }\r
+};\r
+static int hf_opcua_DeadbandType = -1;\r
+\r
+void parseDeadbandType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+       proto_tree_add_item(tree, hf_opcua_DeadbandType, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+
+/** header field definitions */
+static hf_register_info hf[] =
+{\r
+    { &hf_opcua_NodeClass,\r
+    {  "NodeClass", "", FT_UINT32, BASE_HEX,  VALS(g_NodeClassTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_IdType,\r
+    {  "IdType", "", FT_UINT32, BASE_HEX,  VALS(g_IdTypeTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_MessageSecurityMode,\r
+    {  "MessageSecurityMode", "", FT_UINT32, BASE_HEX,  VALS(g_MessageSecurityModeTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_UserTokenType,\r
+    {  "UserTokenType", "", FT_UINT32, BASE_HEX,  VALS(g_UserTokenTypeTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_ServerDescriptionType,\r
+    {  "ServerDescriptionType", "", FT_UINT32, BASE_HEX,  VALS(g_ServerDescriptionTypeTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_SecurityTokenRequestType,\r
+    {  "SecurityTokenRequestType", "", FT_UINT32, BASE_HEX,  VALS(g_SecurityTokenRequestTypeTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_ComplianceLevel,\r
+    {  "ComplianceLevel", "", FT_UINT32, BASE_HEX,  VALS(g_ComplianceLevelTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_RedundancySupport,\r
+    {  "RedundancySupport", "", FT_UINT32, BASE_HEX,  VALS(g_RedundancySupportTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_ServerState,\r
+    {  "ServerState", "", FT_UINT32, BASE_HEX,  VALS(g_ServerStateTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_ExceptionDeviationType,\r
+    {  "ExceptionDeviationType", "", FT_UINT32, BASE_HEX,  VALS(g_ExceptionDeviationTypeTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_ColorsDataType,\r
+    {  "ColorsDataType", "", FT_UINT32, BASE_HEX,  VALS(g_ColorsDataTypeTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_DiagnosticsMasks,\r
+    {  "DiagnosticsMasks", "", FT_UINT32, BASE_HEX,  VALS(g_DiagnosticsMasksTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_EnumeratedTestType,\r
+    {  "EnumeratedTestType", "", FT_UINT32, BASE_HEX,  VALS(g_EnumeratedTestTypeTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_BrowseDirection,\r
+    {  "BrowseDirection", "", FT_UINT32, BASE_HEX,  VALS(g_BrowseDirectionTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_FilterOperator,\r
+    {  "FilterOperator", "", FT_UINT32, BASE_HEX,  VALS(g_FilterOperatorTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_TimestampsToReturn,\r
+    {  "TimestampsToReturn", "", FT_UINT32, BASE_HEX,  VALS(g_TimestampsToReturnTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_MonitoringMode,\r
+    {  "MonitoringMode", "", FT_UINT32, BASE_HEX,  VALS(g_MonitoringModeTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_DataChangeTrigger,\r
+    {  "DataChangeTrigger", "", FT_UINT32, BASE_HEX,  VALS(g_DataChangeTriggerTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_DeadbandType,\r
+    {  "DeadbandType", "", FT_UINT32, BASE_HEX,  VALS(g_DeadbandTypeTable), 0x0, "", HFILL }\r
+    }
+};
+
+/** Register enum types. */
+void registerEnumTypes(int proto)
+{
+    proto_register_field_array(proto, hf, array_length(hf));
+}
diff --git a/plugins/opcua/opcua_enumparser.h b/plugins/opcua/opcua_enumparser.h
new file mode 100644 (file)
index 0000000..9838e53
--- /dev/null
@@ -0,0 +1,51 @@
+/******************************************************************************
+** $Id$
+**
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+** 
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License
+** as published by the Free Software Foundation; either version 2
+** of the License, or (at your option) any later version.
+** 
+** 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 8.5.2007 18:53:26.
+** DON'T MODIFY THIS FILE!
+**
+******************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gmodule.h>
+#include <epan/packet.h>
+
+void parseNodeClass(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseIdType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseMessageSecurityMode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseUserTokenType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseServerDescriptionType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseSecurityTokenRequestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseComplianceLevel(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseRedundancySupport(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseServerState(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseExceptionDeviationType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseColorsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseDiagnosticsMasks(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseEnumeratedTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseBrowseDirection(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseFilterOperator(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseTimestampsToReturn(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseMonitoringMode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseDataChangeTrigger(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseDeadbandType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void registerEnumTypes(int proto);
+
diff --git a/plugins/opcua/opcua_hfindeces.c b/plugins/opcua/opcua_hfindeces.c
new file mode 100644 (file)
index 0000000..860cd42
--- /dev/null
@@ -0,0 +1,590 @@
+/******************************************************************************\r
+** $Id$\r
+**\r
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.\r
+** Web: http://www.ascolab.com\r
+**\r
+** This program is free software; you can redistribute it and/or\r
+** modify it under the terms of the GNU General Public License\r
+** as published by the Free Software Foundation; either version 2\r
+** of the License, or (at your option) any later version.\r
+**\r
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\r
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
+** \r
+** Project: OpcUa Wireshark Plugin\r
+**\r
+** Description: This file contains protocol field information.\r
+**\r
+** This file was autogenerated on 8.5.2007 18:53:26.\r
+** DON'T MODIFY THIS FILE!\r
+**\r
+******************************************************************************/\r
+\r
+#ifdef HAVE_CONFIG_H\r
+# include "config.h"\r
+#endif\r
+\r
+#include <gmodule.h>\r
+#include <epan/packet.h>\r
+
+int hf_opcua_TestId = -1;
+int hf_opcua_Iteration = -1;
+int hf_opcua_ServerUris = -1;
+int hf_opcua_ProfileUris = -1;
+int hf_opcua_ClientCertificate = -1;
+int hf_opcua_SecureChannelId = -1;
+int hf_opcua_SecurityPolicyUri = -1;
+int hf_opcua_ClientNonce = -1;
+int hf_opcua_RequestedLifetime = -1;
+int hf_opcua_ServerCertificate = -1;
+int hf_opcua_ServerNonce = -1;
+int hf_opcua_ClientName = -1;
+int hf_opcua_RequestedSessionTimeout = -1;
+int hf_opcua_SessionId = -1;
+int hf_opcua_RevisedSessionTimeout = -1;
+int hf_opcua_LocaleIds = -1;
+int hf_opcua_CertificateResults = -1;
+int hf_opcua_SequenceNumber = -1;
+int hf_opcua_Results = -1;
+int hf_opcua_MaxResultsToReturn = -1;
+int hf_opcua_IncludeSubtypes = -1;
+int hf_opcua_NodeClassMask = -1;
+int hf_opcua_ContinuationPoint = -1;
+int hf_opcua_ReleaseContinuationPoint = -1;
+int hf_opcua_RevisedContinuationPoint = -1;
+int hf_opcua_MaxDescriptionsToReturn = -1;
+int hf_opcua_MaxReferencesToReturn = -1;
+int hf_opcua_MaxReferencedNodesToReturn = -1;
+int hf_opcua_MaxTime = -1;
+int hf_opcua_MaxAge = -1;
+int hf_opcua_ReleaseContinuationPoints = -1;
+int hf_opcua_SubscriptionId = -1;
+int hf_opcua_MonitoredItemIds = -1;
+int hf_opcua_TriggeringItemId = -1;
+int hf_opcua_LinksToAdd = -1;
+int hf_opcua_LinksToRemove = -1;
+int hf_opcua_AddResults = -1;
+int hf_opcua_RemoveResults = -1;
+int hf_opcua_RequestedPublishingInterval = -1;
+int hf_opcua_RequestedLifetimeCounter = -1;
+int hf_opcua_RequestedMaxKeepAliveCount = -1;
+int hf_opcua_PublishingEnabled = -1;
+int hf_opcua_Priority = -1;
+int hf_opcua_RevisedPublishingInterval = -1;
+int hf_opcua_RevisedLifetimeCounter = -1;
+int hf_opcua_RevisedMaxKeepAliveCount = -1;
+int hf_opcua_SubscriptionIds = -1;
+int hf_opcua_AvailableSequenceNumbers = -1;
+int hf_opcua_MoreNotifications = -1;
+int hf_opcua_RetransmitSequenceNumber = -1;
+int hf_opcua_IsInverse = -1;
+int hf_opcua_ServerIndex = -1;
+int hf_opcua_NodeClass = -1;
+int hf_opcua_EventNotifier = -1;
+int hf_opcua_IsAbstract = -1;
+int hf_opcua_ArraySize = -1;
+int hf_opcua_AccessLevel = -1;
+int hf_opcua_UserAccessLevel = -1;
+int hf_opcua_MinimumSamplingInterval = -1;
+int hf_opcua_Historizing = -1;
+int hf_opcua_Symmetric = -1;
+int hf_opcua_Executable = -1;
+int hf_opcua_UserExecutable = -1;
+int hf_opcua_ContainsNoLoops = -1;
+int hf_opcua_Index = -1;
+int hf_opcua_Uri = -1;
+int hf_opcua_Name = -1;
+int hf_opcua_StatusCode = -1;
+int hf_opcua_EventId = -1;
+int hf_opcua_SourceName = -1;
+int hf_opcua_Time = -1;
+int hf_opcua_ReceiveTime = -1;
+int hf_opcua_Severity = -1;
+int hf_opcua_Digest = -1;
+int hf_opcua_SymmetricSignature = -1;
+int hf_opcua_SymmetricKeyWrap = -1;
+int hf_opcua_SymmetricEncryption = -1;
+int hf_opcua_SymmetricKeyLength = -1;
+int hf_opcua_AsymmetricSignature = -1;
+int hf_opcua_AsymmetricKeyWrap = -1;
+int hf_opcua_AsymmetricEncryption = -1;
+int hf_opcua_MinimumAsymmetricKeyLength = -1;
+int hf_opcua_MaximumAsymmetricKeyLength = -1;
+int hf_opcua_DerivedKey = -1;
+int hf_opcua_DerivedEncryptionKeyLength = -1;
+int hf_opcua_DerivedSignatureKeyLength = -1;
+int hf_opcua_IssuerType = -1;
+int hf_opcua_IssuerUrl = -1;
+int hf_opcua_ServerUri = -1;
+int hf_opcua_DiscoveryUrls = -1;
+int hf_opcua_EndpointUrl = -1;
+int hf_opcua_SupportedProfiles = -1;
+int hf_opcua_SendTimeout = -1;
+int hf_opcua_OperationTimeout = -1;
+int hf_opcua_UseBinaryEncoding = -1;
+int hf_opcua_MaxMessageSize = -1;
+int hf_opcua_MaxArrayLength = -1;
+int hf_opcua_MaxStringLength = -1;
+int hf_opcua_UserName = -1;
+int hf_opcua_Password = -1;
+int hf_opcua_HashAlgorithm = -1;
+int hf_opcua_CertificateData = -1;
+int hf_opcua_TokenData = -1;
+int hf_opcua_ProfileUri = -1;
+int hf_opcua_ProfileName = -1;
+int hf_opcua_ApplicationUri = -1;
+int hf_opcua_ManufacturerName = -1;
+int hf_opcua_ApplicationName = -1;
+int hf_opcua_SoftwareVersion = -1;
+int hf_opcua_BuildNumber = -1;
+int hf_opcua_BuildDate = -1;
+int hf_opcua_IssuedBy = -1;
+int hf_opcua_IssuedDate = -1;
+int hf_opcua_ExpirationDate = -1;
+int hf_opcua_ApplicationCertificate = -1;
+int hf_opcua_IssuerCertificateThumbprint = -1;
+int hf_opcua_IssuerSignatureAlgorithm = -1;
+int hf_opcua_IssuerSignature = -1;
+int hf_opcua_IsForward = -1;
+int hf_opcua_TargetServerUri = -1;
+int hf_opcua_TargetNodeClass = -1;
+int hf_opcua_DeleteTargetReferences = -1;
+int hf_opcua_ServerId = -1;
+int hf_opcua_ServiceLevel = -1;
+int hf_opcua_SamplingRate = -1;
+int hf_opcua_SamplingErrorCount = -1;
+int hf_opcua_SampledMonitoredItemsCount = -1;
+int hf_opcua_MaxSampledMonitoredItemsCount = -1;
+int hf_opcua_DisabledMonitoredItemsSamplingCount = -1;
+int hf_opcua_ServerViewCount = -1;
+int hf_opcua_CurrentSessionCount = -1;
+int hf_opcua_CumulatedSessionCount = -1;
+int hf_opcua_SecurityRejectedSessionCount = -1;
+int hf_opcua_RejectSessionCount = -1;
+int hf_opcua_SessionTimeoutCount = -1;
+int hf_opcua_SessionAbortCount = -1;
+int hf_opcua_SamplingRateCount = -1;
+int hf_opcua_PublishingRateCount = -1;
+int hf_opcua_CurrentSubscriptionCount = -1;
+int hf_opcua_CumulatedSubscriptionCount = -1;
+int hf_opcua_SecurityRejectedRequestsCount = -1;
+int hf_opcua_RejectedRequestsCount = -1;
+int hf_opcua_StartTime = -1;
+int hf_opcua_CurrentTime = -1;
+int hf_opcua_TotalCount = -1;
+int hf_opcua_UnauthorizedCount = -1;
+int hf_opcua_ErrorCount = -1;
+int hf_opcua_ActualSessionTimeout = -1;
+int hf_opcua_ClientConnectionTime = -1;
+int hf_opcua_ClientLastContactTime = -1;
+int hf_opcua_CurrentSubscriptionsCount = -1;
+int hf_opcua_CurrentMonitoredItemsCount = -1;
+int hf_opcua_CurrentPublishRequestsInQueue = -1;
+int hf_opcua_CurrentPublishTimerExpirations = -1;
+int hf_opcua_KeepAliveCount = -1;
+int hf_opcua_CurrentRepublishRequestsInQueue = -1;
+int hf_opcua_MaxRepublishRequestsInQueue = -1;
+int hf_opcua_RepublishCounter = -1;
+int hf_opcua_PublishingCount = -1;
+int hf_opcua_PublishingQueueOverflowCount = -1;
+int hf_opcua_ClientUserIdOfSession = -1;
+int hf_opcua_ClientUserIdHistory = -1;
+int hf_opcua_AuthenticationMechanism = -1;
+int hf_opcua_Encoding = -1;
+int hf_opcua_TransportProtocol = -1;
+int hf_opcua_SecurityPolicy = -1;
+int hf_opcua_PublishingInterval = -1;
+int hf_opcua_MaxKeepAliveCount = -1;
+int hf_opcua_ModifyCount = -1;
+int hf_opcua_EnableCount = -1;
+int hf_opcua_DisableCount = -1;
+int hf_opcua_RepublishRequestCount = -1;
+int hf_opcua_RepublishMessageRequestCount = -1;
+int hf_opcua_RepublishMessageCount = -1;
+int hf_opcua_TransferRequestCount = -1;
+int hf_opcua_TransferredToAltClientCount = -1;
+int hf_opcua_TransferredToSameClientCount = -1;
+int hf_opcua_PublishRequestCount = -1;
+int hf_opcua_DataChangeNotificationsCount = -1;
+int hf_opcua_EventNotificationsCount = -1;
+int hf_opcua_NotificationsCount = -1;
+int hf_opcua_LateStateCount = -1;
+int hf_opcua_KeepAliveStateCount = -1;
+int hf_opcua_Low = -1;
+int hf_opcua_High = -1;
+int hf_opcua_NamespaceUri = -1;
+int hf_opcua_UnitId = -1;
+int hf_opcua_Message = -1;
+int hf_opcua_AnnotationTime = -1;
+int hf_opcua_Id = -1;
+int hf_opcua_Description = -1;
+int hf_opcua_Timestamp = -1;
+int hf_opcua_Boolean = -1;
+int hf_opcua_SByte = -1;
+int hf_opcua_Byte = -1;
+int hf_opcua_Int16 = -1;
+int hf_opcua_UInt16 = -1;
+int hf_opcua_Int32 = -1;
+int hf_opcua_UInt32 = -1;
+int hf_opcua_Int64 = -1;
+int hf_opcua_UInt64 = -1;
+int hf_opcua_Float = -1;
+int hf_opcua_Double = -1;
+int hf_opcua_String = -1;
+int hf_opcua_DateTime = -1;
+int hf_opcua_Guid = -1;
+int hf_opcua_ByteString = -1;
+int hf_opcua_XmlElement = -1;
+int hf_opcua_RequestId = -1;
+int hf_opcua_ReturnDiagnostics = -1;
+int hf_opcua_AuditLogEntryId = -1;
+int hf_opcua_TimeoutHint = -1;
+int hf_opcua_ServiceResult = -1;
+int hf_opcua_StringTable = -1;
+int hf_opcua_Value1 = -1;
+int hf_opcua_Value2 = -1;
+int hf_opcua_Booleans = -1;
+int hf_opcua_SBytes = -1;
+int hf_opcua_Int16s = -1;
+int hf_opcua_UInt16s = -1;
+int hf_opcua_Int32s = -1;
+int hf_opcua_UInt32s = -1;
+int hf_opcua_Int64s = -1;
+int hf_opcua_UInt64s = -1;
+int hf_opcua_Floats = -1;
+int hf_opcua_Doubles = -1;
+int hf_opcua_Strings = -1;
+int hf_opcua_DateTimes = -1;
+int hf_opcua_Guids = -1;
+int hf_opcua_ByteStrings = -1;
+int hf_opcua_XmlElements = -1;
+int hf_opcua_StatusCodes = -1;
+int hf_opcua_SemaphoreFilePath = -1;
+int hf_opcua_IsOnline = -1;
+int hf_opcua_ChannelId = -1;
+int hf_opcua_TokenId = -1;
+int hf_opcua_CreatedAt = -1;
+int hf_opcua_RevisedLifetime = -1;
+int hf_opcua_Algorithm = -1;
+int hf_opcua_Signature = -1;
+int hf_opcua_PropertyStatusCode = -1;
+int hf_opcua_ViewVersion = -1;
+int hf_opcua_RelativePath = -1;
+int hf_opcua_AttributeId = -1;
+int hf_opcua_IndexRange = -1;
+int hf_opcua_IncludeSubTypes = -1;
+int hf_opcua_Alias = -1;
+int hf_opcua_Result = -1;
+int hf_opcua_IndexOfInvalidElement = -1;
+int hf_opcua_AttributeStatusCodes = -1;
+int hf_opcua_NumValuesPerNode = -1;
+int hf_opcua_EndTime = -1;
+int hf_opcua_IsReadModified = -1;
+int hf_opcua_ReturnBounds = -1;
+int hf_opcua_ResampleInterval = -1;
+int hf_opcua_ReqTimes = -1;
+int hf_opcua_ClientHandle = -1;
+int hf_opcua_PerformInsert = -1;
+int hf_opcua_PerformReplace = -1;
+int hf_opcua_IsDeleteModified = -1;
+int hf_opcua_OperationResult = -1;
+int hf_opcua_InputArgumentResults = -1;
+int hf_opcua_DeadbandType = -1;
+int hf_opcua_DeadbandValue = -1;
+int hf_opcua_SelectClauseResults = -1;
+int hf_opcua_SamplingInterval = -1;
+int hf_opcua_QueueSize = -1;
+int hf_opcua_DiscardOldest = -1;
+int hf_opcua_MonitoredItemId = -1;
+int hf_opcua_RevisedSamplingInterval = -1;
+int hf_opcua_RevisedQueueSize = -1;
+int hf_opcua_MonitorItemId = -1;
+int hf_opcua_PublishTime = -1;
+int hf_opcua_AvailableSequenceNumbersRanges = -1;\r
+\r
+/** header field definitions */\r
+static hf_register_info hf[] =\r
+{\r
+
+   { &hf_opcua_TestId, { "TestId", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Iteration, { "Iteration", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ServerUris, { "ServerUris", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ProfileUris, { "ProfileUris", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ClientCertificate, { "ClientCertificate", "", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SecureChannelId, { "SecureChannelId", "", FT_GUID, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SecurityPolicyUri, { "SecurityPolicyUri", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ClientNonce, { "ClientNonce", "", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RequestedLifetime, { "RequestedLifetime", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ServerCertificate, { "ServerCertificate", "", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ServerNonce, { "ServerNonce", "", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ClientName, { "ClientName", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RequestedSessionTimeout, { "RequestedSessionTimeout", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SessionId, { "SessionId", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RevisedSessionTimeout, { "RevisedSessionTimeout", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_LocaleIds, { "LocaleIds", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_CertificateResults, { "CertificateResults", "", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SequenceNumber, { "SequenceNumber", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Results, { "Results", "", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MaxResultsToReturn, { "MaxResultsToReturn", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IncludeSubtypes, { "IncludeSubtypes", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_NodeClassMask, { "NodeClassMask", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ContinuationPoint, { "ContinuationPoint", "", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ReleaseContinuationPoint, { "ReleaseContinuationPoint", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RevisedContinuationPoint, { "RevisedContinuationPoint", "", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MaxDescriptionsToReturn, { "MaxDescriptionsToReturn", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MaxReferencesToReturn, { "MaxReferencesToReturn", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MaxReferencedNodesToReturn, { "MaxReferencedNodesToReturn", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MaxTime, { "MaxTime", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MaxAge, { "MaxAge", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ReleaseContinuationPoints, { "ReleaseContinuationPoints", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SubscriptionId, { "SubscriptionId", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MonitoredItemIds, { "MonitoredItemIds", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_TriggeringItemId, { "TriggeringItemId", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_LinksToAdd, { "LinksToAdd", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_LinksToRemove, { "LinksToRemove", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_AddResults, { "AddResults", "", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RemoveResults, { "RemoveResults", "", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RequestedPublishingInterval, { "RequestedPublishingInterval", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RequestedLifetimeCounter, { "RequestedLifetimeCounter", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RequestedMaxKeepAliveCount, { "RequestedMaxKeepAliveCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_PublishingEnabled, { "PublishingEnabled", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Priority, { "Priority", "", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RevisedPublishingInterval, { "RevisedPublishingInterval", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RevisedLifetimeCounter, { "RevisedLifetimeCounter", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RevisedMaxKeepAliveCount, { "RevisedMaxKeepAliveCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SubscriptionIds, { "SubscriptionIds", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_AvailableSequenceNumbers, { "AvailableSequenceNumbers", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MoreNotifications, { "MoreNotifications", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RetransmitSequenceNumber, { "RetransmitSequenceNumber", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IsInverse, { "IsInverse", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ServerIndex, { "ServerIndex", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_NodeClass, { "NodeClass", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_EventNotifier, { "EventNotifier", "", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IsAbstract, { "IsAbstract", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ArraySize, { "ArraySize", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_AccessLevel, { "AccessLevel", "", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_UserAccessLevel, { "UserAccessLevel", "", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MinimumSamplingInterval, { "MinimumSamplingInterval", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Historizing, { "Historizing", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Symmetric, { "Symmetric", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Executable, { "Executable", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_UserExecutable, { "UserExecutable", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ContainsNoLoops, { "ContainsNoLoops", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Index, { "Index", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Uri, { "Uri", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Name, { "Name", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_StatusCode, { "StatusCode", "", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_EventId, { "EventId", "", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SourceName, { "SourceName", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Time, { "Time", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ReceiveTime, { "ReceiveTime", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Severity, { "Severity", "", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Digest, { "Digest", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SymmetricSignature, { "SymmetricSignature", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SymmetricKeyWrap, { "SymmetricKeyWrap", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SymmetricEncryption, { "SymmetricEncryption", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SymmetricKeyLength, { "SymmetricKeyLength", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_AsymmetricSignature, { "AsymmetricSignature", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_AsymmetricKeyWrap, { "AsymmetricKeyWrap", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_AsymmetricEncryption, { "AsymmetricEncryption", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MinimumAsymmetricKeyLength, { "MinimumAsymmetricKeyLength", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MaximumAsymmetricKeyLength, { "MaximumAsymmetricKeyLength", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_DerivedKey, { "DerivedKey", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_DerivedEncryptionKeyLength, { "DerivedEncryptionKeyLength", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_DerivedSignatureKeyLength, { "DerivedSignatureKeyLength", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IssuerType, { "IssuerType", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IssuerUrl, { "IssuerUrl", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ServerUri, { "ServerUri", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_DiscoveryUrls, { "DiscoveryUrls", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_EndpointUrl, { "EndpointUrl", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SupportedProfiles, { "SupportedProfiles", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SendTimeout, { "SendTimeout", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_OperationTimeout, { "OperationTimeout", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_UseBinaryEncoding, { "UseBinaryEncoding", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MaxMessageSize, { "MaxMessageSize", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MaxArrayLength, { "MaxArrayLength", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MaxStringLength, { "MaxStringLength", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_UserName, { "UserName", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Password, { "Password", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_HashAlgorithm, { "HashAlgorithm", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_CertificateData, { "CertificateData", "", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_TokenData, { "TokenData", "", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ProfileUri, { "ProfileUri", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ProfileName, { "ProfileName", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ApplicationUri, { "ApplicationUri", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ManufacturerName, { "ManufacturerName", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ApplicationName, { "ApplicationName", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SoftwareVersion, { "SoftwareVersion", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_BuildNumber, { "BuildNumber", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_BuildDate, { "BuildDate", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IssuedBy, { "IssuedBy", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IssuedDate, { "IssuedDate", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ExpirationDate, { "ExpirationDate", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ApplicationCertificate, { "ApplicationCertificate", "", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IssuerCertificateThumbprint, { "IssuerCertificateThumbprint", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IssuerSignatureAlgorithm, { "IssuerSignatureAlgorithm", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IssuerSignature, { "IssuerSignature", "", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IsForward, { "IsForward", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_TargetServerUri, { "TargetServerUri", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_TargetNodeClass, { "TargetNodeClass", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_DeleteTargetReferences, { "DeleteTargetReferences", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ServerId, { "ServerId", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ServiceLevel, { "ServiceLevel", "", FT_INT8, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SamplingRate, { "SamplingRate", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SamplingErrorCount, { "SamplingErrorCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SampledMonitoredItemsCount, { "SampledMonitoredItemsCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MaxSampledMonitoredItemsCount, { "MaxSampledMonitoredItemsCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_DisabledMonitoredItemsSamplingCount, { "DisabledMonitoredItemsSamplingCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ServerViewCount, { "ServerViewCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_CurrentSessionCount, { "CurrentSessionCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_CumulatedSessionCount, { "CumulatedSessionCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SecurityRejectedSessionCount, { "SecurityRejectedSessionCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RejectSessionCount, { "RejectSessionCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SessionTimeoutCount, { "SessionTimeoutCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SessionAbortCount, { "SessionAbortCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SamplingRateCount, { "SamplingRateCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_PublishingRateCount, { "PublishingRateCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_CurrentSubscriptionCount, { "CurrentSubscriptionCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_CumulatedSubscriptionCount, { "CumulatedSubscriptionCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SecurityRejectedRequestsCount, { "SecurityRejectedRequestsCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RejectedRequestsCount, { "RejectedRequestsCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_StartTime, { "StartTime", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_CurrentTime, { "CurrentTime", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_TotalCount, { "TotalCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_UnauthorizedCount, { "UnauthorizedCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ErrorCount, { "ErrorCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ActualSessionTimeout, { "ActualSessionTimeout", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ClientConnectionTime, { "ClientConnectionTime", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ClientLastContactTime, { "ClientLastContactTime", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_CurrentSubscriptionsCount, { "CurrentSubscriptionsCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_CurrentMonitoredItemsCount, { "CurrentMonitoredItemsCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_CurrentPublishRequestsInQueue, { "CurrentPublishRequestsInQueue", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_CurrentPublishTimerExpirations, { "CurrentPublishTimerExpirations", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_KeepAliveCount, { "KeepAliveCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_CurrentRepublishRequestsInQueue, { "CurrentRepublishRequestsInQueue", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MaxRepublishRequestsInQueue, { "MaxRepublishRequestsInQueue", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RepublishCounter, { "RepublishCounter", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_PublishingCount, { "PublishingCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_PublishingQueueOverflowCount, { "PublishingQueueOverflowCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ClientUserIdOfSession, { "ClientUserIdOfSession", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ClientUserIdHistory, { "ClientUserIdHistory", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_AuthenticationMechanism, { "AuthenticationMechanism", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Encoding, { "Encoding", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_TransportProtocol, { "TransportProtocol", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SecurityPolicy, { "SecurityPolicy", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_PublishingInterval, { "PublishingInterval", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MaxKeepAliveCount, { "MaxKeepAliveCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ModifyCount, { "ModifyCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_EnableCount, { "EnableCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_DisableCount, { "DisableCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RepublishRequestCount, { "RepublishRequestCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RepublishMessageRequestCount, { "RepublishMessageRequestCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RepublishMessageCount, { "RepublishMessageCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_TransferRequestCount, { "TransferRequestCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_TransferredToAltClientCount, { "TransferredToAltClientCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_TransferredToSameClientCount, { "TransferredToSameClientCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_PublishRequestCount, { "PublishRequestCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_DataChangeNotificationsCount, { "DataChangeNotificationsCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_EventNotificationsCount, { "EventNotificationsCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_NotificationsCount, { "NotificationsCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_LateStateCount, { "LateStateCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_KeepAliveStateCount, { "KeepAliveStateCount", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Low, { "Low", "", FT_DOUBLE, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_High, { "High", "", FT_DOUBLE, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_NamespaceUri, { "NamespaceUri", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_UnitId, { "UnitId", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Message, { "Message", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_AnnotationTime, { "AnnotationTime", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Id, { "Id", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Description, { "Description", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Timestamp, { "Timestamp", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Boolean, { "Boolean", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SByte, { "SByte", "", FT_INT8, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Byte, { "Byte", "", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Int16, { "Int16", "", FT_INT16, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_UInt16, { "UInt16", "", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Int32, { "Int32", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_UInt32, { "UInt32", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Int64, { "Int64", "", FT_INT64, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_UInt64, { "UInt64", "", FT_UINT64, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Float, { "Float", "", FT_FLOAT, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Double, { "Double", "", FT_DOUBLE, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_String, { "String", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_DateTime, { "DateTime", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Guid, { "Guid", "", FT_GUID, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ByteString, { "ByteString", "", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_XmlElement, { "XmlElement", "", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RequestId, { "RequestId", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ReturnDiagnostics, { "ReturnDiagnostics", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_AuditLogEntryId, { "AuditLogEntryId", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_TimeoutHint, { "TimeoutHint", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ServiceResult, { "ServiceResult", "", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_StringTable, { "StringTable", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Value1, { "Value1", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Value2, { "Value2", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Booleans, { "Booleans", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SBytes, { "SBytes", "", FT_INT8, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Int16s, { "Int16s", "", FT_INT16, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_UInt16s, { "UInt16s", "", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Int32s, { "Int32s", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_UInt32s, { "UInt32s", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Int64s, { "Int64s", "", FT_INT64, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_UInt64s, { "UInt64s", "", FT_UINT64, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Floats, { "Floats", "", FT_FLOAT, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Doubles, { "Doubles", "", FT_DOUBLE, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Strings, { "Strings", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_DateTimes, { "DateTimes", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Guids, { "Guids", "", FT_GUID, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ByteStrings, { "ByteStrings", "", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_XmlElements, { "XmlElements", "", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_StatusCodes, { "StatusCodes", "", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SemaphoreFilePath, { "SemaphoreFilePath", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IsOnline, { "IsOnline", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ChannelId, { "ChannelId", "", FT_GUID, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_TokenId, { "TokenId", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_CreatedAt, { "CreatedAt", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RevisedLifetime, { "RevisedLifetime", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Algorithm, { "Algorithm", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Signature, { "Signature", "", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_PropertyStatusCode, { "PropertyStatusCode", "", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ViewVersion, { "ViewVersion", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RelativePath, { "RelativePath", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_AttributeId, { "AttributeId", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IndexRange, { "IndexRange", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IncludeSubTypes, { "IncludeSubTypes", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Alias, { "Alias", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_Result, { "Result", "", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IndexOfInvalidElement, { "IndexOfInvalidElement", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_AttributeStatusCodes, { "AttributeStatusCodes", "", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_NumValuesPerNode, { "NumValuesPerNode", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_EndTime, { "EndTime", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IsReadModified, { "IsReadModified", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ReturnBounds, { "ReturnBounds", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ResampleInterval, { "ResampleInterval", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ReqTimes, { "ReqTimes", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_ClientHandle, { "ClientHandle", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_PerformInsert, { "PerformInsert", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_PerformReplace, { "PerformReplace", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_IsDeleteModified, { "IsDeleteModified", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_OperationResult, { "OperationResult", "", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_InputArgumentResults, { "InputArgumentResults", "", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_DeadbandType, { "DeadbandType", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_DeadbandValue, { "DeadbandValue", "", FT_DOUBLE, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SelectClauseResults, { "SelectClauseResults", "", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_SamplingInterval, { "SamplingInterval", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_QueueSize, { "QueueSize", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_DiscardOldest, { "DiscardOldest", "", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MonitoredItemId, { "MonitoredItemId", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RevisedSamplingInterval, { "RevisedSamplingInterval", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_RevisedQueueSize, { "RevisedQueueSize", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_MonitorItemId, { "MonitorItemId", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_PublishTime, { "PublishTime", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },
+   { &hf_opcua_AvailableSequenceNumbersRanges, { "AvailableSequenceNumbersRanges", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } }\r
+};\r
+\r
+/** Register field types. */\r
+void registerFieldTypes(int proto)\r
+{\r
+    proto_register_field_array(proto, hf, array_length(hf));\r
+}\r
diff --git a/plugins/opcua/opcua_hfindeces.h b/plugins/opcua/opcua_hfindeces.h
new file mode 100644 (file)
index 0000000..74f276c
--- /dev/null
@@ -0,0 +1,307 @@
+/******************************************************************************\r
+** $Id$\r
+**\r
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.\r
+** Web: http://www.ascolab.com\r
+** \r
+** This program is free software; you can redistribute it and/or\r
+** modify it under the terms of the GNU General Public License\r
+** as published by the Free Software Foundation; either version 2\r
+** of the License, or (at your option) any later version.\r
+** \r
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\r
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
+** \r
+** Project: OpcUa Wireshark Plugin\r
+**\r
+** Description: This file contains protocol field handles.\r
+**\r
+** This file was autogenerated on 8.5.2007 18:53:26.\r
+** DON'T MODIFY THIS FILE!\r
+**\r
+******************************************************************************/\r
+\r
+#ifdef HAVE_CONFIG_H\r
+# include "config.h"\r
+#endif\r
+\r
+#include <gmodule.h>\r
+#include <epan/packet.h>\r
+
+extern int hf_opcua_TestId;
+extern int hf_opcua_Iteration;
+extern int hf_opcua_ServerUris;
+extern int hf_opcua_ProfileUris;
+extern int hf_opcua_ClientCertificate;
+extern int hf_opcua_SecureChannelId;
+extern int hf_opcua_SecurityPolicyUri;
+extern int hf_opcua_ClientNonce;
+extern int hf_opcua_RequestedLifetime;
+extern int hf_opcua_ServerCertificate;
+extern int hf_opcua_ServerNonce;
+extern int hf_opcua_ClientName;
+extern int hf_opcua_RequestedSessionTimeout;
+extern int hf_opcua_SessionId;
+extern int hf_opcua_RevisedSessionTimeout;
+extern int hf_opcua_LocaleIds;
+extern int hf_opcua_CertificateResults;
+extern int hf_opcua_SequenceNumber;
+extern int hf_opcua_Results;
+extern int hf_opcua_MaxResultsToReturn;
+extern int hf_opcua_IncludeSubtypes;
+extern int hf_opcua_NodeClassMask;
+extern int hf_opcua_ContinuationPoint;
+extern int hf_opcua_ReleaseContinuationPoint;
+extern int hf_opcua_RevisedContinuationPoint;
+extern int hf_opcua_MaxDescriptionsToReturn;
+extern int hf_opcua_MaxReferencesToReturn;
+extern int hf_opcua_MaxReferencedNodesToReturn;
+extern int hf_opcua_MaxTime;
+extern int hf_opcua_MaxAge;
+extern int hf_opcua_ReleaseContinuationPoints;
+extern int hf_opcua_SubscriptionId;
+extern int hf_opcua_MonitoredItemIds;
+extern int hf_opcua_TriggeringItemId;
+extern int hf_opcua_LinksToAdd;
+extern int hf_opcua_LinksToRemove;
+extern int hf_opcua_AddResults;
+extern int hf_opcua_RemoveResults;
+extern int hf_opcua_RequestedPublishingInterval;
+extern int hf_opcua_RequestedLifetimeCounter;
+extern int hf_opcua_RequestedMaxKeepAliveCount;
+extern int hf_opcua_PublishingEnabled;
+extern int hf_opcua_Priority;
+extern int hf_opcua_RevisedPublishingInterval;
+extern int hf_opcua_RevisedLifetimeCounter;
+extern int hf_opcua_RevisedMaxKeepAliveCount;
+extern int hf_opcua_SubscriptionIds;
+extern int hf_opcua_AvailableSequenceNumbers;
+extern int hf_opcua_MoreNotifications;
+extern int hf_opcua_RetransmitSequenceNumber;
+extern int hf_opcua_IsInverse;
+extern int hf_opcua_ServerIndex;
+extern int hf_opcua_NodeClass;
+extern int hf_opcua_EventNotifier;
+extern int hf_opcua_IsAbstract;
+extern int hf_opcua_ArraySize;
+extern int hf_opcua_AccessLevel;
+extern int hf_opcua_UserAccessLevel;
+extern int hf_opcua_MinimumSamplingInterval;
+extern int hf_opcua_Historizing;
+extern int hf_opcua_Symmetric;
+extern int hf_opcua_Executable;
+extern int hf_opcua_UserExecutable;
+extern int hf_opcua_ContainsNoLoops;
+extern int hf_opcua_Index;
+extern int hf_opcua_Uri;
+extern int hf_opcua_Name;
+extern int hf_opcua_StatusCode;
+extern int hf_opcua_EventId;
+extern int hf_opcua_SourceName;
+extern int hf_opcua_Time;
+extern int hf_opcua_ReceiveTime;
+extern int hf_opcua_Severity;
+extern int hf_opcua_Digest;
+extern int hf_opcua_SymmetricSignature;
+extern int hf_opcua_SymmetricKeyWrap;
+extern int hf_opcua_SymmetricEncryption;
+extern int hf_opcua_SymmetricKeyLength;
+extern int hf_opcua_AsymmetricSignature;
+extern int hf_opcua_AsymmetricKeyWrap;
+extern int hf_opcua_AsymmetricEncryption;
+extern int hf_opcua_MinimumAsymmetricKeyLength;
+extern int hf_opcua_MaximumAsymmetricKeyLength;
+extern int hf_opcua_DerivedKey;
+extern int hf_opcua_DerivedEncryptionKeyLength;
+extern int hf_opcua_DerivedSignatureKeyLength;
+extern int hf_opcua_IssuerType;
+extern int hf_opcua_IssuerUrl;
+extern int hf_opcua_ServerUri;
+extern int hf_opcua_DiscoveryUrls;
+extern int hf_opcua_EndpointUrl;
+extern int hf_opcua_SupportedProfiles;
+extern int hf_opcua_SendTimeout;
+extern int hf_opcua_OperationTimeout;
+extern int hf_opcua_UseBinaryEncoding;
+extern int hf_opcua_MaxMessageSize;
+extern int hf_opcua_MaxArrayLength;
+extern int hf_opcua_MaxStringLength;
+extern int hf_opcua_UserName;
+extern int hf_opcua_Password;
+extern int hf_opcua_HashAlgorithm;
+extern int hf_opcua_CertificateData;
+extern int hf_opcua_TokenData;
+extern int hf_opcua_ProfileUri;
+extern int hf_opcua_ProfileName;
+extern int hf_opcua_ApplicationUri;
+extern int hf_opcua_ManufacturerName;
+extern int hf_opcua_ApplicationName;
+extern int hf_opcua_SoftwareVersion;
+extern int hf_opcua_BuildNumber;
+extern int hf_opcua_BuildDate;
+extern int hf_opcua_IssuedBy;
+extern int hf_opcua_IssuedDate;
+extern int hf_opcua_ExpirationDate;
+extern int hf_opcua_ApplicationCertificate;
+extern int hf_opcua_IssuerCertificateThumbprint;
+extern int hf_opcua_IssuerSignatureAlgorithm;
+extern int hf_opcua_IssuerSignature;
+extern int hf_opcua_IsForward;
+extern int hf_opcua_TargetServerUri;
+extern int hf_opcua_TargetNodeClass;
+extern int hf_opcua_DeleteTargetReferences;
+extern int hf_opcua_ServerId;
+extern int hf_opcua_ServiceLevel;
+extern int hf_opcua_SamplingRate;
+extern int hf_opcua_SamplingErrorCount;
+extern int hf_opcua_SampledMonitoredItemsCount;
+extern int hf_opcua_MaxSampledMonitoredItemsCount;
+extern int hf_opcua_DisabledMonitoredItemsSamplingCount;
+extern int hf_opcua_ServerViewCount;
+extern int hf_opcua_CurrentSessionCount;
+extern int hf_opcua_CumulatedSessionCount;
+extern int hf_opcua_SecurityRejectedSessionCount;
+extern int hf_opcua_RejectSessionCount;
+extern int hf_opcua_SessionTimeoutCount;
+extern int hf_opcua_SessionAbortCount;
+extern int hf_opcua_SamplingRateCount;
+extern int hf_opcua_PublishingRateCount;
+extern int hf_opcua_CurrentSubscriptionCount;
+extern int hf_opcua_CumulatedSubscriptionCount;
+extern int hf_opcua_SecurityRejectedRequestsCount;
+extern int hf_opcua_RejectedRequestsCount;
+extern int hf_opcua_StartTime;
+extern int hf_opcua_CurrentTime;
+extern int hf_opcua_TotalCount;
+extern int hf_opcua_UnauthorizedCount;
+extern int hf_opcua_ErrorCount;
+extern int hf_opcua_ActualSessionTimeout;
+extern int hf_opcua_ClientConnectionTime;
+extern int hf_opcua_ClientLastContactTime;
+extern int hf_opcua_CurrentSubscriptionsCount;
+extern int hf_opcua_CurrentMonitoredItemsCount;
+extern int hf_opcua_CurrentPublishRequestsInQueue;
+extern int hf_opcua_CurrentPublishTimerExpirations;
+extern int hf_opcua_KeepAliveCount;
+extern int hf_opcua_CurrentRepublishRequestsInQueue;
+extern int hf_opcua_MaxRepublishRequestsInQueue;
+extern int hf_opcua_RepublishCounter;
+extern int hf_opcua_PublishingCount;
+extern int hf_opcua_PublishingQueueOverflowCount;
+extern int hf_opcua_ClientUserIdOfSession;
+extern int hf_opcua_ClientUserIdHistory;
+extern int hf_opcua_AuthenticationMechanism;
+extern int hf_opcua_Encoding;
+extern int hf_opcua_TransportProtocol;
+extern int hf_opcua_SecurityPolicy;
+extern int hf_opcua_PublishingInterval;
+extern int hf_opcua_MaxKeepAliveCount;
+extern int hf_opcua_ModifyCount;
+extern int hf_opcua_EnableCount;
+extern int hf_opcua_DisableCount;
+extern int hf_opcua_RepublishRequestCount;
+extern int hf_opcua_RepublishMessageRequestCount;
+extern int hf_opcua_RepublishMessageCount;
+extern int hf_opcua_TransferRequestCount;
+extern int hf_opcua_TransferredToAltClientCount;
+extern int hf_opcua_TransferredToSameClientCount;
+extern int hf_opcua_PublishRequestCount;
+extern int hf_opcua_DataChangeNotificationsCount;
+extern int hf_opcua_EventNotificationsCount;
+extern int hf_opcua_NotificationsCount;
+extern int hf_opcua_LateStateCount;
+extern int hf_opcua_KeepAliveStateCount;
+extern int hf_opcua_Low;
+extern int hf_opcua_High;
+extern int hf_opcua_NamespaceUri;
+extern int hf_opcua_UnitId;
+extern int hf_opcua_Message;
+extern int hf_opcua_AnnotationTime;
+extern int hf_opcua_Id;
+extern int hf_opcua_Description;
+extern int hf_opcua_Timestamp;
+extern int hf_opcua_Boolean;
+extern int hf_opcua_SByte;
+extern int hf_opcua_Byte;
+extern int hf_opcua_Int16;
+extern int hf_opcua_UInt16;
+extern int hf_opcua_Int32;
+extern int hf_opcua_UInt32;
+extern int hf_opcua_Int64;
+extern int hf_opcua_UInt64;
+extern int hf_opcua_Float;
+extern int hf_opcua_Double;
+extern int hf_opcua_String;
+extern int hf_opcua_DateTime;
+extern int hf_opcua_Guid;
+extern int hf_opcua_ByteString;
+extern int hf_opcua_XmlElement;
+extern int hf_opcua_RequestId;
+extern int hf_opcua_ReturnDiagnostics;
+extern int hf_opcua_AuditLogEntryId;
+extern int hf_opcua_TimeoutHint;
+extern int hf_opcua_ServiceResult;
+extern int hf_opcua_StringTable;
+extern int hf_opcua_Value1;
+extern int hf_opcua_Value2;
+extern int hf_opcua_Booleans;
+extern int hf_opcua_SBytes;
+extern int hf_opcua_Int16s;
+extern int hf_opcua_UInt16s;
+extern int hf_opcua_Int32s;
+extern int hf_opcua_UInt32s;
+extern int hf_opcua_Int64s;
+extern int hf_opcua_UInt64s;
+extern int hf_opcua_Floats;
+extern int hf_opcua_Doubles;
+extern int hf_opcua_Strings;
+extern int hf_opcua_DateTimes;
+extern int hf_opcua_Guids;
+extern int hf_opcua_ByteStrings;
+extern int hf_opcua_XmlElements;
+extern int hf_opcua_StatusCodes;
+extern int hf_opcua_SemaphoreFilePath;
+extern int hf_opcua_IsOnline;
+extern int hf_opcua_ChannelId;
+extern int hf_opcua_TokenId;
+extern int hf_opcua_CreatedAt;
+extern int hf_opcua_RevisedLifetime;
+extern int hf_opcua_Algorithm;
+extern int hf_opcua_Signature;
+extern int hf_opcua_PropertyStatusCode;
+extern int hf_opcua_ViewVersion;
+extern int hf_opcua_RelativePath;
+extern int hf_opcua_AttributeId;
+extern int hf_opcua_IndexRange;
+extern int hf_opcua_IncludeSubTypes;
+extern int hf_opcua_Alias;
+extern int hf_opcua_Result;
+extern int hf_opcua_IndexOfInvalidElement;
+extern int hf_opcua_AttributeStatusCodes;
+extern int hf_opcua_NumValuesPerNode;
+extern int hf_opcua_EndTime;
+extern int hf_opcua_IsReadModified;
+extern int hf_opcua_ReturnBounds;
+extern int hf_opcua_ResampleInterval;
+extern int hf_opcua_ReqTimes;
+extern int hf_opcua_ClientHandle;
+extern int hf_opcua_PerformInsert;
+extern int hf_opcua_PerformReplace;
+extern int hf_opcua_IsDeleteModified;
+extern int hf_opcua_OperationResult;
+extern int hf_opcua_InputArgumentResults;
+extern int hf_opcua_DeadbandType;
+extern int hf_opcua_DeadbandValue;
+extern int hf_opcua_SelectClauseResults;
+extern int hf_opcua_SamplingInterval;
+extern int hf_opcua_QueueSize;
+extern int hf_opcua_DiscardOldest;
+extern int hf_opcua_MonitoredItemId;
+extern int hf_opcua_RevisedSamplingInterval;
+extern int hf_opcua_RevisedQueueSize;
+extern int hf_opcua_MonitorItemId;
+extern int hf_opcua_PublishTime;
+extern int hf_opcua_AvailableSequenceNumbersRanges;\r
+\r
+/** Register field types. */\r
+void registerFieldTypes(int proto);\r
diff --git a/plugins/opcua/opcua_identifiers.h b/plugins/opcua/opcua_identifiers.h
new file mode 100644 (file)
index 0000000..d5fd508
--- /dev/null
@@ -0,0 +1,44 @@
+/******************************************************************************\r
+** $Id$\r
+**\r
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.\r
+** Web: http://www.ascolab.com\r
+** \r
+** This program is free software; you can redistribute it and/or\r
+** modify it under the terms of the GNU General Public License\r
+** as published by the Free Software Foundation; either version 2\r
+** of the License, or (at your option) any later version.\r
+** \r
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\r
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
+** \r
+** Project: OpcUa Wireshark Plugin\r
+**\r
+** Description: Parser type definitions.\r
+**\r
+** This file was autogenerated on 8.5.2007 18:53:26.\r
+** DON'T MODIFY THIS FILE!\r
+**\r
+******************************************************************************/\r
+\r
+#ifdef HAVE_CONFIG_H\r
+# include "config.h"\r
+#endif\r
+\r
+#include <gmodule.h>\r
+#include <epan/packet.h>\r
+\r
+/* declare service parser function prototype */\r
+typedef void (*fctServiceParser)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);\r
+/* declare enum parser function prototype */\r
+typedef void (*fctEnumParser)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);\r
+/* declare type parser function prototype */\r
+typedef void (*fctComplexTypeParser)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);\r
+/* declare type parser function prototype */\r
+typedef void (*fctSimpleTypeParser)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+\r
+typedef struct _ParserEntry\r
+{\r
+       int iRequestId;\r
+       fctServiceParser pParser;\r
+} ParserEntry;\r
diff --git a/plugins/opcua/opcua_serviceparser.c b/plugins/opcua/opcua_serviceparser.c
new file mode 100644 (file)
index 0000000..7f3e330
--- /dev/null
@@ -0,0 +1,984 @@
+/******************************************************************************
+** $Id$
+**
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+** 
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License
+** as published by the Free Software Foundation; either version 2
+** of the License, or (at your option) any later version.
+** 
+** 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 8.5.2007 18:53:26.
+** DON'T MODIFY THIS FILE!
+**
+******************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gmodule.h>
+#include <epan/packet.h>
+#include "opcua_serviceparser.h"
+#include "opcua_complextypeparser.h"
+#include "opcua_enumparser.h"
+#include "opcua_simpletypes.h"
+#include "opcua_hfindeces.h"
+
+\r
+gint ett_opcua_TestStackRequest = -1;\r
+void parseTestStackRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TestStackRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TestStackRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_TestId);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_Iteration);
+  parseVariant(subtree, tvb, pOffset, "Input");\r
+}\r
+\r
+gint ett_opcua_TestStackResponse = -1;\r
+void parseTestStackResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TestStackResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TestStackResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseVariant(subtree, tvb, pOffset, "Output");\r
+}\r
+\r
+gint ett_opcua_TestStackExRequest = -1;\r
+void parseTestStackExRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TestStackExRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TestStackExRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_TestId);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_Iteration);
+  parseExtensionObject(subtree, tvb, pOffset, "Input");\r
+}\r
+\r
+gint ett_opcua_TestStackExResponse = -1;\r
+void parseTestStackExResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TestStackExResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TestStackExResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseExtensionObject(subtree, tvb, pOffset, "Output");\r
+}\r
+\r
+gint ett_opcua_FindServersRequest = -1;\r
+void parseFindServersRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "FindServersRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_FindServersRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "LocaleIds", parseLocalizedText);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_ServerUris, parseString);\r
+}\r
+\r
+gint ett_opcua_FindServersResponse = -1;\r
+void parseFindServersResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "FindServersResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_FindServersResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "Servers", parseServerDescription);\r
+}\r
+\r
+gint ett_opcua_GetEndpointsRequest = -1;\r
+void parseGetEndpointsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "GetEndpointsRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_GetEndpointsRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "LocaleIds", parseLocalizedText);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_ProfileUris, parseString);\r
+}\r
+\r
+gint ett_opcua_GetEndpointsResponse = -1;\r
+void parseGetEndpointsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "GetEndpointsResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_GetEndpointsResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "Endpoints", parseEndpointDescription);\r
+}\r
+\r
+gint ett_opcua_RegisterServerRequest = -1;\r
+void parseRegisterServerRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "RegisterServerRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RegisterServerRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseRegisteredServer(subtree, tvb, pOffset, "Server");\r
+}\r
+\r
+gint ett_opcua_RegisterServerResponse = -1;\r
+void parseRegisterServerResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "RegisterServerResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RegisterServerResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");\r
+}\r
+\r
+gint ett_opcua_OpenSecureChannelRequest = -1;\r
+void parseOpenSecureChannelRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "OpenSecureChannelRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_OpenSecureChannelRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ClientCertificate);
+  parseSecurityTokenRequestType(subtree, tvb, pOffset);
+  parseGuid(subtree, tvb, pOffset, hf_opcua_SecureChannelId);
+  parseMessageSecurityMode(subtree, tvb, pOffset);
+  parseString(subtree, tvb, pOffset, hf_opcua_SecurityPolicyUri);
+  parseSecurityPolicy(subtree, tvb, pOffset, "SecurityPolicy");
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ClientNonce);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_RequestedLifetime);\r
+}\r
+\r
+gint ett_opcua_OpenSecureChannelResponse = -1;\r
+void parseOpenSecureChannelResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "OpenSecureChannelResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_OpenSecureChannelResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ServerCertificate);
+  parseChannelSecurityToken(subtree, tvb, pOffset, "SecurityToken");
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ServerNonce);\r
+}\r
+\r
+gint ett_opcua_CloseSecureChannelRequest = -1;\r
+void parseCloseSecureChannelRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CloseSecureChannelRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CloseSecureChannelRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseGuid(subtree, tvb, pOffset, hf_opcua_SecureChannelId);\r
+}\r
+\r
+gint ett_opcua_CloseSecureChannelResponse = -1;\r
+void parseCloseSecureChannelResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CloseSecureChannelResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CloseSecureChannelResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");\r
+}\r
+\r
+gint ett_opcua_CreateSessionRequest = -1;\r
+void parseCreateSessionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateSessionRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateSessionRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseString(subtree, tvb, pOffset, hf_opcua_ClientName);
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ClientNonce);
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ClientCertificate);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_RequestedSessionTimeout);\r
+}\r
+\r
+gint ett_opcua_CreateSessionResponse = -1;\r
+void parseCreateSessionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateSessionResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateSessionResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SessionId);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_RevisedSessionTimeout);
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ServerNonce);
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ServerCertificate);
+  parseArrayComplex(subtree, tvb, pOffset, "ServerSoftwareCertificates", parseSignedSoftwareCertificate);
+  parseSignatureData(subtree, tvb, pOffset, "ServerSignature");\r
+}\r
+\r
+gint ett_opcua_ActivateSessionRequest = -1;\r
+void parseActivateSessionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ActivateSessionRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ActivateSessionRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseSignatureData(subtree, tvb, pOffset, "ClientSignature");
+  parseArrayComplex(subtree, tvb, pOffset, "ClientSoftwareCertificates", parseSignedSoftwareCertificate);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_LocaleIds, parseString);
+  parseExtensionObject(subtree, tvb, pOffset, "UserIdentityToken");
+  parseSignatureData(subtree, tvb, pOffset, "UserTokenSignature");\r
+}\r
+\r
+gint ett_opcua_ActivateSessionResponse = -1;\r
+void parseActivateSessionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ActivateSessionResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ActivateSessionResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ServerNonce);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_CertificateResults, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "CertificateDiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_CloseSessionRequest = -1;\r
+void parseCloseSessionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CloseSessionRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CloseSessionRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");\r
+}\r
+\r
+gint ett_opcua_CloseSessionResponse = -1;\r
+void parseCloseSessionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CloseSessionResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CloseSessionResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");\r
+}\r
+\r
+gint ett_opcua_CancelRequest = -1;\r
+void parseCancelRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CancelRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CancelRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SequenceNumber);\r
+}\r
+\r
+gint ett_opcua_CancelResponse = -1;\r
+void parseCancelResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CancelResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CancelResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");\r
+}\r
+\r
+gint ett_opcua_AddNodesRequest = -1;\r
+void parseAddNodesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "AddNodesRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddNodesRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "NodesToAdd", parseAddNodesItem);\r
+}\r
+\r
+gint ett_opcua_AddNodesResponse = -1;\r
+void parseAddNodesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "AddNodesResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddNodesResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "Results", parseAddNodesResult);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_AddReferencesRequest = -1;\r
+void parseAddReferencesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "AddReferencesRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddReferencesRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "ReferencesToAdd", parseAddReferencesItem);\r
+}\r
+\r
+gint ett_opcua_AddReferencesResponse = -1;\r
+void parseAddReferencesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "AddReferencesResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddReferencesResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_DeleteNodesRequest = -1;\r
+void parseDeleteNodesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteNodesRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteNodesRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "NodesToDelete", parseDeleteNodesItem);\r
+}\r
+\r
+gint ett_opcua_DeleteNodesResponse = -1;\r
+void parseDeleteNodesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteNodesResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteNodesResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "Diagnostics", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_DeleteReferencesRequest = -1;\r
+void parseDeleteReferencesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteReferencesRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteReferencesRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "ReferencesToDelete", parseDeleteReferencesItem);\r
+}\r
+\r
+gint ett_opcua_DeleteReferencesResponse = -1;\r
+void parseDeleteReferencesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteReferencesResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteReferencesResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_BrowsePropertiesRequest = -1;\r
+void parseBrowsePropertiesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowsePropertiesRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowsePropertiesRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "NodesToAccess", parseNodeId);
+  parseArrayComplex(subtree, tvb, pOffset, "Properties", parseQualifiedName);\r
+}\r
+\r
+gint ett_opcua_BrowsePropertiesResponse = -1;\r
+void parseBrowsePropertiesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowsePropertiesResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowsePropertiesResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "NodeResults", parseBrowsePropertiesResult);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_BrowseRequest = -1;\r
+void parseBrowseRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowseRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowseRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseViewDescription(subtree, tvb, pOffset, "View");
+  parseNodeId(subtree, tvb, pOffset, "NodeToBrowse");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_MaxResultsToReturn);
+  parseBrowseDirection(subtree, tvb, pOffset);
+  parseNodeId(subtree, tvb, pOffset, "ReferenceTypeId");
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_IncludeSubtypes);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_NodeClassMask);\r
+}\r
+\r
+gint ett_opcua_BrowseResponse = -1;\r
+void parseBrowseResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowseResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowseResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ContinuationPoint);
+  parseArrayComplex(subtree, tvb, pOffset, "References", parseReferenceDescription);\r
+}\r
+\r
+gint ett_opcua_BrowseNextRequest = -1;\r
+void parseBrowseNextRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowseNextRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowseNextRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_ReleaseContinuationPoint);
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ContinuationPoint);\r
+}\r
+\r
+gint ett_opcua_BrowseNextResponse = -1;\r
+void parseBrowseNextResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowseNextResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowseNextResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseByteString(subtree, tvb, pOffset, hf_opcua_RevisedContinuationPoint);
+  parseArrayComplex(subtree, tvb, pOffset, "References", parseReferenceDescription);\r
+}\r
+\r
+gint ett_opcua_TranslateBrowsePathsToNodeIdsRequest = -1;\r
+void parseTranslateBrowsePathsToNodeIdsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TranslateBrowsePathsToNodeIdsRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TranslateBrowsePathsToNodeIdsRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "BrowsePaths", parseBrowsePath);\r
+}\r
+\r
+gint ett_opcua_TranslateBrowsePathsToNodeIdsResponse = -1;\r
+void parseTranslateBrowsePathsToNodeIdsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TranslateBrowsePathsToNodeIdsResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TranslateBrowsePathsToNodeIdsResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "Results", parseTranslateBrowsePathResult);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_QueryFirstRequest = -1;\r
+void parseQueryFirstRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "QueryFirstRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryFirstRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseViewDescription(subtree, tvb, pOffset, "View");
+  parseArrayComplex(subtree, tvb, pOffset, "NodeTypes", parseNodeTypeDescription);
+  parseContentFilter(subtree, tvb, pOffset, "Filter");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_MaxDescriptionsToReturn);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_MaxReferencesToReturn);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_MaxReferencedNodesToReturn);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_MaxTime);\r
+}\r
+\r
+gint ett_opcua_QueryFirstResponse = -1;\r
+void parseQueryFirstResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "QueryFirstResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryFirstResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "QueryDataSets", parseQueryDataSet);
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ContinuationPoint);
+  parseArrayComplex(subtree, tvb, pOffset, "Results", parseQueryResult);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfo", parseDiagnosticInfo);
+  parseContentFilterResult(subtree, tvb, pOffset, "ContentFilterResult");\r
+}\r
+\r
+gint ett_opcua_QueryNextRequest = -1;\r
+void parseQueryNextRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "QueryNextRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryNextRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_ReleaseContinuationPoint);
+  parseByteString(subtree, tvb, pOffset, hf_opcua_ContinuationPoint);\r
+}\r
+\r
+gint ett_opcua_QueryNextResponse = -1;\r
+void parseQueryNextResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "QueryNextResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryNextResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "QueryDataSets", parseQueryDataSet);
+  parseByteString(subtree, tvb, pOffset, hf_opcua_RevisedContinuationPoint);\r
+}\r
+\r
+gint ett_opcua_ReadRequest = -1;\r
+void parseReadRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ReadRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseInt32(subtree, tvb, pOffset, hf_opcua_MaxAge);
+  parseTimestampsToReturn(subtree, tvb, pOffset);
+  parseArrayComplex(subtree, tvb, pOffset, "NodesToRead", parseReadValueId);\r
+}\r
+\r
+gint ett_opcua_ReadResponse = -1;\r
+void parseReadResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ReadResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "Results", parseDataValue);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_HistoryReadRequest = -1;\r
+void parseHistoryReadRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "HistoryReadRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryReadRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseExtensionObject(subtree, tvb, pOffset, "HistoryReadDetails");
+  parseTimestampsToReturn(subtree, tvb, pOffset);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_ReleaseContinuationPoints);
+  parseArrayComplex(subtree, tvb, pOffset, "NodesToRead", parseHistoryReadValueId);\r
+}\r
+\r
+gint ett_opcua_HistoryReadResponse = -1;\r
+void parseHistoryReadResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "HistoryReadResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryReadResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "Results", parseHistoryReadResult);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_WriteRequest = -1;\r
+void parseWriteRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "WriteRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_WriteRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "NodesToWrite", parseWriteValue);\r
+}\r
+\r
+gint ett_opcua_WriteResponse = -1;\r
+void parseWriteResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "WriteResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_WriteResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_HistoryUpdateRequest = -1;\r
+void parseHistoryUpdateRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "HistoryUpdateRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryUpdateRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "HistoryUpdateDetails", parseExtensionObject);\r
+}\r
+\r
+gint ett_opcua_HistoryUpdateResponse = -1;\r
+void parseHistoryUpdateResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "HistoryUpdateResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryUpdateResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "Results", parseHistoryUpdateResult);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_CallRequest = -1;\r
+void parseCallRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CallRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CallRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "MethodsToCall", parseCallRequestItem);\r
+}\r
+\r
+gint ett_opcua_CallResponse = -1;\r
+void parseCallResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CallResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CallResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "Results", parseCallResultItem);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_CreateMonitoredItemsRequest = -1;\r
+void parseCreateMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateMonitoredItemsRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateMonitoredItemsRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId);
+  parseTimestampsToReturn(subtree, tvb, pOffset);
+  parseArrayComplex(subtree, tvb, pOffset, "ItemsToCreate", parseMonitoredItemCreateRequest);\r
+}\r
+\r
+gint ett_opcua_CreateMonitoredItemsResponse = -1;\r
+void parseCreateMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateMonitoredItemsResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateMonitoredItemsResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "Results", parseMonitoredItemCreateResult);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_ModifyMonitoredItemsRequest = -1;\r
+void parseModifyMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ModifyMonitoredItemsRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ModifyMonitoredItemsRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId);
+  parseTimestampsToReturn(subtree, tvb, pOffset);
+  parseArrayComplex(subtree, tvb, pOffset, "ItemsToModify", parseMonitoredItemModifyRequest);\r
+}\r
+\r
+gint ett_opcua_ModifyMonitoredItemsResponse = -1;\r
+void parseModifyMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ModifyMonitoredItemsResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ModifyMonitoredItemsResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "Results", parseMonitoredItemModifyResult);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_SetMonitoringModeRequest = -1;\r
+void parseSetMonitoringModeRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetMonitoringModeRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetMonitoringModeRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId);
+  parseMonitoringMode(subtree, tvb, pOffset);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_MonitoredItemIds, parseUInt32);\r
+}\r
+\r
+gint ett_opcua_SetMonitoringModeResponse = -1;\r
+void parseSetMonitoringModeResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetMonitoringModeResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetMonitoringModeResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_SetTriggeringRequest = -1;\r
+void parseSetTriggeringRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetTriggeringRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetTriggeringRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_TriggeringItemId);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_LinksToAdd, parseUInt32);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_LinksToRemove, parseUInt32);\r
+}\r
+\r
+gint ett_opcua_SetTriggeringResponse = -1;\r
+void parseSetTriggeringResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetTriggeringResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetTriggeringResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_AddResults, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "AddDiagnosticInfos", parseDiagnosticInfo);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_RemoveResults, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "RemoveDiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_DeleteMonitoredItemsRequest = -1;\r
+void parseDeleteMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteMonitoredItemsRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteMonitoredItemsRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_MonitoredItemIds, parseUInt32);\r
+}\r
+\r
+gint ett_opcua_DeleteMonitoredItemsResponse = -1;\r
+void parseDeleteMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteMonitoredItemsResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteMonitoredItemsResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_CreateSubscriptionRequest = -1;\r
+void parseCreateSubscriptionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateSubscriptionRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateSubscriptionRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseInt32(subtree, tvb, pOffset, hf_opcua_RequestedPublishingInterval);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RequestedLifetimeCounter);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RequestedMaxKeepAliveCount);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_PublishingEnabled);
+  parseByte(subtree, tvb, pOffset, hf_opcua_Priority);\r
+}\r
+\r
+gint ett_opcua_CreateSubscriptionResponse = -1;\r
+void parseCreateSubscriptionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateSubscriptionResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateSubscriptionResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_RevisedPublishingInterval);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RevisedLifetimeCounter);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RevisedMaxKeepAliveCount);\r
+}\r
+\r
+gint ett_opcua_ModifySubscriptionRequest = -1;\r
+void parseModifySubscriptionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ModifySubscriptionRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ModifySubscriptionRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId);
+  parseInt32(subtree, tvb, pOffset, hf_opcua_RequestedPublishingInterval);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RequestedLifetimeCounter);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RequestedMaxKeepAliveCount);
+  parseByte(subtree, tvb, pOffset, hf_opcua_Priority);\r
+}\r
+\r
+gint ett_opcua_ModifySubscriptionResponse = -1;\r
+void parseModifySubscriptionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ModifySubscriptionResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ModifySubscriptionResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseInt32(subtree, tvb, pOffset, hf_opcua_RevisedPublishingInterval);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RevisedLifetimeCounter);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RevisedMaxKeepAliveCount);\r
+}\r
+\r
+gint ett_opcua_SetPublishingModeRequest = -1;\r
+void parseSetPublishingModeRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetPublishingModeRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetPublishingModeRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_PublishingEnabled);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_SubscriptionIds, parseUInt32);\r
+}\r
+\r
+gint ett_opcua_SetPublishingModeResponse = -1;\r
+void parseSetPublishingModeResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetPublishingModeResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetPublishingModeResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_PublishRequest = -1;\r
+void parsePublishRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "PublishRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_PublishRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "SubscriptionAcknowledgements", parseSubscriptionAcknowledgement);\r
+}\r
+\r
+gint ett_opcua_PublishResponse = -1;\r
+void parsePublishResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "PublishResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_PublishResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId);
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_AvailableSequenceNumbers, parseUInt32);
+  parseBoolean(subtree, tvb, pOffset, hf_opcua_MoreNotifications);
+  parseNotificationMessage(subtree, tvb, pOffset, "NotificationMessage");
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_RepublishRequest = -1;\r
+void parseRepublishRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "RepublishRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RepublishRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId);
+  parseUInt32(subtree, tvb, pOffset, hf_opcua_RetransmitSequenceNumber);\r
+}\r
+\r
+gint ett_opcua_RepublishResponse = -1;\r
+void parseRepublishResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "RepublishResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RepublishResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseNotificationMessage(subtree, tvb, pOffset, "NotificationMessage");\r
+}\r
+\r
+gint ett_opcua_TransferSubscriptionsRequest = -1;\r
+void parseTransferSubscriptionsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TransferSubscriptionsRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TransferSubscriptionsRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_SubscriptionIds, parseUInt32);\r
+}\r
+\r
+gint ett_opcua_TransferSubscriptionsResponse = -1;\r
+void parseTransferSubscriptionsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TransferSubscriptionsResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TransferSubscriptionsResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArrayComplex(subtree, tvb, pOffset, "Results", parseTransferResult);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+\r
+gint ett_opcua_DeleteSubscriptionsRequest = -1;\r
+void parseDeleteSubscriptionsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteSubscriptionsRequest");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteSubscriptionsRequest);\r
+
+  parseRequestHeader(subtree, tvb, pOffset, "RequestHeader");
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_SubscriptionIds, parseUInt32);\r
+}\r
+\r
+gint ett_opcua_DeleteSubscriptionsResponse = -1;\r
+void parseDeleteSubscriptionsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+  proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteSubscriptionsResponse");\r
+  proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteSubscriptionsResponse);\r
+
+  parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader");
+  parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode);
+  parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo);\r
+}\r
+
+/** Setup protocol subtree array */
+static gint *ett[] =
+{
+  &ett_opcua_TestStackRequest,
+  &ett_opcua_TestStackResponse,
+  &ett_opcua_TestStackExRequest,
+  &ett_opcua_TestStackExResponse,
+  &ett_opcua_FindServersRequest,
+  &ett_opcua_FindServersResponse,
+  &ett_opcua_GetEndpointsRequest,
+  &ett_opcua_GetEndpointsResponse,
+  &ett_opcua_RegisterServerRequest,
+  &ett_opcua_RegisterServerResponse,
+  &ett_opcua_OpenSecureChannelRequest,
+  &ett_opcua_OpenSecureChannelResponse,
+  &ett_opcua_CloseSecureChannelRequest,
+  &ett_opcua_CloseSecureChannelResponse,
+  &ett_opcua_CreateSessionRequest,
+  &ett_opcua_CreateSessionResponse,
+  &ett_opcua_ActivateSessionRequest,
+  &ett_opcua_ActivateSessionResponse,
+  &ett_opcua_CloseSessionRequest,
+  &ett_opcua_CloseSessionResponse,
+  &ett_opcua_CancelRequest,
+  &ett_opcua_CancelResponse,
+  &ett_opcua_AddNodesRequest,
+  &ett_opcua_AddNodesResponse,
+  &ett_opcua_AddReferencesRequest,
+  &ett_opcua_AddReferencesResponse,
+  &ett_opcua_DeleteNodesRequest,
+  &ett_opcua_DeleteNodesResponse,
+  &ett_opcua_DeleteReferencesRequest,
+  &ett_opcua_DeleteReferencesResponse,
+  &ett_opcua_BrowsePropertiesRequest,
+  &ett_opcua_BrowsePropertiesResponse,
+  &ett_opcua_BrowseRequest,
+  &ett_opcua_BrowseResponse,
+  &ett_opcua_BrowseNextRequest,
+  &ett_opcua_BrowseNextResponse,
+  &ett_opcua_TranslateBrowsePathsToNodeIdsRequest,
+  &ett_opcua_TranslateBrowsePathsToNodeIdsResponse,
+  &ett_opcua_QueryFirstRequest,
+  &ett_opcua_QueryFirstResponse,
+  &ett_opcua_QueryNextRequest,
+  &ett_opcua_QueryNextResponse,
+  &ett_opcua_ReadRequest,
+  &ett_opcua_ReadResponse,
+  &ett_opcua_HistoryReadRequest,
+  &ett_opcua_HistoryReadResponse,
+  &ett_opcua_WriteRequest,
+  &ett_opcua_WriteResponse,
+  &ett_opcua_HistoryUpdateRequest,
+  &ett_opcua_HistoryUpdateResponse,
+  &ett_opcua_CallRequest,
+  &ett_opcua_CallResponse,
+  &ett_opcua_CreateMonitoredItemsRequest,
+  &ett_opcua_CreateMonitoredItemsResponse,
+  &ett_opcua_ModifyMonitoredItemsRequest,
+  &ett_opcua_ModifyMonitoredItemsResponse,
+  &ett_opcua_SetMonitoringModeRequest,
+  &ett_opcua_SetMonitoringModeResponse,
+  &ett_opcua_SetTriggeringRequest,
+  &ett_opcua_SetTriggeringResponse,
+  &ett_opcua_DeleteMonitoredItemsRequest,
+  &ett_opcua_DeleteMonitoredItemsResponse,
+  &ett_opcua_CreateSubscriptionRequest,
+  &ett_opcua_CreateSubscriptionResponse,
+  &ett_opcua_ModifySubscriptionRequest,
+  &ett_opcua_ModifySubscriptionResponse,
+  &ett_opcua_SetPublishingModeRequest,
+  &ett_opcua_SetPublishingModeResponse,
+  &ett_opcua_PublishRequest,
+  &ett_opcua_PublishResponse,
+  &ett_opcua_RepublishRequest,
+  &ett_opcua_RepublishResponse,
+  &ett_opcua_TransferSubscriptionsRequest,
+  &ett_opcua_TransferSubscriptionsResponse,
+  &ett_opcua_DeleteSubscriptionsRequest,
+  &ett_opcua_DeleteSubscriptionsResponse,
+};
+
+void registerServiceTypes()
+{
+  proto_register_subtree_array(ett, array_length(ett));
+}
+
diff --git a/plugins/opcua/opcua_serviceparser.h b/plugins/opcua/opcua_serviceparser.h
new file mode 100644 (file)
index 0000000..2445f2a
--- /dev/null
@@ -0,0 +1,107 @@
+/******************************************************************************
+** $Id$
+**
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.
+** Web: http://www.ascolab.com
+** 
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License
+** as published by the Free Software Foundation; either version 2
+** of the License, or (at your option) any later version.
+** 
+** 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 8.5.2007 18:53:26.
+** DON'T MODIFY THIS FILE!
+**
+******************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gmodule.h>
+#include <epan/packet.h>
+
+void parseTestStackRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseTestStackResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseTestStackExRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseTestStackExResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseFindServersRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseFindServersResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseGetEndpointsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseGetEndpointsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseRegisterServerRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseRegisterServerResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseOpenSecureChannelRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseOpenSecureChannelResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseCloseSecureChannelRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseCloseSecureChannelResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseCreateSessionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseCreateSessionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseActivateSessionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseActivateSessionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseCloseSessionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseCloseSessionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseCancelRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseCancelResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseAddNodesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseAddNodesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseAddReferencesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseAddReferencesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseDeleteNodesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseDeleteNodesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseDeleteReferencesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseDeleteReferencesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseBrowsePropertiesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseBrowsePropertiesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseBrowseRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseBrowseResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseBrowseNextRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseBrowseNextResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseTranslateBrowsePathsToNodeIdsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseTranslateBrowsePathsToNodeIdsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseQueryFirstRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseQueryFirstResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseQueryNextRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseQueryNextResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseReadRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseReadResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseHistoryReadRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseHistoryReadResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseWriteRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseWriteResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseHistoryUpdateRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseHistoryUpdateResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseCallRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseCallResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseCreateMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseCreateMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseModifyMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseModifyMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseSetMonitoringModeRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseSetMonitoringModeResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseSetTriggeringRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseSetTriggeringResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseDeleteMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseDeleteMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseCreateSubscriptionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseCreateSubscriptionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseModifySubscriptionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseModifySubscriptionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseSetPublishingModeRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseSetPublishingModeResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parsePublishRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parsePublishResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseRepublishRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseRepublishResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseTransferSubscriptionsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseTransferSubscriptionsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseDeleteSubscriptionsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void parseDeleteSubscriptionsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);
+void registerServiceTypes();
diff --git a/plugins/opcua/opcua_servicetable.c b/plugins/opcua/opcua_servicetable.c
new file mode 100644 (file)
index 0000000..5a44bae
--- /dev/null
@@ -0,0 +1,209 @@
+/******************************************************************************\r
+** $Id$\r
+**\r
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.\r
+** Web: http://www.ascolab.com\r
+** \r
+** This program is free software; you can redistribute it and/or\r
+** modify it under the terms of the GNU General Public License\r
+** as published by the Free Software Foundation; either version 2\r
+** of the License, or (at your option) any later version.\r
+** \r
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\r
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
+** \r
+** Project: OpcUa Wireshark Plugin\r
+**\r
+** Description: Service table and service dispatcher.\r
+**\r
+** This file was autogenerated on 8.5.2007 18:53:26.\r
+** DON'T MODIFY THIS FILE!\r
+**\r
+******************************************************************************/\r
+\r
+#ifdef HAVE_CONFIG_H\r
+# include "config.h"\r
+#endif\r
+\r
+#include <gmodule.h>\r
+#include <epan/packet.h>\r
+#include "opcua_identifiers.h"\r
+#include "opcua_serviceparser.h"\r
+\r
+ParserEntry g_arParserTable[] = {\r
+  { 1358, parseTestStackRequest }, 
+  { 1363, parseTestStackResponse }, 
+  { 1368, parseTestStackExRequest }, 
+  { 1373, parseTestStackExResponse }, 
+  { 1414, parseFindServersRequest }, 
+  { 1419, parseFindServersResponse }, 
+  { 1424, parseGetEndpointsRequest }, 
+  { 1429, parseGetEndpointsResponse }, 
+  { 1439, parseRegisterServerRequest }, 
+  { 1444, parseRegisterServerResponse }, 
+  { 1454, parseOpenSecureChannelRequest }, 
+  { 1459, parseOpenSecureChannelResponse }, 
+  { 1464, parseCloseSecureChannelRequest }, 
+  { 1469, parseCloseSecureChannelResponse }, 
+  { 1479, parseCreateSessionRequest }, 
+  { 1484, parseCreateSessionResponse }, 
+  { 1489, parseActivateSessionRequest }, 
+  { 1494, parseActivateSessionResponse }, 
+  { 1499, parseCloseSessionRequest }, 
+  { 1504, parseCloseSessionResponse }, 
+  { 1509, parseCancelRequest }, 
+  { 1514, parseCancelResponse }, 
+  { 1524, parseAddNodesRequest }, 
+  { 1529, parseAddNodesResponse }, 
+  { 1534, parseAddReferencesRequest }, 
+  { 1539, parseAddReferencesResponse }, 
+  { 1544, parseDeleteNodesRequest }, 
+  { 1549, parseDeleteNodesResponse }, 
+  { 1554, parseDeleteReferencesRequest }, 
+  { 1559, parseDeleteReferencesResponse }, 
+  { 1574, parseBrowsePropertiesRequest }, 
+  { 1579, parseBrowsePropertiesResponse }, 
+  { 1599, parseBrowseRequest }, 
+  { 1604, parseBrowseResponse }, 
+  { 1609, parseBrowseNextRequest }, 
+  { 1614, parseBrowseNextResponse }, 
+  { 1630, parseTranslateBrowsePathsToNodeIdsRequest }, 
+  { 1635, parseTranslateBrowsePathsToNodeIdsResponse }, 
+  { 1710, parseQueryFirstRequest }, 
+  { 1715, parseQueryFirstResponse }, 
+  { 1720, parseQueryNextRequest }, 
+  { 1725, parseQueryNextResponse }, 
+  { 1740, parseReadRequest }, 
+  { 1745, parseReadResponse }, 
+  { 1790, parseHistoryReadRequest }, 
+  { 1795, parseHistoryReadResponse }, 
+  { 1805, parseWriteRequest }, 
+  { 1810, parseWriteResponse }, 
+  { 1845, parseHistoryUpdateRequest }, 
+  { 1850, parseHistoryUpdateResponse }, 
+  { 1865, parseCallRequest }, 
+  { 1870, parseCallResponse }, 
+  { 1930, parseCreateMonitoredItemsRequest }, 
+  { 1935, parseCreateMonitoredItemsResponse }, 
+  { 1950, parseModifyMonitoredItemsRequest }, 
+  { 1955, parseModifyMonitoredItemsResponse }, 
+  { 1960, parseSetMonitoringModeRequest }, 
+  { 1965, parseSetMonitoringModeResponse }, 
+  { 1970, parseSetTriggeringRequest }, 
+  { 1975, parseSetTriggeringResponse }, 
+  { 1980, parseDeleteMonitoredItemsRequest }, 
+  { 1985, parseDeleteMonitoredItemsResponse }, 
+  { 1990, parseCreateSubscriptionRequest }, 
+  { 1995, parseCreateSubscriptionResponse }, 
+  { 2000, parseModifySubscriptionRequest }, 
+  { 2005, parseModifySubscriptionResponse }, 
+  { 2010, parseSetPublishingModeRequest }, 
+  { 2015, parseSetPublishingModeResponse }, 
+  { 2050, parsePublishRequest }, 
+  { 2055, parsePublishResponse }, 
+  { 2060, parseRepublishRequest }, 
+  { 2065, parseRepublishResponse }, 
+  { 2075, parseTransferSubscriptionsRequest }, 
+  { 2080, parseTransferSubscriptionsResponse }, 
+  { 2085, parseDeleteSubscriptionsRequest }, 
+  { 2090, parseDeleteSubscriptionsResponse }
+\r
+};\r
+const int g_NumServices = sizeof(g_arParserTable) / sizeof(ParserEntry);\r
+\r
+/** Service type table */\r
+const value_string g_requesttypes[] = {
+  { 1358, "TestStackRequest" },
+  { 1363, "TestStackResponse" },
+  { 1368, "TestStackExRequest" },
+  { 1373, "TestStackExResponse" },
+  { 1414, "FindServersRequest" },
+  { 1419, "FindServersResponse" },
+  { 1424, "GetEndpointsRequest" },
+  { 1429, "GetEndpointsResponse" },
+  { 1439, "RegisterServerRequest" },
+  { 1444, "RegisterServerResponse" },
+  { 1454, "OpenSecureChannelRequest" },
+  { 1459, "OpenSecureChannelResponse" },
+  { 1464, "CloseSecureChannelRequest" },
+  { 1469, "CloseSecureChannelResponse" },
+  { 1479, "CreateSessionRequest" },
+  { 1484, "CreateSessionResponse" },
+  { 1489, "ActivateSessionRequest" },
+  { 1494, "ActivateSessionResponse" },
+  { 1499, "CloseSessionRequest" },
+  { 1504, "CloseSessionResponse" },
+  { 1509, "CancelRequest" },
+  { 1514, "CancelResponse" },
+  { 1524, "AddNodesRequest" },
+  { 1529, "AddNodesResponse" },
+  { 1534, "AddReferencesRequest" },
+  { 1539, "AddReferencesResponse" },
+  { 1544, "DeleteNodesRequest" },
+  { 1549, "DeleteNodesResponse" },
+  { 1554, "DeleteReferencesRequest" },
+  { 1559, "DeleteReferencesResponse" },
+  { 1574, "BrowsePropertiesRequest" },
+  { 1579, "BrowsePropertiesResponse" },
+  { 1599, "BrowseRequest" },
+  { 1604, "BrowseResponse" },
+  { 1609, "BrowseNextRequest" },
+  { 1614, "BrowseNextResponse" },
+  { 1630, "TranslateBrowsePathsToNodeIdsRequest" },
+  { 1635, "TranslateBrowsePathsToNodeIdsResponse" },
+  { 1710, "QueryFirstRequest" },
+  { 1715, "QueryFirstResponse" },
+  { 1720, "QueryNextRequest" },
+  { 1725, "QueryNextResponse" },
+  { 1740, "ReadRequest" },
+  { 1745, "ReadResponse" },
+  { 1790, "HistoryReadRequest" },
+  { 1795, "HistoryReadResponse" },
+  { 1805, "WriteRequest" },
+  { 1810, "WriteResponse" },
+  { 1845, "HistoryUpdateRequest" },
+  { 1850, "HistoryUpdateResponse" },
+  { 1865, "CallRequest" },
+  { 1870, "CallResponse" },
+  { 1930, "CreateMonitoredItemsRequest" },
+  { 1935, "CreateMonitoredItemsResponse" },
+  { 1950, "ModifyMonitoredItemsRequest" },
+  { 1955, "ModifyMonitoredItemsResponse" },
+  { 1960, "SetMonitoringModeRequest" },
+  { 1965, "SetMonitoringModeResponse" },
+  { 1970, "SetTriggeringRequest" },
+  { 1975, "SetTriggeringResponse" },
+  { 1980, "DeleteMonitoredItemsRequest" },
+  { 1985, "DeleteMonitoredItemsResponse" },
+  { 1990, "CreateSubscriptionRequest" },
+  { 1995, "CreateSubscriptionResponse" },
+  { 2000, "ModifySubscriptionRequest" },
+  { 2005, "ModifySubscriptionResponse" },
+  { 2010, "SetPublishingModeRequest" },
+  { 2015, "SetPublishingModeResponse" },
+  { 2050, "PublishRequest" },
+  { 2055, "PublishResponse" },
+  { 2060, "RepublishRequest" },
+  { 2065, "RepublishResponse" },
+  { 2075, "TransferSubscriptionsRequest" },
+  { 2080, "TransferSubscriptionsResponse" },
+  { 2085, "DeleteSubscriptionsRequest" },
+  { 2090, "DeleteSubscriptionsResponse" },\r
+  { 0, NULL }\r
+};\r
+\r
+/** Dispatch all services to a special parser function. */\r
+void dispatchService(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int ServiceId)\r
+{\r
+    int index = 0;\r
+\r
+    while (index < g_NumServices)\r
+    {\r
+        if (g_arParserTable[index].iRequestId == ServiceId)\r
+        {\r
+            (*g_arParserTable[index].pParser)(tree, tvb, pOffset);\r
+            break;\r
+        }\r
+        index++;\r
+    }\r
+}\r
diff --git a/plugins/opcua/opcua_simpletypes.c b/plugins/opcua/opcua_simpletypes.c
new file mode 100644 (file)
index 0000000..26d578c
--- /dev/null
@@ -0,0 +1,840 @@
+/******************************************************************************\r
+** $Id: opcua_simpletypes.c,v 1.1 2007/02/08 11:26:55 gergap Exp $\r
+**\r
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.\r
+** Web: http://www.ascolab.com\r
+** \r
+** This program is free software; you can redistribute it and/or\r
+** modify it under the terms of the GNU General Public License\r
+** as published by the Free Software Foundation; either version 2\r
+** of the License, or (at your option) any later version.\r
+** \r
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\r
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
+** \r
+** Project: OpcUa Wireshark Plugin\r
+**\r
+** Description: Implementation of OpcUa built-in type parsers.\r
+**              This contains all the simple types and some complex types.\r
+**\r
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>\r
+** Last change by: $Author: gergap $\r
+**\r
+******************************************************************************/\r
+\r
+#ifdef HAVE_CONFIG_H\r
+# include "config.h"\r
+#endif\r
+\r
+#include <gmodule.h>\r
+#include <epan/packet.h>\r
+#include <epan/dissectors/packet-windows-common.h>\r
+#include "opcua_simpletypes.h"\r
+#include "opcua_hfindeces.h"\r
+#include <string.h>\r
+#include <epan/emem.h>\r
+\r
+/* string buffer */\r
+#define MAX_BUFFER 256\r
+\r
+#define DIAGNOSTICINFO_ENCODINGMASK_SYMBOLICID_FLAG           0x01\r
+#define DIAGNOSTICINFO_ENCODINGMASK_NAMESPACE_FLAG            0x02\r
+#define DIAGNOSTICINFO_ENCODINGMASK_LOCALIZEDTEXT_FLAG        0x04\r
+#define DIAGNOSTICINFO_ENCODINGMASK_ADDITIONALINFO_FLAG       0x08\r
+#define DIAGNOSTICINFO_ENCODINGMASK_INNERSTATUSCODE_FLAG      0x10\r
+#define DIAGNOSTICINFO_ENCODINGMASK_INNERDIAGNOSTICINFO_FLAG  0x20\r
+#define LOCALIZEDTEXT_ENCODINGBYTE_LOCALE                     0x01\r
+#define LOCALIZEDTEXT_ENCODINGBYTE_TEXT                       0x02\r
+#define NODEID_URIMASK                                        0x80\r
+#define DATAVALUE_ENCODINGBYTE_VALUE                          0x01\r
+#define DATAVALUE_ENCODINGBYTE_STATUSCODE                     0x02\r
+#define DATAVALUE_ENCODINGBYTE_SOURCETIMESTAMP                0x04\r
+#define DATAVALUE_ENCODINGBYTE_SERVERTIMESTAMP                0x08\r
+#define EXTOBJ_ENCODINGMASK_BINBODY_FLAG                      0x01\r
+#define EXTOBJ_ENCODINGMASK_XMLBODY_FLAG                      0x02\r
+\r
+static int hf_opcua_diag_mask_symbolicflag = -1;\r
+static int hf_opcua_diag_mask_namespaceflag = -1;\r
+static int hf_opcua_diag_mask_localizedtextflag = -1;\r
+static int hf_opcua_diag_mask_additionalinfoflag = -1;\r
+static int hf_opcua_diag_mask_innerstatuscodeflag = -1;\r
+static int hf_opcua_diag_mask_innerdiaginfoflag = -1;\r
+static int hf_opcua_loctext_mask_localeflag = -1;\r
+static int hf_opcua_loctext_mask_textflag = -1;\r
+static int hf_opcua_datavalue_mask_valueflag = -1;\r
+static int hf_opcua_datavalue_mask_statuscodeflag = -1;\r
+static int hf_opcua_datavalue_mask_sourcetimestampflag = -1;\r
+static int hf_opcua_datavalue_mask_servertimestampflag = -1;\r
+static int hf_opcua_nodeid_encodingmask = -1;\r
+static int hf_opcua_variant_encodingmask = -1;\r
+static int hf_opcua_nodeid_nsid = -1;\r
+static int hf_opcua_nodeid_numeric = -1;\r
+static int hf_opcua_Locale = -1;\r
+static int hf_opcua_Text = -1;\r
+static int hf_opcua_SourceTimestamp = -1;\r
+static int hf_opcua_ServerTimestamp = -1;\r
+static int hf_opcua_diag_symbolicid = -1;\r
+static int hf_opcua_diag_namespace = -1;\r
+static int hf_opcua_diag_localizedtext = -1;\r
+static int hf_opcua_diag_additionalinfo = -1;\r
+static int hf_opcua_diag_innerstatuscode = -1;\r
+static int hf_opcua_extobj_mask_binbodyflag = -1;\r
+static int hf_opcua_extobj_mask_xmlbodyflag = -1;\r
+\r
+/** NodeId encoding mask table */\r
+static const value_string g_nodeidmasks[] = {\r
+    { 0, "Two byte encoded Numeric" },\r
+    { 1, "Four byte encoded Numeric" },\r
+    { 2, "Numeric of arbitrary length" },\r
+    { 3, "String" },\r
+    { 4, "URI" },\r
+    { 5, "GUID" },\r
+    { 6, "ByteString" },\r
+    { 0x80, "UriMask" },\r
+    { 0, NULL }\r
+};\r
+\r
+/** UA Variant Type enum */\r
+typedef enum _OpcUa_BuiltInType\r
+{\r
+    OpcUaType_Null = 0,\r
+    OpcUaType_Boolean = 1,\r
+    OpcUaType_SByte = 2,\r
+    OpcUaType_Byte = 3,\r
+    OpcUaType_Int16 = 4,\r
+    OpcUaType_UInt16 = 5,\r
+    OpcUaType_Int32 = 6,\r
+    OpcUaType_UInt32 = 7,\r
+    OpcUaType_Int64 = 8,\r
+    OpcUaType_UInt64 = 9,\r
+    OpcUaType_Float = 10,\r
+    OpcUaType_Double = 11,\r
+    OpcUaType_String = 12,\r
+    OpcUaType_DateTime = 13,\r
+    OpcUaType_Guid = 14,\r
+    OpcUaType_ByteString = 15,\r
+    OpcUaType_XmlElement = 16,\r
+    OpcUaType_NodeId = 17,\r
+    OpcUaType_ExpandedNodeId = 18,\r
+    OpcUaType_StatusCode = 19,\r
+    OpcUaType_DiagnosticInfo = 20,\r
+    OpcUaType_QualifiedName = 21,\r
+    OpcUaType_LocalizedText = 22,\r
+    OpcUaType_ExtensionObject = 23,\r
+    OpcUaType_DataValue = 24,\r
+    OpcUaType_Variant = 25  \r
+}\r
+OpcUa_BuiltInType;\r
+\r
+/** Variant encoding mask table */\r
+static const value_string g_VariantTypes[] = {\r
+    { 0, "Null" },\r
+    { 1, "Boolean" },\r
+    { 2, "SByte" },\r
+    { 3, "Byte" },\r
+    { 4, "Int16" },\r
+    { 5, "UInt16" },\r
+    { 6, "Int32" },\r
+    { 7, "UInt32" },\r
+    { 8, "Int64" },\r
+    { 9, "UInt64" },\r
+    { 10, "Float" },\r
+    { 11, "Double" },\r
+    { 12, "String" },\r
+    { 13, "DateTime" },\r
+    { 14, "Guid" },\r
+    { 15, "ByteString" },\r
+    { 16, "XmlElement" },\r
+    { 17, "NodeId" },\r
+    { 18, "ExpandedNodeId" },\r
+    { 19, "StatusCode" },\r
+    { 20, "DiagnosticInfo" },\r
+    { 21, "QualifiedName" },\r
+    { 22, "LocalizedText" },\r
+    { 23, "ExtensionObject" },\r
+    { 24, "DataValue" },\r
+    { 25, "Variant" },\r
+    { 0x80,   "Array of Null" },\r
+    { 0x80+1, "Array of Boolean" },\r
+    { 0x80+2, "Array of SByte" },\r
+    { 0x80+3, "Array of Byte" },\r
+    { 0x80+4, "Array of Int16" },\r
+    { 0x80+5, "Array of UInt16" },\r
+    { 0x80+6, "Array of Int32" },\r
+    { 0x80+7, "Array of UInt32" },\r
+    { 0x80+8, "Array of Int64" },\r
+    { 0x80+9, "Array of UInt64" },\r
+    { 0x80+10, "Array of Float" },\r
+    { 0x80+11, "Array of Double" },\r
+    { 0x80+12, "Array of String" },\r
+    { 0x80+13, "Array of DateTime" },\r
+    { 0x80+14, "Array of Guid" },\r
+    { 0x80+15, "Array of ByteString" },\r
+    { 0x80+16, "Array of XmlElement" },\r
+    { 0x80+17, "Array of NodeId" },\r
+    { 0x80+18, "Array of ExpandedNodeId" },\r
+    { 0x80+19, "Array of StatusCode" },\r
+    { 0x80+20, "Array of DiagnosticInfo" },\r
+    { 0x80+21, "Array of QualifiedName" },\r
+    { 0x80+22, "Array of LocalizedText" },\r
+    { 0x80+23, "Array of ExtensionObject" },\r
+    { 0x80+24, "Array of DataValue" },\r
+    { 0x80+25, "Array of Variant" },\r
+    { 0, NULL }\r
+};\r
+#define VARIANT_ARRAYMASK 0x80\r
+\r
+/* trees */\r
+static gint ett_opcua_array = -1;\r
+static gint ett_opcua_diagnosticinfo = -1;\r
+static gint ett_opcua_nodeid = -1;\r
+static gint ett_opcua_localeid = -1;\r
+static gint ett_opcua_localizedtext = -1;\r
+static gint ett_opcua_qualifiedname = -1;\r
+static gint ett_opcua_datavalue = -1;\r
+static gint ett_opcua_variant = -1;\r
+static gint ett_opcua_extensionobject = -1;\r
+static gint ett_opcua_extobj_encodingmask = -1;\r
+static gint *ett[] =\r
+{\r
+  &ett_opcua_array,\r
+  &ett_opcua_diagnosticinfo,\r
+  &ett_opcua_nodeid,\r
+  &ett_opcua_localeid,\r
+  &ett_opcua_localizedtext,\r
+  &ett_opcua_qualifiedname,\r
+  &ett_opcua_datavalue,\r
+  &ett_opcua_variant,\r
+  &ett_opcua_extensionobject,\r
+  &ett_opcua_extobj_encodingmask\r
+};\r
+\r
+\r
+static hf_register_info hf[] =\r
+{\r
+    /* full name  ,           abbreviation  ,       type     , display  , strings, bitmask, blurb, id, parent, ref_count, bitshift */\r
+    { &hf_opcua_diag_mask_symbolicflag,\r
+    {  "has symbolic id",           "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_SYMBOLICID_FLAG, "", HFILL }\r
+    },\r
+    { &hf_opcua_diag_mask_namespaceflag,\r
+    {  "has namespace",             "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_NAMESPACE_FLAG, "", HFILL }\r
+    },\r
+    { &hf_opcua_diag_mask_localizedtextflag,\r
+    {  "has localizedtext",         "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_LOCALIZEDTEXT_FLAG, "", HFILL }\r
+    },\r
+    { &hf_opcua_diag_mask_additionalinfoflag,\r
+    {  "has additional info",       "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_ADDITIONALINFO_FLAG, "", HFILL }\r
+    },\r
+    { &hf_opcua_diag_mask_innerstatuscodeflag,\r
+    {  "has inner statuscode",      "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_INNERSTATUSCODE_FLAG, "", HFILL }\r
+    },\r
+    { &hf_opcua_diag_mask_innerdiaginfoflag,\r
+    {  "has inner diagnostic info", "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_INNERDIAGNOSTICINFO_FLAG, "", HFILL }\r
+    },\r
+    { &hf_opcua_loctext_mask_localeflag,\r
+    {  "has locale information", "", FT_BOOLEAN, 8, NULL, LOCALIZEDTEXT_ENCODINGBYTE_LOCALE, "", HFILL }\r
+    },\r
+    { &hf_opcua_loctext_mask_textflag,\r
+    {  "has text", "", FT_BOOLEAN, 8, NULL, LOCALIZEDTEXT_ENCODINGBYTE_TEXT, "", HFILL }\r
+    },\r
+    { &hf_opcua_nodeid_encodingmask,\r
+    {  "NodeId EncodingMask",        "application.nodeid.encodingmask", FT_UINT8,   BASE_HEX,  VALS(g_nodeidmasks), 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_nodeid_nsid,\r
+    {  "NodeId Namespace Id",        "application.nodeid.nsid",         FT_UINT32,  BASE_DEC,  NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_nodeid_numeric,\r
+    {  "NodeId Identifier Numeric",  "application.nodeid.numeric",      FT_UINT32,  BASE_DEC,  NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_Locale, { "Locale", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },\r
+    { &hf_opcua_Text,   { "Text",   "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },\r
+    { &hf_opcua_datavalue_mask_valueflag,           {  "has value", "",            FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_VALUE, "", HFILL } },\r
+    { &hf_opcua_datavalue_mask_statuscodeflag,      {  "has statuscode", "",       FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_STATUSCODE, "", HFILL } },\r
+    { &hf_opcua_datavalue_mask_sourcetimestampflag, {  "has source timestamp", "", FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_SOURCETIMESTAMP, "", HFILL } },\r
+    { &hf_opcua_datavalue_mask_servertimestampflag, {  "has server timestamp", "", FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_SERVERTIMESTAMP, "", HFILL } },\r
+    { &hf_opcua_variant_encodingmask, { "Variant Type", "", FT_UINT8, BASE_HEX, VALS(g_VariantTypes), 0x0, "", HFILL } },\r
+    { &hf_opcua_SourceTimestamp, { "SourceTimestamp", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },\r
+    { &hf_opcua_ServerTimestamp, { "ServerTimestamp", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } },\r
+    { &hf_opcua_diag_symbolicid,      { "SymblicId", "",       FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },\r
+    { &hf_opcua_diag_namespace,       { "Namespace", "",       FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },\r
+    { &hf_opcua_diag_localizedtext,   { "LocaliezdText", "",   FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } },\r
+    { &hf_opcua_diag_additionalinfo,  { "AdditionalInfo", "",  FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } },\r
+    { &hf_opcua_diag_innerstatuscode, { "InnerStatusCode", "", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } },\r
+    { &hf_opcua_extobj_mask_binbodyflag, {  "has binary body", "", FT_BOOLEAN, 8, NULL, EXTOBJ_ENCODINGMASK_BINBODY_FLAG, "", HFILL } },\r
+    { &hf_opcua_extobj_mask_xmlbodyflag, {  "has xml body",    "", FT_BOOLEAN, 8, NULL, EXTOBJ_ENCODINGMASK_XMLBODY_FLAG, "", HFILL } }\r
+};\r
+\r
+void registerSimpleTypes(int proto)\r
+{\r
+    proto_register_field_array(proto, hf, array_length(hf));\r
+    proto_register_subtree_array(ett, array_length(ett));\r
+}\r
+\r
+void parseBoolean(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+    proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 1, TRUE); *pOffset+=1;\r
+}\r
+\r
+void parseByte(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+    proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 1, TRUE); *pOffset+=1;\r
+}\r
+\r
+void parseSByte(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+    proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 1, TRUE); *pOffset+=1;\r
+}\r
+\r
+void parseUInt16(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+    proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 2, TRUE); *pOffset+=2;\r
+}\r
+\r
+void parseInt16(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+    proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 2, TRUE); *pOffset+=2;\r
+}\r
+\r
+void parseUInt32(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+    proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+void parseInt32(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+    proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+void parseUInt64(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+    proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 8, TRUE); *pOffset+=8;\r
+}\r
+\r
+void parseInt64(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+    proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 8, TRUE); *pOffset+=8;\r
+}\r
+\r
+void parseString(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+    char *szValue = ep_alloc(MAX_BUFFER);\r
+    gint iOffset = *pOffset;\r
+    gint32 iLen = tvb_get_letohl(tvb, *pOffset);\r
+    iOffset+=4;\r
+\r
+    if (szValue)\r
+    {\r
+        if (iLen == -1)\r
+        {\r
+            g_snprintf(szValue, MAX_BUFFER, "[OpcUa Null String]");\r
+        }\r
+        else if (iLen >= 0)\r
+        {\r
+            int iStrLen = iLen;\r
+            if (iStrLen > (MAX_BUFFER-1)) iStrLen = MAX_BUFFER - 1;\r
+            /* copy non null terminated string of length iStrlen */\r
+            strncpy(szValue, (char*)&tvb->real_data[iOffset], iStrLen);\r
+            /* set null terminator */\r
+            szValue[iStrLen] = 0;\r
+            iOffset += iLen; /* eat the whole string */\r
+        }\r
+        else\r
+        {\r
+            g_snprintf(szValue, MAX_BUFFER, "[Invalid String] Ups, something is wrong with this message.");\r
+        }\r
+\r
+        proto_tree_add_string(tree, hfIndex, tvb, *pOffset, (iOffset - *pOffset), szValue);\r
+        *pOffset = iOffset;\r
+    }\r
+}\r
+\r
+void parseStatusCode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+    proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 4, TRUE); \r
+    *pOffset += 4;\r
+}\r
+\r
+void parseLocalizedText(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+    gint        iOffset = *pOffset;\r
+    guint8      EncodingMask;\r
+    proto_tree *mask_tree;\r
+    proto_tree *subtree;\r
+    proto_item *ti;\r
+\r
+    ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: LocalizedText", szFieldName);\r
+    subtree = proto_item_add_subtree(ti, ett_opcua_localizedtext);\r
+\r
+    /* parse encoding mask */\r
+    EncodingMask = tvb_get_guint8(tvb, iOffset);\r
+    ti = proto_tree_add_text(subtree, tvb, 0, -1, "EncodingMask");\r
+    mask_tree = proto_item_add_subtree(ti, ett_opcua_localizedtext);\r
+    proto_tree_add_item(mask_tree, hf_opcua_loctext_mask_localeflag, tvb, iOffset, 1, TRUE);\r
+    proto_tree_add_item(mask_tree, hf_opcua_loctext_mask_textflag,   tvb, iOffset, 1, TRUE);\r
+    iOffset++;\r
+\r
+    if (EncodingMask & LOCALIZEDTEXT_ENCODINGBYTE_LOCALE)\r
+    {\r
+        parseString(subtree, tvb, &iOffset, hf_opcua_Locale);\r
+    }\r
+\r
+    if (EncodingMask & LOCALIZEDTEXT_ENCODINGBYTE_TEXT)\r
+    {\r
+        parseString(subtree, tvb, &iOffset, hf_opcua_Text);\r
+    }\r
+\r
+    *pOffset = iOffset;\r
+}\r
+\r
+void parseGuid(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+    proto_tree_add_item(tree, hfIndex, tvb, *pOffset, GUID_LEN, TRUE); *pOffset+=GUID_LEN;\r
+}\r
+\r
+void parseByteString(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+    int iOffset = *pOffset;\r
+    gint32 iLen = tvb_get_letohl(tvb, iOffset);\r
+    iOffset += 4;\r
+\r
+    if (iLen == -1)\r
+    {\r
+    }\r
+    else if (iLen >= 0)\r
+    {\r
+        iOffset += iLen;\r
+    }\r
+    proto_tree_add_item(tree, hfIndex, tvb, *pOffset, (iOffset - *pOffset), TRUE);\r
+    *pOffset = iOffset;\r
+}\r
+\r
+void parseXmlElement(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+    parseByteString(tree, tvb, pOffset, hfIndex);\r
+}\r
+\r
+void parseFloat(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+        proto_tree_add_item(tree, hfIndex, tvb, *pOffset, sizeof(gfloat), TRUE);\r
+     *pOffset += sizeof(gfloat);\r
+}\r
+\r
+void parseDouble(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+        proto_tree_add_item(tree, hfIndex, tvb, *pOffset, sizeof(gdouble), TRUE);\r
+     *pOffset += sizeof(gdouble);\r
+}\r
+\r
+void parseDateTime(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex)\r
+{\r
+    *pOffset = dissect_nt_64bit_time(tvb, tree, *pOffset, hfIndex);\r
+}\r
+\r
+void parseDiagnosticInfo(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+    gint        iOffset = *pOffset;\r
+    guint8      EncodingMask;\r
+    proto_tree *mask_tree;\r
+    proto_tree *subtree;\r
+    proto_item *ti;\r
+\r
+    ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: DiagnosticInfo", szFieldName);\r
+    subtree = proto_item_add_subtree(ti, ett_opcua_diagnosticinfo);\r
+\r
+    /* parse encoding mask */\r
+    EncodingMask = tvb_get_guint8(tvb, iOffset);\r
+    ti = proto_tree_add_text(subtree, tvb, 0, -1, "EncodingMask");\r
+    mask_tree = proto_item_add_subtree(ti, ett_opcua_diagnosticinfo);\r
+    proto_tree_add_item(mask_tree, hf_opcua_diag_mask_symbolicflag,        tvb, iOffset, 1, TRUE);\r
+    proto_tree_add_item(mask_tree, hf_opcua_diag_mask_namespaceflag,       tvb, iOffset, 1, TRUE);\r
+    proto_tree_add_item(mask_tree, hf_opcua_diag_mask_localizedtextflag,   tvb, iOffset, 1, TRUE);\r
+    proto_tree_add_item(mask_tree, hf_opcua_diag_mask_additionalinfoflag,  tvb, iOffset, 1, TRUE);\r
+    proto_tree_add_item(mask_tree, hf_opcua_diag_mask_innerstatuscodeflag, tvb, iOffset, 1, TRUE);\r
+    proto_tree_add_item(mask_tree, hf_opcua_diag_mask_innerdiaginfoflag,   tvb, iOffset, 1, TRUE);\r
+    iOffset++;\r
+\r
+    if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_SYMBOLICID_FLAG)\r
+    {\r
+        parseInt32(subtree, tvb, &iOffset, hf_opcua_diag_symbolicid);\r
+    }\r
+    if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_NAMESPACE_FLAG)\r
+    {\r
+        parseInt32(subtree, tvb, &iOffset, hf_opcua_diag_namespace);\r
+    }\r
+    if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_LOCALIZEDTEXT_FLAG)\r
+    {\r
+        parseInt32(subtree, tvb, &iOffset, hf_opcua_diag_localizedtext);\r
+    }\r
+    if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_ADDITIONALINFO_FLAG)\r
+    {\r
+        parseString(subtree, tvb, &iOffset, hf_opcua_diag_additionalinfo);\r
+    }\r
+    if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_INNERSTATUSCODE_FLAG)\r
+    {\r
+        parseStatusCode(subtree, tvb, &iOffset, hf_opcua_diag_innerstatuscode);\r
+    }\r
+    if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_INNERDIAGNOSTICINFO_FLAG)\r
+    {\r
+        parseDiagnosticInfo(subtree, tvb, &iOffset, "Inner DiagnosticInfo");\r
+    }\r
+\r
+    *pOffset = iOffset;\r
+}\r
+\r
+void parseQualifiedName(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+    proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: QualifiedName", szFieldName);\r
+    proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_qualifiedname);\r
+\r
+    parseInt32(subtree, tvb, pOffset, hf_opcua_Id);\r
+    parseString(subtree, tvb, pOffset, hf_opcua_Name);\r
+}\r
+\r
+void parseDataValue(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+    proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: DataValue", szFieldName);\r
+    proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_datavalue);\r
+    proto_tree *mask_tree;\r
+    gint    iOffset = *pOffset;\r
+    guint8  EncodingMask;\r
+\r
+    EncodingMask = tvb_get_guint8(tvb, iOffset);\r
+    ti = proto_tree_add_text(subtree, tvb, 0, -1, "EncodingMask");\r
+    mask_tree = proto_item_add_subtree(ti, ett_opcua_datavalue);\r
+    proto_tree_add_item(mask_tree, hf_opcua_datavalue_mask_valueflag,           tvb, iOffset, 1, TRUE);\r
+    proto_tree_add_item(mask_tree, hf_opcua_datavalue_mask_statuscodeflag,      tvb, iOffset, 1, TRUE);\r
+    proto_tree_add_item(mask_tree, hf_opcua_datavalue_mask_sourcetimestampflag, tvb, iOffset, 1, TRUE);\r
+    proto_tree_add_item(mask_tree, hf_opcua_datavalue_mask_servertimestampflag, tvb, iOffset, 1, TRUE);\r
+    iOffset++;\r
+\r
+    if (EncodingMask & DATAVALUE_ENCODINGBYTE_VALUE)\r
+    {\r
+        parseVariant(subtree, tvb, &iOffset, "Value");\r
+    }\r
+    if (EncodingMask & DATAVALUE_ENCODINGBYTE_STATUSCODE)\r
+    {\r
+        parseStatusCode(subtree, tvb, &iOffset, hf_opcua_StatusCode);\r
+    }\r
+    if (EncodingMask & DATAVALUE_ENCODINGBYTE_SOURCETIMESTAMP)\r
+    {\r
+        parseDateTime(subtree, tvb, &iOffset, hf_opcua_SourceTimestamp);\r
+    }\r
+    if (EncodingMask & DATAVALUE_ENCODINGBYTE_SERVERTIMESTAMP)\r
+    {\r
+        parseDateTime(subtree, tvb, &iOffset, hf_opcua_ServerTimestamp);\r
+    }\r
+\r
+    *pOffset = iOffset;\r
+}\r
+\r
+void parseVariant(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+    proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: Variant", szFieldName);\r
+    proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_variant);\r
+    gint    iOffset = *pOffset;\r
+    guint8  EncodingMask;\r
+\r
+    EncodingMask = tvb_get_guint8(tvb, iOffset);\r
+    proto_tree_add_item(subtree, hf_opcua_variant_encodingmask, tvb, iOffset, 1, TRUE);\r
+    iOffset++;\r
+\r
+    if (EncodingMask & VARIANT_ARRAYMASK)\r
+    {\r
+        EncodingMask &= ~VARIANT_ARRAYMASK;\r
+\r
+        switch(EncodingMask)\r
+        {\r
+        case OpcUaType_Null: break;\r
+        case OpcUaType_Boolean: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Boolean, parseBoolean); break;\r
+        case OpcUaType_SByte: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_SByte, parseSByte); break;\r
+        case OpcUaType_Byte: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Byte, parseByte); break;\r
+        case OpcUaType_Int16: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Int16, parseInt16); break;\r
+        case OpcUaType_UInt16: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_UInt16, parseUInt16); break;\r
+        case OpcUaType_Int32: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Int32, parseInt32); break;\r
+        case OpcUaType_UInt32: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_UInt32, parseUInt32); break;\r
+        case OpcUaType_Int64: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Int64, parseInt64); break;\r
+        case OpcUaType_UInt64: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_UInt64, parseUInt64); break;\r
+        case OpcUaType_Float: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Float, parseFloat); break;\r
+        case OpcUaType_Double: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Double, parseDouble); break;\r
+        case OpcUaType_String: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_String, parseString); break;\r
+        case OpcUaType_DateTime: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_DateTime, parseDateTime); break;\r
+        case OpcUaType_Guid: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Guid, parseGuid); break;\r
+        case OpcUaType_ByteString: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_ByteString, parseByteString); break;\r
+        case OpcUaType_XmlElement: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_XmlElement, parseXmlElement); break;\r
+        case OpcUaType_NodeId: parseArrayComplex(subtree, tvb, &iOffset, "NodeId", parseNodeId); break;\r
+        case OpcUaType_ExpandedNodeId: parseArrayComplex(subtree, tvb, &iOffset, "ExpandedNodeId", parseExpandedNodeId); break;\r
+        case OpcUaType_StatusCode: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_StatusCode, parseStatusCode); break;\r
+        case OpcUaType_DiagnosticInfo: parseArrayComplex(subtree, tvb, &iOffset, "DiagnosticInfo", parseDiagnosticInfo); break;\r
+        case OpcUaType_QualifiedName: parseArrayComplex(subtree, tvb, &iOffset, "QualifiedName", parseQualifiedName); break;\r
+        case OpcUaType_LocalizedText: parseArrayComplex(subtree, tvb, &iOffset, "LocalizedText", parseLocalizedText); break;\r
+        case OpcUaType_ExtensionObject: parseArrayComplex(subtree, tvb, &iOffset, "ExtensionObject", parseExtensionObject); break;\r
+        case OpcUaType_DataValue: parseArrayComplex(subtree, tvb, &iOffset, "DataValue", parseDataValue); break;\r
+        case OpcUaType_Variant: parseArrayComplex(subtree, tvb, &iOffset, "Variant", parseVariant); break;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        switch(EncodingMask)\r
+        {\r
+        case OpcUaType_Null: break;\r
+        case OpcUaType_Boolean: parseBoolean(subtree, tvb, &iOffset, hf_opcua_Boolean); break;\r
+        case OpcUaType_SByte: parseSByte(subtree, tvb, &iOffset, hf_opcua_SByte); break;\r
+        case OpcUaType_Byte: parseByte(subtree, tvb, &iOffset, hf_opcua_Byte); break;\r
+        case OpcUaType_Int16: parseInt16(subtree, tvb, &iOffset, hf_opcua_Int16); break;\r
+        case OpcUaType_UInt16: parseUInt16(subtree, tvb, &iOffset, hf_opcua_UInt16); break;\r
+        case OpcUaType_Int32: parseInt32(subtree, tvb, &iOffset, hf_opcua_Int32); break;\r
+        case OpcUaType_UInt32: parseUInt32(subtree, tvb, &iOffset, hf_opcua_UInt32); break;\r
+        case OpcUaType_Int64: parseInt64(subtree, tvb, &iOffset, hf_opcua_Int64); break;\r
+        case OpcUaType_UInt64: parseUInt64(subtree, tvb, &iOffset, hf_opcua_UInt64); break;\r
+        case OpcUaType_Float: parseFloat(subtree, tvb, &iOffset, hf_opcua_Float); break;\r
+        case OpcUaType_Double: parseDouble(subtree, tvb, &iOffset, hf_opcua_Double); break;\r
+        case OpcUaType_String: parseString(subtree, tvb, &iOffset, hf_opcua_String); break;\r
+        case OpcUaType_DateTime: parseDateTime(subtree, tvb, &iOffset, hf_opcua_DateTime); break;\r
+        case OpcUaType_Guid: parseGuid(subtree, tvb, &iOffset, hf_opcua_Guid); break;\r
+        case OpcUaType_ByteString: parseByteString(subtree, tvb, &iOffset, hf_opcua_ByteString); break;\r
+        case OpcUaType_XmlElement: parseXmlElement(subtree, tvb, &iOffset, hf_opcua_XmlElement); break;\r
+        case OpcUaType_NodeId: parseNodeId(subtree, tvb, &iOffset, "Value"); break;\r
+        case OpcUaType_ExpandedNodeId: parseExpandedNodeId(subtree, tvb, &iOffset, "Value"); break;\r
+        case OpcUaType_StatusCode: parseStatusCode(subtree, tvb, &iOffset, hf_opcua_StatusCode); break;\r
+        case OpcUaType_DiagnosticInfo: parseDiagnosticInfo(subtree, tvb, &iOffset, "Value"); break;\r
+        case OpcUaType_QualifiedName: parseQualifiedName(subtree, tvb, &iOffset, "Value"); break;\r
+        case OpcUaType_LocalizedText: parseLocalizedText(subtree, tvb, &iOffset, "Value"); break;\r
+        case OpcUaType_ExtensionObject: parseExtensionObject(subtree, tvb, &iOffset, "Value"); break;\r
+        case OpcUaType_DataValue: parseDataValue(subtree, tvb, &iOffset, "Value"); break;\r
+        case OpcUaType_Variant: parseVariant(subtree, tvb, &iOffset, "Value"); break;\r
+        }\r
+    }\r
+\r
+    *pOffset = iOffset;\r
+}\r
+\r
+/** General parsing function for arrays of simple types.\r
+ * All arrays have one 4 byte signed integer length information,\r
+ * followed by n data elements.\r
+ */\r
+void parseArraySimple(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex, fctSimpleTypeParser pParserFunction)\r
+{\r
+    char szFieldName[] = "Array of Simple Type";\r
+    proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, szFieldName);\r
+    proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_array);\r
+    int i;\r
+    gint32 iLen;\r
+\r
+    /* read array length */\r
+    iLen = tvb_get_letohl(tvb, *pOffset);\r
+    proto_tree_add_item(subtree, hf_opcua_ArraySize, tvb, *pOffset, 4, TRUE);\r
+    *pOffset += 4;\r
+\r
+    if (iLen == -1) return; /* no array */\r
+    if (iLen == 0)  return; /* array with zero elements*/\r
+\r
+    for (i=0; i<iLen; i++)\r
+    {\r
+        (*pParserFunction)(subtree, tvb, pOffset, hfIndex);\r
+    }\r
+}\r
+\r
+/** General parsing function for arrays of enums.\r
+ * All arrays have one 4 byte signed integer length information,\r
+ * followed by n data elements.\r
+ */\r
+void parseArrayEnum(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, fctEnumParser pParserFunction)\r
+{\r
+    char szFieldName[] = "Array of Enum Type";\r
+    proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, szFieldName);\r
+    proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_array);\r
+    int i;\r
+    gint32 iLen;\r
+\r
+    /* read array length */\r
+    iLen = tvb_get_letohl(tvb, *pOffset);\r
+    proto_tree_add_item(subtree, hf_opcua_ArraySize, tvb, *pOffset, 4, TRUE);\r
+    *pOffset += 4;\r
+\r
+    if (iLen == -1) return; /* no array */\r
+    if (iLen == 0)  return; /* array with zero elements*/\r
+\r
+    for (i=0; i<iLen; i++)\r
+    {\r
+        (*pParserFunction)(subtree, tvb, pOffset);\r
+    }\r
+}\r
+\r
+/** General parsing function for arrays of complex types.\r
+ * All arrays have one 4 byte signed integer length information,\r
+ * followed by n data elements.\r
+ */\r
+void parseArrayComplex(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName, fctComplexTypeParser pParserFunction)\r
+{\r
+    proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "Array of %s", szFieldName);\r
+    proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_array);\r
+    int i;\r
+    gint32 iLen;\r
+\r
+    /* read array length */\r
+    iLen = tvb_get_letohl(tvb, *pOffset);\r
+    proto_tree_add_item(subtree, hf_opcua_ArraySize, tvb, *pOffset, 4, TRUE);\r
+    *pOffset += 4;\r
+\r
+    if (iLen == -1) return; /* no array */\r
+    if (iLen == 0)  return; /* array with zero elements*/\r
+\r
+    for (i=0; i<iLen; i++)\r
+    {\r
+        char szNum[20];\r
+        g_snprintf(szNum, 20, "[%i]", i);\r
+        (*pParserFunction)(subtree, tvb, pOffset, szNum);\r
+    }\r
+}\r
+\r
+void parseNodeId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+    proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: NodeId", szFieldName);\r
+    proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_nodeid);\r
+    gint    iOffset = *pOffset;\r
+    guint8  EncodingMask;\r
+    guint32 Numeric = 0, NSId = 0;\r
+\r
+    EncodingMask = tvb_get_guint8(tvb, iOffset);\r
+    proto_tree_add_item(subtree, hf_opcua_nodeid_encodingmask, tvb, iOffset, 1, TRUE);\r
+    iOffset++;\r
+\r
+    switch(EncodingMask)\r
+    {\r
+    case 0x00: /* two byte node id */\r
+        Numeric = tvb_get_guint8(tvb, iOffset);\r
+        proto_tree_add_item(subtree, hf_opcua_nodeid_numeric, tvb, iOffset, 1, TRUE);\r
+        iOffset+=1;\r
+        break;\r
+    case 0x01: /* four byte node id */\r
+        NSId = tvb_get_guint8(tvb, iOffset);\r
+        proto_tree_add_item(subtree, hf_opcua_nodeid_nsid, tvb, iOffset, 1, TRUE);\r
+        iOffset+=1;\r
+        Numeric = tvb_get_letohs(tvb, iOffset);\r
+        proto_tree_add_item(subtree, hf_opcua_nodeid_numeric, tvb, iOffset, 2, TRUE);\r
+        iOffset+=2;\r
+        break;\r
+    case 0x02: /* numeric, that does not fit into four bytes */\r
+        NSId = tvb_get_letohl(tvb, iOffset);\r
+        proto_tree_add_item(subtree, hf_opcua_nodeid_nsid, tvb, iOffset, 4, TRUE);\r
+        iOffset+=4;\r
+        Numeric = tvb_get_letohl(tvb, iOffset);\r
+        proto_tree_add_item(subtree, hf_opcua_nodeid_numeric, tvb, iOffset, 4, TRUE);\r
+        iOffset+=4;\r
+        break;\r
+    case 0x03: /* string */\r
+        NSId = tvb_get_letohl(tvb, iOffset);\r
+        proto_tree_add_item(subtree, hf_opcua_nodeid_nsid, tvb, iOffset, 4, TRUE);\r
+        iOffset+=4;\r
+        parseString(subtree, tvb, &iOffset, hf_opcua_String);\r
+        break;\r
+    case 0x04: /* uri */\r
+        parseString(subtree, tvb, &iOffset, hf_opcua_Uri);\r
+        break;\r
+    case 0x05: /* guid */\r
+        parseGuid(subtree, tvb, &iOffset, hf_opcua_Guid);\r
+        break;\r
+    case 0x06: /* byte string */\r
+        NSId = tvb_get_letohl(tvb, iOffset);\r
+        proto_tree_add_item(subtree, hf_opcua_nodeid_nsid, tvb, iOffset, 4, TRUE);\r
+        iOffset+=4;\r
+        parseByteString(subtree, tvb, &iOffset, hf_opcua_ByteString);\r
+        break;\r
+    };\r
+\r
+    *pOffset = iOffset;\r
+}\r
+\r
+void parseExtensionObject(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+    gint    iOffset = *pOffset;\r
+    guint8  EncodingMask;\r
+    proto_tree *extobj_tree;\r
+    proto_tree *mask_tree;\r
+    proto_item *ti;\r
+\r
+    /* add extension object subtree */\r
+    ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ExtensionObject", szFieldName);\r
+    extobj_tree = proto_item_add_subtree(ti, ett_opcua_extensionobject);\r
+\r
+    /* add nodeid subtree */\r
+    parseExpandedNodeId(extobj_tree, tvb, &iOffset, "TypeId");\r
+\r
+    /* parse encoding mask */\r
+    EncodingMask = tvb_get_guint8(tvb, iOffset);\r
+    ti = proto_tree_add_text(extobj_tree, tvb, 0, -1, "EncodingMask");\r
+    mask_tree = proto_item_add_subtree(ti, ett_opcua_extobj_encodingmask);\r
+    proto_tree_add_item(mask_tree, hf_opcua_extobj_mask_binbodyflag, tvb, iOffset, 1, TRUE);\r
+    proto_tree_add_item(mask_tree, hf_opcua_extobj_mask_xmlbodyflag, tvb, iOffset, 1, TRUE);\r
+    iOffset++;\r
+\r
+    if (EncodingMask & EXTOBJ_ENCODINGMASK_BINBODY_FLAG) /* has binary body ? */\r
+    {\r
+        parseByteString(extobj_tree, tvb, &iOffset, hf_opcua_ByteString);\r
+    }\r
+\r
+    *pOffset = iOffset;\r
+}\r
+\r
+void parseExpandedNodeId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+    proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: ExpandedNodeId", szFieldName);\r
+    proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_nodeid);\r
+    gint    iOffset = *pOffset;\r
+    guint8  EncodingMask, NSId = 0;\r
+    guint32 Numeric = 0;\r
+\r
+    EncodingMask = tvb_get_guint8(tvb, iOffset);\r
+    proto_tree_add_item(subtree, hf_opcua_nodeid_encodingmask, tvb, iOffset, 1, TRUE);\r
+    iOffset++;\r
+\r
+    switch(EncodingMask)\r
+    {\r
+    case 0x00: /* two byte node id */\r
+        Numeric = tvb_get_guint8(tvb, iOffset);\r
+        proto_tree_add_item(subtree, hf_opcua_nodeid_numeric, tvb, iOffset, 1, TRUE);\r
+        iOffset+=1;\r
+        break;\r
+    case 0x01: /* four byte node id */\r
+        NSId = tvb_get_guint8(tvb, iOffset);\r
+        proto_tree_add_item(subtree, hf_opcua_nodeid_nsid, tvb, iOffset, 1, TRUE);\r
+        iOffset+=1;\r
+        Numeric = tvb_get_letohs(tvb, iOffset);\r
+        proto_tree_add_item(subtree, hf_opcua_nodeid_numeric, tvb, iOffset, 2, TRUE);\r
+        iOffset+=2;\r
+        break;\r
+    case 0x02: /* numeric, that does not fit into four bytes */\r
+        NSId = tvb_get_letohl(tvb, iOffset);\r
+        proto_tree_add_item(subtree, hf_opcua_nodeid_nsid, tvb, iOffset, 4, TRUE);\r
+        iOffset+=4;\r
+        Numeric = tvb_get_letohl(tvb, iOffset);\r
+        proto_tree_add_item(subtree, hf_opcua_nodeid_numeric, tvb, iOffset, 4, TRUE);\r
+        iOffset+=4;\r
+        break;\r
+    case 0x03: /* string */\r
+        NSId = tvb_get_letohl(tvb, iOffset);\r
+        proto_tree_add_item(subtree, hf_opcua_nodeid_nsid, tvb, iOffset, 4, TRUE);\r
+        iOffset+=4;\r
+        parseString(subtree, tvb, &iOffset, hf_opcua_String);\r
+        break;\r
+    case 0x04: /* uri */\r
+        parseString(subtree, tvb, &iOffset, hf_opcua_Uri);\r
+        break;\r
+    case 0x05: /* guid */\r
+        parseGuid(subtree, tvb, &iOffset, hf_opcua_Guid);\r
+        break;\r
+    case 0x06: /* byte string */\r
+        NSId = tvb_get_letohl(tvb, iOffset);\r
+        proto_tree_add_item(subtree, hf_opcua_nodeid_nsid, tvb, iOffset, 4, TRUE);\r
+        iOffset+=4;\r
+        parseByteString(subtree, tvb, &iOffset, hf_opcua_ByteString);\r
+        break;\r
+    };\r
+\r
+    if (EncodingMask & NODEID_URIMASK)\r
+    {\r
+        parseString(subtree, tvb, &iOffset, hf_opcua_Uri);\r
+    }\r
+\r
+    *pOffset = iOffset;\r
+}\r
diff --git a/plugins/opcua/opcua_simpletypes.h b/plugins/opcua/opcua_simpletypes.h
new file mode 100644 (file)
index 0000000..4ad30a0
--- /dev/null
@@ -0,0 +1,56 @@
+/******************************************************************************\r
+** $Id: opcua_simpletypes.h,v 1.1 2007/02/08 11:26:55 gergap Exp $\r
+**\r
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.\r
+** Web: http://www.ascolab.com\r
+** \r
+** This program is free software; you can redistribute it and/or\r
+** modify it under the terms of the GNU General Public License\r
+** as published by the Free Software Foundation; either version 2\r
+** of the License, or (at your option) any later version.\r
+** \r
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\r
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
+** \r
+** Project: OpcUa Wireshark Plugin\r
+**\r
+** Description: Implementation of OpcUa built-in type parsers.\r
+**              This contains all the simple types and some complex types.\r
+**\r
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>\r
+** Last change by: $Author: gergap $\r
+**\r
+******************************************************************************/\r
+#include "opcua_identifiers.h"\r
+\r
+/* simple types */\r
+void parseBoolean(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+void parseByte(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+void parseSByte(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+void parseUInt16(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+void parseInt16(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+void parseUInt32(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+void parseInt32(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+void parseUInt64(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+void parseInt64(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+void parseString(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+void parseGuid(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+void parseByteString(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+void parseXmlElement(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+void parseFloat(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+void parseDouble(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+void parseDateTime(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+void parseStatusCode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex);\r
+/* complex types */\r
+void parseLocalizedText(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);\r
+void parseNodeId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);\r
+void parseDiagnosticInfo(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);\r
+void parseExtensionObject(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);\r
+void parseQualifiedName(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);\r
+void parseDataValue(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);\r
+void parseVariant(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);\r
+void parseExpandedNodeId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);\r
+void parseArraySimple(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex, fctSimpleTypeParser pParserFunction);\r
+void parseArrayEnum(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, fctEnumParser pParserFunction);\r
+void parseArrayComplex(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName, fctComplexTypeParser pParserFunction);\r
+void registerSimpleTypes(int proto);\r
diff --git a/plugins/opcua/plugin.c b/plugins/opcua/plugin.c
new file mode 100644 (file)
index 0000000..138b4a4
--- /dev/null
@@ -0,0 +1,26 @@
+/* Do not modify this file.  */
+/* It is created automatically by the Makefile. */
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gmodule.h>
+
+#include "moduleinfo.h"
+
+#ifndef ENABLE_STATIC
+G_MODULE_EXPORT const gchar version[] = VERSION;
+
+/* Start the functions we need for the plugin stuff */
+
+G_MODULE_EXPORT void
+plugin_register (void)
+{
+  {extern void proto_register_opcua (void); proto_register_opcua ();}
+}
+G_MODULE_EXPORT void
+plugin_reg_handoff(void)
+{
+  {extern void proto_reg_handoff_opcua (void); proto_reg_handoff_opcua ();}
+}
+#endif
diff --git a/plugins/opcua/ua_application_layer.c b/plugins/opcua/ua_application_layer.c
new file mode 100644 (file)
index 0000000..7c7670f
--- /dev/null
@@ -0,0 +1,122 @@
+/******************************************************************************\r
+** $Id: ua_application_layer.c,v 1.3 2007/02/08 11:31:56 gergap Exp $\r
+**\r
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.\r
+** Web: http://www.ascolab.com\r
+** \r
+** This program is free software; you can redistribute it and/or\r
+** modify it under the terms of the GNU General Public License\r
+** as published by the Free Software Foundation; either version 2\r
+** of the License, or (at your option) any later version.\r
+** \r
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\r
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
+** \r
+** Project: OpcUa Wireshark Plugin\r
+**\r
+** Description: OpcUa Application Layer Decoder.\r
+**\r
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>\r
+** Last change by: $Author: gergap $\r
+**\r
+******************************************************************************/\r
+\r
+#ifdef HAVE_CONFIG_H\r
+# include "config.h"\r
+#endif\r
+\r
+#include <gmodule.h>\r
+#include <epan/packet.h>\r
+#include "opcua_simpletypes.h"\r
+\r
+/** NodeId encoding mask table */\r
+static const value_string g_nodeidmasks[] = {\r
+    { 0, "Two byte encoded Numeric" },\r
+    { 1, "Four byte encoded Numeric" },\r
+    { 2, "Numeric of arbitrary length" },\r
+    { 3, "String" },\r
+    { 4, "URI" },\r
+    { 5, "GUID" },\r
+    { 6, "ByteString" },\r
+    { 0x80, "UriMask" },\r
+    { 0, NULL }\r
+};\r
+\r
+/** Service type table */\r
+extern const value_string g_requesttypes[];\r
+\r
+static int hf_opcua_nodeid_encodingmask = -1;\r
+static int hf_opcua_app_nsid = -1;\r
+static int hf_opcua_app_numeric = -1;\r
+\r
+/** header field definitions */\r
+static hf_register_info hf[] =\r
+{\r
+    { &hf_opcua_nodeid_encodingmask,\r
+    {  "NodeId EncodingMask",        "application.nodeid.encodingmask", FT_UINT8,   BASE_HEX,  VALS(g_nodeidmasks), 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_app_nsid,\r
+    {  "NodeId EncodingMask",        "application.nodeid.nsid",         FT_UINT8,   BASE_DEC,  NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_app_numeric,\r
+    {  "NodeId Identifier Numeric",  "application.nodeid.numeric",      FT_UINT32,  BASE_DEC,  VALS(g_requesttypes), 0x0,    "",    HFILL }\r
+    }\r
+};\r
+\r
+/** Register application layer types. */\r
+void registerApplicationLayerTypes(int proto)\r
+{\r
+    proto_register_field_array(proto, hf, array_length(hf));\r
+}\r
+\r
+/** Parses an OpcUa Service NodeId and returns the service type.\r
+ * In this cases the NodeId is always from type numeric and NSId = 0.\r
+ */\r
+int parseServiceNodeId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName)\r
+{\r
+    gint    iOffset = *pOffset;\r
+    guint8  EncodingMask, NSId = 0;\r
+    guint32 Numeric = 0;\r
+\r
+       szFieldName = 0; /* avoid warning */\r
+\r
+    EncodingMask = tvb_get_guint8(tvb, iOffset);\r
+    proto_tree_add_item(tree, hf_opcua_nodeid_encodingmask, tvb, iOffset, 1, TRUE);\r
+    iOffset++;\r
+\r
+    switch(EncodingMask)\r
+    {\r
+    case 0x00: /* two byte node id */\r
+        Numeric = tvb_get_guint8(tvb, iOffset);\r
+        proto_tree_add_item(tree, hf_opcua_app_numeric, tvb, iOffset, 1, TRUE);\r
+        iOffset+=1;\r
+        break;\r
+    case 0x01: /* four byte node id */\r
+        NSId = tvb_get_guint8(tvb, iOffset);\r
+        proto_tree_add_item(tree, hf_opcua_app_nsid, tvb, iOffset, 1, TRUE);\r
+        iOffset+=1;\r
+        Numeric = tvb_get_letohs(tvb, iOffset);\r
+        proto_tree_add_item(tree, hf_opcua_app_numeric, tvb, iOffset, 2, TRUE);\r
+        iOffset+=2;\r
+        break;\r
+    case 0x02: /* numeric, that does not fit into four bytes */\r
+        NSId = tvb_get_letohl(tvb, iOffset);\r
+        proto_tree_add_item(tree, hf_opcua_app_nsid, tvb, iOffset, 4, TRUE);\r
+        iOffset+=4;\r
+        Numeric = tvb_get_letohl(tvb, iOffset);\r
+        proto_tree_add_item(tree, hf_opcua_app_numeric, tvb, iOffset, 4, TRUE);\r
+        iOffset+=4;\r
+        break;\r
+    case 0x03: /* string */\r
+    case 0x04: /* uri */\r
+    case 0x05: /* guid */\r
+    case 0x06: /* byte string */\r
+        /* NOT USED */\r
+        break;\r
+    };\r
+\r
+    *pOffset = iOffset;\r
+\r
+    return Numeric;\r
+}\r
+\r
diff --git a/plugins/opcua/ua_application_layer.h b/plugins/opcua/ua_application_layer.h
new file mode 100644 (file)
index 0000000..a1a51a9
--- /dev/null
@@ -0,0 +1,27 @@
+/******************************************************************************\r
+** $Id: ua_application_layer.h,v 1.3 2007/02/08 12:19:58 gergap Exp $\r
+**\r
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.\r
+** Web: http://www.ascolab.com\r
+** \r
+** This program is free software; you can redistribute it and/or\r
+** modify it under the terms of the GNU General Public License\r
+** as published by the Free Software Foundation; either version 2\r
+** of the License, or (at your option) any later version.\r
+** \r
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\r
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
+** \r
+** Project: OpcUa Wireshark Plugin\r
+**\r
+** Description: OpcUa Application Layer Decoder.\r
+**\r
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>\r
+** Last change by: $Author: gergap $\r
+**\r
+******************************************************************************/\r
+\r
+void registerApplicationLayerTypes(int proto);\r
+\r
+/* Ua type parsers */\r
+int parseServiceNodeId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName);\r
diff --git a/plugins/opcua/ua_security_layer.c b/plugins/opcua/ua_security_layer.c
new file mode 100644 (file)
index 0000000..71013b6
--- /dev/null
@@ -0,0 +1,99 @@
+/******************************************************************************\r
+** $Id: ua_security_layer.c,v 1.2 2007/02/08 12:16:59 gergap Exp $\r
+**\r
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.\r
+** Web: http://www.ascolab.com\r
+** \r
+** This program is free software; you can redistribute it and/or\r
+** modify it under the terms of the GNU General Public License\r
+** as published by the Free Software Foundation; either version 2\r
+** of the License, or (at your option) any later version.\r
+** \r
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\r
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
+** \r
+** Project: OpcUa Wireshark Plugin\r
+**\r
+** Description: OpcUa Security Layer Decoder.\r
+**\r
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>\r
+** Last change by: $Author: gergap $\r
+**\r
+******************************************************************************/\r
+\r
+#ifdef HAVE_CONFIG_H\r
+# include "config.h"\r
+#endif\r
+\r
+#include <gmodule.h>\r
+#include <epan/packet.h>\r
+#include "ua_application_layer.h"\r
+#include "opcua_simpletypes.h"\r
+\r
+/** NodeClass enum table */\r
+static const value_string g_SecSigTable[] = {
+  { 0, "GetSecurityPolcies" },
+  { 1, "OpenSecureChannel" },
+  { 2, "CloseSecureChannel" },
+  { 3, "Message" },\r
+  { 0, NULL }
+};\r
+static int hf_opcua_SecuritySigEnum = -1;\r
+\r
+static int hf_opcua_security_sig = -1;\r
+static int hf_opcua_security_policy = -1;\r
+static int hf_opcua_security_channel = -1;\r
+static int hf_opcua_security_token = -1;\r
+\r
+static hf_register_info hf[] =\r
+{\r
+    { &hf_opcua_security_sig,\r
+    {  "Security Signature",       "security.sig",     FT_UINT16, BASE_HEX,  VALS(g_SecSigTable), 0x0, "", HFILL }\r
+    },\r
+    { &hf_opcua_security_policy,\r
+    {  "Security Policy",          "security.policy",  FT_STRING, BASE_NONE,  NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_security_channel,\r
+    {  "Secure Channel Id",        "security.channel", FT_GUID,   BASE_NONE,  NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_security_token,\r
+    {  "Security Token Id",        "security.token",   FT_STRING, BASE_NONE,  NULL, 0x0,    "",    HFILL }\r
+    }\r
+};\r
+\r
+/** Register security layer types. */\r
+void registerSecurityLayerTypes(int proto)\r
+{\r
+    proto_register_field_array(proto, hf, array_length(hf));\r
+}\r
+\r
+\r
+/* Security Layer: message parsers\r
+ * Only works for Security Policy "NoSecurity" at the moment.\r
+ */\r
+void parseSecurityLayer(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+    guint16 Sig;\r
+    \r
+    Sig = tvb_get_letohs(tvb, pOffset[0]);\r
+    proto_tree_add_item(tree, hf_opcua_security_sig, tvb, *pOffset, 2, TRUE); *pOffset+=2;\r
+\r
+    switch (Sig)\r
+    {\r
+    case 0: /* GetSecurityPolicies */\r
+        break;\r
+    case 1: /* OpenSecureChannel */\r
+        parseGuid(tree, tvb,   pOffset, hf_opcua_security_channel);\r
+        parseString(tree, tvb, pOffset, hf_opcua_security_policy);\r
+        break;\r
+    case 2: /* CloseSecureChannel */\r
+        parseGuid(tree, tvb,   pOffset, hf_opcua_security_channel);\r
+        parseString(tree, tvb, pOffset, hf_opcua_security_token);\r
+        break;\r
+    case 3: /* Other Services Messages */\r
+        parseGuid(tree, tvb,   pOffset, hf_opcua_security_channel);\r
+        parseString(tree, tvb, pOffset, hf_opcua_security_token);\r
+        break;\r
+    }\r
+}\r
+\r
diff --git a/plugins/opcua/ua_security_layer.h b/plugins/opcua/ua_security_layer.h
new file mode 100644 (file)
index 0000000..d497f65
--- /dev/null
@@ -0,0 +1,25 @@
+/******************************************************************************\r
+** $Id: ua_security_layer.h,v 1.2 2007/02/08 12:19:58 gergap Exp $\r
+**\r
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.\r
+** Web: http://www.ascolab.com\r
+** \r
+** This program is free software; you can redistribute it and/or\r
+** modify it under the terms of the GNU General Public License\r
+** as published by the Free Software Foundation; either version 2\r
+** of the License, or (at your option) any later version.\r
+** \r
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\r
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
+** \r
+** Project: OpcUa Wireshark Plugin\r
+**\r
+** Description: OpcUa Security Layer Decoder.\r
+**\r
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>\r
+** Last change by: $Author: gergap $\r
+**\r
+******************************************************************************/\r
+\r
+void registerSecurityLayerTypes(int proto);\r
+void parseSecurityLayer(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);\r
diff --git a/plugins/opcua/ua_transport_layer.c b/plugins/opcua/ua_transport_layer.c
new file mode 100644 (file)
index 0000000..110fefa
--- /dev/null
@@ -0,0 +1,211 @@
+/******************************************************************************\r
+** $Id: ua_transport_layer.c,v 1.3 2007/02/08 12:17:50 gergap Exp $\r
+**\r
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.\r
+** Web: http://www.ascolab.com\r
+** \r
+** This program is free software; you can redistribute it and/or\r
+** modify it under the terms of the GNU General Public License\r
+** as published by the Free Software Foundation; either version 2\r
+** of the License, or (at your option) any later version.\r
+** \r
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\r
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
+** \r
+** Project: OpcUa Wireshark Plugin\r
+**\r
+** Description: OpcUa Transport Layer Decoder.\r
+**\r
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>\r
+** Last change by: $Author: gergap $\r
+**\r
+******************************************************************************/\r
+\r
+#ifdef HAVE_CONFIG_H\r
+# include "config.h"\r
+#endif\r
+\r
+#include <gmodule.h>\r
+#include <epan/packet.h>\r
+#include "ua_security_layer.h"\r
+#include "ua_application_layer.h"\r
+#include "opcua_simpletypes.h"\r
+#include <string.h>\r
+#include <epan/emem.h>\r
+\r
+void dispatchService(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int ServiceId);\r
+\r
+static int hf_opcua_transport_sig = -1;\r
+static int hf_opcua_transport_len = -1;\r
+static int hf_opcua_transport_ver = -1;\r
+static int hf_opcua_transport_cid = -1;\r
+static int hf_opcua_transport_lifetime = -1;\r
+static int hf_opcua_transport_sbl = -1;\r
+static int hf_opcua_transport_rbl = -1;\r
+static int hf_opcua_transport_endpoint = -1;\r
+static int hf_opcua_transport_rlifetime = -1;\r
+static int hf_opcua_transport_rsbl = -1;\r
+static int hf_opcua_transport_rrbl = -1;\r
+static int hf_opcua_transport_altendpoint = -1;\r
+static int hf_opcua_transport_rqid = -1;\r
+static int hf_opcua_transport_status = -1;\r
+extern gint ett_opcua_nodeid;\r
+\r
+static hf_register_info hf[] =\r
+{\r
+    { &hf_opcua_transport_sig,\r
+    /* full name  ,           abbreviation  ,       type     , display  , strings, bitmask, blurb, id, parent, ref_count, bitshift */\r
+    {  "Signature",           "transport.sig",      FT_STRING, BASE_NONE, NULL,    0x0,     "",    HFILL }\r
+    },\r
+    { &hf_opcua_transport_len,\r
+    {  "Message Length",      "transport.len",      FT_UINT32, BASE_DEC,  NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_transport_ver,\r
+    {  "Version",             "transport.ver",      FT_UINT32, BASE_DEC,  NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_transport_cid,\r
+    {  "ConnectionId",        "transport.cid",      FT_GUID,   BASE_NONE, NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_transport_lifetime,\r
+    {  "Lifetime",            "transport.lifetime", FT_UINT32, BASE_DEC,  NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_transport_sbl,\r
+    {  "SendBufferLength",    "transport.sbl",      FT_UINT32, BASE_DEC,  NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_transport_rbl,\r
+    {  "ReceiveBufferLength", "transport.rbl",      FT_UINT32, BASE_DEC,  NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_transport_endpoint,\r
+    {  "EndPoint",            "transport.endpoint", FT_STRING, BASE_NONE, NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_transport_rlifetime,\r
+    {  "Revised Lifetime",    "transport.rlifetime", FT_UINT32, BASE_DEC,  NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_transport_rsbl,\r
+    {  "Revised SendBufferLength", "transport.rsbl", FT_UINT32, BASE_DEC,  NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_transport_rrbl,\r
+    {  "Revised ReceiveBufferLength", "transport.rrbl", FT_UINT32, BASE_DEC,  NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_transport_altendpoint,\r
+    {  "Alternate EndPoint",  "transport.altendpoint", FT_STRING, BASE_NONE, NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_transport_rqid,\r
+    {  "RequestId",           "transport.rqid",     FT_UINT32, BASE_DEC,  NULL, 0x0,    "",    HFILL }\r
+    },\r
+    { &hf_opcua_transport_status,\r
+    {  "StatusCode",          "transport.status",   FT_UINT32, BASE_DEC,  NULL, 0x0,    "",    HFILL }\r
+    }\r
+};\r
+\r
+/** subtree types */\r
+extern gint ett_opcua_extensionobject;\r
+\r
+/** Register transport layer types. */\r
+void registerTransportLayerTypes(int proto)\r
+{\r
+    proto_register_field_array(proto, hf, array_length(hf));\r
+}\r
+\r
+/** helper functions for adding strings,\r
+  * that are not zero terminated.\r
+  */\r
+void addString(proto_tree *tree,  \r
+               int  hfindex,  \r
+               tvbuff_t *tvb,  \r
+               gint  start,  \r
+               gint  length,  \r
+               const char *value)\r
+{\r
+    char *szValue = ep_alloc(256);\r
+\r
+    if (szValue)\r
+    {\r
+        if (length > 255) length = 255;\r
+        /* copy non null terminated string data */\r
+        strncpy(szValue, value, length);\r
+        /* set null terminator */\r
+        szValue[length] = 0;\r
+\r
+        proto_tree_add_string(tree, hfindex, tvb, start, length, szValue);\r
+    }\r
+}\r
+\r
+/* Transport Layer: message parsers */\r
+void parseHello(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+    addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_ver, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16;\r
+    proto_tree_add_item(tree, hf_opcua_transport_lifetime, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_sbl, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_rbl, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+    parseString(tree, tvb, pOffset, hf_opcua_transport_endpoint);\r
+}\r
+\r
+void parseAcknowledge(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+    addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16;\r
+    proto_tree_add_item(tree, hf_opcua_transport_rlifetime, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_rsbl, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_rrbl, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+    parseString(tree, tvb, pOffset, hf_opcua_transport_altendpoint);\r
+}\r
+\r
+void parseDisconnect(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+    addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16;\r
+}\r
+\r
+void parseData(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+    proto_item *ti;\r
+    proto_tree *encobj_tree;\r
+    proto_tree *nodeid_tree;\r
+    int ServiceId = 0;\r
+\r
+    addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16;\r
+    proto_tree_add_item(tree, hf_opcua_transport_rqid, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+\r
+    /* message data contains the security layer */\r
+    parseSecurityLayer(tree, tvb, pOffset);\r
+\r
+    /* AT THE MOMENT NO SECURITY IS IMPLEMENTED IN UA.\r
+     * WE CAN JUST JUMP INTO THE APPLICATION LAYER DATA.\r
+     * THIS WILL CHAHNGE IN THE FUTURE. */\r
+\r
+    /* add encodeable object subtree */\r
+    ti = proto_tree_add_text(tree, tvb, 0, -1, "Message : Encodeable Object");\r
+    encobj_tree = proto_item_add_subtree(ti, ett_opcua_extensionobject);\r
+\r
+    /* add nodeid subtree */\r
+    ti = proto_tree_add_text(encobj_tree, tvb, 0, -1, "TypeId : ExpandedNodeId");\r
+    nodeid_tree = proto_item_add_subtree(ti, ett_opcua_nodeid);\r
+    ServiceId = parseServiceNodeId(nodeid_tree, tvb, pOffset, "NodeId") - 1;\r
+\r
+    dispatchService(encobj_tree, tvb, pOffset, ServiceId);\r
+}\r
+\r
+void parseAbort(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+    addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16;\r
+    proto_tree_add_item(tree, hf_opcua_transport_rqid, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
+\r
+void parseError(proto_tree *tree, tvbuff_t *tvb, gint *pOffset)\r
+{\r
+    addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16;\r
+    proto_tree_add_item(tree, hf_opcua_transport_rqid, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+    proto_tree_add_item(tree, hf_opcua_transport_status, tvb, *pOffset, 4, TRUE); *pOffset+=4;\r
+}\r
diff --git a/plugins/opcua/ua_transport_layer.h b/plugins/opcua/ua_transport_layer.h
new file mode 100644 (file)
index 0000000..1491df5
--- /dev/null
@@ -0,0 +1,32 @@
+/******************************************************************************\r
+** $Id: ua_transport_layer.h,v 1.3 2007/02/08 12:19:58 gergap Exp $\r
+**\r
+** Copyright (C) 2006-2007 ascolab GmbH. All Rights Reserved.\r
+** Web: http://www.ascolab.com\r
+** \r
+** This program is free software; you can redistribute it and/or\r
+** modify it under the terms of the GNU General Public License\r
+** as published by the Free Software Foundation; either version 2\r
+** of the License, or (at your option) any later version.\r
+** \r
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE\r
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\r
+** \r
+** Project: OpcUa Wireshark Plugin\r
+**\r
+** Description: OpcUa Transport Layer Decoder.\r
+**\r
+** Author: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>\r
+** Last change by: $Author: gergap $\r
+**\r
+******************************************************************************/\r
+\r
+/* Transport Layer: message parsers */\r
+void parseHello(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);\r
+void parseAcknowledge(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);\r
+void parseDisconnect(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);\r
+void parseData(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);\r
+void parseAbort(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);\r
+void parseError(proto_tree *tree, tvbuff_t *tvb, gint *pOffset);\r
+void registerTransportLayerTypes(int proto);\r
+\r