From 12101aad61d6a14acbc7b1acdfefe6cb386bec55 Mon Sep 17 00:00:00 2001 From: Ulf Lamping Date: Tue, 15 May 2007 09:05:53 +0000 Subject: [PATCH] add svn properties for dir and files svn path=/trunk/; revision=21780 --- plugins/opcua/AUTHORS | 12 +- plugins/opcua/COPYING | 680 ++++---- plugins/opcua/ChangeLog | 16 +- plugins/opcua/Doxyfile | 550 +++---- plugins/opcua/Makefile.am | 238 +-- plugins/opcua/Makefile.common | 82 +- plugins/opcua/Makefile.nmake | 158 +- plugins/opcua/README | 116 +- plugins/opcua/moduleinfo.h | 34 +- plugins/opcua/opcua.c | 510 +++--- plugins/opcua/opcua_complextypeparser.c | 1952 +++++++++++------------ plugins/opcua/opcua_enumparser.c | 532 +++--- plugins/opcua/opcua_hfindeces.c | 84 +- plugins/opcua/opcua_hfindeces.h | 66 +- plugins/opcua/opcua_identifiers.h | 88 +- plugins/opcua/opcua_serviceparser.c | 1218 +++++++------- plugins/opcua/opcua_servicetable.c | 114 +- plugins/opcua/opcua_simpletypes.c | 1680 +++++++++---------- plugins/opcua/opcua_simpletypes.h | 112 +- plugins/opcua/ua_application_layer.c | 244 +-- plugins/opcua/ua_application_layer.h | 54 +- plugins/opcua/ua_security_layer.c | 188 +-- plugins/opcua/ua_security_layer.h | 50 +- plugins/opcua/ua_transport_layer.c | 422 ++--- plugins/opcua/ua_transport_layer.h | 64 +- 25 files changed, 4632 insertions(+), 4632 deletions(-) diff --git a/plugins/opcua/AUTHORS b/plugins/opcua/AUTHORS index d4abe79534..91a0a255f1 100644 --- a/plugins/opcua/AUTHORS +++ b/plugins/opcua/AUTHORS @@ -1,6 +1,6 @@ -Author : -Gerhard Gappmeier -ascolab GmbH -http://www.ascolab.com - - +Author : +Gerhard Gappmeier +ascolab GmbH +http://www.ascolab.com + + diff --git a/plugins/opcua/COPYING b/plugins/opcua/COPYING index fbdd65f6f8..d60c31a97a 100644 --- a/plugins/opcua/COPYING +++ b/plugins/opcua/COPYING @@ -1,340 +1,340 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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 program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/plugins/opcua/ChangeLog b/plugins/opcua/ChangeLog index 93e3e97f18..1fbc573370 100644 --- a/plugins/opcua/ChangeLog +++ b/plugins/opcua/ChangeLog @@ -1,8 +1,8 @@ -$Id: ChangeLog,v 1.1.1.1 2006/07/12 09:17:41 gergap Exp $ - -Overview of changes in OpcUa plugin: - -Version 0.0.1: - -* initial implementation without security - +$Id$ + +Overview of changes in OpcUa plugin: + +Version 0.0.1: + +* initial implementation without security + diff --git a/plugins/opcua/Doxyfile b/plugins/opcua/Doxyfile index 2955c7b03e..478bcdb878 100644 --- a/plugins/opcua/Doxyfile +++ b/plugins/opcua/Doxyfile @@ -1,275 +1,275 @@ -# Doxyfile 1.4.1-KDevelop - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -PROJECT_NAME = opcua.kdevelop -PROJECT_NUMBER = $VERSION$ -OUTPUT_DIRECTORY = -CREATE_SUBDIRS = NO -OUTPUT_LANGUAGE = English -USE_WINDOWS_ENCODING = NO -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the -ALWAYS_DETAILED_SEC = NO -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = YES -STRIP_FROM_PATH = /home/gergap/ -STRIP_FROM_INC_PATH = -SHORT_NAMES = NO -JAVADOC_AUTOBRIEF = NO -MULTILINE_CPP_IS_BRIEF = NO -DETAILS_AT_TOP = NO -INHERIT_DOCS = YES -DISTRIBUTE_GROUP_DOC = NO -TAB_SIZE = 8 -ALIASES = -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -SUBGROUPING = YES -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- -EXTRACT_ALL = NO -EXTRACT_PRIVATE = NO -EXTRACT_STATIC = NO -EXTRACT_LOCAL_CLASSES = YES -EXTRACT_LOCAL_METHODS = NO -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -INTERNAL_DOCS = NO -CASE_SENSE_NAMES = YES -HIDE_SCOPE_NAMES = NO -SHOW_INCLUDE_FILES = YES -INLINE_INFO = YES -SORT_MEMBER_DOCS = YES -SORT_BRIEF_DOCS = NO -SORT_BY_SCOPE_NAME = NO -GENERATE_TODOLIST = YES -GENERATE_TESTLIST = YES -GENERATE_BUGLIST = YES -GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -SHOW_USED_FILES = YES -SHOW_DIRECTORIES = YES -FILE_VERSION_FILTER = -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- -QUIET = NO -WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = NO -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = /home/gergap/work/wireshark/plugins/opcua -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.mm \ - *.dox \ - *.C \ - *.CC \ - *.C++ \ - *.II \ - *.I++ \ - *.H \ - *.HH \ - *.H++ \ - *.CS \ - *.PHP \ - *.PHP3 \ - *.M \ - *.MM \ - *.C \ - *.H \ - *.tlh \ - *.diff \ - *.patch \ - *.moc \ - *.xpm \ - *.dox -RECURSIVE = yes -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = -EXAMPLE_PATH = -EXAMPLE_PATTERNS = * -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_PATTERNS = -FILTER_SOURCE_FILES = NO -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- -SOURCE_BROWSER = NO -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = YES -REFERENCES_RELATION = YES -VERBATIM_HEADERS = YES -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- -ALPHABETICAL_INDEX = NO -COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- -GENERATE_HTML = YES -HTML_OUTPUT = html -HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_ALIGN_MEMBERS = YES -GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -BINARY_TOC = NO -TOC_EXPAND = NO -DISABLE_INDEX = NO -ENUM_VALUES_PER_LINE = 4 -GENERATE_TREEVIEW = NO -TREEVIEW_WIDTH = 250 -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- -GENERATE_LATEX = YES -LATEX_OUTPUT = latex -LATEX_CMD_NAME = latex -MAKEINDEX_CMD_NAME = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = -PDF_HYPERLINKS = NO -USE_PDFLATEX = NO -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- -GENERATE_MAN = NO -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_LINKS = NO -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- -GENERATE_XML = yes -XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = -XML_PROGRAMLISTING = YES -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- -GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- -TAGFILES = -GENERATE_TAGFILE = opcua.tag -ALLEXTERNALS = NO -EXTERNAL_GROUPS = YES -PERL_PATH = /usr/bin/perl -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- -CLASS_DIAGRAMS = YES -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = NO -CLASS_GRAPH = YES -COLLABORATION_GRAPH = YES -GROUP_GRAPHS = YES -UML_LOOK = NO -TEMPLATE_RELATIONS = NO -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -CALL_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DIRECTORY_GRAPH = YES -DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = -MAX_DOT_GRAPH_WIDTH = 1024 -MAX_DOT_GRAPH_HEIGHT = 1024 -MAX_DOT_GRAPH_DEPTH = 1000 -DOT_TRANSPARENT = NO -DOT_MULTI_TARGETS = NO -GENERATE_LEGEND = YES -DOT_CLEANUP = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- -SEARCHENGINE = NO +# Doxyfile 1.4.1-KDevelop + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = opcua.kdevelop +PROJECT_NUMBER = $VERSION$ +OUTPUT_DIRECTORY = +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +USE_WINDOWS_ENCODING = NO +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = /home/gergap/ +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +DISTRIBUTE_GROUP_DOC = NO +TAB_SIZE = 8 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +SUBGROUPING = YES +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = YES +FILE_VERSION_FILTER = +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = /home/gergap/work/wireshark/plugins/opcua +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.mm \ + *.dox \ + *.C \ + *.CC \ + *.C++ \ + *.II \ + *.I++ \ + *.H \ + *.HH \ + *.H++ \ + *.CS \ + *.PHP \ + *.PHP3 \ + *.M \ + *.MM \ + *.C \ + *.H \ + *.tlh \ + *.diff \ + *.patch \ + *.moc \ + *.xpm \ + *.dox +RECURSIVE = yes +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +VERBATIM_HEADERS = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = NO +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = YES +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = yes +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = opcua.tag +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1024 +MAX_DOT_GRAPH_DEPTH = 1000 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/plugins/opcua/Makefile.am b/plugins/opcua/Makefile.am index 3e87a735f7..bd10e17b83 100644 --- a/plugins/opcua/Makefile.am +++ b/plugins/opcua/Makefile.am @@ -1,119 +1,119 @@ -# Makefile.am -# Automake file for OpcUa plugin -# -# $Id: Makefile.am,v 1.1.1.1 2006/07/12 09:17:41 gergap Exp $ -# -# Adapted by Gerhard Gappmeier for OpcUa -# Wireshark - Network traffic analyzer -# By Gerald Combs -# Copyright 1998 Gerald Combs -# -# 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 program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# - -INCLUDES = -I$(top_srcdir) -I$(includedir) - -include Makefile.common - -plugindir = @plugindir@ - -plugin_LTLIBRARIES = opcua.la -opcua_la_SOURCES = \ - plugin.c \ - moduleinfo.h \ - $(DISSECTOR_SRC) \ - $(DISSECTOR_INCLUDES) -opcua_la_LDFLAGS = -module -avoid-version -opcua_la_LIBADD = @PLUGIN_LIBS@ - -# Libs must be cleared, or else libtool won't create a shared module. -# If your module needs to be linked against any particular libraries, -# add them here. -LIBS = - -# -# Build plugin.c, which contains the plugin version[] string, a -# function plugin_register() that calls the register routines for all -# protocols, and a function plugin_reg_handoff() that calls the handoff -# registration routines for all protocols. -# -# We do this by scanning sources. If that turns out to be too slow, -# maybe we could just require every .o file to have an register routine -# of a given name (packet-aarp.o -> proto_register_aarp, etc.). -# -# Formatting conventions: The name of the proto_register_* routines an -# proto_reg_handoff_* routines must start in column zero, or must be -# preceded only by "void " starting in column zero, and must not be -# inside #if. -# -# DISSECTOR_SRC is assumed to have all the files that need to be scanned. -# -# For some unknown reason, having a big "for" loop in the Makefile -# to scan all the files doesn't work with some "make"s; they seem to -# pass only the first few names in the list to the shell, for some -# reason. -# -# Therefore, we have a script to generate the plugin.c file. -# The shell script runs slowly, as multiple greps and seds are run -# for each input file; this is especially slow on Windows. Therefore, -# if Python is present (as indicated by PYTHON being defined), we run -# a faster Python script to do that work instead. -# -# The first argument is the directory in which the source files live. -# The second argument is "plugin", to indicate that we should build -# a plugin.c file for a plugin. -# All subsequent arguments are the files to scan. -# -plugin.c: $(DISSECTOR_SRC) $(top_srcdir)/tools/make-dissector-reg \ - $(top_srcdir)/tools/make-dissector-reg.py - @if test -n $(PYTHON); then \ - echo Making plugin.c with python ; \ - $(PYTHON) $(top_srcdir)/tools/make-dissector-reg.py $(srcdir) \ - plugin $(DISSECTOR_SRC) ; \ - else \ - echo Making plugin.c with shell script ; \ - $(top_srcdir)/tools/make-dissector-reg $(srcdir) \ - $(plugin_src) plugin $(DISSECTOR_SRC) ; \ - fi - -# -# Currently plugin.c can be included in the distribution because -# we always build all protocol dissectors. We used to have to check -# whether or not to build the snmp dissector. If we again need to -# variably build something, making plugin.c non-portable, uncomment -# the dist-hook line below. -# -# Oh, yuk. We don't want to include "plugin.c" in the distribution, as -# its contents depend on the configuration, and therefore we want it -# to be built when the first "make" is done; however, Automake insists -# on putting *all* source into the distribution. -# -# We work around this by having a "dist-hook" rule that deletes -# "plugin.c", so that "dist" won't pick it up. -# -#dist-hook: -# @rm -f $(distdir)/plugin.c - -CLEANFILES = \ - opcua \ - *~ - -MAINTAINERCLEANFILES = \ - Makefile.in \ - plugin.c - -EXTRA_DIST = \ - Makefile.common \ - Makefile.nmake +# Makefile.am +# Automake file for OpcUa plugin +# +# $Id$ +# +# Adapted by Gerhard Gappmeier for OpcUa +# Wireshark - Network traffic analyzer +# By Gerald Combs +# Copyright 1998 Gerald Combs +# +# 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 program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# + +INCLUDES = -I$(top_srcdir) -I$(includedir) + +include Makefile.common + +plugindir = @plugindir@ + +plugin_LTLIBRARIES = opcua.la +opcua_la_SOURCES = \ + plugin.c \ + moduleinfo.h \ + $(DISSECTOR_SRC) \ + $(DISSECTOR_INCLUDES) +opcua_la_LDFLAGS = -module -avoid-version +opcua_la_LIBADD = @PLUGIN_LIBS@ + +# Libs must be cleared, or else libtool won't create a shared module. +# If your module needs to be linked against any particular libraries, +# add them here. +LIBS = + +# +# Build plugin.c, which contains the plugin version[] string, a +# function plugin_register() that calls the register routines for all +# protocols, and a function plugin_reg_handoff() that calls the handoff +# registration routines for all protocols. +# +# We do this by scanning sources. If that turns out to be too slow, +# maybe we could just require every .o file to have an register routine +# of a given name (packet-aarp.o -> proto_register_aarp, etc.). +# +# Formatting conventions: The name of the proto_register_* routines an +# proto_reg_handoff_* routines must start in column zero, or must be +# preceded only by "void " starting in column zero, and must not be +# inside #if. +# +# DISSECTOR_SRC is assumed to have all the files that need to be scanned. +# +# For some unknown reason, having a big "for" loop in the Makefile +# to scan all the files doesn't work with some "make"s; they seem to +# pass only the first few names in the list to the shell, for some +# reason. +# +# Therefore, we have a script to generate the plugin.c file. +# The shell script runs slowly, as multiple greps and seds are run +# for each input file; this is especially slow on Windows. Therefore, +# if Python is present (as indicated by PYTHON being defined), we run +# a faster Python script to do that work instead. +# +# The first argument is the directory in which the source files live. +# The second argument is "plugin", to indicate that we should build +# a plugin.c file for a plugin. +# All subsequent arguments are the files to scan. +# +plugin.c: $(DISSECTOR_SRC) $(top_srcdir)/tools/make-dissector-reg \ + $(top_srcdir)/tools/make-dissector-reg.py + @if test -n $(PYTHON); then \ + echo Making plugin.c with python ; \ + $(PYTHON) $(top_srcdir)/tools/make-dissector-reg.py $(srcdir) \ + plugin $(DISSECTOR_SRC) ; \ + else \ + echo Making plugin.c with shell script ; \ + $(top_srcdir)/tools/make-dissector-reg $(srcdir) \ + $(plugin_src) plugin $(DISSECTOR_SRC) ; \ + fi + +# +# Currently plugin.c can be included in the distribution because +# we always build all protocol dissectors. We used to have to check +# whether or not to build the snmp dissector. If we again need to +# variably build something, making plugin.c non-portable, uncomment +# the dist-hook line below. +# +# Oh, yuk. We don't want to include "plugin.c" in the distribution, as +# its contents depend on the configuration, and therefore we want it +# to be built when the first "make" is done; however, Automake insists +# on putting *all* source into the distribution. +# +# We work around this by having a "dist-hook" rule that deletes +# "plugin.c", so that "dist" won't pick it up. +# +#dist-hook: +# @rm -f $(distdir)/plugin.c + +CLEANFILES = \ + opcua \ + *~ + +MAINTAINERCLEANFILES = \ + Makefile.in \ + plugin.c + +EXTRA_DIST = \ + Makefile.common \ + Makefile.nmake diff --git a/plugins/opcua/Makefile.common b/plugins/opcua/Makefile.common index a07fab8520..db1485acd3 100644 --- a/plugins/opcua/Makefile.common +++ b/plugins/opcua/Makefile.common @@ -1,41 +1,41 @@ -# Makefile.common for OpcUa plugin -# Contains the stuff from Makefile.am and Makefile.nmake that is -# a) common to both files and -# b) portable between both files -# -# $Id: Makefile.common,v 1.3 2007/02/08 11:29:50 gergap Exp $ -# -# Adapted by Gerhard Gappmeier for OpcUa -# Wireshark - Network traffic analyzer -# By Gerald Combs -# Copyright 1998 Gerald Combs -# -# 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 program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# the name of the plugin -PLUGIN_NAME = opcua - -# the dissector sources (without any helpers) -DISSECTOR_SRC = \ - opcua.c \ - ua_transport_layer.c \ - ua_security_layer.c \ - ua_application_layer.c \ - opcua_serviceparser.c \ - opcua_complextypeparser.c \ - opcua_enumparser.c \ - opcua_simpletypes.c \ - opcua_servicetable.c \ - opcua_hfindeces.c +# Makefile.common for OpcUa plugin +# Contains the stuff from Makefile.am and Makefile.nmake that is +# a) common to both files and +# b) portable between both files +# +# $Id$ +# +# Adapted by Gerhard Gappmeier for OpcUa +# Wireshark - Network traffic analyzer +# By Gerald Combs +# Copyright 1998 Gerald Combs +# +# 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 program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# the name of the plugin +PLUGIN_NAME = opcua + +# the dissector sources (without any helpers) +DISSECTOR_SRC = \ + opcua.c \ + ua_transport_layer.c \ + ua_security_layer.c \ + ua_application_layer.c \ + opcua_serviceparser.c \ + opcua_complextypeparser.c \ + opcua_enumparser.c \ + opcua_simpletypes.c \ + opcua_servicetable.c \ + opcua_hfindeces.c diff --git a/plugins/opcua/Makefile.nmake b/plugins/opcua/Makefile.nmake index cba80b8b07..daf998f2dc 100644 --- a/plugins/opcua/Makefile.nmake +++ b/plugins/opcua/Makefile.nmake @@ -1,79 +1,79 @@ -# Makefile.nmake -# nmake file for OpcUa plugin -# -# $Id: Makefile.nmake,v 1.1.1.1 2006/07/12 09:17:41 gergap Exp $ -# - -include ..\..\config.nmake - -############### no need to modify below this line ######### - -include Makefile.common - -CFLAGS=/DHAVE_CONFIG_H /I../.. /I../../wiretap $(GLIB_CFLAGS) \ - /I$(PCAP_DIR)\include -D_U_="" $(LOCAL_CFLAGS) - -LDFLAGS = /NOLOGO /INCREMENTAL:no /MACHINE:I386 $(LOCAL_LDFLAGS) - -!IFDEF ENABLE_LIBWIRESHARK -LINK_PLUGIN_WITH=..\..\epan\libwireshark.lib ..\..\epan\dissectors\dissectors.lib -CFLAGS=/DHAVE_WIN32_LIBWIRESHARK_LIB /D_NEED_VAR_IMPORT_ $(CFLAGS) - -DISSECTOR_OBJECTS = $(DISSECTOR_SRC:.c=.obj) - -OBJECTS=$(DISSECTOR_OBJECTS) plugin.obj - -opcua.dll opcua.exp opcua.lib : $(OBJECTS) $(LINK_PLUGIN_WITH) - link -dll /out:opcua.dll $(LDFLAGS) $(OBJECTS) $(LINK_PLUGIN_WITH) \ - $(GLIB_LIBS) - -# -# Build plugin.c, which contains the plugin version[] string, a -# function plugin_register() that calls the register routines for all -# protocols, and a function plugin_reg_handoff() that calls the handoff -# registration routines for all protocols. -# -# We do this by scanning sources. If that turns out to be too slow, -# maybe we could just require every .o file to have an register routine -# of a given name (packet-aarp.o -> proto_register_aarp, etc.). -# -# Formatting conventions: The name of the proto_register_* routines an -# proto_reg_handoff_* routines must start in column zero, or must be -# preceded only by "void " starting in column zero, and must not be -# inside #if. -# -# DISSECTOR_SRC is assumed to have all the files that need to be scanned. -# -# For some unknown reason, having a big "for" loop in the Makefile -# to scan all the files doesn't work with some "make"s; they seem to -# pass only the first few names in the list to the shell, for some -# reason. -# -# Therefore, we have a script to generate the plugin.c file. -# The shell script runs slowly, as multiple greps and seds are run -# for each input file; this is especially slow on Windows. Therefore, -# if Python is present (as indicated by PYTHON being defined), we run -# a faster Python script to do that work instead. -# -# The first argument is the directory in which the source files live. -# The second argument is "plugin", to indicate that we should build -# a plugin.c file for a plugin. -# All subsequent arguments are the files to scan. -# -plugin.c: $(DISSECTOR_SRC) -!IFDEF PYTHON - @echo Making plugin.c (using python) - @$(PYTHON) "../../tools/make-dissector-reg.py" . plugin $(DISSECTOR_SRC) -!ELSE - @echo Making plugin.c (using sh) - @$(SH) ../../tools/make-dissector-reg . plugin $(DISSECTOR_SRC) -!ENDIF - -!ENDIF - -clean: - rm -f $(OBJECTS) opcua.dll opcua.exp opcua.lib *.pdb - -distclean: clean - -maintainer-clean: distclean +# Makefile.nmake +# nmake file for OpcUa plugin +# +# $Id$ +# + +include ..\..\config.nmake + +############### no need to modify below this line ######### + +include Makefile.common + +CFLAGS=/DHAVE_CONFIG_H /I../.. /I../../wiretap $(GLIB_CFLAGS) \ + /I$(PCAP_DIR)\include -D_U_="" $(LOCAL_CFLAGS) + +LDFLAGS = /NOLOGO /INCREMENTAL:no /MACHINE:I386 $(LOCAL_LDFLAGS) + +!IFDEF ENABLE_LIBWIRESHARK +LINK_PLUGIN_WITH=..\..\epan\libwireshark.lib ..\..\epan\dissectors\dissectors.lib +CFLAGS=/DHAVE_WIN32_LIBWIRESHARK_LIB /D_NEED_VAR_IMPORT_ $(CFLAGS) + +DISSECTOR_OBJECTS = $(DISSECTOR_SRC:.c=.obj) + +OBJECTS=$(DISSECTOR_OBJECTS) plugin.obj + +opcua.dll opcua.exp opcua.lib : $(OBJECTS) $(LINK_PLUGIN_WITH) + link -dll /out:opcua.dll $(LDFLAGS) $(OBJECTS) $(LINK_PLUGIN_WITH) \ + $(GLIB_LIBS) + +# +# Build plugin.c, which contains the plugin version[] string, a +# function plugin_register() that calls the register routines for all +# protocols, and a function plugin_reg_handoff() that calls the handoff +# registration routines for all protocols. +# +# We do this by scanning sources. If that turns out to be too slow, +# maybe we could just require every .o file to have an register routine +# of a given name (packet-aarp.o -> proto_register_aarp, etc.). +# +# Formatting conventions: The name of the proto_register_* routines an +# proto_reg_handoff_* routines must start in column zero, or must be +# preceded only by "void " starting in column zero, and must not be +# inside #if. +# +# DISSECTOR_SRC is assumed to have all the files that need to be scanned. +# +# For some unknown reason, having a big "for" loop in the Makefile +# to scan all the files doesn't work with some "make"s; they seem to +# pass only the first few names in the list to the shell, for some +# reason. +# +# Therefore, we have a script to generate the plugin.c file. +# The shell script runs slowly, as multiple greps and seds are run +# for each input file; this is especially slow on Windows. Therefore, +# if Python is present (as indicated by PYTHON being defined), we run +# a faster Python script to do that work instead. +# +# The first argument is the directory in which the source files live. +# The second argument is "plugin", to indicate that we should build +# a plugin.c file for a plugin. +# All subsequent arguments are the files to scan. +# +plugin.c: $(DISSECTOR_SRC) +!IFDEF PYTHON + @echo Making plugin.c (using python) + @$(PYTHON) "../../tools/make-dissector-reg.py" . plugin $(DISSECTOR_SRC) +!ELSE + @echo Making plugin.c (using sh) + @$(SH) ../../tools/make-dissector-reg . plugin $(DISSECTOR_SRC) +!ENDIF + +!ENDIF + +clean: + rm -f $(OBJECTS) opcua.dll opcua.exp opcua.lib *.pdb + +distclean: clean + +maintainer-clean: distclean diff --git a/plugins/opcua/README b/plugins/opcua/README index 40646bdf3d..d062bebe24 100644 --- a/plugins/opcua/README +++ b/plugins/opcua/README @@ -1,58 +1,58 @@ -OpcUa Plugin: -============= - -This plugin implements the dissection of the OpcUa Binary Protocol. -Author: Gerhard Gappmeier - ascolab GmbH - http://www.ascolab.com - -Overview: -========= - -OpcUa (OPC Unified Architecture) is a vendor and platform independent -protocol for automation technology. It is the successor of the -COM/DCOM based specifications OPC DA, OPC Alarm & Events, OPC HDA, etc. -It unifies all this technologies into a single protocol. - -The specification describes abstract services that are independent -of the underlying protocol. For now there exist protocol mappings -to a Binary TCP based protocol and a SOAP based Webservice. -Also a hybrid version will be available where the Binary messages are transported -by a single webservice command called "Invoke". - -More information about the technology you can find on -http://www.ascolab.com/index.php?file=ua&lang=en. - -Protocol Mappings: -================== - -Binary (TCP): The fastest and most flexible version (small footprint, no XML and SOAP necessary) - can easily be tunneled (SSH, IPSEC, etc.), redirected, ... -SOAP version: Easy to implement with verious tools like .Net, JAVA, gSOAP, etc. - Better to communicate through firewalls via HTTP. -SOAP with Binary Attchment: Combines the advantages of both. - The messages are encoded as Binary, and transported via SOAP as binary - attachment. - -The OPC Foundation offers a free Opc Ua stack implementation in ANSI C -for all members. This stack implements the binary protocol as well -as the SOAP version. It's easily portable to different kinds of operating -systems from embedded devices to servers. -This makes it easy to implement Opc Ua applications based on this stack -and it is expected that the binary protocol will be the most used -protocol. -Nevertheless it's free to everbody to implement an own stack according -to the specification. An own implementation of the SOAP version -should be easy with the various SOAP toolkits. - -For more information see http://www.opcfoundation.org - -Known limitations: -================== - -* In this version the security layer contains only dummy data. - The plugin decodes the transport layer, skips the security dummy data - and decodes the application layer. - Security implementation will follow when it has been implemented in the - Opc Ua stack. - +OpcUa Plugin: +============= + +This plugin implements the dissection of the OpcUa Binary Protocol. +Author: Gerhard Gappmeier + ascolab GmbH + http://www.ascolab.com + +Overview: +========= + +OpcUa (OPC Unified Architecture) is a vendor and platform independent +protocol for automation technology. It is the successor of the +COM/DCOM based specifications OPC DA, OPC Alarm & Events, OPC HDA, etc. +It unifies all this technologies into a single protocol. + +The specification describes abstract services that are independent +of the underlying protocol. For now there exist protocol mappings +to a Binary TCP based protocol and a SOAP based Webservice. +Also a hybrid version will be available where the Binary messages are transported +by a single webservice command called "Invoke". + +More information about the technology you can find on +http://www.ascolab.com/index.php?file=ua&lang=en. + +Protocol Mappings: +================== + +Binary (TCP): The fastest and most flexible version (small footprint, no XML and SOAP necessary) + can easily be tunneled (SSH, IPSEC, etc.), redirected, ... +SOAP version: Easy to implement with verious tools like .Net, JAVA, gSOAP, etc. + Better to communicate through firewalls via HTTP. +SOAP with Binary Attchment: Combines the advantages of both. + The messages are encoded as Binary, and transported via SOAP as binary + attachment. + +The OPC Foundation offers a free Opc Ua stack implementation in ANSI C +for all members. This stack implements the binary protocol as well +as the SOAP version. It's easily portable to different kinds of operating +systems from embedded devices to servers. +This makes it easy to implement Opc Ua applications based on this stack +and it is expected that the binary protocol will be the most used +protocol. +Nevertheless it's free to everbody to implement an own stack according +to the specification. An own implementation of the SOAP version +should be easy with the various SOAP toolkits. + +For more information see http://www.opcfoundation.org + +Known limitations: +================== + +* In this version the security layer contains only dummy data. + The plugin decodes the transport layer, skips the security dummy data + and decodes the application layer. + Security implementation will follow when it has been implemented in the + Opc Ua stack. + diff --git a/plugins/opcua/moduleinfo.h b/plugins/opcua/moduleinfo.h index 118adb7305..bdcddac805 100644 --- a/plugins/opcua/moduleinfo.h +++ b/plugins/opcua/moduleinfo.h @@ -1,17 +1,17 @@ -/* Included *after* config.h, in order to re-define these macros */ - -#ifdef PACKAGE -#undef PACKAGE -#endif - -/* Name of package */ -#define PACKAGE "opcua" - - -#ifdef VERSION -#undef VERSION -#endif - -/* Version number of package */ -#define VERSION "0.0.1" - +/* Included *after* config.h, in order to re-define these macros */ + +#ifdef PACKAGE +#undef PACKAGE +#endif + +/* Name of package */ +#define PACKAGE "opcua" + + +#ifdef VERSION +#undef VERSION +#endif + +/* Version number of package */ +#define VERSION "0.0.1" + diff --git a/plugins/opcua/opcua.c b/plugins/opcua/opcua.c index 76be7b1591..7b9ac17afc 100644 --- a/plugins/opcua/opcua.c +++ b/plugins/opcua/opcua.c @@ -1,255 +1,255 @@ -/****************************************************************************** -** $Id: opcua.c,v 1.5 2007/02/08 11:29:45 gergap Exp $ -** -** 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 Protocol Decoder. -** -** Author: Gerhard Gappmeier -** Last change by: $Author: gergap $ -** -******************************************************************************/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include -#include -#include -#include "ua_transport_layer.h" -#include "ua_security_layer.h" -#include "ua_application_layer.h" -#include "opcua_complextypeparser.h" -#include "opcua_serviceparser.h" -#include "opcua_enumparser.h" -#include "opcua_simpletypes.h" -#include "opcua_hfindeces.h" - -/* forward reference */ -void proto_register_opcua (void); -void proto_reg_handoff_opcua (void); -static void dissect_opcua(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); -static void dissect_opcua_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); - -/* declare parse function pointer */ -typedef void (*FctParse)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); - -static int proto_opcua = -1; -/** Official IANA registered port for OPC UA Binary Protocol. */ -static int global_opcua_port = 4840; -static dissector_handle_t opcua_handle; - -/** subtree types */ -gint ett_opcua_transport = -1; -gint ett_opcua_extensionobject = -1; -gint ett_opcua_nodeid = -1; - -/** OpcUa Transport Message Types */ -enum MessageType -{ - MSG_HELLO = 0, - MSG_ACKNOWLEDGE, - MSG_DISCONNECT, - MSG_DATA_LAST_CHUNK, - MSG_DATA, - MSG_ABORT, - MSG_ERROR, - MSG_INVALID, - MSG_UNKNOWN -}; - -/** OpcUa Transport Message Type Names */ -static char* g_szMessageTypes[] = -{ - "Hello message", - "Acknowledge message", - "Disconnect message", - "Data message, last chunk in message.", - "Data message, further chunks must follow.", - "Abort message", - "Error message", - "Invalid message", - "Unknown message" -}; - - -/** Setup protocol subtree array */ -static gint *ett[] = -{ - &ett_opcua_transport, - &ett_opcua_extensionobject, - &ett_opcua_nodeid, -}; - -/** plugin entry functions. - * This registers the OpcUa protocol. - */ -void proto_register_opcua(void) -{ - module_t *opcua_module; - - if (proto_opcua == -1) - { - proto_opcua = proto_register_protocol( - "OpcUa Binary Protocol", /* name */ - "OpcUa", /* short name */ - "opcua" /* abbrev */ - ); - } - opcua_module = prefs_register_protocol(proto_opcua, proto_reg_handoff_opcua); - - registerTransportLayerTypes(proto_opcua); - registerSecurityLayerTypes(proto_opcua); - registerApplicationLayerTypes(proto_opcua); - registerSimpleTypes(proto_opcua); - registerEnumTypes(proto_opcua); - registerComplexTypes(); - registerServiceTypes(); - registerFieldTypes(proto_opcua); - - proto_register_subtree_array(ett, array_length(ett)); -} - -/** Register sub protocol. - * For TCP port 4840. - */ -void proto_reg_handoff_opcua(void) -{ - static int Initialized=FALSE; - - if (!Initialized) - { - opcua_handle = create_dissector_handle(dissect_opcua, proto_opcua); - dissector_add("tcp.port", global_opcua_port, opcua_handle); - } -} - -/** header length that is needed to compute - * the pdu length. - * @see get_opcua_message_len - */ -#define FRAME_HEADER_LEN 8 - -/** returns the length of an OpcUa message. - * This function reads the length information from - * the transport header. - */ -static guint get_opcua_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset) -{ - gint32 plen; - - /* the message length starts at offset 4 */ - plen = tvb_get_letohl(tvb, offset + 4); - - return plen; -} - -/** The main OpcUa dissector functions. - * It uses tcp_dissect_pdus from packet-tcp.h - * to reassemble the TCP data. - */ -static void dissect_opcua(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) -{ - tcp_dissect_pdus(tvb, pinfo, tree, TRUE, FRAME_HEADER_LEN, - get_opcua_message_len, dissect_opcua_message); -} - -/** The OpcUa message dissector. - * This method dissects full OpcUa messages. - * It gets only called with reassembled data - * from tcp_dissect_pdus. - */ -static void dissect_opcua_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) -{ - FctParse pfctParse = NULL; - enum MessageType msgtype = MSG_INVALID; - - if (check_col(pinfo->cinfo, COL_PROTOCOL)) - { - col_set_str(pinfo->cinfo, COL_PROTOCOL, "OpcUa"); - } - - /* parse message type */ - if (tvb->real_data[0] == 'U' && tvb->real_data[1] == 'A') - { - if (tvb->real_data[2] == 'T') - { - switch(tvb->real_data[3]) - { - case 'H': msgtype = MSG_HELLO; - pfctParse = parseHello; - break; - case 'A': msgtype = MSG_ACKNOWLEDGE; - pfctParse = parseAcknowledge; - break; - case 'D': msgtype = MSG_DISCONNECT; - pfctParse = parseDisconnect; - break; - default: msgtype = MSG_INVALID; - break; - } - } - else if (tvb->real_data[2] == 'M') - { - switch(tvb->real_data[3]) - { - case 'G': msgtype = MSG_DATA_LAST_CHUNK; - pfctParse = parseData; - break; - case 'C': msgtype = MSG_DATA; - pfctParse = parseData; - break; - case 'A': msgtype = MSG_ABORT; - pfctParse = parseAbort; - break; - case 'E': msgtype = MSG_ERROR; - pfctParse = parseError; - break; - default: msgtype = MSG_INVALID; - break; - } - } - } - else - { - msgtype = MSG_UNKNOWN; - } - - /* Clear out stuff in the info column */ - if(check_col(pinfo->cinfo, COL_INFO)) - { - col_set_str(pinfo->cinfo, COL_INFO, g_szMessageTypes[msgtype]); - } - - if (tree && pfctParse) - { - gint offset = 0; - - /* we are being asked for details */ - proto_item *ti = NULL; - proto_tree *transport_tree = NULL; - - ti = proto_tree_add_item(tree, proto_opcua, tvb, 0, -1, FALSE); - transport_tree = proto_item_add_subtree(ti, ett_opcua_transport); - - /* call the transport message dissector */ - (*pfctParse)(transport_tree, tvb, &offset); - - } -} - - +/****************************************************************************** +** $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 Protocol Decoder. +** +** Author: Gerhard Gappmeier +** Last change by: $Author: gergap $ +** +******************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include "ua_transport_layer.h" +#include "ua_security_layer.h" +#include "ua_application_layer.h" +#include "opcua_complextypeparser.h" +#include "opcua_serviceparser.h" +#include "opcua_enumparser.h" +#include "opcua_simpletypes.h" +#include "opcua_hfindeces.h" + +/* forward reference */ +void proto_register_opcua (void); +void proto_reg_handoff_opcua (void); +static void dissect_opcua(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); +static void dissect_opcua_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); + +/* declare parse function pointer */ +typedef void (*FctParse)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); + +static int proto_opcua = -1; +/** Official IANA registered port for OPC UA Binary Protocol. */ +static int global_opcua_port = 4840; +static dissector_handle_t opcua_handle; + +/** subtree types */ +gint ett_opcua_transport = -1; +gint ett_opcua_extensionobject = -1; +gint ett_opcua_nodeid = -1; + +/** OpcUa Transport Message Types */ +enum MessageType +{ + MSG_HELLO = 0, + MSG_ACKNOWLEDGE, + MSG_DISCONNECT, + MSG_DATA_LAST_CHUNK, + MSG_DATA, + MSG_ABORT, + MSG_ERROR, + MSG_INVALID, + MSG_UNKNOWN +}; + +/** OpcUa Transport Message Type Names */ +static char* g_szMessageTypes[] = +{ + "Hello message", + "Acknowledge message", + "Disconnect message", + "Data message, last chunk in message.", + "Data message, further chunks must follow.", + "Abort message", + "Error message", + "Invalid message", + "Unknown message" +}; + + +/** Setup protocol subtree array */ +static gint *ett[] = +{ + &ett_opcua_transport, + &ett_opcua_extensionobject, + &ett_opcua_nodeid, +}; + +/** plugin entry functions. + * This registers the OpcUa protocol. + */ +void proto_register_opcua(void) +{ + module_t *opcua_module; + + if (proto_opcua == -1) + { + proto_opcua = proto_register_protocol( + "OpcUa Binary Protocol", /* name */ + "OpcUa", /* short name */ + "opcua" /* abbrev */ + ); + } + opcua_module = prefs_register_protocol(proto_opcua, proto_reg_handoff_opcua); + + registerTransportLayerTypes(proto_opcua); + registerSecurityLayerTypes(proto_opcua); + registerApplicationLayerTypes(proto_opcua); + registerSimpleTypes(proto_opcua); + registerEnumTypes(proto_opcua); + registerComplexTypes(); + registerServiceTypes(); + registerFieldTypes(proto_opcua); + + proto_register_subtree_array(ett, array_length(ett)); +} + +/** Register sub protocol. + * For TCP port 4840. + */ +void proto_reg_handoff_opcua(void) +{ + static int Initialized=FALSE; + + if (!Initialized) + { + opcua_handle = create_dissector_handle(dissect_opcua, proto_opcua); + dissector_add("tcp.port", global_opcua_port, opcua_handle); + } +} + +/** header length that is needed to compute + * the pdu length. + * @see get_opcua_message_len + */ +#define FRAME_HEADER_LEN 8 + +/** returns the length of an OpcUa message. + * This function reads the length information from + * the transport header. + */ +static guint get_opcua_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset) +{ + gint32 plen; + + /* the message length starts at offset 4 */ + plen = tvb_get_letohl(tvb, offset + 4); + + return plen; +} + +/** The main OpcUa dissector functions. + * It uses tcp_dissect_pdus from packet-tcp.h + * to reassemble the TCP data. + */ +static void dissect_opcua(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) +{ + tcp_dissect_pdus(tvb, pinfo, tree, TRUE, FRAME_HEADER_LEN, + get_opcua_message_len, dissect_opcua_message); +} + +/** The OpcUa message dissector. + * This method dissects full OpcUa messages. + * It gets only called with reassembled data + * from tcp_dissect_pdus. + */ +static void dissect_opcua_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) +{ + FctParse pfctParse = NULL; + enum MessageType msgtype = MSG_INVALID; + + if (check_col(pinfo->cinfo, COL_PROTOCOL)) + { + col_set_str(pinfo->cinfo, COL_PROTOCOL, "OpcUa"); + } + + /* parse message type */ + if (tvb->real_data[0] == 'U' && tvb->real_data[1] == 'A') + { + if (tvb->real_data[2] == 'T') + { + switch(tvb->real_data[3]) + { + case 'H': msgtype = MSG_HELLO; + pfctParse = parseHello; + break; + case 'A': msgtype = MSG_ACKNOWLEDGE; + pfctParse = parseAcknowledge; + break; + case 'D': msgtype = MSG_DISCONNECT; + pfctParse = parseDisconnect; + break; + default: msgtype = MSG_INVALID; + break; + } + } + else if (tvb->real_data[2] == 'M') + { + switch(tvb->real_data[3]) + { + case 'G': msgtype = MSG_DATA_LAST_CHUNK; + pfctParse = parseData; + break; + case 'C': msgtype = MSG_DATA; + pfctParse = parseData; + break; + case 'A': msgtype = MSG_ABORT; + pfctParse = parseAbort; + break; + case 'E': msgtype = MSG_ERROR; + pfctParse = parseError; + break; + default: msgtype = MSG_INVALID; + break; + } + } + } + else + { + msgtype = MSG_UNKNOWN; + } + + /* Clear out stuff in the info column */ + if(check_col(pinfo->cinfo, COL_INFO)) + { + col_set_str(pinfo->cinfo, COL_INFO, g_szMessageTypes[msgtype]); + } + + if (tree && pfctParse) + { + gint offset = 0; + + /* we are being asked for details */ + proto_item *ti = NULL; + proto_tree *transport_tree = NULL; + + ti = proto_tree_add_item(tree, proto_opcua, tvb, 0, -1, FALSE); + transport_tree = proto_item_add_subtree(ti, ett_opcua_transport); + + /* call the transport message dissector */ + (*pfctParse)(transport_tree, tvb, &offset); + + } +} + + diff --git a/plugins/opcua/opcua_complextypeparser.c b/plugins/opcua/opcua_complextypeparser.c index 6723353f89..cffedb312b 100644 --- a/plugins/opcua/opcua_complextypeparser.c +++ b/plugins/opcua/opcua_complextypeparser.c @@ -32,60 +32,60 @@ #include "opcua_simpletypes.h" #include "opcua_hfindeces.h" - -gint ett_opcua_ReferenceNode = -1; -void parseReferenceNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReferenceNode", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReferenceNode); + +gint ett_opcua_ReferenceNode = -1; +void parseReferenceNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReferenceNode", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReferenceNode); parseNodeId(subtree, tvb, pOffset, "ReferenceTypeId"); parseBoolean(subtree, tvb, pOffset, hf_opcua_IsInverse); parseUInt32(subtree, tvb, pOffset, hf_opcua_ServerIndex); - parseExpandedNodeId(subtree, tvb, pOffset, "TargetId"); -} - -gint ett_opcua_Node = -1; -void parseNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : Node", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_Node); + parseExpandedNodeId(subtree, tvb, pOffset, "TargetId"); +} + +gint ett_opcua_Node = -1; +void parseNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : Node", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_Node); 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); -} - -gint ett_opcua_ObjectNode = -1; -void parseObjectNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ObjectNode", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ObjectNode); + parseArrayComplex(subtree, tvb, pOffset, "References", parseReferenceNode); +} + +gint ett_opcua_ObjectNode = -1; +void parseObjectNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ObjectNode", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ObjectNode); /* parse base class members */ parseNode(subtree, tvb, pOffset, "[Node]"); /* parse additional members */ - parseByte(subtree, tvb, pOffset, hf_opcua_EventNotifier); -} - -gint ett_opcua_ObjectTypeNode = -1; -void parseObjectTypeNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ObjectTypeNode", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ObjectTypeNode); + parseByte(subtree, tvb, pOffset, hf_opcua_EventNotifier); +} + +gint ett_opcua_ObjectTypeNode = -1; +void parseObjectTypeNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ObjectTypeNode", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ObjectTypeNode); /* parse base class members */ parseNode(subtree, tvb, pOffset, "[Node]"); /* parse additional members */ - parseBoolean(subtree, tvb, pOffset, hf_opcua_IsAbstract); -} - -gint ett_opcua_VariableNode = -1; -void parseVariableNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : VariableNode", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_VariableNode); + parseBoolean(subtree, tvb, pOffset, hf_opcua_IsAbstract); +} + +gint ett_opcua_VariableNode = -1; +void parseVariableNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : VariableNode", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_VariableNode); /* parse base class members */ parseNode(subtree, tvb, pOffset, "[Node]"); /* parse additional members */ @@ -95,119 +95,119 @@ void parseVariableNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szF 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); -} - -gint ett_opcua_VariableTypeNode = -1; -void parseVariableTypeNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : VariableTypeNode", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_VariableTypeNode); + parseBoolean(subtree, tvb, pOffset, hf_opcua_Historizing); +} + +gint ett_opcua_VariableTypeNode = -1; +void parseVariableTypeNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : VariableTypeNode", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_VariableTypeNode); /* 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); -} - -gint ett_opcua_ReferenceTypeNode = -1; -void parseReferenceTypeNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReferenceTypeNode", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReferenceTypeNode); + parseBoolean(subtree, tvb, pOffset, hf_opcua_IsAbstract); +} + +gint ett_opcua_ReferenceTypeNode = -1; +void parseReferenceTypeNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReferenceTypeNode", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReferenceTypeNode); /* 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"); -} - -gint ett_opcua_MethodNode = -1; -void parseMethodNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MethodNode", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MethodNode); + parseLocalizedText(subtree, tvb, pOffset, "InverseName"); +} + +gint ett_opcua_MethodNode = -1; +void parseMethodNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MethodNode", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MethodNode); /* 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); -} - -gint ett_opcua_ViewNode = -1; -void parseViewNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ViewNode", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ViewNode); + parseBoolean(subtree, tvb, pOffset, hf_opcua_UserExecutable); +} + +gint ett_opcua_ViewNode = -1; +void parseViewNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ViewNode", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ViewNode); /* 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); -} - -gint ett_opcua_DataTypeNode = -1; -void parseDataTypeNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DataTypeNode", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DataTypeNode); + parseByte(subtree, tvb, pOffset, hf_opcua_EventNotifier); +} + +gint ett_opcua_DataTypeNode = -1; +void parseDataTypeNode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DataTypeNode", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DataTypeNode); /* parse base class members */ parseNode(subtree, tvb, pOffset, "[Node]"); /* parse additional members */ - parseBoolean(subtree, tvb, pOffset, hf_opcua_IsAbstract); -} - -gint ett_opcua_UriTableEntry = -1; -void parseUriTableEntry(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : UriTableEntry", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_UriTableEntry); + parseBoolean(subtree, tvb, pOffset, hf_opcua_IsAbstract); +} + +gint ett_opcua_UriTableEntry = -1; +void parseUriTableEntry(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : UriTableEntry", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_UriTableEntry); parseUInt32(subtree, tvb, pOffset, hf_opcua_Index); - parseString(subtree, tvb, pOffset, hf_opcua_Uri); -} - -gint ett_opcua_NodeSet = -1; -void parseNodeSet(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : NodeSet", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_NodeSet); + parseString(subtree, tvb, pOffset, hf_opcua_Uri); +} + +gint ett_opcua_NodeSet = -1; +void parseNodeSet(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : NodeSet", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_NodeSet); parseArrayComplex(subtree, tvb, pOffset, "NamespaceUris", parseUriTableEntry); parseArrayComplex(subtree, tvb, pOffset, "ServerUris", parseUriTableEntry); - parseArrayComplex(subtree, tvb, pOffset, "Nodes", parseExtensionObject); -} - -gint ett_opcua_Argument = -1; -void parseArgument(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : Argument", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_Argument); + parseArrayComplex(subtree, tvb, pOffset, "Nodes", parseExtensionObject); +} + +gint ett_opcua_Argument = -1; +void parseArgument(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : Argument", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_Argument); parseString(subtree, tvb, pOffset, hf_opcua_Name); parseNodeId(subtree, tvb, pOffset, "DataType"); parseInt32(subtree, tvb, pOffset, hf_opcua_ArraySize); - parseLocalizedText(subtree, tvb, pOffset, "Description"); -} - -gint ett_opcua_Status = -1; -void parseStatus(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : Status", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_Status); + parseLocalizedText(subtree, tvb, pOffset, "Description"); +} + +gint ett_opcua_Status = -1; +void parseStatus(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : Status", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_Status); parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode); - parseDiagnosticInfo(subtree, tvb, pOffset, "DiagnosticInfo"); -} - -gint ett_opcua_BaseEvent = -1; -void parseBaseEvent(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BaseEvent", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BaseEvent); + parseDiagnosticInfo(subtree, tvb, pOffset, "DiagnosticInfo"); +} + +gint ett_opcua_BaseEvent = -1; +void parseBaseEvent(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BaseEvent", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BaseEvent); parseByteString(subtree, tvb, pOffset, hf_opcua_EventId); parseNodeId(subtree, tvb, pOffset, "EventType"); @@ -216,14 +216,14 @@ void parseBaseEvent(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFiel 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); -} - -gint ett_opcua_SecurityPolicy = -1; -void parseSecurityPolicy(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SecurityPolicy", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SecurityPolicy); + parseUInt16(subtree, tvb, pOffset, hf_opcua_Severity); +} + +gint ett_opcua_SecurityPolicy = -1; +void parseSecurityPolicy(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SecurityPolicy", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SecurityPolicy); parseString(subtree, tvb, pOffset, hf_opcua_Uri); parseString(subtree, tvb, pOffset, hf_opcua_Digest); @@ -238,37 +238,37 @@ void parseSecurityPolicy(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *s 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); -} - -gint ett_opcua_UserTokenPolicy = -1; -void parseUserTokenPolicy(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : UserTokenPolicy", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_UserTokenPolicy); + parseUInt32(subtree, tvb, pOffset, hf_opcua_DerivedSignatureKeyLength); +} + +gint ett_opcua_UserTokenPolicy = -1; +void parseUserTokenPolicy(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : UserTokenPolicy", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_UserTokenPolicy); parseUserTokenType(subtree, tvb, pOffset); parseString(subtree, tvb, pOffset, hf_opcua_IssuerType); - parseString(subtree, tvb, pOffset, hf_opcua_IssuerUrl); -} - -gint ett_opcua_ServerDescription = -1; -void parseServerDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ServerDescription", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ServerDescription); + parseString(subtree, tvb, pOffset, hf_opcua_IssuerUrl); +} + +gint ett_opcua_ServerDescription = -1; +void parseServerDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ServerDescription", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ServerDescription); parseServerDescriptionType(subtree, tvb, pOffset); parseString(subtree, tvb, pOffset, hf_opcua_ServerUri); parseLocalizedText(subtree, tvb, pOffset, "ServerName"); - parseArraySimple(subtree, tvb, pOffset, hf_opcua_DiscoveryUrls, parseString); -} - -gint ett_opcua_EndpointDescription = -1; -void parseEndpointDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EndpointDescription", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EndpointDescription); + parseArraySimple(subtree, tvb, pOffset, hf_opcua_DiscoveryUrls, parseString); +} + +gint ett_opcua_EndpointDescription = -1; +void parseEndpointDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EndpointDescription", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EndpointDescription); parseServerDescription(subtree, tvb, pOffset, "Server"); parseString(subtree, tvb, pOffset, hf_opcua_EndpointUrl); @@ -276,96 +276,96 @@ void parseEndpointDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, ch 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); -} - -gint ett_opcua_EndpointConfiguration = -1; -void parseEndpointConfiguration(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EndpointConfiguration", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EndpointConfiguration); + parseArraySimple(subtree, tvb, pOffset, hf_opcua_SupportedProfiles, parseString); +} + +gint ett_opcua_EndpointConfiguration = -1; +void parseEndpointConfiguration(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EndpointConfiguration", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EndpointConfiguration); 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); -} - -gint ett_opcua_UserIdentityToken = -1; -void parseUserIdentityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : UserIdentityToken", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_UserIdentityToken); - -} - -gint ett_opcua_UserNameIdentityToken = -1; -void parseUserNameIdentityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : UserNameIdentityToken", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_UserNameIdentityToken); + parseInt32(subtree, tvb, pOffset, hf_opcua_MaxStringLength); +} + +gint ett_opcua_UserIdentityToken = -1; +void parseUserIdentityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : UserIdentityToken", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_UserIdentityToken); + +} + +gint ett_opcua_UserNameIdentityToken = -1; +void parseUserNameIdentityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : UserNameIdentityToken", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_UserNameIdentityToken); /* 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); -} - -gint ett_opcua_X509IdentityToken = -1; -void parseX509IdentityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : X509IdentityToken", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_X509IdentityToken); + parseString(subtree, tvb, pOffset, hf_opcua_HashAlgorithm); +} + +gint ett_opcua_X509IdentityToken = -1; +void parseX509IdentityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : X509IdentityToken", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_X509IdentityToken); /* parse base class members */ parseUserIdentityToken(subtree, tvb, pOffset, "[UserIdentityToken]"); /* parse additional members */ - parseByteString(subtree, tvb, pOffset, hf_opcua_CertificateData); -} - -gint ett_opcua_WssIdentityToken = -1; -void parseWssIdentityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : WssIdentityToken", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_WssIdentityToken); + parseByteString(subtree, tvb, pOffset, hf_opcua_CertificateData); +} + +gint ett_opcua_WssIdentityToken = -1; +void parseWssIdentityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : WssIdentityToken", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_WssIdentityToken); /* parse base class members */ parseUserIdentityToken(subtree, tvb, pOffset, "[UserIdentityToken]"); /* parse additional members */ - parseXmlElement(subtree, tvb, pOffset, hf_opcua_TokenData); -} - -gint ett_opcua_SupportedProfile = -1; -void parseSupportedProfile(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SupportedProfile", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SupportedProfile); + parseXmlElement(subtree, tvb, pOffset, hf_opcua_TokenData); +} + +gint ett_opcua_SupportedProfile = -1; +void parseSupportedProfile(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SupportedProfile", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SupportedProfile); parseString(subtree, tvb, pOffset, hf_opcua_ProfileUri); parseString(subtree, tvb, pOffset, hf_opcua_ProfileName); - parseComplianceLevel(subtree, tvb, pOffset); -} - -gint ett_opcua_BuildInfo = -1; -void parseBuildInfo(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BuildInfo", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BuildInfo); + parseComplianceLevel(subtree, tvb, pOffset); +} + +gint ett_opcua_BuildInfo = -1; +void parseBuildInfo(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BuildInfo", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BuildInfo); 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); -} - -gint ett_opcua_SoftwareCertificate = -1; -void parseSoftwareCertificate(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SoftwareCertificate", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SoftwareCertificate); + parseDateTime(subtree, tvb, pOffset, hf_opcua_BuildDate); +} + +gint ett_opcua_SoftwareCertificate = -1; +void parseSoftwareCertificate(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SoftwareCertificate", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SoftwareCertificate); parseBuildInfo(subtree, tvb, pOffset, "ServerInfo"); parseString(subtree, tvb, pOffset, hf_opcua_IssuedBy); @@ -374,56 +374,56 @@ void parseSoftwareCertificate(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, ch 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); -} - -gint ett_opcua_SignedSoftwareCertificate = -1; -void parseSignedSoftwareCertificate(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SignedSoftwareCertificate", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SignedSoftwareCertificate); + parseArrayComplex(subtree, tvb, pOffset, "SupportedProfiles", parseSupportedProfile); +} + +gint ett_opcua_SignedSoftwareCertificate = -1; +void parseSignedSoftwareCertificate(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SignedSoftwareCertificate", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SignedSoftwareCertificate); parseByteString(subtree, tvb, pOffset, hf_opcua_CertificateData); - parseByteString(subtree, tvb, pOffset, hf_opcua_IssuerSignature); -} - -gint ett_opcua_NodeAttributes = -1; -void parseNodeAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : NodeAttributes", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_NodeAttributes); + parseByteString(subtree, tvb, pOffset, hf_opcua_IssuerSignature); +} + +gint ett_opcua_NodeAttributes = -1; +void parseNodeAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : NodeAttributes", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_NodeAttributes); parseLocalizedText(subtree, tvb, pOffset, "DisplayName"); - parseLocalizedText(subtree, tvb, pOffset, "Description"); -} - -gint ett_opcua_ObjectAttributes = -1; -void parseObjectAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ObjectAttributes", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ObjectAttributes); + parseLocalizedText(subtree, tvb, pOffset, "Description"); +} + +gint ett_opcua_ObjectAttributes = -1; +void parseObjectAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ObjectAttributes", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ObjectAttributes); /* parse base class members */ parseNodeAttributes(subtree, tvb, pOffset, "[NodeAttributes]"); /* parse additional members */ - parseByte(subtree, tvb, pOffset, hf_opcua_EventNotifier); -} - -gint ett_opcua_ObjectTypeAttributes = -1; -void parseObjectTypeAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ObjectTypeAttributes", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ObjectTypeAttributes); + parseByte(subtree, tvb, pOffset, hf_opcua_EventNotifier); +} + +gint ett_opcua_ObjectTypeAttributes = -1; +void parseObjectTypeAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ObjectTypeAttributes", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ObjectTypeAttributes); /* parse base class members */ parseNodeAttributes(subtree, tvb, pOffset, "[NodeAttributes]"); /* parse additional members */ - parseBoolean(subtree, tvb, pOffset, hf_opcua_IsAbstract); -} - -gint ett_opcua_VariableAttributes = -1; -void parseVariableAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : VariableAttributes", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_VariableAttributes); + parseBoolean(subtree, tvb, pOffset, hf_opcua_IsAbstract); +} + +gint ett_opcua_VariableAttributes = -1; +void parseVariableAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : VariableAttributes", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_VariableAttributes); /* parse base class members */ parseNodeAttributes(subtree, tvb, pOffset, "[NodeAttributes]"); /* parse additional members */ @@ -433,65 +433,65 @@ void parseVariableAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, cha 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); -} - -gint ett_opcua_VariableTypeAttributes = -1; -void parseVariableTypeAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : VariableTypeAttributes", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_VariableTypeAttributes); + parseBoolean(subtree, tvb, pOffset, hf_opcua_Historizing); +} + +gint ett_opcua_VariableTypeAttributes = -1; +void parseVariableTypeAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : VariableTypeAttributes", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_VariableTypeAttributes); /* 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); -} - -gint ett_opcua_ReferenceTypeAttributes = -1; -void parseReferenceTypeAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReferenceTypeAttributes", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReferenceTypeAttributes); + parseBoolean(subtree, tvb, pOffset, hf_opcua_IsAbstract); +} + +gint ett_opcua_ReferenceTypeAttributes = -1; +void parseReferenceTypeAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReferenceTypeAttributes", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReferenceTypeAttributes); /* 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"); -} - -gint ett_opcua_MethodAttributes = -1; -void parseMethodAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MethodAttributes", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MethodAttributes); + parseLocalizedText(subtree, tvb, pOffset, "InverseName"); +} + +gint ett_opcua_MethodAttributes = -1; +void parseMethodAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MethodAttributes", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MethodAttributes); /* 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); -} - -gint ett_opcua_ViewAttributes = -1; -void parseViewAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ViewAttributes", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ViewAttributes); + parseBoolean(subtree, tvb, pOffset, hf_opcua_UserExecutable); +} + +gint ett_opcua_ViewAttributes = -1; +void parseViewAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ViewAttributes", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ViewAttributes); /* 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); -} - -gint ett_opcua_AddNodesItem = -1; -void parseAddNodesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : AddNodesItem", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddNodesItem); + parseByte(subtree, tvb, pOffset, hf_opcua_EventNotifier); +} + +gint ett_opcua_AddNodesItem = -1; +void parseAddNodesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : AddNodesItem", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddNodesItem); parseExpandedNodeId(subtree, tvb, pOffset, "ParentNodeId"); parseNodeId(subtree, tvb, pOffset, "ReferenceTypeId"); @@ -499,75 +499,75 @@ void parseAddNodesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szF parseQualifiedName(subtree, tvb, pOffset, "BrowseName"); parseInt32(subtree, tvb, pOffset, hf_opcua_NodeClass); parseExtensionObject(subtree, tvb, pOffset, "NodeAttributes"); - parseExpandedNodeId(subtree, tvb, pOffset, "TypeDefinition"); -} - -gint ett_opcua_AddReferencesItem = -1; -void parseAddReferencesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : AddReferencesItem", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddReferencesItem); + parseExpandedNodeId(subtree, tvb, pOffset, "TypeDefinition"); +} + +gint ett_opcua_AddReferencesItem = -1; +void parseAddReferencesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : AddReferencesItem", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddReferencesItem); 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); -} - -gint ett_opcua_DeleteNodesItem = -1; -void parseDeleteNodesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DeleteNodesItem", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteNodesItem); + parseInt32(subtree, tvb, pOffset, hf_opcua_TargetNodeClass); +} + +gint ett_opcua_DeleteNodesItem = -1; +void parseDeleteNodesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DeleteNodesItem", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteNodesItem); parseNodeId(subtree, tvb, pOffset, "NodeId"); - parseBoolean(subtree, tvb, pOffset, hf_opcua_DeleteTargetReferences); -} - -gint ett_opcua_DeleteReferencesItem = -1; -void parseDeleteReferencesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DeleteReferencesItem", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteReferencesItem); + parseBoolean(subtree, tvb, pOffset, hf_opcua_DeleteTargetReferences); +} + +gint ett_opcua_DeleteReferencesItem = -1; +void parseDeleteReferencesItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DeleteReferencesItem", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteReferencesItem); 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"); -} - -gint ett_opcua_RedundantServerDataType = -1; -void parseRedundantServerDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : RedundantServerDataType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RedundantServerDataType); + parseExpandedNodeId(subtree, tvb, pOffset, "TargetNodeId"); +} + +gint ett_opcua_RedundantServerDataType = -1; +void parseRedundantServerDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : RedundantServerDataType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RedundantServerDataType); parseString(subtree, tvb, pOffset, hf_opcua_ServerId); parseSByte(subtree, tvb, pOffset, hf_opcua_ServiceLevel); - parseServerState(subtree, tvb, pOffset); -} - -gint ett_opcua_SamplingRateDiagnosticsDataType = -1; -void parseSamplingRateDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SamplingRateDiagnosticsDataType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SamplingRateDiagnosticsDataType); + parseServerState(subtree, tvb, pOffset); +} + +gint ett_opcua_SamplingRateDiagnosticsDataType = -1; +void parseSamplingRateDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SamplingRateDiagnosticsDataType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SamplingRateDiagnosticsDataType); 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); -} - -gint ett_opcua_ServerDiagnosticsSummaryDataType = -1; -void parseServerDiagnosticsSummaryDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ServerDiagnosticsSummaryDataType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ServerDiagnosticsSummaryDataType); + parseUInt32(subtree, tvb, pOffset, hf_opcua_DisabledMonitoredItemsSamplingCount); +} + +gint ett_opcua_ServerDiagnosticsSummaryDataType = -1; +void parseServerDiagnosticsSummaryDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ServerDiagnosticsSummaryDataType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ServerDiagnosticsSummaryDataType); parseUInt32(subtree, tvb, pOffset, hf_opcua_ServerViewCount); parseUInt32(subtree, tvb, pOffset, hf_opcua_CurrentSessionCount); @@ -581,37 +581,37 @@ void parseServerDiagnosticsSummaryDataType(proto_tree *tree, tvbuff_t *tvb, gint 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); -} - -gint ett_opcua_ServerStatusDataType = -1; -void parseServerStatusDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ServerStatusDataType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ServerStatusDataType); + parseUInt32(subtree, tvb, pOffset, hf_opcua_RejectedRequestsCount); +} + +gint ett_opcua_ServerStatusDataType = -1; +void parseServerStatusDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ServerStatusDataType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ServerStatusDataType); parseDateTime(subtree, tvb, pOffset, hf_opcua_StartTime); parseDateTime(subtree, tvb, pOffset, hf_opcua_CurrentTime); parseServerState(subtree, tvb, pOffset); - parseBuildInfo(subtree, tvb, pOffset, "BuildInfo"); -} - -gint ett_opcua_ServiceCounterDataType = -1; -void parseServiceCounterDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ServiceCounterDataType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ServiceCounterDataType); + parseBuildInfo(subtree, tvb, pOffset, "BuildInfo"); +} + +gint ett_opcua_ServiceCounterDataType = -1; +void parseServiceCounterDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ServiceCounterDataType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ServiceCounterDataType); parseUInt32(subtree, tvb, pOffset, hf_opcua_TotalCount); parseUInt32(subtree, tvb, pOffset, hf_opcua_UnauthorizedCount); - parseUInt32(subtree, tvb, pOffset, hf_opcua_ErrorCount); -} - -gint ett_opcua_SessionDiagnosticsDataType = -1; -void parseSessionDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SessionDiagnosticsDataType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SessionDiagnosticsDataType); + parseUInt32(subtree, tvb, pOffset, hf_opcua_ErrorCount); +} + +gint ett_opcua_SessionDiagnosticsDataType = -1; +void parseSessionDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SessionDiagnosticsDataType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SessionDiagnosticsDataType); parseUInt32(subtree, tvb, pOffset, hf_opcua_SessionId); parseString(subtree, tvb, pOffset, hf_opcua_ClientName); @@ -654,14 +654,14 @@ void parseSessionDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOff parseServiceCounterDataType(subtree, tvb, pOffset, "BrowseNextCount"); parseServiceCounterDataType(subtree, tvb, pOffset, "TranslateBrowsePathsToNodeIdsCount"); parseServiceCounterDataType(subtree, tvb, pOffset, "QueryFirstCount"); - parseServiceCounterDataType(subtree, tvb, pOffset, "QueryNextCount"); -} - -gint ett_opcua_SessionSecurityDiagnosticsDataType = -1; -void parseSessionSecurityDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SessionSecurityDiagnosticsDataType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SessionSecurityDiagnosticsDataType); + parseServiceCounterDataType(subtree, tvb, pOffset, "QueryNextCount"); +} + +gint ett_opcua_SessionSecurityDiagnosticsDataType = -1; +void parseSessionSecurityDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SessionSecurityDiagnosticsDataType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SessionSecurityDiagnosticsDataType); parseUInt32(subtree, tvb, pOffset, hf_opcua_SessionId); parseString(subtree, tvb, pOffset, hf_opcua_ClientUserIdOfSession); @@ -669,14 +669,14 @@ void parseSessionSecurityDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gi 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); -} - -gint ett_opcua_SubscriptionDiagnosticsDataType = -1; -void parseSubscriptionDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SubscriptionDiagnosticsDataType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SubscriptionDiagnosticsDataType); + parseString(subtree, tvb, pOffset, hf_opcua_SecurityPolicy); +} + +gint ett_opcua_SubscriptionDiagnosticsDataType = -1; +void parseSubscriptionDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SubscriptionDiagnosticsDataType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SubscriptionDiagnosticsDataType); parseUInt32(subtree, tvb, pOffset, hf_opcua_SessionId); parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId); @@ -698,70 +698,70 @@ void parseSubscriptionDiagnosticsDataType(proto_tree *tree, tvbuff_t *tvb, gint 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); -} - -gint ett_opcua_Range = -1; -void parseRange(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : Range", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_Range); + parseUInt32(subtree, tvb, pOffset, hf_opcua_KeepAliveStateCount); +} + +gint ett_opcua_Range = -1; +void parseRange(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : Range", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_Range); parseDouble(subtree, tvb, pOffset, hf_opcua_Low); - parseDouble(subtree, tvb, pOffset, hf_opcua_High); -} - -gint ett_opcua_EUInformation = -1; -void parseEUInformation(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EUInformation", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EUInformation); + parseDouble(subtree, tvb, pOffset, hf_opcua_High); +} + +gint ett_opcua_EUInformation = -1; +void parseEUInformation(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EUInformation", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EUInformation); parseString(subtree, tvb, pOffset, hf_opcua_NamespaceUri); parseInt32(subtree, tvb, pOffset, hf_opcua_UnitId); parseLocalizedText(subtree, tvb, pOffset, "DisplayName"); - parseLocalizedText(subtree, tvb, pOffset, "Description"); -} - -gint ett_opcua_Annotation = -1; -void parseAnnotation(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : Annotation", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_Annotation); + parseLocalizedText(subtree, tvb, pOffset, "Description"); +} + +gint ett_opcua_Annotation = -1; +void parseAnnotation(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : Annotation", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_Annotation); 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); -} - -gint ett_opcua_BaseStructureDataType = -1; -void parseBaseStructureDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BaseStructureDataType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BaseStructureDataType); + parseDateTime(subtree, tvb, pOffset, hf_opcua_AnnotationTime); +} + +gint ett_opcua_BaseStructureDataType = -1; +void parseBaseStructureDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BaseStructureDataType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BaseStructureDataType); parseInt32(subtree, tvb, pOffset, hf_opcua_Id); - parseString(subtree, tvb, pOffset, hf_opcua_Name); -} - -gint ett_opcua_DerivedStructureDataType = -1; -void parseDerivedStructureDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DerivedStructureDataType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DerivedStructureDataType); + parseString(subtree, tvb, pOffset, hf_opcua_Name); +} + +gint ett_opcua_DerivedStructureDataType = -1; +void parseDerivedStructureDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DerivedStructureDataType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DerivedStructureDataType); /* 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); -} - -gint ett_opcua_ScalarValuesDataType = -1; -void parseScalarValuesDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ScalarValuesDataType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ScalarValuesDataType); + parseDateTime(subtree, tvb, pOffset, hf_opcua_Timestamp); +} + +gint ett_opcua_ScalarValuesDataType = -1; +void parseScalarValuesDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ScalarValuesDataType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ScalarValuesDataType); parseBoolean(subtree, tvb, pOffset, hf_opcua_Boolean); parseSByte(subtree, tvb, pOffset, hf_opcua_SByte); @@ -789,14 +789,14 @@ void parseScalarValuesDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, c parseDataValue(subtree, tvb, pOffset, "DataValue"); parseVariant(subtree, tvb, pOffset, "Variant"); parseBaseStructureDataType(subtree, tvb, pOffset, "Structure"); - parseColorsDataType(subtree, tvb, pOffset); -} - -gint ett_opcua_ArrayValuesDataType = -1; -void parseArrayValuesDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ArrayValuesDataType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ArrayValuesDataType); + parseColorsDataType(subtree, tvb, pOffset); +} + +gint ett_opcua_ArrayValuesDataType = -1; +void parseArrayValuesDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ArrayValuesDataType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ArrayValuesDataType); parseArraySimple(subtree, tvb, pOffset, hf_opcua_Boolean, parseBoolean); parseArraySimple(subtree, tvb, pOffset, hf_opcua_SByte, parseSByte); @@ -823,14 +823,14 @@ void parseArrayValuesDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, ch parseArrayComplex(subtree, tvb, pOffset, "DataValue", parseDataValue); parseArrayComplex(subtree, tvb, pOffset, "Variant", parseVariant); parseArrayComplex(subtree, tvb, pOffset, "Structure", parseBaseStructureDataType); - parseArrayEnum(subtree, tvb, pOffset, parseColorsDataType); -} - -gint ett_opcua_RequestHeader = -1; -void parseRequestHeader(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : RequestHeader", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RequestHeader); + parseArrayEnum(subtree, tvb, pOffset, parseColorsDataType); +} + +gint ett_opcua_RequestHeader = -1; +void parseRequestHeader(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : RequestHeader", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RequestHeader); parseUInt32(subtree, tvb, pOffset, hf_opcua_SessionId); parseDateTime(subtree, tvb, pOffset, hf_opcua_Timestamp); @@ -838,14 +838,14 @@ void parseRequestHeader(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *sz 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"); -} - -gint ett_opcua_ResponseHeader = -1; -void parseResponseHeader(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ResponseHeader", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ResponseHeader); + parseExtensionObject(subtree, tvb, pOffset, "AdditionalHeaders"); +} + +gint ett_opcua_ResponseHeader = -1; +void parseResponseHeader(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ResponseHeader", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ResponseHeader); parseUInt32(subtree, tvb, pOffset, hf_opcua_SessionId); parseDateTime(subtree, tvb, pOffset, hf_opcua_Timestamp); @@ -853,53 +853,53 @@ void parseResponseHeader(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *s 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"); -} - -gint ett_opcua_ServiceFault = -1; -void parseServiceFault(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ServiceFault", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ServiceFault); + parseExtensionObject(subtree, tvb, pOffset, "AdditionalHeaders"); +} - parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); -} - -gint ett_opcua_ComplexTestType = -1; -void parseComplexTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ComplexTestType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ComplexTestType); +gint ett_opcua_ServiceFault = -1; +void parseServiceFault(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ServiceFault", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ServiceFault); + + parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); +} + +gint ett_opcua_ComplexTestType = -1; +void parseComplexTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ComplexTestType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ComplexTestType); parseDateTime(subtree, tvb, pOffset, hf_opcua_Value1); - parseArrayEnum(subtree, tvb, pOffset, parseEnumeratedTestType); -} - -gint ett_opcua_BaseTestType = -1; -void parseBaseTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BaseTestType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BaseTestType); + parseArrayEnum(subtree, tvb, pOffset, parseEnumeratedTestType); +} - parseDateTime(subtree, tvb, pOffset, hf_opcua_Value1); -} - -gint ett_opcua_DerivedTestType = -1; -void parseDerivedTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DerivedTestType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DerivedTestType); +gint ett_opcua_BaseTestType = -1; +void parseBaseTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BaseTestType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BaseTestType); + + parseDateTime(subtree, tvb, pOffset, hf_opcua_Value1); +} + +gint ett_opcua_DerivedTestType = -1; +void parseDerivedTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DerivedTestType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DerivedTestType); /* parse base class members */ parseBaseTestType(subtree, tvb, pOffset, "[BaseTestType]"); /* parse additional members */ - parseDateTime(subtree, tvb, pOffset, hf_opcua_Value2); -} - -gint ett_opcua_ScalarTestType = -1; -void parseScalarTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ScalarTestType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ScalarTestType); + parseDateTime(subtree, tvb, pOffset, hf_opcua_Value2); +} + +gint ett_opcua_ScalarTestType = -1; +void parseScalarTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ScalarTestType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ScalarTestType); parseBoolean(subtree, tvb, pOffset, hf_opcua_Boolean); parseSByte(subtree, tvb, pOffset, hf_opcua_SByte); @@ -927,14 +927,14 @@ void parseScalarTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *s parseDataValue(subtree, tvb, pOffset, "DataValue"); parseVariant(subtree, tvb, pOffset, "Variant"); parseComplexTestType(subtree, tvb, pOffset, "ComplexValue"); - parseEnumeratedTestType(subtree, tvb, pOffset); -} - -gint ett_opcua_ArrayTestType = -1; -void parseArrayTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ArrayTestType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ArrayTestType); + parseEnumeratedTestType(subtree, tvb, pOffset); +} + +gint ett_opcua_ArrayTestType = -1; +void parseArrayTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ArrayTestType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ArrayTestType); parseArraySimple(subtree, tvb, pOffset, hf_opcua_Booleans, parseBoolean); parseArraySimple(subtree, tvb, pOffset, hf_opcua_SBytes, parseSByte); @@ -961,93 +961,93 @@ void parseArrayTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *sz parseArrayComplex(subtree, tvb, pOffset, "DataValues", parseDataValue); parseArrayComplex(subtree, tvb, pOffset, "Variants", parseVariant); parseArrayComplex(subtree, tvb, pOffset, "ComplexValues", parseComplexTestType); - parseArrayEnum(subtree, tvb, pOffset, parseEnumeratedTestType); -} - -gint ett_opcua_CompositeTestType = -1; -void parseCompositeTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : CompositeTestType", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CompositeTestType); + parseArrayEnum(subtree, tvb, pOffset, parseEnumeratedTestType); +} + +gint ett_opcua_CompositeTestType = -1; +void parseCompositeTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : CompositeTestType", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CompositeTestType); parseScalarTestType(subtree, tvb, pOffset, "Input1"); - parseArrayTestType(subtree, tvb, pOffset, "Input2"); -} - -gint ett_opcua_RegisteredServer = -1; -void parseRegisteredServer(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : RegisteredServer", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RegisteredServer); + parseArrayTestType(subtree, tvb, pOffset, "Input2"); +} + +gint ett_opcua_RegisteredServer = -1; +void parseRegisteredServer(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : RegisteredServer", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RegisteredServer); 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); -} - -gint ett_opcua_ChannelSecurityToken = -1; -void parseChannelSecurityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ChannelSecurityToken", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ChannelSecurityToken); + parseBoolean(subtree, tvb, pOffset, hf_opcua_IsOnline); +} + +gint ett_opcua_ChannelSecurityToken = -1; +void parseChannelSecurityToken(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ChannelSecurityToken", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ChannelSecurityToken); 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); -} - -gint ett_opcua_SignatureData = -1; -void parseSignatureData(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SignatureData", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SignatureData); + parseInt32(subtree, tvb, pOffset, hf_opcua_RevisedLifetime); +} + +gint ett_opcua_SignatureData = -1; +void parseSignatureData(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SignatureData", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SignatureData); parseString(subtree, tvb, pOffset, hf_opcua_Algorithm); - parseByteString(subtree, tvb, pOffset, hf_opcua_Signature); -} - -gint ett_opcua_AddNodesResult = -1; -void parseAddNodesResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : AddNodesResult", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddNodesResult); + parseByteString(subtree, tvb, pOffset, hf_opcua_Signature); +} + +gint ett_opcua_AddNodesResult = -1; +void parseAddNodesResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : AddNodesResult", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddNodesResult); parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode); - parseNodeId(subtree, tvb, pOffset, "AddedNodeId"); -} - -gint ett_opcua_BrowsePropertiesPropertyResult = -1; -void parseBrowsePropertiesPropertyResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BrowsePropertiesPropertyResult", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowsePropertiesPropertyResult); + parseNodeId(subtree, tvb, pOffset, "AddedNodeId"); +} + +gint ett_opcua_BrowsePropertiesPropertyResult = -1; +void parseBrowsePropertiesPropertyResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BrowsePropertiesPropertyResult", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowsePropertiesPropertyResult); parseQualifiedName(subtree, tvb, pOffset, "PropertyName"); parseLocalizedText(subtree, tvb, pOffset, "PropertyDisplayName"); parseNodeId(subtree, tvb, pOffset, "PropertyNodeId"); - parseStatusCode(subtree, tvb, pOffset, hf_opcua_PropertyStatusCode); -} - -gint ett_opcua_BrowsePropertiesResult = -1; -void parseBrowsePropertiesResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BrowsePropertiesResult", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowsePropertiesResult); + parseStatusCode(subtree, tvb, pOffset, hf_opcua_PropertyStatusCode); +} + +gint ett_opcua_BrowsePropertiesResult = -1; +void parseBrowsePropertiesResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BrowsePropertiesResult", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowsePropertiesResult); parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode); parseArrayComplex(subtree, tvb, pOffset, "PropertyResults", parseBrowsePropertiesPropertyResult); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_ReferenceDescription = -1; -void parseReferenceDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReferenceDescription", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReferenceDescription); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_ReferenceDescription = -1; +void parseReferenceDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReferenceDescription", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReferenceDescription); parseNodeId(subtree, tvb, pOffset, "ReferenceTypeId"); parseBoolean(subtree, tvb, pOffset, hf_opcua_IsForward); @@ -1056,564 +1056,564 @@ void parseReferenceDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, c parseQualifiedName(subtree, tvb, pOffset, "BrowseName"); parseLocalizedText(subtree, tvb, pOffset, "DisplayName"); parseInt32(subtree, tvb, pOffset, hf_opcua_NodeClass); - parseExpandedNodeId(subtree, tvb, pOffset, "TypeDefinition"); -} - -gint ett_opcua_ViewDescription = -1; -void parseViewDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ViewDescription", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ViewDescription); + parseExpandedNodeId(subtree, tvb, pOffset, "TypeDefinition"); +} + +gint ett_opcua_ViewDescription = -1; +void parseViewDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ViewDescription", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ViewDescription); parseNodeId(subtree, tvb, pOffset, "ViewId"); parseDateTime(subtree, tvb, pOffset, hf_opcua_Timestamp); - parseInt32(subtree, tvb, pOffset, hf_opcua_ViewVersion); -} - -gint ett_opcua_BrowsePath = -1; -void parseBrowsePath(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BrowsePath", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowsePath); + parseInt32(subtree, tvb, pOffset, hf_opcua_ViewVersion); +} + +gint ett_opcua_BrowsePath = -1; +void parseBrowsePath(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : BrowsePath", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowsePath); parseNodeId(subtree, tvb, pOffset, "StartingNode"); - parseString(subtree, tvb, pOffset, hf_opcua_RelativePath); -} - -gint ett_opcua_TranslateBrowsePathResult = -1; -void parseTranslateBrowsePathResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : TranslateBrowsePathResult", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TranslateBrowsePathResult); + parseString(subtree, tvb, pOffset, hf_opcua_RelativePath); +} + +gint ett_opcua_TranslateBrowsePathResult = -1; +void parseTranslateBrowsePathResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : TranslateBrowsePathResult", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TranslateBrowsePathResult); parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode); - parseArrayComplex(subtree, tvb, pOffset, "MatchingNodeIds", parseNodeId); -} - -gint ett_opcua_AttributeDescription = -1; -void parseAttributeDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : AttributeDescription", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AttributeDescription); + parseArrayComplex(subtree, tvb, pOffset, "MatchingNodeIds", parseNodeId); +} + +gint ett_opcua_AttributeDescription = -1; +void parseAttributeDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : AttributeDescription", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AttributeDescription); parseString(subtree, tvb, pOffset, hf_opcua_RelativePath); parseUInt32(subtree, tvb, pOffset, hf_opcua_AttributeId); - parseString(subtree, tvb, pOffset, hf_opcua_IndexRange); -} - -gint ett_opcua_NodeTypeDescription = -1; -void parseNodeTypeDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : NodeTypeDescription", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_NodeTypeDescription); + parseString(subtree, tvb, pOffset, hf_opcua_IndexRange); +} + +gint ett_opcua_NodeTypeDescription = -1; +void parseNodeTypeDescription(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : NodeTypeDescription", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_NodeTypeDescription); parseNodeId(subtree, tvb, pOffset, "TypeDefinitionNode"); parseBoolean(subtree, tvb, pOffset, hf_opcua_IncludeSubTypes); - parseArrayComplex(subtree, tvb, pOffset, "AttributesToReturn", parseAttributeDescription); -} - -gint ett_opcua_QueryDataSet = -1; -void parseQueryDataSet(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : QueryDataSet", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryDataSet); + parseArrayComplex(subtree, tvb, pOffset, "AttributesToReturn", parseAttributeDescription); +} + +gint ett_opcua_QueryDataSet = -1; +void parseQueryDataSet(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : QueryDataSet", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryDataSet); parseExpandedNodeId(subtree, tvb, pOffset, "NodeId"); parseNodeId(subtree, tvb, pOffset, "TypeDefinitionNodeId"); - parseArrayComplex(subtree, tvb, pOffset, "Values", parseVariant); -} - -gint ett_opcua_NodeReference = -1; -void parseNodeReference(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : NodeReference", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_NodeReference); + parseArrayComplex(subtree, tvb, pOffset, "Values", parseVariant); +} + +gint ett_opcua_NodeReference = -1; +void parseNodeReference(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : NodeReference", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_NodeReference); parseNodeId(subtree, tvb, pOffset, "NodeId"); parseNodeId(subtree, tvb, pOffset, "ReferenceTypeId"); parseBoolean(subtree, tvb, pOffset, hf_opcua_IsForward); - parseArrayComplex(subtree, tvb, pOffset, "ReferencedNodeIds", parseNodeId); -} - -gint ett_opcua_ContentFilterElement = -1; -void parseContentFilterElement(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ContentFilterElement", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ContentFilterElement); + parseArrayComplex(subtree, tvb, pOffset, "ReferencedNodeIds", parseNodeId); +} + +gint ett_opcua_ContentFilterElement = -1; +void parseContentFilterElement(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ContentFilterElement", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ContentFilterElement); parseFilterOperator(subtree, tvb, pOffset); - parseArrayComplex(subtree, tvb, pOffset, "FilterOperands", parseExtensionObject); -} - -gint ett_opcua_ContentFilter = -1; -void parseContentFilter(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ContentFilter", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ContentFilter); + parseArrayComplex(subtree, tvb, pOffset, "FilterOperands", parseExtensionObject); +} - parseArrayComplex(subtree, tvb, pOffset, "Elements", parseContentFilterElement); -} - -gint ett_opcua_FilterOperand = -1; -void parseFilterOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : FilterOperand", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_FilterOperand); - -} - -gint ett_opcua_ElementOperand = -1; -void parseElementOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ElementOperand", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ElementOperand); +gint ett_opcua_ContentFilter = -1; +void parseContentFilter(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ContentFilter", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ContentFilter); + + parseArrayComplex(subtree, tvb, pOffset, "Elements", parseContentFilterElement); +} + +gint ett_opcua_FilterOperand = -1; +void parseFilterOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : FilterOperand", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_FilterOperand); + +} + +gint ett_opcua_ElementOperand = -1; +void parseElementOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ElementOperand", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ElementOperand); /* parse base class members */ parseFilterOperand(subtree, tvb, pOffset, "[FilterOperand]"); /* parse additional members */ - parseUInt32(subtree, tvb, pOffset, hf_opcua_Index); -} - -gint ett_opcua_LiteralOperand = -1; -void parseLiteralOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : LiteralOperand", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_LiteralOperand); + parseUInt32(subtree, tvb, pOffset, hf_opcua_Index); +} + +gint ett_opcua_LiteralOperand = -1; +void parseLiteralOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : LiteralOperand", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_LiteralOperand); /* parse base class members */ parseFilterOperand(subtree, tvb, pOffset, "[FilterOperand]"); /* parse additional members */ - parseVariant(subtree, tvb, pOffset, "Value"); -} - -gint ett_opcua_AttributeOperand = -1; -void parseAttributeOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : AttributeOperand", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AttributeOperand); + parseVariant(subtree, tvb, pOffset, "Value"); +} + +gint ett_opcua_AttributeOperand = -1; +void parseAttributeOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : AttributeOperand", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AttributeOperand); /* 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); -} - -gint ett_opcua_PropertyOperand = -1; -void parsePropertyOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : PropertyOperand", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_PropertyOperand); + parseString(subtree, tvb, pOffset, hf_opcua_IndexRange); +} + +gint ett_opcua_PropertyOperand = -1; +void parsePropertyOperand(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : PropertyOperand", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_PropertyOperand); /* 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); -} - -gint ett_opcua_ContentFilterResult = -1; -void parseContentFilterResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ContentFilterResult", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ContentFilterResult); + parseString(subtree, tvb, pOffset, hf_opcua_IndexRange); +} + +gint ett_opcua_ContentFilterResult = -1; +void parseContentFilterResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ContentFilterResult", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ContentFilterResult); parseStatusCode(subtree, tvb, pOffset, hf_opcua_Result); parseDiagnosticInfo(subtree, tvb, pOffset, "DiagnosticInfo"); - parseUInt32(subtree, tvb, pOffset, hf_opcua_IndexOfInvalidElement); -} - -gint ett_opcua_QueryResult = -1; -void parseQueryResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : QueryResult", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryResult); + parseUInt32(subtree, tvb, pOffset, hf_opcua_IndexOfInvalidElement); +} + +gint ett_opcua_QueryResult = -1; +void parseQueryResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : QueryResult", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryResult); parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode); parseArraySimple(subtree, tvb, pOffset, hf_opcua_AttributeStatusCodes, parseStatusCode); - parseArrayComplex(subtree, tvb, pOffset, "AttributeDiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_ReadValueId = -1; -void parseReadValueId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReadValueId", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadValueId); + parseArrayComplex(subtree, tvb, pOffset, "AttributeDiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_ReadValueId = -1; +void parseReadValueId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReadValueId", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadValueId); parseNodeId(subtree, tvb, pOffset, "NodeId"); parseUInt32(subtree, tvb, pOffset, hf_opcua_AttributeId); parseString(subtree, tvb, pOffset, hf_opcua_IndexRange); - parseQualifiedName(subtree, tvb, pOffset, "Encoding"); -} - -gint ett_opcua_HistoryReadValueId = -1; -void parseHistoryReadValueId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : HistoryReadValueId", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryReadValueId); + parseQualifiedName(subtree, tvb, pOffset, "Encoding"); +} + +gint ett_opcua_HistoryReadValueId = -1; +void parseHistoryReadValueId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : HistoryReadValueId", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryReadValueId); parseNodeId(subtree, tvb, pOffset, "NodeId"); parseQualifiedName(subtree, tvb, pOffset, "Encoding"); - parseByteString(subtree, tvb, pOffset, hf_opcua_ContinuationPoint); -} - -gint ett_opcua_HistoryReadResult = -1; -void parseHistoryReadResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : HistoryReadResult", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryReadResult); + parseByteString(subtree, tvb, pOffset, hf_opcua_ContinuationPoint); +} + +gint ett_opcua_HistoryReadResult = -1; +void parseHistoryReadResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : HistoryReadResult", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryReadResult); parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode); parseByteString(subtree, tvb, pOffset, hf_opcua_ContinuationPoint); - parseExtensionObject(subtree, tvb, pOffset, "HistoryData"); -} - -gint ett_opcua_MonitoringFilter = -1; -void parseMonitoringFilter(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoringFilter", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoringFilter); - -} - -gint ett_opcua_EventFilter = -1; -void parseEventFilter(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EventFilter", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EventFilter); + parseExtensionObject(subtree, tvb, pOffset, "HistoryData"); +} + +gint ett_opcua_MonitoringFilter = -1; +void parseMonitoringFilter(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoringFilter", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoringFilter); + +} + +gint ett_opcua_EventFilter = -1; +void parseEventFilter(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EventFilter", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EventFilter); /* parse base class members */ parseMonitoringFilter(subtree, tvb, pOffset, "[MonitoringFilter]"); /* parse additional members */ parseArrayComplex(subtree, tvb, pOffset, "SelectClauses", parseNodeId); - parseContentFilter(subtree, tvb, pOffset, "WhereClause"); -} - -gint ett_opcua_ReadEventDetails = -1; -void parseReadEventDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReadEventDetails", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadEventDetails); + parseContentFilter(subtree, tvb, pOffset, "WhereClause"); +} + +gint ett_opcua_ReadEventDetails = -1; +void parseReadEventDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReadEventDetails", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadEventDetails); 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"); -} - -gint ett_opcua_ReadRawModifiedDetails = -1; -void parseReadRawModifiedDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReadRawModifiedDetails", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadRawModifiedDetails); + parseEventFilter(subtree, tvb, pOffset, "Filter"); +} + +gint ett_opcua_ReadRawModifiedDetails = -1; +void parseReadRawModifiedDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReadRawModifiedDetails", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadRawModifiedDetails); 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); -} - -gint ett_opcua_ReadProcessedDetails = -1; -void parseReadProcessedDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReadProcessedDetails", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadProcessedDetails); + parseBoolean(subtree, tvb, pOffset, hf_opcua_ReturnBounds); +} + +gint ett_opcua_ReadProcessedDetails = -1; +void parseReadProcessedDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReadProcessedDetails", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadProcessedDetails); 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"); -} - -gint ett_opcua_ReadAtTimeDetails = -1; -void parseReadAtTimeDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReadAtTimeDetails", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadAtTimeDetails); + parseNodeId(subtree, tvb, pOffset, "AggregateType"); +} - parseArraySimple(subtree, tvb, pOffset, hf_opcua_ReqTimes, parseDateTime); -} - -gint ett_opcua_HistoryData = -1; -void parseHistoryData(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : HistoryData", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryData); +gint ett_opcua_ReadAtTimeDetails = -1; +void parseReadAtTimeDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : ReadAtTimeDetails", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadAtTimeDetails); - parseArrayComplex(subtree, tvb, pOffset, "DataValues", parseDataValue); -} - -gint ett_opcua_EventFieldList = -1; -void parseEventFieldList(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EventFieldList", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EventFieldList); + parseArraySimple(subtree, tvb, pOffset, hf_opcua_ReqTimes, parseDateTime); +} + +gint ett_opcua_HistoryData = -1; +void parseHistoryData(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : HistoryData", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryData); + + parseArrayComplex(subtree, tvb, pOffset, "DataValues", parseDataValue); +} + +gint ett_opcua_EventFieldList = -1; +void parseEventFieldList(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EventFieldList", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EventFieldList); parseUInt32(subtree, tvb, pOffset, hf_opcua_ClientHandle); - parseArrayComplex(subtree, tvb, pOffset, "EventFields", parseVariant); -} - -gint ett_opcua_EventNotification = -1; -void parseEventNotification(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EventNotification", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EventNotification); + parseArrayComplex(subtree, tvb, pOffset, "EventFields", parseVariant); +} - parseArrayComplex(subtree, tvb, pOffset, "Events", parseEventFieldList); -} - -gint ett_opcua_HistoryEvent = -1; -void parseHistoryEvent(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : HistoryEvent", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryEvent); +gint ett_opcua_EventNotification = -1; +void parseEventNotification(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EventNotification", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EventNotification); - parseArrayComplex(subtree, tvb, pOffset, "Notifications", parseEventNotification); -} - -gint ett_opcua_WriteValue = -1; -void parseWriteValue(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : WriteValue", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_WriteValue); + parseArrayComplex(subtree, tvb, pOffset, "Events", parseEventFieldList); +} + +gint ett_opcua_HistoryEvent = -1; +void parseHistoryEvent(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : HistoryEvent", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryEvent); + + parseArrayComplex(subtree, tvb, pOffset, "Notifications", parseEventNotification); +} + +gint ett_opcua_WriteValue = -1; +void parseWriteValue(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : WriteValue", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_WriteValue); parseNodeId(subtree, tvb, pOffset, "NodeId"); parseUInt32(subtree, tvb, pOffset, hf_opcua_AttributeId); parseString(subtree, tvb, pOffset, hf_opcua_IndexRange); - parseDataValue(subtree, tvb, pOffset, "Value"); -} - -gint ett_opcua_InsertReplaceDetails = -1; -void parseInsertReplaceDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : InsertReplaceDetails", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_InsertReplaceDetails); + parseDataValue(subtree, tvb, pOffset, "Value"); +} + +gint ett_opcua_InsertReplaceDetails = -1; +void parseInsertReplaceDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : InsertReplaceDetails", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_InsertReplaceDetails); parseBoolean(subtree, tvb, pOffset, hf_opcua_PerformInsert); parseBoolean(subtree, tvb, pOffset, hf_opcua_PerformReplace); parseNodeId(subtree, tvb, pOffset, "NodeId"); - parseHistoryData(subtree, tvb, pOffset, "UpdateValue"); -} - -gint ett_opcua_InsertEventDetails = -1; -void parseInsertEventDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : InsertEventDetails", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_InsertEventDetails); + parseHistoryData(subtree, tvb, pOffset, "UpdateValue"); +} - parseHistoryEvent(subtree, tvb, pOffset, "HistoryEvent"); -} - -gint ett_opcua_DeleteRawModifiedDetails = -1; -void parseDeleteRawModifiedDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DeleteRawModifiedDetails", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteRawModifiedDetails); +gint ett_opcua_InsertEventDetails = -1; +void parseInsertEventDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : InsertEventDetails", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_InsertEventDetails); + + parseHistoryEvent(subtree, tvb, pOffset, "HistoryEvent"); +} + +gint ett_opcua_DeleteRawModifiedDetails = -1; +void parseDeleteRawModifiedDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DeleteRawModifiedDetails", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteRawModifiedDetails); 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); -} - -gint ett_opcua_DeleteAtTimeDetails = -1; -void parseDeleteAtTimeDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DeleteAtTimeDetails", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteAtTimeDetails); + parseDateTime(subtree, tvb, pOffset, hf_opcua_EndTime); +} + +gint ett_opcua_DeleteAtTimeDetails = -1; +void parseDeleteAtTimeDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DeleteAtTimeDetails", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteAtTimeDetails); parseNodeId(subtree, tvb, pOffset, "NodeId"); - parseArraySimple(subtree, tvb, pOffset, hf_opcua_ReqTimes, parseDateTime); -} - -gint ett_opcua_DeleteEventDetails = -1; -void parseDeleteEventDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DeleteEventDetails", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteEventDetails); + parseArraySimple(subtree, tvb, pOffset, hf_opcua_ReqTimes, parseDateTime); +} + +gint ett_opcua_DeleteEventDetails = -1; +void parseDeleteEventDetails(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DeleteEventDetails", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteEventDetails); parseEventFilter(subtree, tvb, pOffset, "EventFilter"); parseDateTime(subtree, tvb, pOffset, hf_opcua_StartTime); - parseDateTime(subtree, tvb, pOffset, hf_opcua_EndTime); -} - -gint ett_opcua_HistoryUpdateResult = -1; -void parseHistoryUpdateResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : HistoryUpdateResult", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryUpdateResult); + parseDateTime(subtree, tvb, pOffset, hf_opcua_EndTime); +} + +gint ett_opcua_HistoryUpdateResult = -1; +void parseHistoryUpdateResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : HistoryUpdateResult", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryUpdateResult); parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode); parseArraySimple(subtree, tvb, pOffset, hf_opcua_OperationResult, parseStatusCode); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_CallRequestItem = -1; -void parseCallRequestItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : CallRequestItem", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CallRequestItem); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_CallRequestItem = -1; +void parseCallRequestItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : CallRequestItem", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CallRequestItem); parseNodeId(subtree, tvb, pOffset, "ObjectId"); parseNodeId(subtree, tvb, pOffset, "MethodId"); - parseArrayComplex(subtree, tvb, pOffset, "InputArguments", parseVariant); -} - -gint ett_opcua_CallResultItem = -1; -void parseCallResultItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : CallResultItem", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CallResultItem); + parseArrayComplex(subtree, tvb, pOffset, "InputArguments", parseVariant); +} + +gint ett_opcua_CallResultItem = -1; +void parseCallResultItem(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : CallResultItem", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CallResultItem); 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); -} - -gint ett_opcua_DataChangeFilter = -1; -void parseDataChangeFilter(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DataChangeFilter", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DataChangeFilter); + parseArrayComplex(subtree, tvb, pOffset, "OutputArguments", parseVariant); +} + +gint ett_opcua_DataChangeFilter = -1; +void parseDataChangeFilter(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DataChangeFilter", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DataChangeFilter); /* 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); -} - -gint ett_opcua_MonitoringFilterResult = -1; -void parseMonitoringFilterResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoringFilterResult", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoringFilterResult); - -} - -gint ett_opcua_EventFilterResult = -1; -void parseEventFilterResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EventFilterResult", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EventFilterResult); + parseDouble(subtree, tvb, pOffset, hf_opcua_DeadbandValue); +} + +gint ett_opcua_MonitoringFilterResult = -1; +void parseMonitoringFilterResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoringFilterResult", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoringFilterResult); + +} + +gint ett_opcua_EventFilterResult = -1; +void parseEventFilterResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : EventFilterResult", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_EventFilterResult); /* 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"); -} - -gint ett_opcua_MonitoringAttributes = -1; -void parseMonitoringAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoringAttributes", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoringAttributes); + parseContentFilterResult(subtree, tvb, pOffset, "WhereClauseResult"); +} + +gint ett_opcua_MonitoringAttributes = -1; +void parseMonitoringAttributes(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoringAttributes", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoringAttributes); 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); -} - -gint ett_opcua_MonitoredItemCreateRequest = -1; -void parseMonitoredItemCreateRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoredItemCreateRequest", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoredItemCreateRequest); + parseBoolean(subtree, tvb, pOffset, hf_opcua_DiscardOldest); +} + +gint ett_opcua_MonitoredItemCreateRequest = -1; +void parseMonitoredItemCreateRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoredItemCreateRequest", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoredItemCreateRequest); parseReadValueId(subtree, tvb, pOffset, "ItemToMonitor"); parseMonitoringMode(subtree, tvb, pOffset); - parseMonitoringAttributes(subtree, tvb, pOffset, "RequestedAttributes"); -} - -gint ett_opcua_MonitoredItemCreateResult = -1; -void parseMonitoredItemCreateResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoredItemCreateResult", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoredItemCreateResult); + parseMonitoringAttributes(subtree, tvb, pOffset, "RequestedAttributes"); +} + +gint ett_opcua_MonitoredItemCreateResult = -1; +void parseMonitoredItemCreateResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoredItemCreateResult", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoredItemCreateResult); 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"); -} - -gint ett_opcua_MonitoredItemModifyRequest = -1; -void parseMonitoredItemModifyRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoredItemModifyRequest", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoredItemModifyRequest); + parseExtensionObject(subtree, tvb, pOffset, "FilterResult"); +} + +gint ett_opcua_MonitoredItemModifyRequest = -1; +void parseMonitoredItemModifyRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoredItemModifyRequest", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoredItemModifyRequest); parseUInt32(subtree, tvb, pOffset, hf_opcua_MonitorItemId); - parseMonitoringAttributes(subtree, tvb, pOffset, "RequestedAttributes"); -} - -gint ett_opcua_MonitoredItemModifyResult = -1; -void parseMonitoredItemModifyResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoredItemModifyResult", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoredItemModifyResult); + parseMonitoringAttributes(subtree, tvb, pOffset, "RequestedAttributes"); +} + +gint ett_opcua_MonitoredItemModifyResult = -1; +void parseMonitoredItemModifyResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoredItemModifyResult", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoredItemModifyResult); 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"); -} - -gint ett_opcua_SubscriptionAcknowledgement = -1; -void parseSubscriptionAcknowledgement(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SubscriptionAcknowledgement", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SubscriptionAcknowledgement); + parseExtensionObject(subtree, tvb, pOffset, "FilterResult"); +} + +gint ett_opcua_SubscriptionAcknowledgement = -1; +void parseSubscriptionAcknowledgement(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : SubscriptionAcknowledgement", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SubscriptionAcknowledgement); parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId); - parseUInt32(subtree, tvb, pOffset, hf_opcua_SequenceNumber); -} - -gint ett_opcua_NotificationMessage = -1; -void parseNotificationMessage(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : NotificationMessage", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_NotificationMessage); + parseUInt32(subtree, tvb, pOffset, hf_opcua_SequenceNumber); +} + +gint ett_opcua_NotificationMessage = -1; +void parseNotificationMessage(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : NotificationMessage", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_NotificationMessage); parseUInt32(subtree, tvb, pOffset, hf_opcua_SequenceNumber); parseDateTime(subtree, tvb, pOffset, hf_opcua_PublishTime); - parseArrayComplex(subtree, tvb, pOffset, "NotificationData", parseExtensionObject); -} - -gint ett_opcua_MonitoredItemNotification = -1; -void parseMonitoredItemNotification(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoredItemNotification", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoredItemNotification); + parseArrayComplex(subtree, tvb, pOffset, "NotificationData", parseExtensionObject); +} + +gint ett_opcua_MonitoredItemNotification = -1; +void parseMonitoredItemNotification(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : MonitoredItemNotification", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_MonitoredItemNotification); parseUInt32(subtree, tvb, pOffset, hf_opcua_ClientHandle); - parseDataValue(subtree, tvb, pOffset, "Value"); -} - -gint ett_opcua_DataChangeNotification = -1; -void parseDataChangeNotification(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DataChangeNotification", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DataChangeNotification); + parseDataValue(subtree, tvb, pOffset, "Value"); +} + +gint ett_opcua_DataChangeNotification = -1; +void parseDataChangeNotification(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : DataChangeNotification", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DataChangeNotification); parseArrayComplex(subtree, tvb, pOffset, "MonitoredItems", parseMonitoredItemNotification); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_TransferResult = -1; -void parseTransferResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : TransferResult", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TransferResult); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_TransferResult = -1; +void parseTransferResult(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s : TransferResult", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TransferResult); parseStatusCode(subtree, tvb, pOffset, hf_opcua_StatusCode); - parseArraySimple(subtree, tvb, pOffset, hf_opcua_AvailableSequenceNumbersRanges, parseString); -} + parseArraySimple(subtree, tvb, pOffset, hf_opcua_AvailableSequenceNumbersRanges, parseString); +} /** Setup protocol subtree array */ static gint *ett[] = diff --git a/plugins/opcua/opcua_enumparser.c b/plugins/opcua/opcua_enumparser.c index 757d461157..5f161adc8b 100644 --- a/plugins/opcua/opcua_enumparser.c +++ b/plugins/opcua/opcua_enumparser.c @@ -30,8 +30,8 @@ #include "opcua_enumparser.h" - -/** NodeClass enum table */ + +/** NodeClass enum table */ static const value_string g_NodeClassTable[] = { { 0, "Node" }, { 1, "Object" }, @@ -41,118 +41,118 @@ static const value_string g_NodeClassTable[] = { { 16, "VariableType" }, { 32, "ReferenceType" }, { 64, "DataType" }, - { 128, "View" }, - { 0, NULL } -}; -static int hf_opcua_NodeClass = -1; - -void parseNodeClass(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_NodeClass, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** IdType enum table */ + { 128, "View" }, + { 0, NULL } +}; +static int hf_opcua_NodeClass = -1; + +void parseNodeClass(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_NodeClass, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** IdType enum table */ static const value_string g_IdTypeTable[] = { { 0, "Numeric" }, { 1, "String" }, { 2, "Uri" }, { 3, "Guid" }, - { 4, "Opaque" }, - { 0, NULL } -}; -static int hf_opcua_IdType = -1; - -void parseIdType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_IdType, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** MessageSecurityMode enum table */ + { 4, "Opaque" }, + { 0, NULL } +}; +static int hf_opcua_IdType = -1; + +void parseIdType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_IdType, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** MessageSecurityMode enum table */ static const value_string g_MessageSecurityModeTable[] = { { 0, "None" }, { 1, "Sign" }, - { 2, "SignAndEncrypt" }, - { 0, NULL } -}; -static int hf_opcua_MessageSecurityMode = -1; - -void parseMessageSecurityMode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_MessageSecurityMode, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** UserTokenType enum table */ + { 2, "SignAndEncrypt" }, + { 0, NULL } +}; +static int hf_opcua_MessageSecurityMode = -1; + +void parseMessageSecurityMode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_MessageSecurityMode, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** UserTokenType enum table */ static const value_string g_UserTokenTypeTable[] = { { 0, "Default" }, { 1, "UserName" }, { 2, "Certificate" }, - { 3, "IssuedToken" }, - { 0, NULL } -}; -static int hf_opcua_UserTokenType = -1; - -void parseUserTokenType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_UserTokenType, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** ServerDescriptionType enum table */ + { 3, "IssuedToken" }, + { 0, NULL } +}; +static int hf_opcua_UserTokenType = -1; + +void parseUserTokenType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_UserTokenType, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** ServerDescriptionType enum table */ static const value_string g_ServerDescriptionTypeTable[] = { { 0, "Standard" }, - { 1, "Discovery" }, - { 0, NULL } -}; -static int hf_opcua_ServerDescriptionType = -1; - -void parseServerDescriptionType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_ServerDescriptionType, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** SecurityTokenRequestType enum table */ + { 1, "Discovery" }, + { 0, NULL } +}; +static int hf_opcua_ServerDescriptionType = -1; + +void parseServerDescriptionType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_ServerDescriptionType, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** SecurityTokenRequestType enum table */ static const value_string g_SecurityTokenRequestTypeTable[] = { { 0, "Issue" }, - { 1, "Renew" }, - { 0, NULL } -}; -static int hf_opcua_SecurityTokenRequestType = -1; - -void parseSecurityTokenRequestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_SecurityTokenRequestType, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** ComplianceLevel enum table */ + { 1, "Renew" }, + { 0, NULL } +}; +static int hf_opcua_SecurityTokenRequestType = -1; + +void parseSecurityTokenRequestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_SecurityTokenRequestType, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** ComplianceLevel enum table */ static const value_string g_ComplianceLevelTable[] = { { 0, "Untested" }, { 1, "Partial" }, { 2, "SelfTested" }, - { 3, "Certified" }, - { 0, NULL } -}; -static int hf_opcua_ComplianceLevel = -1; - -void parseComplianceLevel(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_ComplianceLevel, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** RedundancySupport enum table */ + { 3, "Certified" }, + { 0, NULL } +}; +static int hf_opcua_ComplianceLevel = -1; + +void parseComplianceLevel(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_ComplianceLevel, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** RedundancySupport enum table */ static const value_string g_RedundancySupportTable[] = { { 1, "None" }, { 2, "Cold" }, { 3, "Warm" }, - { 4, "Hot" }, - { 0, NULL } -}; -static int hf_opcua_RedundancySupport = -1; - -void parseRedundancySupport(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_RedundancySupport, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** ServerState enum table */ + { 4, "Hot" }, + { 0, NULL } +}; +static int hf_opcua_RedundancySupport = -1; + +void parseRedundancySupport(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_RedundancySupport, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** ServerState enum table */ static const value_string g_ServerStateTable[] = { { 1, "Running" }, { 2, "Failed" }, @@ -161,31 +161,31 @@ static const value_string g_ServerStateTable[] = { { 5, "Shutdown" }, { 6, "Test" }, { 7, "CommunicationFault" }, - { 8, "Unknown" }, - { 0, NULL } -}; -static int hf_opcua_ServerState = -1; - -void parseServerState(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_ServerState, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** ExceptionDeviationType enum table */ + { 8, "Unknown" }, + { 0, NULL } +}; +static int hf_opcua_ServerState = -1; + +void parseServerState(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_ServerState, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** ExceptionDeviationType enum table */ static const value_string g_ExceptionDeviationTypeTable[] = { { 1, "AbsoluteValue" }, { 2, "PercentOfRange" }, - { 3, "PercentOfValue" }, - { 0, NULL } -}; -static int hf_opcua_ExceptionDeviationType = -1; - -void parseExceptionDeviationType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_ExceptionDeviationType, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** ColorsDataType enum table */ + { 3, "PercentOfValue" }, + { 0, NULL } +}; +static int hf_opcua_ExceptionDeviationType = -1; + +void parseExceptionDeviationType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_ExceptionDeviationType, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** ColorsDataType enum table */ static const value_string g_ColorsDataTypeTable[] = { { 1, "Red" }, { 2, "Orange" }, @@ -193,17 +193,17 @@ static const value_string g_ColorsDataTypeTable[] = { { 4, "Green" }, { 5, "Blue" }, { 6, "DarkBlue" }, - { 7, "Violet" }, - { 0, NULL } -}; -static int hf_opcua_ColorsDataType = -1; - -void parseColorsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_ColorsDataType, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** DiagnosticsMasks enum table */ + { 7, "Violet" }, + { 0, NULL } +}; +static int hf_opcua_ColorsDataType = -1; + +void parseColorsDataType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_ColorsDataType, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** DiagnosticsMasks enum table */ static const value_string g_DiagnosticsMasksTable[] = { { 1, "ServiceSymbolicId" }, { 2, "ServiceLocalizedText" }, @@ -228,45 +228,45 @@ static const value_string g_DiagnosticsMasksTable[] = { { 528, "InnerDiagnostics" }, { 99, "SymbolicIdAndText" }, { 239, "NoInnerStatus" }, - { 1023, "All" }, - { 0, NULL } -}; -static int hf_opcua_DiagnosticsMasks = -1; - -void parseDiagnosticsMasks(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_DiagnosticsMasks, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** EnumeratedTestType enum table */ + { 1023, "All" }, + { 0, NULL } +}; +static int hf_opcua_DiagnosticsMasks = -1; + +void parseDiagnosticsMasks(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_DiagnosticsMasks, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** EnumeratedTestType enum table */ static const value_string g_EnumeratedTestTypeTable[] = { { 1, "Red" }, { 4, "Yellow" }, - { 5, "Green" }, - { 0, NULL } -}; -static int hf_opcua_EnumeratedTestType = -1; - -void parseEnumeratedTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_EnumeratedTestType, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** BrowseDirection enum table */ + { 5, "Green" }, + { 0, NULL } +}; +static int hf_opcua_EnumeratedTestType = -1; + +void parseEnumeratedTestType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_EnumeratedTestType, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** BrowseDirection enum table */ static const value_string g_BrowseDirectionTable[] = { { 1, "Forward" }, { 2, "Inverse" }, - { 3, "Both" }, - { 0, NULL } -}; -static int hf_opcua_BrowseDirection = -1; - -void parseBrowseDirection(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_BrowseDirection, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** FilterOperator enum table */ + { 3, "Both" }, + { 0, NULL } +}; +static int hf_opcua_BrowseDirection = -1; + +void parseBrowseDirection(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_BrowseDirection, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** FilterOperator enum table */ static const value_string g_FilterOperatorTable[] = { { 1, "Equals" }, { 2, "IsNull" }, @@ -282,132 +282,132 @@ static const value_string g_FilterOperatorTable[] = { { 12, "Or" }, { 13, "InView" }, { 14, "OfType" }, - { 15, "RelatedTo" }, - { 0, NULL } -}; -static int hf_opcua_FilterOperator = -1; - -void parseFilterOperator(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_FilterOperator, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** TimestampsToReturn enum table */ + { 15, "RelatedTo" }, + { 0, NULL } +}; +static int hf_opcua_FilterOperator = -1; + +void parseFilterOperator(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_FilterOperator, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** TimestampsToReturn enum table */ static const value_string g_TimestampsToReturnTable[] = { { 1, "Source" }, { 2, "Server" }, { 3, "Both" }, - { 4, "Neither" }, - { 0, NULL } -}; -static int hf_opcua_TimestampsToReturn = -1; - -void parseTimestampsToReturn(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_TimestampsToReturn, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** MonitoringMode enum table */ + { 4, "Neither" }, + { 0, NULL } +}; +static int hf_opcua_TimestampsToReturn = -1; + +void parseTimestampsToReturn(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_TimestampsToReturn, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** MonitoringMode enum table */ static const value_string g_MonitoringModeTable[] = { { 0, "Disabled" }, { 1, "Sampling" }, - { 2, "Reporting" }, - { 0, NULL } -}; -static int hf_opcua_MonitoringMode = -1; - -void parseMonitoringMode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_MonitoringMode, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** DataChangeTrigger enum table */ + { 2, "Reporting" }, + { 0, NULL } +}; +static int hf_opcua_MonitoringMode = -1; + +void parseMonitoringMode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_MonitoringMode, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** DataChangeTrigger enum table */ static const value_string g_DataChangeTriggerTable[] = { { 0, "Status" }, { 1, "StatusValue" }, - { 2, "StatusValueTimestamp" }, - { 0, NULL } -}; -static int hf_opcua_DataChangeTrigger = -1; - -void parseDataChangeTrigger(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_DataChangeTrigger, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -/** DeadbandType enum table */ + { 2, "StatusValueTimestamp" }, + { 0, NULL } +}; +static int hf_opcua_DataChangeTrigger = -1; + +void parseDataChangeTrigger(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_DataChangeTrigger, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +/** DeadbandType enum table */ static const value_string g_DeadbandTypeTable[] = { { 0, "None" }, { 1, "Absolute" }, - { 2, "Percentage" }, - { 0, NULL } -}; -static int hf_opcua_DeadbandType = -1; - -void parseDeadbandType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_tree_add_item(tree, hf_opcua_DeadbandType, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} + { 2, "Percentage" }, + { 0, NULL } +}; +static int hf_opcua_DeadbandType = -1; + +void parseDeadbandType(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_tree_add_item(tree, hf_opcua_DeadbandType, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} /** header field definitions */ static hf_register_info hf[] = -{ - { &hf_opcua_NodeClass, - { "NodeClass", "", FT_UINT32, BASE_HEX, VALS(g_NodeClassTable), 0x0, "", HFILL } - }, - { &hf_opcua_IdType, - { "IdType", "", FT_UINT32, BASE_HEX, VALS(g_IdTypeTable), 0x0, "", HFILL } - }, - { &hf_opcua_MessageSecurityMode, - { "MessageSecurityMode", "", FT_UINT32, BASE_HEX, VALS(g_MessageSecurityModeTable), 0x0, "", HFILL } - }, - { &hf_opcua_UserTokenType, - { "UserTokenType", "", FT_UINT32, BASE_HEX, VALS(g_UserTokenTypeTable), 0x0, "", HFILL } - }, - { &hf_opcua_ServerDescriptionType, - { "ServerDescriptionType", "", FT_UINT32, BASE_HEX, VALS(g_ServerDescriptionTypeTable), 0x0, "", HFILL } - }, - { &hf_opcua_SecurityTokenRequestType, - { "SecurityTokenRequestType", "", FT_UINT32, BASE_HEX, VALS(g_SecurityTokenRequestTypeTable), 0x0, "", HFILL } - }, - { &hf_opcua_ComplianceLevel, - { "ComplianceLevel", "", FT_UINT32, BASE_HEX, VALS(g_ComplianceLevelTable), 0x0, "", HFILL } - }, - { &hf_opcua_RedundancySupport, - { "RedundancySupport", "", FT_UINT32, BASE_HEX, VALS(g_RedundancySupportTable), 0x0, "", HFILL } - }, - { &hf_opcua_ServerState, - { "ServerState", "", FT_UINT32, BASE_HEX, VALS(g_ServerStateTable), 0x0, "", HFILL } - }, - { &hf_opcua_ExceptionDeviationType, - { "ExceptionDeviationType", "", FT_UINT32, BASE_HEX, VALS(g_ExceptionDeviationTypeTable), 0x0, "", HFILL } - }, - { &hf_opcua_ColorsDataType, - { "ColorsDataType", "", FT_UINT32, BASE_HEX, VALS(g_ColorsDataTypeTable), 0x0, "", HFILL } - }, - { &hf_opcua_DiagnosticsMasks, - { "DiagnosticsMasks", "", FT_UINT32, BASE_HEX, VALS(g_DiagnosticsMasksTable), 0x0, "", HFILL } - }, - { &hf_opcua_EnumeratedTestType, - { "EnumeratedTestType", "", FT_UINT32, BASE_HEX, VALS(g_EnumeratedTestTypeTable), 0x0, "", HFILL } - }, - { &hf_opcua_BrowseDirection, - { "BrowseDirection", "", FT_UINT32, BASE_HEX, VALS(g_BrowseDirectionTable), 0x0, "", HFILL } - }, - { &hf_opcua_FilterOperator, - { "FilterOperator", "", FT_UINT32, BASE_HEX, VALS(g_FilterOperatorTable), 0x0, "", HFILL } - }, - { &hf_opcua_TimestampsToReturn, - { "TimestampsToReturn", "", FT_UINT32, BASE_HEX, VALS(g_TimestampsToReturnTable), 0x0, "", HFILL } - }, - { &hf_opcua_MonitoringMode, - { "MonitoringMode", "", FT_UINT32, BASE_HEX, VALS(g_MonitoringModeTable), 0x0, "", HFILL } - }, - { &hf_opcua_DataChangeTrigger, - { "DataChangeTrigger", "", FT_UINT32, BASE_HEX, VALS(g_DataChangeTriggerTable), 0x0, "", HFILL } - }, - { &hf_opcua_DeadbandType, - { "DeadbandType", "", FT_UINT32, BASE_HEX, VALS(g_DeadbandTypeTable), 0x0, "", HFILL } +{ + { &hf_opcua_NodeClass, + { "NodeClass", "", FT_UINT32, BASE_HEX, VALS(g_NodeClassTable), 0x0, "", HFILL } + }, + { &hf_opcua_IdType, + { "IdType", "", FT_UINT32, BASE_HEX, VALS(g_IdTypeTable), 0x0, "", HFILL } + }, + { &hf_opcua_MessageSecurityMode, + { "MessageSecurityMode", "", FT_UINT32, BASE_HEX, VALS(g_MessageSecurityModeTable), 0x0, "", HFILL } + }, + { &hf_opcua_UserTokenType, + { "UserTokenType", "", FT_UINT32, BASE_HEX, VALS(g_UserTokenTypeTable), 0x0, "", HFILL } + }, + { &hf_opcua_ServerDescriptionType, + { "ServerDescriptionType", "", FT_UINT32, BASE_HEX, VALS(g_ServerDescriptionTypeTable), 0x0, "", HFILL } + }, + { &hf_opcua_SecurityTokenRequestType, + { "SecurityTokenRequestType", "", FT_UINT32, BASE_HEX, VALS(g_SecurityTokenRequestTypeTable), 0x0, "", HFILL } + }, + { &hf_opcua_ComplianceLevel, + { "ComplianceLevel", "", FT_UINT32, BASE_HEX, VALS(g_ComplianceLevelTable), 0x0, "", HFILL } + }, + { &hf_opcua_RedundancySupport, + { "RedundancySupport", "", FT_UINT32, BASE_HEX, VALS(g_RedundancySupportTable), 0x0, "", HFILL } + }, + { &hf_opcua_ServerState, + { "ServerState", "", FT_UINT32, BASE_HEX, VALS(g_ServerStateTable), 0x0, "", HFILL } + }, + { &hf_opcua_ExceptionDeviationType, + { "ExceptionDeviationType", "", FT_UINT32, BASE_HEX, VALS(g_ExceptionDeviationTypeTable), 0x0, "", HFILL } + }, + { &hf_opcua_ColorsDataType, + { "ColorsDataType", "", FT_UINT32, BASE_HEX, VALS(g_ColorsDataTypeTable), 0x0, "", HFILL } + }, + { &hf_opcua_DiagnosticsMasks, + { "DiagnosticsMasks", "", FT_UINT32, BASE_HEX, VALS(g_DiagnosticsMasksTable), 0x0, "", HFILL } + }, + { &hf_opcua_EnumeratedTestType, + { "EnumeratedTestType", "", FT_UINT32, BASE_HEX, VALS(g_EnumeratedTestTypeTable), 0x0, "", HFILL } + }, + { &hf_opcua_BrowseDirection, + { "BrowseDirection", "", FT_UINT32, BASE_HEX, VALS(g_BrowseDirectionTable), 0x0, "", HFILL } + }, + { &hf_opcua_FilterOperator, + { "FilterOperator", "", FT_UINT32, BASE_HEX, VALS(g_FilterOperatorTable), 0x0, "", HFILL } + }, + { &hf_opcua_TimestampsToReturn, + { "TimestampsToReturn", "", FT_UINT32, BASE_HEX, VALS(g_TimestampsToReturnTable), 0x0, "", HFILL } + }, + { &hf_opcua_MonitoringMode, + { "MonitoringMode", "", FT_UINT32, BASE_HEX, VALS(g_MonitoringModeTable), 0x0, "", HFILL } + }, + { &hf_opcua_DataChangeTrigger, + { "DataChangeTrigger", "", FT_UINT32, BASE_HEX, VALS(g_DataChangeTriggerTable), 0x0, "", HFILL } + }, + { &hf_opcua_DeadbandType, + { "DeadbandType", "", FT_UINT32, BASE_HEX, VALS(g_DeadbandTypeTable), 0x0, "", HFILL } } }; diff --git a/plugins/opcua/opcua_hfindeces.c b/plugins/opcua/opcua_hfindeces.c index 860cd42cc9..82055640f0 100644 --- a/plugins/opcua/opcua_hfindeces.c +++ b/plugins/opcua/opcua_hfindeces.c @@ -1,32 +1,32 @@ -/****************************************************************************** -** $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: This file contains protocol field information. -** -** 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 -#include +/****************************************************************************** +** $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: This file contains protocol field information. +** +** 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 +#include int hf_opcua_TestId = -1; int hf_opcua_Iteration = -1; @@ -301,11 +301,11 @@ 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; - -/** header field definitions */ -static hf_register_info hf[] = -{ +int hf_opcua_AvailableSequenceNumbersRanges = -1; + +/** header field definitions */ +static hf_register_info hf[] = +{ { &hf_opcua_TestId, { "TestId", "", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } }, { &hf_opcua_Iteration, { "Iteration", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } }, @@ -580,11 +580,11 @@ static hf_register_info hf[] = { &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 } } -}; - -/** Register field types. */ -void registerFieldTypes(int proto) -{ - proto_register_field_array(proto, hf, array_length(hf)); -} + { &hf_opcua_AvailableSequenceNumbersRanges, { "AvailableSequenceNumbersRanges", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } } +}; + +/** Register field types. */ +void registerFieldTypes(int proto) +{ + proto_register_field_array(proto, hf, array_length(hf)); +} diff --git a/plugins/opcua/opcua_hfindeces.h b/plugins/opcua/opcua_hfindeces.h index 74f276c166..aec6f06088 100644 --- a/plugins/opcua/opcua_hfindeces.h +++ b/plugins/opcua/opcua_hfindeces.h @@ -1,32 +1,32 @@ -/****************************************************************************** -** $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: This file contains protocol field handles. -** -** 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 -#include +/****************************************************************************** +** $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: This file contains protocol field handles. +** +** 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 +#include extern int hf_opcua_TestId; extern int hf_opcua_Iteration; @@ -301,7 +301,7 @@ 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; - -/** Register field types. */ -void registerFieldTypes(int proto); +extern int hf_opcua_AvailableSequenceNumbersRanges; + +/** Register field types. */ +void registerFieldTypes(int proto); diff --git a/plugins/opcua/opcua_identifiers.h b/plugins/opcua/opcua_identifiers.h index d5fd508ede..67569810b5 100644 --- a/plugins/opcua/opcua_identifiers.h +++ b/plugins/opcua/opcua_identifiers.h @@ -1,44 +1,44 @@ -/****************************************************************************** -** $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: Parser type definitions. -** -** 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 -#include - -/* declare service parser function prototype */ -typedef void (*fctServiceParser)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); -/* declare enum parser function prototype */ -typedef void (*fctEnumParser)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); -/* declare type parser function prototype */ -typedef void (*fctComplexTypeParser)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); -/* declare type parser function prototype */ -typedef void (*fctSimpleTypeParser)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); - -typedef struct _ParserEntry -{ - int iRequestId; - fctServiceParser pParser; -} ParserEntry; +/****************************************************************************** +** $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: Parser type definitions. +** +** 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 +#include + +/* declare service parser function prototype */ +typedef void (*fctServiceParser)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); +/* declare enum parser function prototype */ +typedef void (*fctEnumParser)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); +/* declare type parser function prototype */ +typedef void (*fctComplexTypeParser)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); +/* declare type parser function prototype */ +typedef void (*fctSimpleTypeParser)(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); + +typedef struct _ParserEntry +{ + int iRequestId; + fctServiceParser pParser; +} ParserEntry; diff --git a/plugins/opcua/opcua_serviceparser.c b/plugins/opcua/opcua_serviceparser.c index 7f3e330db2..db9adf402d 100644 --- a/plugins/opcua/opcua_serviceparser.c +++ b/plugins/opcua/opcua_serviceparser.c @@ -33,117 +33,117 @@ #include "opcua_simpletypes.h" #include "opcua_hfindeces.h" - -gint ett_opcua_TestStackRequest = -1; -void parseTestStackRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TestStackRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TestStackRequest); + +gint ett_opcua_TestStackRequest = -1; +void parseTestStackRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TestStackRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TestStackRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseUInt32(subtree, tvb, pOffset, hf_opcua_TestId); parseInt32(subtree, tvb, pOffset, hf_opcua_Iteration); - parseVariant(subtree, tvb, pOffset, "Input"); -} - -gint ett_opcua_TestStackResponse = -1; -void parseTestStackResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TestStackResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TestStackResponse); + parseVariant(subtree, tvb, pOffset, "Input"); +} + +gint ett_opcua_TestStackResponse = -1; +void parseTestStackResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TestStackResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TestStackResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); - parseVariant(subtree, tvb, pOffset, "Output"); -} - -gint ett_opcua_TestStackExRequest = -1; -void parseTestStackExRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TestStackExRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TestStackExRequest); + parseVariant(subtree, tvb, pOffset, "Output"); +} + +gint ett_opcua_TestStackExRequest = -1; +void parseTestStackExRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TestStackExRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TestStackExRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseUInt32(subtree, tvb, pOffset, hf_opcua_TestId); parseInt32(subtree, tvb, pOffset, hf_opcua_Iteration); - parseExtensionObject(subtree, tvb, pOffset, "Input"); -} - -gint ett_opcua_TestStackExResponse = -1; -void parseTestStackExResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TestStackExResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TestStackExResponse); + parseExtensionObject(subtree, tvb, pOffset, "Input"); +} + +gint ett_opcua_TestStackExResponse = -1; +void parseTestStackExResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TestStackExResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TestStackExResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); - parseExtensionObject(subtree, tvb, pOffset, "Output"); -} - -gint ett_opcua_FindServersRequest = -1; -void parseFindServersRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "FindServersRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_FindServersRequest); + parseExtensionObject(subtree, tvb, pOffset, "Output"); +} + +gint ett_opcua_FindServersRequest = -1; +void parseFindServersRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "FindServersRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_FindServersRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseArrayComplex(subtree, tvb, pOffset, "LocaleIds", parseLocalizedText); - parseArraySimple(subtree, tvb, pOffset, hf_opcua_ServerUris, parseString); -} - -gint ett_opcua_FindServersResponse = -1; -void parseFindServersResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "FindServersResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_FindServersResponse); + parseArraySimple(subtree, tvb, pOffset, hf_opcua_ServerUris, parseString); +} + +gint ett_opcua_FindServersResponse = -1; +void parseFindServersResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "FindServersResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_FindServersResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); - parseArrayComplex(subtree, tvb, pOffset, "Servers", parseServerDescription); -} - -gint ett_opcua_GetEndpointsRequest = -1; -void parseGetEndpointsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "GetEndpointsRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_GetEndpointsRequest); + parseArrayComplex(subtree, tvb, pOffset, "Servers", parseServerDescription); +} + +gint ett_opcua_GetEndpointsRequest = -1; +void parseGetEndpointsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "GetEndpointsRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_GetEndpointsRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseArrayComplex(subtree, tvb, pOffset, "LocaleIds", parseLocalizedText); - parseArraySimple(subtree, tvb, pOffset, hf_opcua_ProfileUris, parseString); -} - -gint ett_opcua_GetEndpointsResponse = -1; -void parseGetEndpointsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "GetEndpointsResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_GetEndpointsResponse); + parseArraySimple(subtree, tvb, pOffset, hf_opcua_ProfileUris, parseString); +} + +gint ett_opcua_GetEndpointsResponse = -1; +void parseGetEndpointsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "GetEndpointsResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_GetEndpointsResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); - parseArrayComplex(subtree, tvb, pOffset, "Endpoints", parseEndpointDescription); -} - -gint ett_opcua_RegisterServerRequest = -1; -void parseRegisterServerRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "RegisterServerRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RegisterServerRequest); + parseArrayComplex(subtree, tvb, pOffset, "Endpoints", parseEndpointDescription); +} + +gint ett_opcua_RegisterServerRequest = -1; +void parseRegisterServerRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "RegisterServerRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RegisterServerRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); - parseRegisteredServer(subtree, tvb, pOffset, "Server"); -} - -gint ett_opcua_RegisterServerResponse = -1; -void parseRegisterServerResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "RegisterServerResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RegisterServerResponse); + parseRegisteredServer(subtree, tvb, pOffset, "Server"); +} - parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); -} - -gint ett_opcua_OpenSecureChannelRequest = -1; -void parseOpenSecureChannelRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "OpenSecureChannelRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_OpenSecureChannelRequest); +gint ett_opcua_RegisterServerResponse = -1; +void parseRegisterServerResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "RegisterServerResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RegisterServerResponse); + + parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); +} + +gint ett_opcua_OpenSecureChannelRequest = -1; +void parseOpenSecureChannelRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "OpenSecureChannelRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_OpenSecureChannelRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseByteString(subtree, tvb, pOffset, hf_opcua_ClientCertificate); @@ -153,58 +153,58 @@ void parseOpenSecureChannelRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffse 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); -} - -gint ett_opcua_OpenSecureChannelResponse = -1; -void parseOpenSecureChannelResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "OpenSecureChannelResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_OpenSecureChannelResponse); + parseInt32(subtree, tvb, pOffset, hf_opcua_RequestedLifetime); +} + +gint ett_opcua_OpenSecureChannelResponse = -1; +void parseOpenSecureChannelResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "OpenSecureChannelResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_OpenSecureChannelResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseByteString(subtree, tvb, pOffset, hf_opcua_ServerCertificate); parseChannelSecurityToken(subtree, tvb, pOffset, "SecurityToken"); - parseByteString(subtree, tvb, pOffset, hf_opcua_ServerNonce); -} - -gint ett_opcua_CloseSecureChannelRequest = -1; -void parseCloseSecureChannelRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CloseSecureChannelRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CloseSecureChannelRequest); + parseByteString(subtree, tvb, pOffset, hf_opcua_ServerNonce); +} + +gint ett_opcua_CloseSecureChannelRequest = -1; +void parseCloseSecureChannelRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CloseSecureChannelRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CloseSecureChannelRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); - parseGuid(subtree, tvb, pOffset, hf_opcua_SecureChannelId); -} - -gint ett_opcua_CloseSecureChannelResponse = -1; -void parseCloseSecureChannelResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CloseSecureChannelResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CloseSecureChannelResponse); + parseGuid(subtree, tvb, pOffset, hf_opcua_SecureChannelId); +} - parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); -} - -gint ett_opcua_CreateSessionRequest = -1; -void parseCreateSessionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateSessionRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateSessionRequest); +gint ett_opcua_CloseSecureChannelResponse = -1; +void parseCloseSecureChannelResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CloseSecureChannelResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CloseSecureChannelResponse); + + parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); +} + +gint ett_opcua_CreateSessionRequest = -1; +void parseCreateSessionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateSessionRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateSessionRequest); 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); -} - -gint ett_opcua_CreateSessionResponse = -1; -void parseCreateSessionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateSessionResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateSessionResponse); + parseInt32(subtree, tvb, pOffset, hf_opcua_RequestedSessionTimeout); +} + +gint ett_opcua_CreateSessionResponse = -1; +void parseCreateSessionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateSessionResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateSessionResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseUInt32(subtree, tvb, pOffset, hf_opcua_SessionId); @@ -212,183 +212,183 @@ void parseCreateSessionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) 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"); -} - -gint ett_opcua_ActivateSessionRequest = -1; -void parseActivateSessionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ActivateSessionRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ActivateSessionRequest); + parseSignatureData(subtree, tvb, pOffset, "ServerSignature"); +} + +gint ett_opcua_ActivateSessionRequest = -1; +void parseActivateSessionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ActivateSessionRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ActivateSessionRequest); 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"); -} - -gint ett_opcua_ActivateSessionResponse = -1; -void parseActivateSessionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ActivateSessionResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ActivateSessionResponse); + parseSignatureData(subtree, tvb, pOffset, "UserTokenSignature"); +} + +gint ett_opcua_ActivateSessionResponse = -1; +void parseActivateSessionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ActivateSessionResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ActivateSessionResponse); 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); -} - -gint ett_opcua_CloseSessionRequest = -1; -void parseCloseSessionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CloseSessionRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CloseSessionRequest); + parseArrayComplex(subtree, tvb, pOffset, "CertificateDiagnosticInfos", parseDiagnosticInfo); +} - parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); -} - -gint ett_opcua_CloseSessionResponse = -1; -void parseCloseSessionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CloseSessionResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CloseSessionResponse); - - parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); -} - -gint ett_opcua_CancelRequest = -1; -void parseCancelRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CancelRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CancelRequest); +gint ett_opcua_CloseSessionRequest = -1; +void parseCloseSessionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CloseSessionRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CloseSessionRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); - parseUInt32(subtree, tvb, pOffset, hf_opcua_SequenceNumber); -} - -gint ett_opcua_CancelResponse = -1; -void parseCancelResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CancelResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CancelResponse); +} - parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); -} - -gint ett_opcua_AddNodesRequest = -1; -void parseAddNodesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "AddNodesRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddNodesRequest); +gint ett_opcua_CloseSessionResponse = -1; +void parseCloseSessionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CloseSessionResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CloseSessionResponse); + + parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); +} + +gint ett_opcua_CancelRequest = -1; +void parseCancelRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CancelRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CancelRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); - parseArrayComplex(subtree, tvb, pOffset, "NodesToAdd", parseAddNodesItem); -} - -gint ett_opcua_AddNodesResponse = -1; -void parseAddNodesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "AddNodesResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddNodesResponse); + parseUInt32(subtree, tvb, pOffset, hf_opcua_SequenceNumber); +} + +gint ett_opcua_CancelResponse = -1; +void parseCancelResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CancelResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CancelResponse); + + parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); +} + +gint ett_opcua_AddNodesRequest = -1; +void parseAddNodesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "AddNodesRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddNodesRequest); + + parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); + parseArrayComplex(subtree, tvb, pOffset, "NodesToAdd", parseAddNodesItem); +} + +gint ett_opcua_AddNodesResponse = -1; +void parseAddNodesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "AddNodesResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddNodesResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArrayComplex(subtree, tvb, pOffset, "Results", parseAddNodesResult); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_AddReferencesRequest = -1; -void parseAddReferencesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "AddReferencesRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddReferencesRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_AddReferencesRequest = -1; +void parseAddReferencesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "AddReferencesRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddReferencesRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); - parseArrayComplex(subtree, tvb, pOffset, "ReferencesToAdd", parseAddReferencesItem); -} - -gint ett_opcua_AddReferencesResponse = -1; -void parseAddReferencesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "AddReferencesResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddReferencesResponse); + parseArrayComplex(subtree, tvb, pOffset, "ReferencesToAdd", parseAddReferencesItem); +} + +gint ett_opcua_AddReferencesResponse = -1; +void parseAddReferencesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "AddReferencesResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_AddReferencesResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_DeleteNodesRequest = -1; -void parseDeleteNodesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteNodesRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteNodesRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_DeleteNodesRequest = -1; +void parseDeleteNodesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteNodesRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteNodesRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); - parseArrayComplex(subtree, tvb, pOffset, "NodesToDelete", parseDeleteNodesItem); -} - -gint ett_opcua_DeleteNodesResponse = -1; -void parseDeleteNodesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteNodesResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteNodesResponse); + parseArrayComplex(subtree, tvb, pOffset, "NodesToDelete", parseDeleteNodesItem); +} + +gint ett_opcua_DeleteNodesResponse = -1; +void parseDeleteNodesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteNodesResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteNodesResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode); - parseArrayComplex(subtree, tvb, pOffset, "Diagnostics", parseDiagnosticInfo); -} - -gint ett_opcua_DeleteReferencesRequest = -1; -void parseDeleteReferencesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteReferencesRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteReferencesRequest); + parseArrayComplex(subtree, tvb, pOffset, "Diagnostics", parseDiagnosticInfo); +} + +gint ett_opcua_DeleteReferencesRequest = -1; +void parseDeleteReferencesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteReferencesRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteReferencesRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); - parseArrayComplex(subtree, tvb, pOffset, "ReferencesToDelete", parseDeleteReferencesItem); -} - -gint ett_opcua_DeleteReferencesResponse = -1; -void parseDeleteReferencesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteReferencesResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteReferencesResponse); + parseArrayComplex(subtree, tvb, pOffset, "ReferencesToDelete", parseDeleteReferencesItem); +} + +gint ett_opcua_DeleteReferencesResponse = -1; +void parseDeleteReferencesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteReferencesResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteReferencesResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_BrowsePropertiesRequest = -1; -void parseBrowsePropertiesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowsePropertiesRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowsePropertiesRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_BrowsePropertiesRequest = -1; +void parseBrowsePropertiesRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowsePropertiesRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowsePropertiesRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseArrayComplex(subtree, tvb, pOffset, "NodesToAccess", parseNodeId); - parseArrayComplex(subtree, tvb, pOffset, "Properties", parseQualifiedName); -} - -gint ett_opcua_BrowsePropertiesResponse = -1; -void parseBrowsePropertiesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowsePropertiesResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowsePropertiesResponse); + parseArrayComplex(subtree, tvb, pOffset, "Properties", parseQualifiedName); +} + +gint ett_opcua_BrowsePropertiesResponse = -1; +void parseBrowsePropertiesResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowsePropertiesResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowsePropertiesResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArrayComplex(subtree, tvb, pOffset, "NodeResults", parseBrowsePropertiesResult); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_BrowseRequest = -1; -void parseBrowseRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowseRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowseRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_BrowseRequest = -1; +void parseBrowseRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowseRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowseRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseViewDescription(subtree, tvb, pOffset, "View"); @@ -397,68 +397,68 @@ void parseBrowseRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) parseBrowseDirection(subtree, tvb, pOffset); parseNodeId(subtree, tvb, pOffset, "ReferenceTypeId"); parseBoolean(subtree, tvb, pOffset, hf_opcua_IncludeSubtypes); - parseInt32(subtree, tvb, pOffset, hf_opcua_NodeClassMask); -} - -gint ett_opcua_BrowseResponse = -1; -void parseBrowseResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowseResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowseResponse); + parseInt32(subtree, tvb, pOffset, hf_opcua_NodeClassMask); +} + +gint ett_opcua_BrowseResponse = -1; +void parseBrowseResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowseResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowseResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseByteString(subtree, tvb, pOffset, hf_opcua_ContinuationPoint); - parseArrayComplex(subtree, tvb, pOffset, "References", parseReferenceDescription); -} - -gint ett_opcua_BrowseNextRequest = -1; -void parseBrowseNextRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowseNextRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowseNextRequest); + parseArrayComplex(subtree, tvb, pOffset, "References", parseReferenceDescription); +} + +gint ett_opcua_BrowseNextRequest = -1; +void parseBrowseNextRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowseNextRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowseNextRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseBoolean(subtree, tvb, pOffset, hf_opcua_ReleaseContinuationPoint); - parseByteString(subtree, tvb, pOffset, hf_opcua_ContinuationPoint); -} - -gint ett_opcua_BrowseNextResponse = -1; -void parseBrowseNextResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowseNextResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowseNextResponse); + parseByteString(subtree, tvb, pOffset, hf_opcua_ContinuationPoint); +} + +gint ett_opcua_BrowseNextResponse = -1; +void parseBrowseNextResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "BrowseNextResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_BrowseNextResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseByteString(subtree, tvb, pOffset, hf_opcua_RevisedContinuationPoint); - parseArrayComplex(subtree, tvb, pOffset, "References", parseReferenceDescription); -} - -gint ett_opcua_TranslateBrowsePathsToNodeIdsRequest = -1; -void parseTranslateBrowsePathsToNodeIdsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TranslateBrowsePathsToNodeIdsRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TranslateBrowsePathsToNodeIdsRequest); + parseArrayComplex(subtree, tvb, pOffset, "References", parseReferenceDescription); +} + +gint ett_opcua_TranslateBrowsePathsToNodeIdsRequest = -1; +void parseTranslateBrowsePathsToNodeIdsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TranslateBrowsePathsToNodeIdsRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TranslateBrowsePathsToNodeIdsRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); - parseArrayComplex(subtree, tvb, pOffset, "BrowsePaths", parseBrowsePath); -} - -gint ett_opcua_TranslateBrowsePathsToNodeIdsResponse = -1; -void parseTranslateBrowsePathsToNodeIdsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TranslateBrowsePathsToNodeIdsResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TranslateBrowsePathsToNodeIdsResponse); + parseArrayComplex(subtree, tvb, pOffset, "BrowsePaths", parseBrowsePath); +} + +gint ett_opcua_TranslateBrowsePathsToNodeIdsResponse = -1; +void parseTranslateBrowsePathsToNodeIdsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TranslateBrowsePathsToNodeIdsResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TranslateBrowsePathsToNodeIdsResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArrayComplex(subtree, tvb, pOffset, "Results", parseTranslateBrowsePathResult); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_QueryFirstRequest = -1; -void parseQueryFirstRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "QueryFirstRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryFirstRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_QueryFirstRequest = -1; +void parseQueryFirstRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "QueryFirstRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryFirstRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseViewDescription(subtree, tvb, pOffset, "View"); @@ -467,362 +467,362 @@ void parseQueryFirstRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) 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); -} - -gint ett_opcua_QueryFirstResponse = -1; -void parseQueryFirstResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "QueryFirstResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryFirstResponse); + parseUInt32(subtree, tvb, pOffset, hf_opcua_MaxTime); +} + +gint ett_opcua_QueryFirstResponse = -1; +void parseQueryFirstResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "QueryFirstResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryFirstResponse); 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"); -} - -gint ett_opcua_QueryNextRequest = -1; -void parseQueryNextRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "QueryNextRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryNextRequest); + parseContentFilterResult(subtree, tvb, pOffset, "ContentFilterResult"); +} + +gint ett_opcua_QueryNextRequest = -1; +void parseQueryNextRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "QueryNextRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryNextRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseBoolean(subtree, tvb, pOffset, hf_opcua_ReleaseContinuationPoint); - parseByteString(subtree, tvb, pOffset, hf_opcua_ContinuationPoint); -} - -gint ett_opcua_QueryNextResponse = -1; -void parseQueryNextResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "QueryNextResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryNextResponse); + parseByteString(subtree, tvb, pOffset, hf_opcua_ContinuationPoint); +} + +gint ett_opcua_QueryNextResponse = -1; +void parseQueryNextResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "QueryNextResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_QueryNextResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArrayComplex(subtree, tvb, pOffset, "QueryDataSets", parseQueryDataSet); - parseByteString(subtree, tvb, pOffset, hf_opcua_RevisedContinuationPoint); -} - -gint ett_opcua_ReadRequest = -1; -void parseReadRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ReadRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadRequest); + parseByteString(subtree, tvb, pOffset, hf_opcua_RevisedContinuationPoint); +} + +gint ett_opcua_ReadRequest = -1; +void parseReadRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ReadRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseInt32(subtree, tvb, pOffset, hf_opcua_MaxAge); parseTimestampsToReturn(subtree, tvb, pOffset); - parseArrayComplex(subtree, tvb, pOffset, "NodesToRead", parseReadValueId); -} - -gint ett_opcua_ReadResponse = -1; -void parseReadResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ReadResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadResponse); + parseArrayComplex(subtree, tvb, pOffset, "NodesToRead", parseReadValueId); +} + +gint ett_opcua_ReadResponse = -1; +void parseReadResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ReadResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ReadResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArrayComplex(subtree, tvb, pOffset, "Results", parseDataValue); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_HistoryReadRequest = -1; -void parseHistoryReadRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "HistoryReadRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryReadRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_HistoryReadRequest = -1; +void parseHistoryReadRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "HistoryReadRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryReadRequest); 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); -} - -gint ett_opcua_HistoryReadResponse = -1; -void parseHistoryReadResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "HistoryReadResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryReadResponse); + parseArrayComplex(subtree, tvb, pOffset, "NodesToRead", parseHistoryReadValueId); +} + +gint ett_opcua_HistoryReadResponse = -1; +void parseHistoryReadResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "HistoryReadResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryReadResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArrayComplex(subtree, tvb, pOffset, "Results", parseHistoryReadResult); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_WriteRequest = -1; -void parseWriteRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "WriteRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_WriteRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_WriteRequest = -1; +void parseWriteRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "WriteRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_WriteRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); - parseArrayComplex(subtree, tvb, pOffset, "NodesToWrite", parseWriteValue); -} - -gint ett_opcua_WriteResponse = -1; -void parseWriteResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "WriteResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_WriteResponse); + parseArrayComplex(subtree, tvb, pOffset, "NodesToWrite", parseWriteValue); +} + +gint ett_opcua_WriteResponse = -1; +void parseWriteResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "WriteResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_WriteResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_HistoryUpdateRequest = -1; -void parseHistoryUpdateRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "HistoryUpdateRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryUpdateRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_HistoryUpdateRequest = -1; +void parseHistoryUpdateRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "HistoryUpdateRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryUpdateRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); - parseArrayComplex(subtree, tvb, pOffset, "HistoryUpdateDetails", parseExtensionObject); -} - -gint ett_opcua_HistoryUpdateResponse = -1; -void parseHistoryUpdateResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "HistoryUpdateResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryUpdateResponse); + parseArrayComplex(subtree, tvb, pOffset, "HistoryUpdateDetails", parseExtensionObject); +} + +gint ett_opcua_HistoryUpdateResponse = -1; +void parseHistoryUpdateResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "HistoryUpdateResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_HistoryUpdateResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArrayComplex(subtree, tvb, pOffset, "Results", parseHistoryUpdateResult); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_CallRequest = -1; -void parseCallRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CallRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CallRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_CallRequest = -1; +void parseCallRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CallRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CallRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); - parseArrayComplex(subtree, tvb, pOffset, "MethodsToCall", parseCallRequestItem); -} - -gint ett_opcua_CallResponse = -1; -void parseCallResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CallResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CallResponse); + parseArrayComplex(subtree, tvb, pOffset, "MethodsToCall", parseCallRequestItem); +} + +gint ett_opcua_CallResponse = -1; +void parseCallResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CallResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CallResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArrayComplex(subtree, tvb, pOffset, "Results", parseCallResultItem); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_CreateMonitoredItemsRequest = -1; -void parseCreateMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateMonitoredItemsRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateMonitoredItemsRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_CreateMonitoredItemsRequest = -1; +void parseCreateMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateMonitoredItemsRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateMonitoredItemsRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId); parseTimestampsToReturn(subtree, tvb, pOffset); - parseArrayComplex(subtree, tvb, pOffset, "ItemsToCreate", parseMonitoredItemCreateRequest); -} - -gint ett_opcua_CreateMonitoredItemsResponse = -1; -void parseCreateMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateMonitoredItemsResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateMonitoredItemsResponse); + parseArrayComplex(subtree, tvb, pOffset, "ItemsToCreate", parseMonitoredItemCreateRequest); +} + +gint ett_opcua_CreateMonitoredItemsResponse = -1; +void parseCreateMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateMonitoredItemsResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateMonitoredItemsResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArrayComplex(subtree, tvb, pOffset, "Results", parseMonitoredItemCreateResult); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_ModifyMonitoredItemsRequest = -1; -void parseModifyMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ModifyMonitoredItemsRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ModifyMonitoredItemsRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_ModifyMonitoredItemsRequest = -1; +void parseModifyMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ModifyMonitoredItemsRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ModifyMonitoredItemsRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId); parseTimestampsToReturn(subtree, tvb, pOffset); - parseArrayComplex(subtree, tvb, pOffset, "ItemsToModify", parseMonitoredItemModifyRequest); -} - -gint ett_opcua_ModifyMonitoredItemsResponse = -1; -void parseModifyMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ModifyMonitoredItemsResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ModifyMonitoredItemsResponse); + parseArrayComplex(subtree, tvb, pOffset, "ItemsToModify", parseMonitoredItemModifyRequest); +} + +gint ett_opcua_ModifyMonitoredItemsResponse = -1; +void parseModifyMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ModifyMonitoredItemsResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ModifyMonitoredItemsResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArrayComplex(subtree, tvb, pOffset, "Results", parseMonitoredItemModifyResult); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_SetMonitoringModeRequest = -1; -void parseSetMonitoringModeRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetMonitoringModeRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetMonitoringModeRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_SetMonitoringModeRequest = -1; +void parseSetMonitoringModeRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetMonitoringModeRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetMonitoringModeRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId); parseMonitoringMode(subtree, tvb, pOffset); - parseArraySimple(subtree, tvb, pOffset, hf_opcua_MonitoredItemIds, parseUInt32); -} - -gint ett_opcua_SetMonitoringModeResponse = -1; -void parseSetMonitoringModeResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetMonitoringModeResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetMonitoringModeResponse); + parseArraySimple(subtree, tvb, pOffset, hf_opcua_MonitoredItemIds, parseUInt32); +} + +gint ett_opcua_SetMonitoringModeResponse = -1; +void parseSetMonitoringModeResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetMonitoringModeResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetMonitoringModeResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_SetTriggeringRequest = -1; -void parseSetTriggeringRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetTriggeringRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetTriggeringRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_SetTriggeringRequest = -1; +void parseSetTriggeringRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetTriggeringRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetTriggeringRequest); 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); -} - -gint ett_opcua_SetTriggeringResponse = -1; -void parseSetTriggeringResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetTriggeringResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetTriggeringResponse); + parseArraySimple(subtree, tvb, pOffset, hf_opcua_LinksToRemove, parseUInt32); +} + +gint ett_opcua_SetTriggeringResponse = -1; +void parseSetTriggeringResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetTriggeringResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetTriggeringResponse); 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); -} - -gint ett_opcua_DeleteMonitoredItemsRequest = -1; -void parseDeleteMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteMonitoredItemsRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteMonitoredItemsRequest); + parseArrayComplex(subtree, tvb, pOffset, "RemoveDiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_DeleteMonitoredItemsRequest = -1; +void parseDeleteMonitoredItemsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteMonitoredItemsRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteMonitoredItemsRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId); - parseArraySimple(subtree, tvb, pOffset, hf_opcua_MonitoredItemIds, parseUInt32); -} - -gint ett_opcua_DeleteMonitoredItemsResponse = -1; -void parseDeleteMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteMonitoredItemsResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteMonitoredItemsResponse); + parseArraySimple(subtree, tvb, pOffset, hf_opcua_MonitoredItemIds, parseUInt32); +} + +gint ett_opcua_DeleteMonitoredItemsResponse = -1; +void parseDeleteMonitoredItemsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteMonitoredItemsResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteMonitoredItemsResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_CreateSubscriptionRequest = -1; -void parseCreateSubscriptionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateSubscriptionRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateSubscriptionRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_CreateSubscriptionRequest = -1; +void parseCreateSubscriptionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateSubscriptionRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateSubscriptionRequest); 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); -} - -gint ett_opcua_CreateSubscriptionResponse = -1; -void parseCreateSubscriptionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateSubscriptionResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateSubscriptionResponse); + parseByte(subtree, tvb, pOffset, hf_opcua_Priority); +} + +gint ett_opcua_CreateSubscriptionResponse = -1; +void parseCreateSubscriptionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "CreateSubscriptionResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_CreateSubscriptionResponse); 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); -} - -gint ett_opcua_ModifySubscriptionRequest = -1; -void parseModifySubscriptionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ModifySubscriptionRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ModifySubscriptionRequest); + parseUInt32(subtree, tvb, pOffset, hf_opcua_RevisedMaxKeepAliveCount); +} + +gint ett_opcua_ModifySubscriptionRequest = -1; +void parseModifySubscriptionRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ModifySubscriptionRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ModifySubscriptionRequest); 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); -} - -gint ett_opcua_ModifySubscriptionResponse = -1; -void parseModifySubscriptionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ModifySubscriptionResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ModifySubscriptionResponse); + parseByte(subtree, tvb, pOffset, hf_opcua_Priority); +} + +gint ett_opcua_ModifySubscriptionResponse = -1; +void parseModifySubscriptionResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "ModifySubscriptionResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_ModifySubscriptionResponse); 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); -} - -gint ett_opcua_SetPublishingModeRequest = -1; -void parseSetPublishingModeRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetPublishingModeRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetPublishingModeRequest); + parseUInt32(subtree, tvb, pOffset, hf_opcua_RevisedMaxKeepAliveCount); +} + +gint ett_opcua_SetPublishingModeRequest = -1; +void parseSetPublishingModeRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetPublishingModeRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetPublishingModeRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseBoolean(subtree, tvb, pOffset, hf_opcua_PublishingEnabled); - parseArraySimple(subtree, tvb, pOffset, hf_opcua_SubscriptionIds, parseUInt32); -} - -gint ett_opcua_SetPublishingModeResponse = -1; -void parseSetPublishingModeResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetPublishingModeResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetPublishingModeResponse); + parseArraySimple(subtree, tvb, pOffset, hf_opcua_SubscriptionIds, parseUInt32); +} + +gint ett_opcua_SetPublishingModeResponse = -1; +void parseSetPublishingModeResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "SetPublishingModeResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_SetPublishingModeResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_PublishRequest = -1; -void parsePublishRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "PublishRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_PublishRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_PublishRequest = -1; +void parsePublishRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "PublishRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_PublishRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); - parseArrayComplex(subtree, tvb, pOffset, "SubscriptionAcknowledgements", parseSubscriptionAcknowledgement); -} - -gint ett_opcua_PublishResponse = -1; -void parsePublishResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "PublishResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_PublishResponse); + parseArrayComplex(subtree, tvb, pOffset, "SubscriptionAcknowledgements", parseSubscriptionAcknowledgement); +} + +gint ett_opcua_PublishResponse = -1; +void parsePublishResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "PublishResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_PublishResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId); @@ -830,71 +830,71 @@ void parsePublishResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) 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); -} - -gint ett_opcua_RepublishRequest = -1; -void parseRepublishRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "RepublishRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RepublishRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_RepublishRequest = -1; +void parseRepublishRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "RepublishRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RepublishRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); parseUInt32(subtree, tvb, pOffset, hf_opcua_SubscriptionId); - parseUInt32(subtree, tvb, pOffset, hf_opcua_RetransmitSequenceNumber); -} - -gint ett_opcua_RepublishResponse = -1; -void parseRepublishResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "RepublishResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RepublishResponse); + parseUInt32(subtree, tvb, pOffset, hf_opcua_RetransmitSequenceNumber); +} + +gint ett_opcua_RepublishResponse = -1; +void parseRepublishResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "RepublishResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_RepublishResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); - parseNotificationMessage(subtree, tvb, pOffset, "NotificationMessage"); -} - -gint ett_opcua_TransferSubscriptionsRequest = -1; -void parseTransferSubscriptionsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TransferSubscriptionsRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TransferSubscriptionsRequest); + parseNotificationMessage(subtree, tvb, pOffset, "NotificationMessage"); +} + +gint ett_opcua_TransferSubscriptionsRequest = -1; +void parseTransferSubscriptionsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TransferSubscriptionsRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TransferSubscriptionsRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); - parseArraySimple(subtree, tvb, pOffset, hf_opcua_SubscriptionIds, parseUInt32); -} - -gint ett_opcua_TransferSubscriptionsResponse = -1; -void parseTransferSubscriptionsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TransferSubscriptionsResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TransferSubscriptionsResponse); + parseArraySimple(subtree, tvb, pOffset, hf_opcua_SubscriptionIds, parseUInt32); +} + +gint ett_opcua_TransferSubscriptionsResponse = -1; +void parseTransferSubscriptionsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "TransferSubscriptionsResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_TransferSubscriptionsResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArrayComplex(subtree, tvb, pOffset, "Results", parseTransferResult); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} - -gint ett_opcua_DeleteSubscriptionsRequest = -1; -void parseDeleteSubscriptionsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteSubscriptionsRequest"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteSubscriptionsRequest); + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} + +gint ett_opcua_DeleteSubscriptionsRequest = -1; +void parseDeleteSubscriptionsRequest(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteSubscriptionsRequest"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteSubscriptionsRequest); parseRequestHeader(subtree, tvb, pOffset, "RequestHeader"); - parseArraySimple(subtree, tvb, pOffset, hf_opcua_SubscriptionIds, parseUInt32); -} - -gint ett_opcua_DeleteSubscriptionsResponse = -1; -void parseDeleteSubscriptionsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteSubscriptionsResponse"); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteSubscriptionsResponse); + parseArraySimple(subtree, tvb, pOffset, hf_opcua_SubscriptionIds, parseUInt32); +} + +gint ett_opcua_DeleteSubscriptionsResponse = -1; +void parseDeleteSubscriptionsResponse(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "DeleteSubscriptionsResponse"); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_DeleteSubscriptionsResponse); parseResponseHeader(subtree, tvb, pOffset, "ResponseHeader"); parseArraySimple(subtree, tvb, pOffset, hf_opcua_Results, parseStatusCode); - parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); -} + parseArrayComplex(subtree, tvb, pOffset, "DiagnosticInfos", parseDiagnosticInfo); +} /** Setup protocol subtree array */ static gint *ett[] = diff --git a/plugins/opcua/opcua_servicetable.c b/plugins/opcua/opcua_servicetable.c index 5a44baefbd..8b9180d95f 100644 --- a/plugins/opcua/opcua_servicetable.c +++ b/plugins/opcua/opcua_servicetable.c @@ -1,36 +1,36 @@ -/****************************************************************************** -** $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: Service table and service dispatcher. -** -** 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 -#include -#include "opcua_identifiers.h" -#include "opcua_serviceparser.h" - -ParserEntry g_arParserTable[] = { +/****************************************************************************** +** $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: Service table and service dispatcher. +** +** 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 +#include +#include "opcua_identifiers.h" +#include "opcua_serviceparser.h" + +ParserEntry g_arParserTable[] = { { 1358, parseTestStackRequest }, { 1363, parseTestStackResponse }, { 1368, parseTestStackExRequest }, @@ -107,11 +107,11 @@ ParserEntry g_arParserTable[] = { { 2080, parseTransferSubscriptionsResponse }, { 2085, parseDeleteSubscriptionsRequest }, { 2090, parseDeleteSubscriptionsResponse } - -}; -const int g_NumServices = sizeof(g_arParserTable) / sizeof(ParserEntry); - -/** Service type table */ + +}; +const int g_NumServices = sizeof(g_arParserTable) / sizeof(ParserEntry); + +/** Service type table */ const value_string g_requesttypes[] = { { 1358, "TestStackRequest" }, { 1363, "TestStackResponse" }, @@ -188,22 +188,22 @@ const value_string g_requesttypes[] = { { 2075, "TransferSubscriptionsRequest" }, { 2080, "TransferSubscriptionsResponse" }, { 2085, "DeleteSubscriptionsRequest" }, - { 2090, "DeleteSubscriptionsResponse" }, - { 0, NULL } -}; - -/** Dispatch all services to a special parser function. */ -void dispatchService(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int ServiceId) -{ - int index = 0; - - while (index < g_NumServices) - { - if (g_arParserTable[index].iRequestId == ServiceId) - { - (*g_arParserTable[index].pParser)(tree, tvb, pOffset); - break; - } - index++; - } -} + { 2090, "DeleteSubscriptionsResponse" }, + { 0, NULL } +}; + +/** Dispatch all services to a special parser function. */ +void dispatchService(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int ServiceId) +{ + int index = 0; + + while (index < g_NumServices) + { + if (g_arParserTable[index].iRequestId == ServiceId) + { + (*g_arParserTable[index].pParser)(tree, tvb, pOffset); + break; + } + index++; + } +} diff --git a/plugins/opcua/opcua_simpletypes.c b/plugins/opcua/opcua_simpletypes.c index 26d578c491..32e2db9ec0 100644 --- a/plugins/opcua/opcua_simpletypes.c +++ b/plugins/opcua/opcua_simpletypes.c @@ -1,840 +1,840 @@ -/****************************************************************************** -** $Id: opcua_simpletypes.c,v 1.1 2007/02/08 11:26:55 gergap Exp $ -** -** 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: Implementation of OpcUa built-in type parsers. -** This contains all the simple types and some complex types. -** -** Author: Gerhard Gappmeier -** Last change by: $Author: gergap $ -** -******************************************************************************/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include -#include "opcua_simpletypes.h" -#include "opcua_hfindeces.h" -#include -#include - -/* string buffer */ -#define MAX_BUFFER 256 - -#define DIAGNOSTICINFO_ENCODINGMASK_SYMBOLICID_FLAG 0x01 -#define DIAGNOSTICINFO_ENCODINGMASK_NAMESPACE_FLAG 0x02 -#define DIAGNOSTICINFO_ENCODINGMASK_LOCALIZEDTEXT_FLAG 0x04 -#define DIAGNOSTICINFO_ENCODINGMASK_ADDITIONALINFO_FLAG 0x08 -#define DIAGNOSTICINFO_ENCODINGMASK_INNERSTATUSCODE_FLAG 0x10 -#define DIAGNOSTICINFO_ENCODINGMASK_INNERDIAGNOSTICINFO_FLAG 0x20 -#define LOCALIZEDTEXT_ENCODINGBYTE_LOCALE 0x01 -#define LOCALIZEDTEXT_ENCODINGBYTE_TEXT 0x02 -#define NODEID_URIMASK 0x80 -#define DATAVALUE_ENCODINGBYTE_VALUE 0x01 -#define DATAVALUE_ENCODINGBYTE_STATUSCODE 0x02 -#define DATAVALUE_ENCODINGBYTE_SOURCETIMESTAMP 0x04 -#define DATAVALUE_ENCODINGBYTE_SERVERTIMESTAMP 0x08 -#define EXTOBJ_ENCODINGMASK_BINBODY_FLAG 0x01 -#define EXTOBJ_ENCODINGMASK_XMLBODY_FLAG 0x02 - -static int hf_opcua_diag_mask_symbolicflag = -1; -static int hf_opcua_diag_mask_namespaceflag = -1; -static int hf_opcua_diag_mask_localizedtextflag = -1; -static int hf_opcua_diag_mask_additionalinfoflag = -1; -static int hf_opcua_diag_mask_innerstatuscodeflag = -1; -static int hf_opcua_diag_mask_innerdiaginfoflag = -1; -static int hf_opcua_loctext_mask_localeflag = -1; -static int hf_opcua_loctext_mask_textflag = -1; -static int hf_opcua_datavalue_mask_valueflag = -1; -static int hf_opcua_datavalue_mask_statuscodeflag = -1; -static int hf_opcua_datavalue_mask_sourcetimestampflag = -1; -static int hf_opcua_datavalue_mask_servertimestampflag = -1; -static int hf_opcua_nodeid_encodingmask = -1; -static int hf_opcua_variant_encodingmask = -1; -static int hf_opcua_nodeid_nsid = -1; -static int hf_opcua_nodeid_numeric = -1; -static int hf_opcua_Locale = -1; -static int hf_opcua_Text = -1; -static int hf_opcua_SourceTimestamp = -1; -static int hf_opcua_ServerTimestamp = -1; -static int hf_opcua_diag_symbolicid = -1; -static int hf_opcua_diag_namespace = -1; -static int hf_opcua_diag_localizedtext = -1; -static int hf_opcua_diag_additionalinfo = -1; -static int hf_opcua_diag_innerstatuscode = -1; -static int hf_opcua_extobj_mask_binbodyflag = -1; -static int hf_opcua_extobj_mask_xmlbodyflag = -1; - -/** NodeId encoding mask table */ -static const value_string g_nodeidmasks[] = { - { 0, "Two byte encoded Numeric" }, - { 1, "Four byte encoded Numeric" }, - { 2, "Numeric of arbitrary length" }, - { 3, "String" }, - { 4, "URI" }, - { 5, "GUID" }, - { 6, "ByteString" }, - { 0x80, "UriMask" }, - { 0, NULL } -}; - -/** UA Variant Type enum */ -typedef enum _OpcUa_BuiltInType -{ - OpcUaType_Null = 0, - OpcUaType_Boolean = 1, - OpcUaType_SByte = 2, - OpcUaType_Byte = 3, - OpcUaType_Int16 = 4, - OpcUaType_UInt16 = 5, - OpcUaType_Int32 = 6, - OpcUaType_UInt32 = 7, - OpcUaType_Int64 = 8, - OpcUaType_UInt64 = 9, - OpcUaType_Float = 10, - OpcUaType_Double = 11, - OpcUaType_String = 12, - OpcUaType_DateTime = 13, - OpcUaType_Guid = 14, - OpcUaType_ByteString = 15, - OpcUaType_XmlElement = 16, - OpcUaType_NodeId = 17, - OpcUaType_ExpandedNodeId = 18, - OpcUaType_StatusCode = 19, - OpcUaType_DiagnosticInfo = 20, - OpcUaType_QualifiedName = 21, - OpcUaType_LocalizedText = 22, - OpcUaType_ExtensionObject = 23, - OpcUaType_DataValue = 24, - OpcUaType_Variant = 25 -} -OpcUa_BuiltInType; - -/** Variant encoding mask table */ -static const value_string g_VariantTypes[] = { - { 0, "Null" }, - { 1, "Boolean" }, - { 2, "SByte" }, - { 3, "Byte" }, - { 4, "Int16" }, - { 5, "UInt16" }, - { 6, "Int32" }, - { 7, "UInt32" }, - { 8, "Int64" }, - { 9, "UInt64" }, - { 10, "Float" }, - { 11, "Double" }, - { 12, "String" }, - { 13, "DateTime" }, - { 14, "Guid" }, - { 15, "ByteString" }, - { 16, "XmlElement" }, - { 17, "NodeId" }, - { 18, "ExpandedNodeId" }, - { 19, "StatusCode" }, - { 20, "DiagnosticInfo" }, - { 21, "QualifiedName" }, - { 22, "LocalizedText" }, - { 23, "ExtensionObject" }, - { 24, "DataValue" }, - { 25, "Variant" }, - { 0x80, "Array of Null" }, - { 0x80+1, "Array of Boolean" }, - { 0x80+2, "Array of SByte" }, - { 0x80+3, "Array of Byte" }, - { 0x80+4, "Array of Int16" }, - { 0x80+5, "Array of UInt16" }, - { 0x80+6, "Array of Int32" }, - { 0x80+7, "Array of UInt32" }, - { 0x80+8, "Array of Int64" }, - { 0x80+9, "Array of UInt64" }, - { 0x80+10, "Array of Float" }, - { 0x80+11, "Array of Double" }, - { 0x80+12, "Array of String" }, - { 0x80+13, "Array of DateTime" }, - { 0x80+14, "Array of Guid" }, - { 0x80+15, "Array of ByteString" }, - { 0x80+16, "Array of XmlElement" }, - { 0x80+17, "Array of NodeId" }, - { 0x80+18, "Array of ExpandedNodeId" }, - { 0x80+19, "Array of StatusCode" }, - { 0x80+20, "Array of DiagnosticInfo" }, - { 0x80+21, "Array of QualifiedName" }, - { 0x80+22, "Array of LocalizedText" }, - { 0x80+23, "Array of ExtensionObject" }, - { 0x80+24, "Array of DataValue" }, - { 0x80+25, "Array of Variant" }, - { 0, NULL } -}; -#define VARIANT_ARRAYMASK 0x80 - -/* trees */ -static gint ett_opcua_array = -1; -static gint ett_opcua_diagnosticinfo = -1; -static gint ett_opcua_nodeid = -1; -static gint ett_opcua_localeid = -1; -static gint ett_opcua_localizedtext = -1; -static gint ett_opcua_qualifiedname = -1; -static gint ett_opcua_datavalue = -1; -static gint ett_opcua_variant = -1; -static gint ett_opcua_extensionobject = -1; -static gint ett_opcua_extobj_encodingmask = -1; -static gint *ett[] = -{ - &ett_opcua_array, - &ett_opcua_diagnosticinfo, - &ett_opcua_nodeid, - &ett_opcua_localeid, - &ett_opcua_localizedtext, - &ett_opcua_qualifiedname, - &ett_opcua_datavalue, - &ett_opcua_variant, - &ett_opcua_extensionobject, - &ett_opcua_extobj_encodingmask -}; - - -static hf_register_info hf[] = -{ - /* full name , abbreviation , type , display , strings, bitmask, blurb, id, parent, ref_count, bitshift */ - { &hf_opcua_diag_mask_symbolicflag, - { "has symbolic id", "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_SYMBOLICID_FLAG, "", HFILL } - }, - { &hf_opcua_diag_mask_namespaceflag, - { "has namespace", "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_NAMESPACE_FLAG, "", HFILL } - }, - { &hf_opcua_diag_mask_localizedtextflag, - { "has localizedtext", "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_LOCALIZEDTEXT_FLAG, "", HFILL } - }, - { &hf_opcua_diag_mask_additionalinfoflag, - { "has additional info", "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_ADDITIONALINFO_FLAG, "", HFILL } - }, - { &hf_opcua_diag_mask_innerstatuscodeflag, - { "has inner statuscode", "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_INNERSTATUSCODE_FLAG, "", HFILL } - }, - { &hf_opcua_diag_mask_innerdiaginfoflag, - { "has inner diagnostic info", "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_INNERDIAGNOSTICINFO_FLAG, "", HFILL } - }, - { &hf_opcua_loctext_mask_localeflag, - { "has locale information", "", FT_BOOLEAN, 8, NULL, LOCALIZEDTEXT_ENCODINGBYTE_LOCALE, "", HFILL } - }, - { &hf_opcua_loctext_mask_textflag, - { "has text", "", FT_BOOLEAN, 8, NULL, LOCALIZEDTEXT_ENCODINGBYTE_TEXT, "", HFILL } - }, - { &hf_opcua_nodeid_encodingmask, - { "NodeId EncodingMask", "application.nodeid.encodingmask", FT_UINT8, BASE_HEX, VALS(g_nodeidmasks), 0x0, "", HFILL } - }, - { &hf_opcua_nodeid_nsid, - { "NodeId Namespace Id", "application.nodeid.nsid", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_nodeid_numeric, - { "NodeId Identifier Numeric", "application.nodeid.numeric", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_Locale, { "Locale", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } }, - { &hf_opcua_Text, { "Text", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } }, - { &hf_opcua_datavalue_mask_valueflag, { "has value", "", FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_VALUE, "", HFILL } }, - { &hf_opcua_datavalue_mask_statuscodeflag, { "has statuscode", "", FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_STATUSCODE, "", HFILL } }, - { &hf_opcua_datavalue_mask_sourcetimestampflag, { "has source timestamp", "", FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_SOURCETIMESTAMP, "", HFILL } }, - { &hf_opcua_datavalue_mask_servertimestampflag, { "has server timestamp", "", FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_SERVERTIMESTAMP, "", HFILL } }, - { &hf_opcua_variant_encodingmask, { "Variant Type", "", FT_UINT8, BASE_HEX, VALS(g_VariantTypes), 0x0, "", HFILL } }, - { &hf_opcua_SourceTimestamp, { "SourceTimestamp", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } }, - { &hf_opcua_ServerTimestamp, { "ServerTimestamp", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } }, - { &hf_opcua_diag_symbolicid, { "SymblicId", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } }, - { &hf_opcua_diag_namespace, { "Namespace", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } }, - { &hf_opcua_diag_localizedtext, { "LocaliezdText", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } }, - { &hf_opcua_diag_additionalinfo, { "AdditionalInfo", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } }, - { &hf_opcua_diag_innerstatuscode, { "InnerStatusCode", "", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } }, - { &hf_opcua_extobj_mask_binbodyflag, { "has binary body", "", FT_BOOLEAN, 8, NULL, EXTOBJ_ENCODINGMASK_BINBODY_FLAG, "", HFILL } }, - { &hf_opcua_extobj_mask_xmlbodyflag, { "has xml body", "", FT_BOOLEAN, 8, NULL, EXTOBJ_ENCODINGMASK_XMLBODY_FLAG, "", HFILL } } -}; - -void registerSimpleTypes(int proto) -{ - proto_register_field_array(proto, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); -} - -void parseBoolean(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 1, TRUE); *pOffset+=1; -} - -void parseByte(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 1, TRUE); *pOffset+=1; -} - -void parseSByte(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 1, TRUE); *pOffset+=1; -} - -void parseUInt16(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 2, TRUE); *pOffset+=2; -} - -void parseInt16(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 2, TRUE); *pOffset+=2; -} - -void parseUInt32(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -void parseInt32(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -void parseUInt64(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 8, TRUE); *pOffset+=8; -} - -void parseInt64(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 8, TRUE); *pOffset+=8; -} - -void parseString(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - char *szValue = ep_alloc(MAX_BUFFER); - gint iOffset = *pOffset; - gint32 iLen = tvb_get_letohl(tvb, *pOffset); - iOffset+=4; - - if (szValue) - { - if (iLen == -1) - { - g_snprintf(szValue, MAX_BUFFER, "[OpcUa Null String]"); - } - else if (iLen >= 0) - { - int iStrLen = iLen; - if (iStrLen > (MAX_BUFFER-1)) iStrLen = MAX_BUFFER - 1; - /* copy non null terminated string of length iStrlen */ - strncpy(szValue, (char*)&tvb->real_data[iOffset], iStrLen); - /* set null terminator */ - szValue[iStrLen] = 0; - iOffset += iLen; /* eat the whole string */ - } - else - { - g_snprintf(szValue, MAX_BUFFER, "[Invalid String] Ups, something is wrong with this message."); - } - - proto_tree_add_string(tree, hfIndex, tvb, *pOffset, (iOffset - *pOffset), szValue); - *pOffset = iOffset; - } -} - -void parseStatusCode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 4, TRUE); - *pOffset += 4; -} - -void parseLocalizedText(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - gint iOffset = *pOffset; - guint8 EncodingMask; - proto_tree *mask_tree; - proto_tree *subtree; - proto_item *ti; - - ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: LocalizedText", szFieldName); - subtree = proto_item_add_subtree(ti, ett_opcua_localizedtext); - - /* parse encoding mask */ - EncodingMask = tvb_get_guint8(tvb, iOffset); - ti = proto_tree_add_text(subtree, tvb, 0, -1, "EncodingMask"); - mask_tree = proto_item_add_subtree(ti, ett_opcua_localizedtext); - proto_tree_add_item(mask_tree, hf_opcua_loctext_mask_localeflag, tvb, iOffset, 1, TRUE); - proto_tree_add_item(mask_tree, hf_opcua_loctext_mask_textflag, tvb, iOffset, 1, TRUE); - iOffset++; - - if (EncodingMask & LOCALIZEDTEXT_ENCODINGBYTE_LOCALE) - { - parseString(subtree, tvb, &iOffset, hf_opcua_Locale); - } - - if (EncodingMask & LOCALIZEDTEXT_ENCODINGBYTE_TEXT) - { - parseString(subtree, tvb, &iOffset, hf_opcua_Text); - } - - *pOffset = iOffset; -} - -void parseGuid(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - proto_tree_add_item(tree, hfIndex, tvb, *pOffset, GUID_LEN, TRUE); *pOffset+=GUID_LEN; -} - -void parseByteString(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - int iOffset = *pOffset; - gint32 iLen = tvb_get_letohl(tvb, iOffset); - iOffset += 4; - - if (iLen == -1) - { - } - else if (iLen >= 0) - { - iOffset += iLen; - } - proto_tree_add_item(tree, hfIndex, tvb, *pOffset, (iOffset - *pOffset), TRUE); - *pOffset = iOffset; -} - -void parseXmlElement(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - parseByteString(tree, tvb, pOffset, hfIndex); -} - -void parseFloat(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - proto_tree_add_item(tree, hfIndex, tvb, *pOffset, sizeof(gfloat), TRUE); - *pOffset += sizeof(gfloat); -} - -void parseDouble(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - proto_tree_add_item(tree, hfIndex, tvb, *pOffset, sizeof(gdouble), TRUE); - *pOffset += sizeof(gdouble); -} - -void parseDateTime(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) -{ - *pOffset = dissect_nt_64bit_time(tvb, tree, *pOffset, hfIndex); -} - -void parseDiagnosticInfo(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - gint iOffset = *pOffset; - guint8 EncodingMask; - proto_tree *mask_tree; - proto_tree *subtree; - proto_item *ti; - - ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: DiagnosticInfo", szFieldName); - subtree = proto_item_add_subtree(ti, ett_opcua_diagnosticinfo); - - /* parse encoding mask */ - EncodingMask = tvb_get_guint8(tvb, iOffset); - ti = proto_tree_add_text(subtree, tvb, 0, -1, "EncodingMask"); - mask_tree = proto_item_add_subtree(ti, ett_opcua_diagnosticinfo); - proto_tree_add_item(mask_tree, hf_opcua_diag_mask_symbolicflag, tvb, iOffset, 1, TRUE); - proto_tree_add_item(mask_tree, hf_opcua_diag_mask_namespaceflag, tvb, iOffset, 1, TRUE); - proto_tree_add_item(mask_tree, hf_opcua_diag_mask_localizedtextflag, tvb, iOffset, 1, TRUE); - proto_tree_add_item(mask_tree, hf_opcua_diag_mask_additionalinfoflag, tvb, iOffset, 1, TRUE); - proto_tree_add_item(mask_tree, hf_opcua_diag_mask_innerstatuscodeflag, tvb, iOffset, 1, TRUE); - proto_tree_add_item(mask_tree, hf_opcua_diag_mask_innerdiaginfoflag, tvb, iOffset, 1, TRUE); - iOffset++; - - if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_SYMBOLICID_FLAG) - { - parseInt32(subtree, tvb, &iOffset, hf_opcua_diag_symbolicid); - } - if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_NAMESPACE_FLAG) - { - parseInt32(subtree, tvb, &iOffset, hf_opcua_diag_namespace); - } - if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_LOCALIZEDTEXT_FLAG) - { - parseInt32(subtree, tvb, &iOffset, hf_opcua_diag_localizedtext); - } - if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_ADDITIONALINFO_FLAG) - { - parseString(subtree, tvb, &iOffset, hf_opcua_diag_additionalinfo); - } - if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_INNERSTATUSCODE_FLAG) - { - parseStatusCode(subtree, tvb, &iOffset, hf_opcua_diag_innerstatuscode); - } - if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_INNERDIAGNOSTICINFO_FLAG) - { - parseDiagnosticInfo(subtree, tvb, &iOffset, "Inner DiagnosticInfo"); - } - - *pOffset = iOffset; -} - -void parseQualifiedName(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: QualifiedName", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_qualifiedname); - - parseInt32(subtree, tvb, pOffset, hf_opcua_Id); - parseString(subtree, tvb, pOffset, hf_opcua_Name); -} - -void parseDataValue(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: DataValue", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_datavalue); - proto_tree *mask_tree; - gint iOffset = *pOffset; - guint8 EncodingMask; - - EncodingMask = tvb_get_guint8(tvb, iOffset); - ti = proto_tree_add_text(subtree, tvb, 0, -1, "EncodingMask"); - mask_tree = proto_item_add_subtree(ti, ett_opcua_datavalue); - proto_tree_add_item(mask_tree, hf_opcua_datavalue_mask_valueflag, tvb, iOffset, 1, TRUE); - proto_tree_add_item(mask_tree, hf_opcua_datavalue_mask_statuscodeflag, tvb, iOffset, 1, TRUE); - proto_tree_add_item(mask_tree, hf_opcua_datavalue_mask_sourcetimestampflag, tvb, iOffset, 1, TRUE); - proto_tree_add_item(mask_tree, hf_opcua_datavalue_mask_servertimestampflag, tvb, iOffset, 1, TRUE); - iOffset++; - - if (EncodingMask & DATAVALUE_ENCODINGBYTE_VALUE) - { - parseVariant(subtree, tvb, &iOffset, "Value"); - } - if (EncodingMask & DATAVALUE_ENCODINGBYTE_STATUSCODE) - { - parseStatusCode(subtree, tvb, &iOffset, hf_opcua_StatusCode); - } - if (EncodingMask & DATAVALUE_ENCODINGBYTE_SOURCETIMESTAMP) - { - parseDateTime(subtree, tvb, &iOffset, hf_opcua_SourceTimestamp); - } - if (EncodingMask & DATAVALUE_ENCODINGBYTE_SERVERTIMESTAMP) - { - parseDateTime(subtree, tvb, &iOffset, hf_opcua_ServerTimestamp); - } - - *pOffset = iOffset; -} - -void parseVariant(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: Variant", szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_variant); - gint iOffset = *pOffset; - guint8 EncodingMask; - - EncodingMask = tvb_get_guint8(tvb, iOffset); - proto_tree_add_item(subtree, hf_opcua_variant_encodingmask, tvb, iOffset, 1, TRUE); - iOffset++; - - if (EncodingMask & VARIANT_ARRAYMASK) - { - EncodingMask &= ~VARIANT_ARRAYMASK; - - switch(EncodingMask) - { - case OpcUaType_Null: break; - case OpcUaType_Boolean: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Boolean, parseBoolean); break; - case OpcUaType_SByte: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_SByte, parseSByte); break; - case OpcUaType_Byte: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Byte, parseByte); break; - case OpcUaType_Int16: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Int16, parseInt16); break; - case OpcUaType_UInt16: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_UInt16, parseUInt16); break; - case OpcUaType_Int32: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Int32, parseInt32); break; - case OpcUaType_UInt32: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_UInt32, parseUInt32); break; - case OpcUaType_Int64: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Int64, parseInt64); break; - case OpcUaType_UInt64: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_UInt64, parseUInt64); break; - case OpcUaType_Float: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Float, parseFloat); break; - case OpcUaType_Double: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Double, parseDouble); break; - case OpcUaType_String: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_String, parseString); break; - case OpcUaType_DateTime: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_DateTime, parseDateTime); break; - case OpcUaType_Guid: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Guid, parseGuid); break; - case OpcUaType_ByteString: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_ByteString, parseByteString); break; - case OpcUaType_XmlElement: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_XmlElement, parseXmlElement); break; - case OpcUaType_NodeId: parseArrayComplex(subtree, tvb, &iOffset, "NodeId", parseNodeId); break; - case OpcUaType_ExpandedNodeId: parseArrayComplex(subtree, tvb, &iOffset, "ExpandedNodeId", parseExpandedNodeId); break; - case OpcUaType_StatusCode: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_StatusCode, parseStatusCode); break; - case OpcUaType_DiagnosticInfo: parseArrayComplex(subtree, tvb, &iOffset, "DiagnosticInfo", parseDiagnosticInfo); break; - case OpcUaType_QualifiedName: parseArrayComplex(subtree, tvb, &iOffset, "QualifiedName", parseQualifiedName); break; - case OpcUaType_LocalizedText: parseArrayComplex(subtree, tvb, &iOffset, "LocalizedText", parseLocalizedText); break; - case OpcUaType_ExtensionObject: parseArrayComplex(subtree, tvb, &iOffset, "ExtensionObject", parseExtensionObject); break; - case OpcUaType_DataValue: parseArrayComplex(subtree, tvb, &iOffset, "DataValue", parseDataValue); break; - case OpcUaType_Variant: parseArrayComplex(subtree, tvb, &iOffset, "Variant", parseVariant); break; - } - } - else - { - switch(EncodingMask) - { - case OpcUaType_Null: break; - case OpcUaType_Boolean: parseBoolean(subtree, tvb, &iOffset, hf_opcua_Boolean); break; - case OpcUaType_SByte: parseSByte(subtree, tvb, &iOffset, hf_opcua_SByte); break; - case OpcUaType_Byte: parseByte(subtree, tvb, &iOffset, hf_opcua_Byte); break; - case OpcUaType_Int16: parseInt16(subtree, tvb, &iOffset, hf_opcua_Int16); break; - case OpcUaType_UInt16: parseUInt16(subtree, tvb, &iOffset, hf_opcua_UInt16); break; - case OpcUaType_Int32: parseInt32(subtree, tvb, &iOffset, hf_opcua_Int32); break; - case OpcUaType_UInt32: parseUInt32(subtree, tvb, &iOffset, hf_opcua_UInt32); break; - case OpcUaType_Int64: parseInt64(subtree, tvb, &iOffset, hf_opcua_Int64); break; - case OpcUaType_UInt64: parseUInt64(subtree, tvb, &iOffset, hf_opcua_UInt64); break; - case OpcUaType_Float: parseFloat(subtree, tvb, &iOffset, hf_opcua_Float); break; - case OpcUaType_Double: parseDouble(subtree, tvb, &iOffset, hf_opcua_Double); break; - case OpcUaType_String: parseString(subtree, tvb, &iOffset, hf_opcua_String); break; - case OpcUaType_DateTime: parseDateTime(subtree, tvb, &iOffset, hf_opcua_DateTime); break; - case OpcUaType_Guid: parseGuid(subtree, tvb, &iOffset, hf_opcua_Guid); break; - case OpcUaType_ByteString: parseByteString(subtree, tvb, &iOffset, hf_opcua_ByteString); break; - case OpcUaType_XmlElement: parseXmlElement(subtree, tvb, &iOffset, hf_opcua_XmlElement); break; - case OpcUaType_NodeId: parseNodeId(subtree, tvb, &iOffset, "Value"); break; - case OpcUaType_ExpandedNodeId: parseExpandedNodeId(subtree, tvb, &iOffset, "Value"); break; - case OpcUaType_StatusCode: parseStatusCode(subtree, tvb, &iOffset, hf_opcua_StatusCode); break; - case OpcUaType_DiagnosticInfo: parseDiagnosticInfo(subtree, tvb, &iOffset, "Value"); break; - case OpcUaType_QualifiedName: parseQualifiedName(subtree, tvb, &iOffset, "Value"); break; - case OpcUaType_LocalizedText: parseLocalizedText(subtree, tvb, &iOffset, "Value"); break; - case OpcUaType_ExtensionObject: parseExtensionObject(subtree, tvb, &iOffset, "Value"); break; - case OpcUaType_DataValue: parseDataValue(subtree, tvb, &iOffset, "Value"); break; - case OpcUaType_Variant: parseVariant(subtree, tvb, &iOffset, "Value"); break; - } - } - - *pOffset = iOffset; -} - -/** General parsing function for arrays of simple types. - * All arrays have one 4 byte signed integer length information, - * followed by n data elements. - */ -void parseArraySimple(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex, fctSimpleTypeParser pParserFunction) -{ - char szFieldName[] = "Array of Simple Type"; - proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, szFieldName); - proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_array); - int i; - gint32 iLen; - - /* read array length */ - iLen = tvb_get_letohl(tvb, *pOffset); - proto_tree_add_item(subtree, hf_opcua_ArraySize, tvb, *pOffset, 4, TRUE); - *pOffset += 4; - - if (iLen == -1) return; /* no array */ - if (iLen == 0) return; /* array with zero elements*/ - - for (i=0; i +** Last change by: $Author: gergap $ +** +******************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include "opcua_simpletypes.h" +#include "opcua_hfindeces.h" +#include +#include + +/* string buffer */ +#define MAX_BUFFER 256 + +#define DIAGNOSTICINFO_ENCODINGMASK_SYMBOLICID_FLAG 0x01 +#define DIAGNOSTICINFO_ENCODINGMASK_NAMESPACE_FLAG 0x02 +#define DIAGNOSTICINFO_ENCODINGMASK_LOCALIZEDTEXT_FLAG 0x04 +#define DIAGNOSTICINFO_ENCODINGMASK_ADDITIONALINFO_FLAG 0x08 +#define DIAGNOSTICINFO_ENCODINGMASK_INNERSTATUSCODE_FLAG 0x10 +#define DIAGNOSTICINFO_ENCODINGMASK_INNERDIAGNOSTICINFO_FLAG 0x20 +#define LOCALIZEDTEXT_ENCODINGBYTE_LOCALE 0x01 +#define LOCALIZEDTEXT_ENCODINGBYTE_TEXT 0x02 +#define NODEID_URIMASK 0x80 +#define DATAVALUE_ENCODINGBYTE_VALUE 0x01 +#define DATAVALUE_ENCODINGBYTE_STATUSCODE 0x02 +#define DATAVALUE_ENCODINGBYTE_SOURCETIMESTAMP 0x04 +#define DATAVALUE_ENCODINGBYTE_SERVERTIMESTAMP 0x08 +#define EXTOBJ_ENCODINGMASK_BINBODY_FLAG 0x01 +#define EXTOBJ_ENCODINGMASK_XMLBODY_FLAG 0x02 + +static int hf_opcua_diag_mask_symbolicflag = -1; +static int hf_opcua_diag_mask_namespaceflag = -1; +static int hf_opcua_diag_mask_localizedtextflag = -1; +static int hf_opcua_diag_mask_additionalinfoflag = -1; +static int hf_opcua_diag_mask_innerstatuscodeflag = -1; +static int hf_opcua_diag_mask_innerdiaginfoflag = -1; +static int hf_opcua_loctext_mask_localeflag = -1; +static int hf_opcua_loctext_mask_textflag = -1; +static int hf_opcua_datavalue_mask_valueflag = -1; +static int hf_opcua_datavalue_mask_statuscodeflag = -1; +static int hf_opcua_datavalue_mask_sourcetimestampflag = -1; +static int hf_opcua_datavalue_mask_servertimestampflag = -1; +static int hf_opcua_nodeid_encodingmask = -1; +static int hf_opcua_variant_encodingmask = -1; +static int hf_opcua_nodeid_nsid = -1; +static int hf_opcua_nodeid_numeric = -1; +static int hf_opcua_Locale = -1; +static int hf_opcua_Text = -1; +static int hf_opcua_SourceTimestamp = -1; +static int hf_opcua_ServerTimestamp = -1; +static int hf_opcua_diag_symbolicid = -1; +static int hf_opcua_diag_namespace = -1; +static int hf_opcua_diag_localizedtext = -1; +static int hf_opcua_diag_additionalinfo = -1; +static int hf_opcua_diag_innerstatuscode = -1; +static int hf_opcua_extobj_mask_binbodyflag = -1; +static int hf_opcua_extobj_mask_xmlbodyflag = -1; + +/** NodeId encoding mask table */ +static const value_string g_nodeidmasks[] = { + { 0, "Two byte encoded Numeric" }, + { 1, "Four byte encoded Numeric" }, + { 2, "Numeric of arbitrary length" }, + { 3, "String" }, + { 4, "URI" }, + { 5, "GUID" }, + { 6, "ByteString" }, + { 0x80, "UriMask" }, + { 0, NULL } +}; + +/** UA Variant Type enum */ +typedef enum _OpcUa_BuiltInType +{ + OpcUaType_Null = 0, + OpcUaType_Boolean = 1, + OpcUaType_SByte = 2, + OpcUaType_Byte = 3, + OpcUaType_Int16 = 4, + OpcUaType_UInt16 = 5, + OpcUaType_Int32 = 6, + OpcUaType_UInt32 = 7, + OpcUaType_Int64 = 8, + OpcUaType_UInt64 = 9, + OpcUaType_Float = 10, + OpcUaType_Double = 11, + OpcUaType_String = 12, + OpcUaType_DateTime = 13, + OpcUaType_Guid = 14, + OpcUaType_ByteString = 15, + OpcUaType_XmlElement = 16, + OpcUaType_NodeId = 17, + OpcUaType_ExpandedNodeId = 18, + OpcUaType_StatusCode = 19, + OpcUaType_DiagnosticInfo = 20, + OpcUaType_QualifiedName = 21, + OpcUaType_LocalizedText = 22, + OpcUaType_ExtensionObject = 23, + OpcUaType_DataValue = 24, + OpcUaType_Variant = 25 +} +OpcUa_BuiltInType; + +/** Variant encoding mask table */ +static const value_string g_VariantTypes[] = { + { 0, "Null" }, + { 1, "Boolean" }, + { 2, "SByte" }, + { 3, "Byte" }, + { 4, "Int16" }, + { 5, "UInt16" }, + { 6, "Int32" }, + { 7, "UInt32" }, + { 8, "Int64" }, + { 9, "UInt64" }, + { 10, "Float" }, + { 11, "Double" }, + { 12, "String" }, + { 13, "DateTime" }, + { 14, "Guid" }, + { 15, "ByteString" }, + { 16, "XmlElement" }, + { 17, "NodeId" }, + { 18, "ExpandedNodeId" }, + { 19, "StatusCode" }, + { 20, "DiagnosticInfo" }, + { 21, "QualifiedName" }, + { 22, "LocalizedText" }, + { 23, "ExtensionObject" }, + { 24, "DataValue" }, + { 25, "Variant" }, + { 0x80, "Array of Null" }, + { 0x80+1, "Array of Boolean" }, + { 0x80+2, "Array of SByte" }, + { 0x80+3, "Array of Byte" }, + { 0x80+4, "Array of Int16" }, + { 0x80+5, "Array of UInt16" }, + { 0x80+6, "Array of Int32" }, + { 0x80+7, "Array of UInt32" }, + { 0x80+8, "Array of Int64" }, + { 0x80+9, "Array of UInt64" }, + { 0x80+10, "Array of Float" }, + { 0x80+11, "Array of Double" }, + { 0x80+12, "Array of String" }, + { 0x80+13, "Array of DateTime" }, + { 0x80+14, "Array of Guid" }, + { 0x80+15, "Array of ByteString" }, + { 0x80+16, "Array of XmlElement" }, + { 0x80+17, "Array of NodeId" }, + { 0x80+18, "Array of ExpandedNodeId" }, + { 0x80+19, "Array of StatusCode" }, + { 0x80+20, "Array of DiagnosticInfo" }, + { 0x80+21, "Array of QualifiedName" }, + { 0x80+22, "Array of LocalizedText" }, + { 0x80+23, "Array of ExtensionObject" }, + { 0x80+24, "Array of DataValue" }, + { 0x80+25, "Array of Variant" }, + { 0, NULL } +}; +#define VARIANT_ARRAYMASK 0x80 + +/* trees */ +static gint ett_opcua_array = -1; +static gint ett_opcua_diagnosticinfo = -1; +static gint ett_opcua_nodeid = -1; +static gint ett_opcua_localeid = -1; +static gint ett_opcua_localizedtext = -1; +static gint ett_opcua_qualifiedname = -1; +static gint ett_opcua_datavalue = -1; +static gint ett_opcua_variant = -1; +static gint ett_opcua_extensionobject = -1; +static gint ett_opcua_extobj_encodingmask = -1; +static gint *ett[] = +{ + &ett_opcua_array, + &ett_opcua_diagnosticinfo, + &ett_opcua_nodeid, + &ett_opcua_localeid, + &ett_opcua_localizedtext, + &ett_opcua_qualifiedname, + &ett_opcua_datavalue, + &ett_opcua_variant, + &ett_opcua_extensionobject, + &ett_opcua_extobj_encodingmask +}; + + +static hf_register_info hf[] = +{ + /* full name , abbreviation , type , display , strings, bitmask, blurb, id, parent, ref_count, bitshift */ + { &hf_opcua_diag_mask_symbolicflag, + { "has symbolic id", "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_SYMBOLICID_FLAG, "", HFILL } + }, + { &hf_opcua_diag_mask_namespaceflag, + { "has namespace", "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_NAMESPACE_FLAG, "", HFILL } + }, + { &hf_opcua_diag_mask_localizedtextflag, + { "has localizedtext", "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_LOCALIZEDTEXT_FLAG, "", HFILL } + }, + { &hf_opcua_diag_mask_additionalinfoflag, + { "has additional info", "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_ADDITIONALINFO_FLAG, "", HFILL } + }, + { &hf_opcua_diag_mask_innerstatuscodeflag, + { "has inner statuscode", "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_INNERSTATUSCODE_FLAG, "", HFILL } + }, + { &hf_opcua_diag_mask_innerdiaginfoflag, + { "has inner diagnostic info", "", FT_BOOLEAN, 8, NULL, DIAGNOSTICINFO_ENCODINGMASK_INNERDIAGNOSTICINFO_FLAG, "", HFILL } + }, + { &hf_opcua_loctext_mask_localeflag, + { "has locale information", "", FT_BOOLEAN, 8, NULL, LOCALIZEDTEXT_ENCODINGBYTE_LOCALE, "", HFILL } + }, + { &hf_opcua_loctext_mask_textflag, + { "has text", "", FT_BOOLEAN, 8, NULL, LOCALIZEDTEXT_ENCODINGBYTE_TEXT, "", HFILL } + }, + { &hf_opcua_nodeid_encodingmask, + { "NodeId EncodingMask", "application.nodeid.encodingmask", FT_UINT8, BASE_HEX, VALS(g_nodeidmasks), 0x0, "", HFILL } + }, + { &hf_opcua_nodeid_nsid, + { "NodeId Namespace Id", "application.nodeid.nsid", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_nodeid_numeric, + { "NodeId Identifier Numeric", "application.nodeid.numeric", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_Locale, { "Locale", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } }, + { &hf_opcua_Text, { "Text", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } }, + { &hf_opcua_datavalue_mask_valueflag, { "has value", "", FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_VALUE, "", HFILL } }, + { &hf_opcua_datavalue_mask_statuscodeflag, { "has statuscode", "", FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_STATUSCODE, "", HFILL } }, + { &hf_opcua_datavalue_mask_sourcetimestampflag, { "has source timestamp", "", FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_SOURCETIMESTAMP, "", HFILL } }, + { &hf_opcua_datavalue_mask_servertimestampflag, { "has server timestamp", "", FT_BOOLEAN, 8, NULL, DATAVALUE_ENCODINGBYTE_SERVERTIMESTAMP, "", HFILL } }, + { &hf_opcua_variant_encodingmask, { "Variant Type", "", FT_UINT8, BASE_HEX, VALS(g_VariantTypes), 0x0, "", HFILL } }, + { &hf_opcua_SourceTimestamp, { "SourceTimestamp", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } }, + { &hf_opcua_ServerTimestamp, { "ServerTimestamp", "", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "", HFILL } }, + { &hf_opcua_diag_symbolicid, { "SymblicId", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } }, + { &hf_opcua_diag_namespace, { "Namespace", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } }, + { &hf_opcua_diag_localizedtext, { "LocaliezdText", "", FT_INT32, BASE_DEC, NULL, 0x0, "", HFILL } }, + { &hf_opcua_diag_additionalinfo, { "AdditionalInfo", "", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } }, + { &hf_opcua_diag_innerstatuscode, { "InnerStatusCode", "", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL } }, + { &hf_opcua_extobj_mask_binbodyflag, { "has binary body", "", FT_BOOLEAN, 8, NULL, EXTOBJ_ENCODINGMASK_BINBODY_FLAG, "", HFILL } }, + { &hf_opcua_extobj_mask_xmlbodyflag, { "has xml body", "", FT_BOOLEAN, 8, NULL, EXTOBJ_ENCODINGMASK_XMLBODY_FLAG, "", HFILL } } +}; + +void registerSimpleTypes(int proto) +{ + proto_register_field_array(proto, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); +} + +void parseBoolean(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 1, TRUE); *pOffset+=1; +} + +void parseByte(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 1, TRUE); *pOffset+=1; +} + +void parseSByte(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 1, TRUE); *pOffset+=1; +} + +void parseUInt16(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 2, TRUE); *pOffset+=2; +} + +void parseInt16(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 2, TRUE); *pOffset+=2; +} + +void parseUInt32(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +void parseInt32(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +void parseUInt64(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 8, TRUE); *pOffset+=8; +} + +void parseInt64(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 8, TRUE); *pOffset+=8; +} + +void parseString(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + char *szValue = ep_alloc(MAX_BUFFER); + gint iOffset = *pOffset; + gint32 iLen = tvb_get_letohl(tvb, *pOffset); + iOffset+=4; + + if (szValue) + { + if (iLen == -1) + { + g_snprintf(szValue, MAX_BUFFER, "[OpcUa Null String]"); + } + else if (iLen >= 0) + { + int iStrLen = iLen; + if (iStrLen > (MAX_BUFFER-1)) iStrLen = MAX_BUFFER - 1; + /* copy non null terminated string of length iStrlen */ + strncpy(szValue, (char*)&tvb->real_data[iOffset], iStrLen); + /* set null terminator */ + szValue[iStrLen] = 0; + iOffset += iLen; /* eat the whole string */ + } + else + { + g_snprintf(szValue, MAX_BUFFER, "[Invalid String] Ups, something is wrong with this message."); + } + + proto_tree_add_string(tree, hfIndex, tvb, *pOffset, (iOffset - *pOffset), szValue); + *pOffset = iOffset; + } +} + +void parseStatusCode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + proto_tree_add_item(tree, hfIndex, tvb, *pOffset, 4, TRUE); + *pOffset += 4; +} + +void parseLocalizedText(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + gint iOffset = *pOffset; + guint8 EncodingMask; + proto_tree *mask_tree; + proto_tree *subtree; + proto_item *ti; + + ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: LocalizedText", szFieldName); + subtree = proto_item_add_subtree(ti, ett_opcua_localizedtext); + + /* parse encoding mask */ + EncodingMask = tvb_get_guint8(tvb, iOffset); + ti = proto_tree_add_text(subtree, tvb, 0, -1, "EncodingMask"); + mask_tree = proto_item_add_subtree(ti, ett_opcua_localizedtext); + proto_tree_add_item(mask_tree, hf_opcua_loctext_mask_localeflag, tvb, iOffset, 1, TRUE); + proto_tree_add_item(mask_tree, hf_opcua_loctext_mask_textflag, tvb, iOffset, 1, TRUE); + iOffset++; + + if (EncodingMask & LOCALIZEDTEXT_ENCODINGBYTE_LOCALE) + { + parseString(subtree, tvb, &iOffset, hf_opcua_Locale); + } + + if (EncodingMask & LOCALIZEDTEXT_ENCODINGBYTE_TEXT) + { + parseString(subtree, tvb, &iOffset, hf_opcua_Text); + } + + *pOffset = iOffset; +} + +void parseGuid(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + proto_tree_add_item(tree, hfIndex, tvb, *pOffset, GUID_LEN, TRUE); *pOffset+=GUID_LEN; +} + +void parseByteString(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + int iOffset = *pOffset; + gint32 iLen = tvb_get_letohl(tvb, iOffset); + iOffset += 4; + + if (iLen == -1) + { + } + else if (iLen >= 0) + { + iOffset += iLen; + } + proto_tree_add_item(tree, hfIndex, tvb, *pOffset, (iOffset - *pOffset), TRUE); + *pOffset = iOffset; +} + +void parseXmlElement(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + parseByteString(tree, tvb, pOffset, hfIndex); +} + +void parseFloat(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + proto_tree_add_item(tree, hfIndex, tvb, *pOffset, sizeof(gfloat), TRUE); + *pOffset += sizeof(gfloat); +} + +void parseDouble(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + proto_tree_add_item(tree, hfIndex, tvb, *pOffset, sizeof(gdouble), TRUE); + *pOffset += sizeof(gdouble); +} + +void parseDateTime(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +{ + *pOffset = dissect_nt_64bit_time(tvb, tree, *pOffset, hfIndex); +} + +void parseDiagnosticInfo(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + gint iOffset = *pOffset; + guint8 EncodingMask; + proto_tree *mask_tree; + proto_tree *subtree; + proto_item *ti; + + ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: DiagnosticInfo", szFieldName); + subtree = proto_item_add_subtree(ti, ett_opcua_diagnosticinfo); + + /* parse encoding mask */ + EncodingMask = tvb_get_guint8(tvb, iOffset); + ti = proto_tree_add_text(subtree, tvb, 0, -1, "EncodingMask"); + mask_tree = proto_item_add_subtree(ti, ett_opcua_diagnosticinfo); + proto_tree_add_item(mask_tree, hf_opcua_diag_mask_symbolicflag, tvb, iOffset, 1, TRUE); + proto_tree_add_item(mask_tree, hf_opcua_diag_mask_namespaceflag, tvb, iOffset, 1, TRUE); + proto_tree_add_item(mask_tree, hf_opcua_diag_mask_localizedtextflag, tvb, iOffset, 1, TRUE); + proto_tree_add_item(mask_tree, hf_opcua_diag_mask_additionalinfoflag, tvb, iOffset, 1, TRUE); + proto_tree_add_item(mask_tree, hf_opcua_diag_mask_innerstatuscodeflag, tvb, iOffset, 1, TRUE); + proto_tree_add_item(mask_tree, hf_opcua_diag_mask_innerdiaginfoflag, tvb, iOffset, 1, TRUE); + iOffset++; + + if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_SYMBOLICID_FLAG) + { + parseInt32(subtree, tvb, &iOffset, hf_opcua_diag_symbolicid); + } + if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_NAMESPACE_FLAG) + { + parseInt32(subtree, tvb, &iOffset, hf_opcua_diag_namespace); + } + if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_LOCALIZEDTEXT_FLAG) + { + parseInt32(subtree, tvb, &iOffset, hf_opcua_diag_localizedtext); + } + if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_ADDITIONALINFO_FLAG) + { + parseString(subtree, tvb, &iOffset, hf_opcua_diag_additionalinfo); + } + if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_INNERSTATUSCODE_FLAG) + { + parseStatusCode(subtree, tvb, &iOffset, hf_opcua_diag_innerstatuscode); + } + if (EncodingMask & DIAGNOSTICINFO_ENCODINGMASK_INNERDIAGNOSTICINFO_FLAG) + { + parseDiagnosticInfo(subtree, tvb, &iOffset, "Inner DiagnosticInfo"); + } + + *pOffset = iOffset; +} + +void parseQualifiedName(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: QualifiedName", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_qualifiedname); + + parseInt32(subtree, tvb, pOffset, hf_opcua_Id); + parseString(subtree, tvb, pOffset, hf_opcua_Name); +} + +void parseDataValue(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: DataValue", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_datavalue); + proto_tree *mask_tree; + gint iOffset = *pOffset; + guint8 EncodingMask; + + EncodingMask = tvb_get_guint8(tvb, iOffset); + ti = proto_tree_add_text(subtree, tvb, 0, -1, "EncodingMask"); + mask_tree = proto_item_add_subtree(ti, ett_opcua_datavalue); + proto_tree_add_item(mask_tree, hf_opcua_datavalue_mask_valueflag, tvb, iOffset, 1, TRUE); + proto_tree_add_item(mask_tree, hf_opcua_datavalue_mask_statuscodeflag, tvb, iOffset, 1, TRUE); + proto_tree_add_item(mask_tree, hf_opcua_datavalue_mask_sourcetimestampflag, tvb, iOffset, 1, TRUE); + proto_tree_add_item(mask_tree, hf_opcua_datavalue_mask_servertimestampflag, tvb, iOffset, 1, TRUE); + iOffset++; + + if (EncodingMask & DATAVALUE_ENCODINGBYTE_VALUE) + { + parseVariant(subtree, tvb, &iOffset, "Value"); + } + if (EncodingMask & DATAVALUE_ENCODINGBYTE_STATUSCODE) + { + parseStatusCode(subtree, tvb, &iOffset, hf_opcua_StatusCode); + } + if (EncodingMask & DATAVALUE_ENCODINGBYTE_SOURCETIMESTAMP) + { + parseDateTime(subtree, tvb, &iOffset, hf_opcua_SourceTimestamp); + } + if (EncodingMask & DATAVALUE_ENCODINGBYTE_SERVERTIMESTAMP) + { + parseDateTime(subtree, tvb, &iOffset, hf_opcua_ServerTimestamp); + } + + *pOffset = iOffset; +} + +void parseVariant(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, "%s: Variant", szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_variant); + gint iOffset = *pOffset; + guint8 EncodingMask; + + EncodingMask = tvb_get_guint8(tvb, iOffset); + proto_tree_add_item(subtree, hf_opcua_variant_encodingmask, tvb, iOffset, 1, TRUE); + iOffset++; + + if (EncodingMask & VARIANT_ARRAYMASK) + { + EncodingMask &= ~VARIANT_ARRAYMASK; + + switch(EncodingMask) + { + case OpcUaType_Null: break; + case OpcUaType_Boolean: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Boolean, parseBoolean); break; + case OpcUaType_SByte: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_SByte, parseSByte); break; + case OpcUaType_Byte: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Byte, parseByte); break; + case OpcUaType_Int16: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Int16, parseInt16); break; + case OpcUaType_UInt16: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_UInt16, parseUInt16); break; + case OpcUaType_Int32: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Int32, parseInt32); break; + case OpcUaType_UInt32: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_UInt32, parseUInt32); break; + case OpcUaType_Int64: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Int64, parseInt64); break; + case OpcUaType_UInt64: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_UInt64, parseUInt64); break; + case OpcUaType_Float: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Float, parseFloat); break; + case OpcUaType_Double: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Double, parseDouble); break; + case OpcUaType_String: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_String, parseString); break; + case OpcUaType_DateTime: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_DateTime, parseDateTime); break; + case OpcUaType_Guid: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_Guid, parseGuid); break; + case OpcUaType_ByteString: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_ByteString, parseByteString); break; + case OpcUaType_XmlElement: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_XmlElement, parseXmlElement); break; + case OpcUaType_NodeId: parseArrayComplex(subtree, tvb, &iOffset, "NodeId", parseNodeId); break; + case OpcUaType_ExpandedNodeId: parseArrayComplex(subtree, tvb, &iOffset, "ExpandedNodeId", parseExpandedNodeId); break; + case OpcUaType_StatusCode: parseArraySimple(subtree, tvb, &iOffset, hf_opcua_StatusCode, parseStatusCode); break; + case OpcUaType_DiagnosticInfo: parseArrayComplex(subtree, tvb, &iOffset, "DiagnosticInfo", parseDiagnosticInfo); break; + case OpcUaType_QualifiedName: parseArrayComplex(subtree, tvb, &iOffset, "QualifiedName", parseQualifiedName); break; + case OpcUaType_LocalizedText: parseArrayComplex(subtree, tvb, &iOffset, "LocalizedText", parseLocalizedText); break; + case OpcUaType_ExtensionObject: parseArrayComplex(subtree, tvb, &iOffset, "ExtensionObject", parseExtensionObject); break; + case OpcUaType_DataValue: parseArrayComplex(subtree, tvb, &iOffset, "DataValue", parseDataValue); break; + case OpcUaType_Variant: parseArrayComplex(subtree, tvb, &iOffset, "Variant", parseVariant); break; + } + } + else + { + switch(EncodingMask) + { + case OpcUaType_Null: break; + case OpcUaType_Boolean: parseBoolean(subtree, tvb, &iOffset, hf_opcua_Boolean); break; + case OpcUaType_SByte: parseSByte(subtree, tvb, &iOffset, hf_opcua_SByte); break; + case OpcUaType_Byte: parseByte(subtree, tvb, &iOffset, hf_opcua_Byte); break; + case OpcUaType_Int16: parseInt16(subtree, tvb, &iOffset, hf_opcua_Int16); break; + case OpcUaType_UInt16: parseUInt16(subtree, tvb, &iOffset, hf_opcua_UInt16); break; + case OpcUaType_Int32: parseInt32(subtree, tvb, &iOffset, hf_opcua_Int32); break; + case OpcUaType_UInt32: parseUInt32(subtree, tvb, &iOffset, hf_opcua_UInt32); break; + case OpcUaType_Int64: parseInt64(subtree, tvb, &iOffset, hf_opcua_Int64); break; + case OpcUaType_UInt64: parseUInt64(subtree, tvb, &iOffset, hf_opcua_UInt64); break; + case OpcUaType_Float: parseFloat(subtree, tvb, &iOffset, hf_opcua_Float); break; + case OpcUaType_Double: parseDouble(subtree, tvb, &iOffset, hf_opcua_Double); break; + case OpcUaType_String: parseString(subtree, tvb, &iOffset, hf_opcua_String); break; + case OpcUaType_DateTime: parseDateTime(subtree, tvb, &iOffset, hf_opcua_DateTime); break; + case OpcUaType_Guid: parseGuid(subtree, tvb, &iOffset, hf_opcua_Guid); break; + case OpcUaType_ByteString: parseByteString(subtree, tvb, &iOffset, hf_opcua_ByteString); break; + case OpcUaType_XmlElement: parseXmlElement(subtree, tvb, &iOffset, hf_opcua_XmlElement); break; + case OpcUaType_NodeId: parseNodeId(subtree, tvb, &iOffset, "Value"); break; + case OpcUaType_ExpandedNodeId: parseExpandedNodeId(subtree, tvb, &iOffset, "Value"); break; + case OpcUaType_StatusCode: parseStatusCode(subtree, tvb, &iOffset, hf_opcua_StatusCode); break; + case OpcUaType_DiagnosticInfo: parseDiagnosticInfo(subtree, tvb, &iOffset, "Value"); break; + case OpcUaType_QualifiedName: parseQualifiedName(subtree, tvb, &iOffset, "Value"); break; + case OpcUaType_LocalizedText: parseLocalizedText(subtree, tvb, &iOffset, "Value"); break; + case OpcUaType_ExtensionObject: parseExtensionObject(subtree, tvb, &iOffset, "Value"); break; + case OpcUaType_DataValue: parseDataValue(subtree, tvb, &iOffset, "Value"); break; + case OpcUaType_Variant: parseVariant(subtree, tvb, &iOffset, "Value"); break; + } + } + + *pOffset = iOffset; +} + +/** General parsing function for arrays of simple types. + * All arrays have one 4 byte signed integer length information, + * followed by n data elements. + */ +void parseArraySimple(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex, fctSimpleTypeParser pParserFunction) +{ + char szFieldName[] = "Array of Simple Type"; + proto_item *ti = proto_tree_add_text(tree, tvb, 0, -1, szFieldName); + proto_tree *subtree = proto_item_add_subtree(ti, ett_opcua_array); + int i; + gint32 iLen; + + /* read array length */ + iLen = tvb_get_letohl(tvb, *pOffset); + proto_tree_add_item(subtree, hf_opcua_ArraySize, tvb, *pOffset, 4, TRUE); + *pOffset += 4; + + if (iLen == -1) return; /* no array */ + if (iLen == 0) return; /* array with zero elements*/ + + for (i=0; i -** Last change by: $Author: gergap $ -** -******************************************************************************/ -#include "opcua_identifiers.h" - -/* simple types */ -void parseBoolean(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -void parseByte(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -void parseSByte(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -void parseUInt16(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -void parseInt16(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -void parseUInt32(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -void parseInt32(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -void parseUInt64(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -void parseInt64(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -void parseString(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -void parseGuid(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -void parseByteString(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -void parseXmlElement(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -void parseFloat(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -void parseDouble(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -void parseDateTime(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -void parseStatusCode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); -/* complex types */ -void parseLocalizedText(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); -void parseNodeId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); -void parseDiagnosticInfo(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); -void parseExtensionObject(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); -void parseQualifiedName(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); -void parseDataValue(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); -void parseVariant(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); -void parseExpandedNodeId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); -void parseArraySimple(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex, fctSimpleTypeParser pParserFunction); -void parseArrayEnum(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, fctEnumParser pParserFunction); -void parseArrayComplex(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName, fctComplexTypeParser pParserFunction); -void registerSimpleTypes(int proto); +/****************************************************************************** +** $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: Implementation of OpcUa built-in type parsers. +** This contains all the simple types and some complex types. +** +** Author: Gerhard Gappmeier +** Last change by: $Author: gergap $ +** +******************************************************************************/ +#include "opcua_identifiers.h" + +/* simple types */ +void parseBoolean(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +void parseByte(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +void parseSByte(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +void parseUInt16(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +void parseInt16(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +void parseUInt32(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +void parseInt32(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +void parseUInt64(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +void parseInt64(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +void parseString(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +void parseGuid(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +void parseByteString(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +void parseXmlElement(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +void parseFloat(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +void parseDouble(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +void parseDateTime(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +void parseStatusCode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex); +/* complex types */ +void parseLocalizedText(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); +void parseNodeId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); +void parseDiagnosticInfo(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); +void parseExtensionObject(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); +void parseQualifiedName(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); +void parseDataValue(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); +void parseVariant(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); +void parseExpandedNodeId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); +void parseArraySimple(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex, fctSimpleTypeParser pParserFunction); +void parseArrayEnum(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, fctEnumParser pParserFunction); +void parseArrayComplex(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName, fctComplexTypeParser pParserFunction); +void registerSimpleTypes(int proto); diff --git a/plugins/opcua/ua_application_layer.c b/plugins/opcua/ua_application_layer.c index 7c7670f7b9..0626cfb517 100644 --- a/plugins/opcua/ua_application_layer.c +++ b/plugins/opcua/ua_application_layer.c @@ -1,122 +1,122 @@ -/****************************************************************************** -** $Id: ua_application_layer.c,v 1.3 2007/02/08 11:31:56 gergap Exp $ -** -** 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 Application Layer Decoder. -** -** Author: Gerhard Gappmeier -** Last change by: $Author: gergap $ -** -******************************************************************************/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include "opcua_simpletypes.h" - -/** NodeId encoding mask table */ -static const value_string g_nodeidmasks[] = { - { 0, "Two byte encoded Numeric" }, - { 1, "Four byte encoded Numeric" }, - { 2, "Numeric of arbitrary length" }, - { 3, "String" }, - { 4, "URI" }, - { 5, "GUID" }, - { 6, "ByteString" }, - { 0x80, "UriMask" }, - { 0, NULL } -}; - -/** Service type table */ -extern const value_string g_requesttypes[]; - -static int hf_opcua_nodeid_encodingmask = -1; -static int hf_opcua_app_nsid = -1; -static int hf_opcua_app_numeric = -1; - -/** header field definitions */ -static hf_register_info hf[] = -{ - { &hf_opcua_nodeid_encodingmask, - { "NodeId EncodingMask", "application.nodeid.encodingmask", FT_UINT8, BASE_HEX, VALS(g_nodeidmasks), 0x0, "", HFILL } - }, - { &hf_opcua_app_nsid, - { "NodeId EncodingMask", "application.nodeid.nsid", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_app_numeric, - { "NodeId Identifier Numeric", "application.nodeid.numeric", FT_UINT32, BASE_DEC, VALS(g_requesttypes), 0x0, "", HFILL } - } -}; - -/** Register application layer types. */ -void registerApplicationLayerTypes(int proto) -{ - proto_register_field_array(proto, hf, array_length(hf)); -} - -/** Parses an OpcUa Service NodeId and returns the service type. - * In this cases the NodeId is always from type numeric and NSId = 0. - */ -int parseServiceNodeId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) -{ - gint iOffset = *pOffset; - guint8 EncodingMask, NSId = 0; - guint32 Numeric = 0; - - szFieldName = 0; /* avoid warning */ - - EncodingMask = tvb_get_guint8(tvb, iOffset); - proto_tree_add_item(tree, hf_opcua_nodeid_encodingmask, tvb, iOffset, 1, TRUE); - iOffset++; - - switch(EncodingMask) - { - case 0x00: /* two byte node id */ - Numeric = tvb_get_guint8(tvb, iOffset); - proto_tree_add_item(tree, hf_opcua_app_numeric, tvb, iOffset, 1, TRUE); - iOffset+=1; - break; - case 0x01: /* four byte node id */ - NSId = tvb_get_guint8(tvb, iOffset); - proto_tree_add_item(tree, hf_opcua_app_nsid, tvb, iOffset, 1, TRUE); - iOffset+=1; - Numeric = tvb_get_letohs(tvb, iOffset); - proto_tree_add_item(tree, hf_opcua_app_numeric, tvb, iOffset, 2, TRUE); - iOffset+=2; - break; - case 0x02: /* numeric, that does not fit into four bytes */ - NSId = tvb_get_letohl(tvb, iOffset); - proto_tree_add_item(tree, hf_opcua_app_nsid, tvb, iOffset, 4, TRUE); - iOffset+=4; - Numeric = tvb_get_letohl(tvb, iOffset); - proto_tree_add_item(tree, hf_opcua_app_numeric, tvb, iOffset, 4, TRUE); - iOffset+=4; - break; - case 0x03: /* string */ - case 0x04: /* uri */ - case 0x05: /* guid */ - case 0x06: /* byte string */ - /* NOT USED */ - break; - }; - - *pOffset = iOffset; - - return Numeric; -} - +/****************************************************************************** +** $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 Application Layer Decoder. +** +** Author: Gerhard Gappmeier +** Last change by: $Author: gergap $ +** +******************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include "opcua_simpletypes.h" + +/** NodeId encoding mask table */ +static const value_string g_nodeidmasks[] = { + { 0, "Two byte encoded Numeric" }, + { 1, "Four byte encoded Numeric" }, + { 2, "Numeric of arbitrary length" }, + { 3, "String" }, + { 4, "URI" }, + { 5, "GUID" }, + { 6, "ByteString" }, + { 0x80, "UriMask" }, + { 0, NULL } +}; + +/** Service type table */ +extern const value_string g_requesttypes[]; + +static int hf_opcua_nodeid_encodingmask = -1; +static int hf_opcua_app_nsid = -1; +static int hf_opcua_app_numeric = -1; + +/** header field definitions */ +static hf_register_info hf[] = +{ + { &hf_opcua_nodeid_encodingmask, + { "NodeId EncodingMask", "application.nodeid.encodingmask", FT_UINT8, BASE_HEX, VALS(g_nodeidmasks), 0x0, "", HFILL } + }, + { &hf_opcua_app_nsid, + { "NodeId EncodingMask", "application.nodeid.nsid", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_app_numeric, + { "NodeId Identifier Numeric", "application.nodeid.numeric", FT_UINT32, BASE_DEC, VALS(g_requesttypes), 0x0, "", HFILL } + } +}; + +/** Register application layer types. */ +void registerApplicationLayerTypes(int proto) +{ + proto_register_field_array(proto, hf, array_length(hf)); +} + +/** Parses an OpcUa Service NodeId and returns the service type. + * In this cases the NodeId is always from type numeric and NSId = 0. + */ +int parseServiceNodeId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName) +{ + gint iOffset = *pOffset; + guint8 EncodingMask, NSId = 0; + guint32 Numeric = 0; + + szFieldName = 0; /* avoid warning */ + + EncodingMask = tvb_get_guint8(tvb, iOffset); + proto_tree_add_item(tree, hf_opcua_nodeid_encodingmask, tvb, iOffset, 1, TRUE); + iOffset++; + + switch(EncodingMask) + { + case 0x00: /* two byte node id */ + Numeric = tvb_get_guint8(tvb, iOffset); + proto_tree_add_item(tree, hf_opcua_app_numeric, tvb, iOffset, 1, TRUE); + iOffset+=1; + break; + case 0x01: /* four byte node id */ + NSId = tvb_get_guint8(tvb, iOffset); + proto_tree_add_item(tree, hf_opcua_app_nsid, tvb, iOffset, 1, TRUE); + iOffset+=1; + Numeric = tvb_get_letohs(tvb, iOffset); + proto_tree_add_item(tree, hf_opcua_app_numeric, tvb, iOffset, 2, TRUE); + iOffset+=2; + break; + case 0x02: /* numeric, that does not fit into four bytes */ + NSId = tvb_get_letohl(tvb, iOffset); + proto_tree_add_item(tree, hf_opcua_app_nsid, tvb, iOffset, 4, TRUE); + iOffset+=4; + Numeric = tvb_get_letohl(tvb, iOffset); + proto_tree_add_item(tree, hf_opcua_app_numeric, tvb, iOffset, 4, TRUE); + iOffset+=4; + break; + case 0x03: /* string */ + case 0x04: /* uri */ + case 0x05: /* guid */ + case 0x06: /* byte string */ + /* NOT USED */ + break; + }; + + *pOffset = iOffset; + + return Numeric; +} + diff --git a/plugins/opcua/ua_application_layer.h b/plugins/opcua/ua_application_layer.h index a1a51a9191..13a52e07b1 100644 --- a/plugins/opcua/ua_application_layer.h +++ b/plugins/opcua/ua_application_layer.h @@ -1,27 +1,27 @@ -/****************************************************************************** -** $Id: ua_application_layer.h,v 1.3 2007/02/08 12:19:58 gergap Exp $ -** -** 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 Application Layer Decoder. -** -** Author: Gerhard Gappmeier -** Last change by: $Author: gergap $ -** -******************************************************************************/ - -void registerApplicationLayerTypes(int proto); - -/* Ua type parsers */ -int parseServiceNodeId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); +/****************************************************************************** +** $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 Application Layer Decoder. +** +** Author: Gerhard Gappmeier +** Last change by: $Author: gergap $ +** +******************************************************************************/ + +void registerApplicationLayerTypes(int proto); + +/* Ua type parsers */ +int parseServiceNodeId(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, char *szFieldName); diff --git a/plugins/opcua/ua_security_layer.c b/plugins/opcua/ua_security_layer.c index 71013b6920..c139f67275 100644 --- a/plugins/opcua/ua_security_layer.c +++ b/plugins/opcua/ua_security_layer.c @@ -1,99 +1,99 @@ -/****************************************************************************** -** $Id: ua_security_layer.c,v 1.2 2007/02/08 12:16:59 gergap Exp $ -** -** 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 Security Layer Decoder. -** -** Author: Gerhard Gappmeier -** Last change by: $Author: gergap $ -** -******************************************************************************/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include "ua_application_layer.h" -#include "opcua_simpletypes.h" - -/** NodeClass enum table */ +/****************************************************************************** +** $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 Security Layer Decoder. +** +** Author: Gerhard Gappmeier +** Last change by: $Author: gergap $ +** +******************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include "ua_application_layer.h" +#include "opcua_simpletypes.h" + +/** NodeClass enum table */ static const value_string g_SecSigTable[] = { { 0, "GetSecurityPolcies" }, { 1, "OpenSecureChannel" }, { 2, "CloseSecureChannel" }, - { 3, "Message" }, + { 3, "Message" }, { 0, NULL } -}; -static int hf_opcua_SecuritySigEnum = -1; - -static int hf_opcua_security_sig = -1; -static int hf_opcua_security_policy = -1; -static int hf_opcua_security_channel = -1; -static int hf_opcua_security_token = -1; - -static hf_register_info hf[] = -{ - { &hf_opcua_security_sig, - { "Security Signature", "security.sig", FT_UINT16, BASE_HEX, VALS(g_SecSigTable), 0x0, "", HFILL } - }, - { &hf_opcua_security_policy, - { "Security Policy", "security.policy", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_security_channel, - { "Secure Channel Id", "security.channel", FT_GUID, BASE_NONE, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_security_token, - { "Security Token Id", "security.token", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } - } -}; - -/** Register security layer types. */ -void registerSecurityLayerTypes(int proto) -{ - proto_register_field_array(proto, hf, array_length(hf)); -} - - -/* Security Layer: message parsers - * Only works for Security Policy "NoSecurity" at the moment. - */ -void parseSecurityLayer(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - guint16 Sig; - - Sig = tvb_get_letohs(tvb, pOffset[0]); - proto_tree_add_item(tree, hf_opcua_security_sig, tvb, *pOffset, 2, TRUE); *pOffset+=2; - - switch (Sig) - { - case 0: /* GetSecurityPolicies */ - break; - case 1: /* OpenSecureChannel */ - parseGuid(tree, tvb, pOffset, hf_opcua_security_channel); - parseString(tree, tvb, pOffset, hf_opcua_security_policy); - break; - case 2: /* CloseSecureChannel */ - parseGuid(tree, tvb, pOffset, hf_opcua_security_channel); - parseString(tree, tvb, pOffset, hf_opcua_security_token); - break; - case 3: /* Other Services Messages */ - parseGuid(tree, tvb, pOffset, hf_opcua_security_channel); - parseString(tree, tvb, pOffset, hf_opcua_security_token); - break; - } -} - +}; +static int hf_opcua_SecuritySigEnum = -1; + +static int hf_opcua_security_sig = -1; +static int hf_opcua_security_policy = -1; +static int hf_opcua_security_channel = -1; +static int hf_opcua_security_token = -1; + +static hf_register_info hf[] = +{ + { &hf_opcua_security_sig, + { "Security Signature", "security.sig", FT_UINT16, BASE_HEX, VALS(g_SecSigTable), 0x0, "", HFILL } + }, + { &hf_opcua_security_policy, + { "Security Policy", "security.policy", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_security_channel, + { "Secure Channel Id", "security.channel", FT_GUID, BASE_NONE, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_security_token, + { "Security Token Id", "security.token", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } + } +}; + +/** Register security layer types. */ +void registerSecurityLayerTypes(int proto) +{ + proto_register_field_array(proto, hf, array_length(hf)); +} + + +/* Security Layer: message parsers + * Only works for Security Policy "NoSecurity" at the moment. + */ +void parseSecurityLayer(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + guint16 Sig; + + Sig = tvb_get_letohs(tvb, pOffset[0]); + proto_tree_add_item(tree, hf_opcua_security_sig, tvb, *pOffset, 2, TRUE); *pOffset+=2; + + switch (Sig) + { + case 0: /* GetSecurityPolicies */ + break; + case 1: /* OpenSecureChannel */ + parseGuid(tree, tvb, pOffset, hf_opcua_security_channel); + parseString(tree, tvb, pOffset, hf_opcua_security_policy); + break; + case 2: /* CloseSecureChannel */ + parseGuid(tree, tvb, pOffset, hf_opcua_security_channel); + parseString(tree, tvb, pOffset, hf_opcua_security_token); + break; + case 3: /* Other Services Messages */ + parseGuid(tree, tvb, pOffset, hf_opcua_security_channel); + parseString(tree, tvb, pOffset, hf_opcua_security_token); + break; + } +} + diff --git a/plugins/opcua/ua_security_layer.h b/plugins/opcua/ua_security_layer.h index d497f654a9..d42f739e2f 100644 --- a/plugins/opcua/ua_security_layer.h +++ b/plugins/opcua/ua_security_layer.h @@ -1,25 +1,25 @@ -/****************************************************************************** -** $Id: ua_security_layer.h,v 1.2 2007/02/08 12:19:58 gergap Exp $ -** -** 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 Security Layer Decoder. -** -** Author: Gerhard Gappmeier -** Last change by: $Author: gergap $ -** -******************************************************************************/ - -void registerSecurityLayerTypes(int proto); -void parseSecurityLayer(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); +/****************************************************************************** +** $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 Security Layer Decoder. +** +** Author: Gerhard Gappmeier +** Last change by: $Author: gergap $ +** +******************************************************************************/ + +void registerSecurityLayerTypes(int proto); +void parseSecurityLayer(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); diff --git a/plugins/opcua/ua_transport_layer.c b/plugins/opcua/ua_transport_layer.c index 110fefaaf2..27045d1f36 100644 --- a/plugins/opcua/ua_transport_layer.c +++ b/plugins/opcua/ua_transport_layer.c @@ -1,211 +1,211 @@ -/****************************************************************************** -** $Id: ua_transport_layer.c,v 1.3 2007/02/08 12:17:50 gergap Exp $ -** -** 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 Transport Layer Decoder. -** -** Author: Gerhard Gappmeier -** Last change by: $Author: gergap $ -** -******************************************************************************/ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include "ua_security_layer.h" -#include "ua_application_layer.h" -#include "opcua_simpletypes.h" -#include -#include - -void dispatchService(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int ServiceId); - -static int hf_opcua_transport_sig = -1; -static int hf_opcua_transport_len = -1; -static int hf_opcua_transport_ver = -1; -static int hf_opcua_transport_cid = -1; -static int hf_opcua_transport_lifetime = -1; -static int hf_opcua_transport_sbl = -1; -static int hf_opcua_transport_rbl = -1; -static int hf_opcua_transport_endpoint = -1; -static int hf_opcua_transport_rlifetime = -1; -static int hf_opcua_transport_rsbl = -1; -static int hf_opcua_transport_rrbl = -1; -static int hf_opcua_transport_altendpoint = -1; -static int hf_opcua_transport_rqid = -1; -static int hf_opcua_transport_status = -1; -extern gint ett_opcua_nodeid; - -static hf_register_info hf[] = -{ - { &hf_opcua_transport_sig, - /* full name , abbreviation , type , display , strings, bitmask, blurb, id, parent, ref_count, bitshift */ - { "Signature", "transport.sig", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_transport_len, - { "Message Length", "transport.len", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_transport_ver, - { "Version", "transport.ver", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_transport_cid, - { "ConnectionId", "transport.cid", FT_GUID, BASE_NONE, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_transport_lifetime, - { "Lifetime", "transport.lifetime", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_transport_sbl, - { "SendBufferLength", "transport.sbl", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_transport_rbl, - { "ReceiveBufferLength", "transport.rbl", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_transport_endpoint, - { "EndPoint", "transport.endpoint", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_transport_rlifetime, - { "Revised Lifetime", "transport.rlifetime", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_transport_rsbl, - { "Revised SendBufferLength", "transport.rsbl", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_transport_rrbl, - { "Revised ReceiveBufferLength", "transport.rrbl", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_transport_altendpoint, - { "Alternate EndPoint", "transport.altendpoint", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_transport_rqid, - { "RequestId", "transport.rqid", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } - }, - { &hf_opcua_transport_status, - { "StatusCode", "transport.status", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } - } -}; - -/** subtree types */ -extern gint ett_opcua_extensionobject; - -/** Register transport layer types. */ -void registerTransportLayerTypes(int proto) -{ - proto_register_field_array(proto, hf, array_length(hf)); -} - -/** helper functions for adding strings, - * that are not zero terminated. - */ -void addString(proto_tree *tree, - int hfindex, - tvbuff_t *tvb, - gint start, - gint length, - const char *value) -{ - char *szValue = ep_alloc(256); - - if (szValue) - { - if (length > 255) length = 255; - /* copy non null terminated string data */ - strncpy(szValue, value, length); - /* set null terminator */ - szValue[length] = 0; - - proto_tree_add_string(tree, hfindex, tvb, start, length, szValue); - } -} - -/* Transport Layer: message parsers */ -void parseHello(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_ver, tvb, *pOffset, 4, TRUE); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; - proto_tree_add_item(tree, hf_opcua_transport_lifetime, tvb, *pOffset, 4, TRUE); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_sbl, tvb, *pOffset, 4, TRUE); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_rbl, tvb, *pOffset, 4, TRUE); *pOffset+=4; - parseString(tree, tvb, pOffset, hf_opcua_transport_endpoint); -} - -void parseAcknowledge(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; - proto_tree_add_item(tree, hf_opcua_transport_rlifetime, tvb, *pOffset, 4, TRUE); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_rsbl, tvb, *pOffset, 4, TRUE); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_rrbl, tvb, *pOffset, 4, TRUE); *pOffset+=4; - parseString(tree, tvb, pOffset, hf_opcua_transport_altendpoint); -} - -void parseDisconnect(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; -} - -void parseData(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - proto_item *ti; - proto_tree *encobj_tree; - proto_tree *nodeid_tree; - int ServiceId = 0; - - addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; - proto_tree_add_item(tree, hf_opcua_transport_rqid, tvb, *pOffset, 4, TRUE); *pOffset+=4; - - /* message data contains the security layer */ - parseSecurityLayer(tree, tvb, pOffset); - - /* AT THE MOMENT NO SECURITY IS IMPLEMENTED IN UA. - * WE CAN JUST JUMP INTO THE APPLICATION LAYER DATA. - * THIS WILL CHAHNGE IN THE FUTURE. */ - - /* add encodeable object subtree */ - ti = proto_tree_add_text(tree, tvb, 0, -1, "Message : Encodeable Object"); - encobj_tree = proto_item_add_subtree(ti, ett_opcua_extensionobject); - - /* add nodeid subtree */ - ti = proto_tree_add_text(encobj_tree, tvb, 0, -1, "TypeId : ExpandedNodeId"); - nodeid_tree = proto_item_add_subtree(ti, ett_opcua_nodeid); - ServiceId = parseServiceNodeId(nodeid_tree, tvb, pOffset, "NodeId") - 1; - - dispatchService(encobj_tree, tvb, pOffset, ServiceId); -} - -void parseAbort(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; - proto_tree_add_item(tree, hf_opcua_transport_rqid, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} - -void parseError(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) -{ - addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; - proto_tree_add_item(tree, hf_opcua_transport_rqid, tvb, *pOffset, 4, TRUE); *pOffset+=4; - proto_tree_add_item(tree, hf_opcua_transport_status, tvb, *pOffset, 4, TRUE); *pOffset+=4; -} +/****************************************************************************** +** $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 Transport Layer Decoder. +** +** Author: Gerhard Gappmeier +** Last change by: $Author: gergap $ +** +******************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include "ua_security_layer.h" +#include "ua_application_layer.h" +#include "opcua_simpletypes.h" +#include +#include + +void dispatchService(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int ServiceId); + +static int hf_opcua_transport_sig = -1; +static int hf_opcua_transport_len = -1; +static int hf_opcua_transport_ver = -1; +static int hf_opcua_transport_cid = -1; +static int hf_opcua_transport_lifetime = -1; +static int hf_opcua_transport_sbl = -1; +static int hf_opcua_transport_rbl = -1; +static int hf_opcua_transport_endpoint = -1; +static int hf_opcua_transport_rlifetime = -1; +static int hf_opcua_transport_rsbl = -1; +static int hf_opcua_transport_rrbl = -1; +static int hf_opcua_transport_altendpoint = -1; +static int hf_opcua_transport_rqid = -1; +static int hf_opcua_transport_status = -1; +extern gint ett_opcua_nodeid; + +static hf_register_info hf[] = +{ + { &hf_opcua_transport_sig, + /* full name , abbreviation , type , display , strings, bitmask, blurb, id, parent, ref_count, bitshift */ + { "Signature", "transport.sig", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_transport_len, + { "Message Length", "transport.len", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_transport_ver, + { "Version", "transport.ver", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_transport_cid, + { "ConnectionId", "transport.cid", FT_GUID, BASE_NONE, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_transport_lifetime, + { "Lifetime", "transport.lifetime", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_transport_sbl, + { "SendBufferLength", "transport.sbl", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_transport_rbl, + { "ReceiveBufferLength", "transport.rbl", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_transport_endpoint, + { "EndPoint", "transport.endpoint", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_transport_rlifetime, + { "Revised Lifetime", "transport.rlifetime", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_transport_rsbl, + { "Revised SendBufferLength", "transport.rsbl", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_transport_rrbl, + { "Revised ReceiveBufferLength", "transport.rrbl", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_transport_altendpoint, + { "Alternate EndPoint", "transport.altendpoint", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_transport_rqid, + { "RequestId", "transport.rqid", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } + }, + { &hf_opcua_transport_status, + { "StatusCode", "transport.status", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL } + } +}; + +/** subtree types */ +extern gint ett_opcua_extensionobject; + +/** Register transport layer types. */ +void registerTransportLayerTypes(int proto) +{ + proto_register_field_array(proto, hf, array_length(hf)); +} + +/** helper functions for adding strings, + * that are not zero terminated. + */ +void addString(proto_tree *tree, + int hfindex, + tvbuff_t *tvb, + gint start, + gint length, + const char *value) +{ + char *szValue = ep_alloc(256); + + if (szValue) + { + if (length > 255) length = 255; + /* copy non null terminated string data */ + strncpy(szValue, value, length); + /* set null terminator */ + szValue[length] = 0; + + proto_tree_add_string(tree, hfindex, tvb, start, length, szValue); + } +} + +/* Transport Layer: message parsers */ +void parseHello(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_ver, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; + proto_tree_add_item(tree, hf_opcua_transport_lifetime, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_sbl, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_rbl, tvb, *pOffset, 4, TRUE); *pOffset+=4; + parseString(tree, tvb, pOffset, hf_opcua_transport_endpoint); +} + +void parseAcknowledge(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; + proto_tree_add_item(tree, hf_opcua_transport_rlifetime, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_rsbl, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_rrbl, tvb, *pOffset, 4, TRUE); *pOffset+=4; + parseString(tree, tvb, pOffset, hf_opcua_transport_altendpoint); +} + +void parseDisconnect(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; +} + +void parseData(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + proto_item *ti; + proto_tree *encobj_tree; + proto_tree *nodeid_tree; + int ServiceId = 0; + + addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; + proto_tree_add_item(tree, hf_opcua_transport_rqid, tvb, *pOffset, 4, TRUE); *pOffset+=4; + + /* message data contains the security layer */ + parseSecurityLayer(tree, tvb, pOffset); + + /* AT THE MOMENT NO SECURITY IS IMPLEMENTED IN UA. + * WE CAN JUST JUMP INTO THE APPLICATION LAYER DATA. + * THIS WILL CHAHNGE IN THE FUTURE. */ + + /* add encodeable object subtree */ + ti = proto_tree_add_text(tree, tvb, 0, -1, "Message : Encodeable Object"); + encobj_tree = proto_item_add_subtree(ti, ett_opcua_extensionobject); + + /* add nodeid subtree */ + ti = proto_tree_add_text(encobj_tree, tvb, 0, -1, "TypeId : ExpandedNodeId"); + nodeid_tree = proto_item_add_subtree(ti, ett_opcua_nodeid); + ServiceId = parseServiceNodeId(nodeid_tree, tvb, pOffset, "NodeId") - 1; + + dispatchService(encobj_tree, tvb, pOffset, ServiceId); +} + +void parseAbort(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; + proto_tree_add_item(tree, hf_opcua_transport_rqid, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} + +void parseError(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) +{ + addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; + proto_tree_add_item(tree, hf_opcua_transport_rqid, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_status, tvb, *pOffset, 4, TRUE); *pOffset+=4; +} diff --git a/plugins/opcua/ua_transport_layer.h b/plugins/opcua/ua_transport_layer.h index 1491df56f4..3ee1efe78f 100644 --- a/plugins/opcua/ua_transport_layer.h +++ b/plugins/opcua/ua_transport_layer.h @@ -1,32 +1,32 @@ -/****************************************************************************** -** $Id: ua_transport_layer.h,v 1.3 2007/02/08 12:19:58 gergap Exp $ -** -** 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 Transport Layer Decoder. -** -** Author: Gerhard Gappmeier -** Last change by: $Author: gergap $ -** -******************************************************************************/ - -/* Transport Layer: message parsers */ -void parseHello(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); -void parseAcknowledge(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); -void parseDisconnect(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); -void parseData(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); -void parseAbort(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); -void parseError(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); -void registerTransportLayerTypes(int proto); - +/****************************************************************************** +** $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 Transport Layer Decoder. +** +** Author: Gerhard Gappmeier +** Last change by: $Author: gergap $ +** +******************************************************************************/ + +/* Transport Layer: message parsers */ +void parseHello(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); +void parseAcknowledge(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); +void parseDisconnect(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); +void parseData(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); +void parseAbort(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); +void parseError(proto_tree *tree, tvbuff_t *tvb, gint *pOffset); +void registerTransportLayerTypes(int proto); +