Ethereal-dev: [Ethereal-dev] New dissector: STANAG 5066
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: "M.P. Andriesse" <menno.andriesse@xxxxxxxxxxxxx>
Date: Fri, 14 Oct 2005 14:50:43 +0200
Oops... Actually attaching the file does work better... -- Menno Andriesse Nato C3 Agency CIS Division, Transmission & Network Services Resource Centre P.O. Box 174 2501 CD The Hague The Netherlands Tel: +31 (0)70 374 3449 Fax: +31 (0)70 374 3049 mailto:Menno.Andriesse@xxxxxxxxxxxxx
Index: configure.in
===================================================================
--- configure.in (revision 16219)
+++ configure.in (working copy)
@@ -1251,6 +1251,7 @@
plugins/rlm/Makefile
plugins/rtnet/Makefile
plugins/rudp/Makefile
+ plugins/s5066/Makefile
plugins/stats_tree/Makefile
plugins/v5ua/Makefile
tools/Makefile
Index: Makefile.am
===================================================================
--- Makefile.am (revision 16219)
+++ Makefile.am (working copy)
@@ -198,6 +198,7 @@
plugins/rlm/rlm.la \
plugins/rtnet/rtnet.la \
plugins/rudp/rudp.la \
+ plugins/s5066/s5066.la \
plugins/v5ua/v5ua.la
if ENABLE_STATIC
@@ -227,6 +228,7 @@
"-dlopen" plugins/rlm/rlm.la \
"-dlopen" plugins/rtnet/rtnet.la \
"-dlopen" plugins/rudp/rudp.la \
+ "-dlopen" plugins/s5066/s5066.la \
"-dlopen" plugins/v5ua/v5ua.la
endif # ENABLE_STATIC
Property changes on: plugins/s5066
___________________________________________________________________
Name: svn:ignore
+ .deps
.libs
Makefile
Makefile.in
config.cache
config.h
config.h.in
config.log
config.status
configure
stamp-h
*.obj
*.dll
*.exp
*.lib
*.pdb
tags
TAGS
Index: plugins/s5066/AUTHORS
===================================================================
--- plugins/s5066/AUTHORS (revision 0)
+++ plugins/s5066/AUTHORS (revision 0)
@@ -0,0 +1,3 @@
+Author:
+Menno Andriesse <s5066 [AT] nc3a.nato.int>
+
Index: plugins/s5066/Makefile.nmake
===================================================================
--- plugins/s5066/Makefile.nmake (revision 0)
+++ plugins/s5066/Makefile.nmake (revision 0)
@@ -0,0 +1,31 @@
+#
+# $Id: $
+#
+
+include ..\..\config.nmake
+
+############### no need to modify below this line #########
+
+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_LIBETHEREAL
+LINK_PLUGIN_WITH=..\..\epan\libethereal.lib
+CFLAGS=/DHAVE_WIN32_LIBETHEREAL_LIB /D_NEED_VAR_IMPORT_ $(CFLAGS)
+
+OBJECTS=packet-s5066.obj
+
+s5066.dll s5066.exp s5066.lib : $(OBJECTS) $(LINK_PLUGIN_WITH)
+ link -dll /out:s5066.dll $(LDFLAGS) $(OBJECTS) $(LINK_PLUGIN_WITH) \
+ $(GLIB_LIBS)
+
+!ENDIF
+
+clean:
+ rm -f $(OBJECTS) s5066.dll s5066.exp s5066.lib *.pdb
+
+distclean: clean
+
+maintainer-clean: distclean
Index: plugins/s5066/moduleinfo.h
===================================================================
--- plugins/s5066/moduleinfo.h (revision 0)
+++ plugins/s5066/moduleinfo.h (revision 0)
@@ -0,0 +1,17 @@
+/* Included *after* config.h, in order to re-define these macros */
+
+#ifdef PACKAGE
+#undef PACKAGE
+#endif
+
+/* Name of package */
+#define PACKAGE "s5066"
+
+
+#ifdef VERSION
+#undef VERSION
+#endif
+
+/* Version number of package */
+#define VERSION "0.2.0"
+
Index: plugins/s5066/ChangeLog
===================================================================
Index: plugins/s5066/COPYING
===================================================================
--- plugins/s5066/COPYING (revision 0)
+++ plugins/s5066/COPYING (revision 0)
@@ -0,0 +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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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.
+
+ <signature of Ty Coon>, 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.
Index: plugins/s5066/Makefile.am
===================================================================
--- plugins/s5066/Makefile.am (revision 0)
+++ plugins/s5066/Makefile.am (revision 0)
@@ -0,0 +1,48 @@
+# Makefile.am
+# Automake file for Ethereal/S5066
+#
+# $Id: $
+#
+# Ethereal - Network traffic analyzer
+# By Gerald Combs <gerald@xxxxxxxxxxxx>
+# 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)
+
+plugindir = @plugindir@
+
+plugin_LTLIBRARIES = s5066.la
+s5066_la_SOURCES = packet-s5066.c moduleinfo.h
+s5066_la_LDFLAGS = -module -avoid-version
+s5066_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 =
+
+CLEANFILES = \
+ s5066 \
+ *~
+
+MAINTAINERCLEANFILES = \
+ Makefile.in
+
+EXTRA_DIST = \
+ Makefile.nmake
+
Index: plugins/s5066/packet-s5066.c
===================================================================
--- plugins/s5066/packet-s5066.c (revision 0)
+++ plugins/s5066/packet-s5066.c (revision 0)
@@ -0,0 +1,1277 @@
+/* packet-s5066.c
+ * Routines for STANAG 5066 SIS layer packet disassembly
+ *
+ * $Id: $
+ *
+ * Copyright (c) 2005 by Menno Andriesse <s5066 [AT] nc3a.nato.int>
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@xxxxxxxxxxxx>
+ * Copyright 1999 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gmodule.h>
+#include <epan/packet.h>
+#include <epan/prefs.h>
+#include <epan/dissectors/packet-tcp.h> /* For tcp_dissect_pdus() */
+
+/* Forward reference */
+/* Register functions */
+void proto_register_s5066(void);
+void proto_reg_handoff_s5066(void);
+/* Main dissectors */
+static void dissect_s5066_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+static guint get_s5066_pdu_len(tvbuff_t *tvb, int offset);
+static void dissect_s5066_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+/* Service type and address dissectors */
+static guint dissect_s5066_servicetype(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_address(tvbuff_t *tvb, guint offset, proto_tree *tree, gint source);
+/* S-Primitive dissectors */
+static guint dissect_s5066_01(tvbuff_t *tvb, guint offset, proto_tree *tree);
+/* static guint dissect_s5066_02(tvbuff_t *tvb, guint offset, proto_tree *tree); */
+static guint dissect_s5066_03(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_04(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_05(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_06(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_07(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_08(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_09(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_10(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_11(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_12(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_13(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_14(tvbuff_t *tvb, guint offset, proto_tree *tree);
+/* static guint dissect_s5066_15(tvbuff_t *tvb, guint offset, proto_tree *tree); */
+/* static guint dissect_s5066_16(tvbuff_t *tvb, guint offset, proto_tree *tree); */
+/* static guint dissect_s5066_17(tvbuff_t *tvb, guint offset, proto_tree *tree); */
+static guint dissect_s5066_18(tvbuff_t *tvb, guint offset, proto_tree *tree, guint pdu_size);
+static guint dissect_s5066_19(tvbuff_t *tvb, guint offset, proto_tree *tree, guint pdu_size);
+static guint dissect_s5066_20(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_21(tvbuff_t *tvb, guint offset, proto_tree *tree, guint pdu_size);
+static guint dissect_s5066_22(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_23(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_24(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_25(tvbuff_t *tvb, guint offset, proto_tree *tree, guint pdu_size);
+static guint dissect_s5066_26(tvbuff_t *tvb, guint offset, proto_tree *tree);
+static guint dissect_s5066_27(tvbuff_t *tvb, guint offset, proto_tree *tree);
+
+/* Define version if we are not building ethereal statically */
+#include "moduleinfo.h"
+#ifndef ENABLE_STATIC
+G_MODULE_EXPORT const gchar version[] = VERSION;
+#endif
+
+static gint proto_s5066 = -1;
+static dissector_handle_t s5066_tcp_handle;
+static dissector_handle_t data_handle;
+
+/* Enable desegmentation of S5066 over TCP */
+static gboolean s5066_desegment = FALSE;
+/* Dissect old 'edition 1' of STANAG 5066 (It lacks the 'version' field.) */
+static gboolean s5066_edition_one = FALSE;
+/* This port is registered with IANA */
+static gint global_s5066_port = 5066;
+/* Size of header outside 'size' field */
+static gint s5066_header_size = 5;
+/* Offset of 'size' field */
+static gint s5066_size_offset = 3;
+
+/* Sync should be 0x90EB */
+static gint hf_s5066_sync_word = -1;
+/* Version should be 0x00 */
+static gint hf_s5066_version = -1;
+/* Total size of the PDU, excluding this size and previous fields */
+/* So total size is this + 5 bytes (s5066_header_size) */
+static gint hf_s5066_size = -1;
+/* Th type of PDU */
+static gint hf_s5066_type = -1;
+static const value_string s5066_pdu_type[] = {
+ { 1, "S_BIND_REQUEST"},
+ { 2, "S_UNBIND_REQUEST"},
+ { 3, "S_BIND_ACCEPTED"},
+ { 4, "S_BIND_REJECTED"},
+ { 5, "S_UNBIND_INDICATION"},
+ { 6, "S_HARD_LINK_ESTABLISH"},
+ { 7, "S_HARD_LINK_TERMINATE"},
+ { 8, "S_HARD_LINK_ESTABLISHED"},
+ { 9, "S_HARD_LINK_REJECTED"},
+ {10, "S_HARD_LINK_TERMINATED"},
+ {11, "S_HARD_LINK_INDICATION"},
+ {12, "S_HARD_LINK_ACCEPT"},
+ {13, "S_HARD_LINK_REJECT"},
+ {14, "S_SUBNET_AVAILABILITY"},
+ {15, "S_DATAFLOW_ON"},
+ {16, "S_DATAFLOW_OFF"},
+ {17, "S_KEEP_ALIVE"},
+ {18, "S_MANAGEMENT_MESSAGE_REQUEST"},
+ {19, "S_MANAGEMENT_MESSAGE_INDICATION"},
+ {20, "S_UNIDATA_REQUEST"},
+ {21, "S_UNIDATA_INDICATION"},
+ {22, "S_UNIDATA_REQUEST_CONFIRM"},
+ {23, "S_UNIDATA_REQUEST_REJECTED"},
+ {24, "S_EXPEDITED_UNIDATA_REQUEST"},
+ {25, "S_EXPEDITED_UNIDATA_INDICATION"},
+ {26, "S_EXPEDITED_UNIDATA_REQUEST_CONFIRM"},
+ {27, "S_EXPEDITED_UNIDATA_REQUEST_REJECTED"},
+ { 0, NULL },
+};
+
+/* STANAG 5066 Address */
+/* Size is defined in nibbles (4 bits) */
+static gint hf_s5066_ad_size = -1;
+/* Group flag: 0 = false, 1 = true */
+static gint hf_s5066_ad_group = -1;
+/* The remainder of the 4 bytes form the address */
+static gint hf_s5066_ad_address = -1;
+
+/* Service type */
+/* Transmission mode: */
+static gint hf_s5066_st_txmode = -1;
+static const value_string s5066_st_txmode[] = {
+ { 0, "Ignore service type field"},
+ { 1, "ARQ"},
+ { 2, "Non-ARQ (Broacast)"},
+ { 3, "Other non-ARQ types"},
+ { 4, "Other non-ARQ types"},
+ { 5, "Other non-ARQ types"},
+ { 6, "Other non-ARQ types"},
+ { 7, "Other non-ARQ types"},
+ { 8, "Other non-ARQ types"},
+ { 9, "Other non-ARQ types"},
+ {10, "Other non-ARQ types"},
+ {11, "Other non-ARQ types"},
+ {12, "Other non-ARQ types"},
+ {13, "Other non-ARQ types"},
+ {14, "Other non-ARQ types"},
+ {15, "Other non-ARQ types"},
+ { 0, NULL },
+};
+/* Delivery confirmation: */
+static gint hf_s5066_st_delivery_confirmation = -1;
+static const value_string s5066_st_delivery_confirmation[] = {
+ { 0, "No confirmation"},
+ { 1, "Node delivery confirmation"},
+ { 2, "Client delivery confirmation"},
+ { 3, "-- Not defined --"},
+ { 0, NULL },
+};
+/* Delivery order: */
+static gint hf_s5066_st_delivery_order = -1;
+static const value_string s5066_st_delivery_order[] = {
+ { 0, "In-order delivery"},
+ { 1, "As-they-arrive"},
+ { 0, NULL },
+};
+/* Extended field present: (Never in the current version.) */
+static gint hf_s5066_st_extended = -1;
+static const value_string s5066_st_extended[] = {
+ { 0, "No extended field"},
+ { 1, "Extended field follows"},
+ { 0, NULL },
+};
+/* Number of retransmissions when in Non-ARQ: */
+static gint hf_s5066_st_retries = -1;
+
+/* Type 1: S_BIND_REQUEST */
+static gint hf_s5066_01_sapid = -1;
+static gint hf_s5066_01_rank = -1;
+static gint hf_s5066_01_unused = -1;
+
+/* Type 2: S_UNBIND_REQUEST */
+/* --- no subfields --- */
+
+/* Type 3: S_BIND_ACCEPTED */
+static gint hf_s5066_03_sapid = -1;
+static gint hf_s5066_03_unused = -1;
+static gint hf_s5066_03_mtu = -1;
+
+/* Type 4: S_BIND_REJECTED */
+static gint hf_s5066_04_reason = -1;
+static const value_string s5066_04_reason[] = {
+ { 0, "Unknown reason"},
+ { 1, "Not enough resources"},
+ { 2, "Invalid Sap ID"},
+ { 3, "Sap ID already allocated"},
+ { 4, "ARQ mode unsupportable during broadcast session"},
+ { 0, NULL },
+};
+
+/* Type 5: S_UNBIND_INDICATION */
+static gint hf_s5066_05_reason = -1;
+static const value_string s5066_05_reason[] = {
+ { 0, "Unknown reason"},
+ { 1, "Connection pre-empted by higher ranking client"},
+ { 2, "Inactivity (failure to respond to 'Keep-alive')"},
+ { 3, "Too many invalid primitives"},
+ { 4, "Too many expedited data request primitives"},
+ { 5, "ARQ mode unsupportable during broadcast session"},
+ { 0, NULL },
+};
+
+/* Hard links: hardlinktype value string array. */
+static const value_string s5066_hard_link_type[] = {
+ { 0, "Link reservation"},
+ { 1, "Partial Bandwidth reservation"},
+ { 2, "Full Bandwidth reservation"},
+ { 3, "--- undefined ---"},
+ { 0, NULL },
+};
+
+/* Type 6: S_HARD_LINK_ESTABLISH */
+static gint hf_s5066_06_link_type = -1;
+static gint hf_s5066_06_link_priority = -1;
+static gint hf_s5066_06_sapid = -1;
+
+/* Type 7: S_HARD_LINK_TERMINATE */
+/* Only remote node address */
+
+/* Type 8: S_HARD_LINK_ESTABLISHED */
+static gint hf_s5066_08_remote_status = -1;
+static const value_string s5066_08_remote_status[] = {
+ { 0, "ERROR"},
+ { 1, "OK"},
+ { 0, NULL },
+};
+static gint hf_s5066_08_link_type = -1;
+static gint hf_s5066_08_link_priority = -1;
+static gint hf_s5066_08_sapid = -1;
+
+/* Type 9: S_HARD_LINK_REJECTED */
+static gint hf_s5066_09_reason = -1;
+static const value_string s5066_09_reason[] = {
+ { 0, "--- undefined ---"},
+ { 1, "Remote node busy"},
+ { 2, "Higher priority link exists"},
+ { 3, "Remote node not responding"},
+ { 4, "Destination Sap ID not bound"},
+ { 5, "Requested Type-0 link exists"},
+ { 0, NULL },
+};
+static gint hf_s5066_09_link_type = -1;
+static gint hf_s5066_09_link_priority = -1;
+static gint hf_s5066_09_sapid = -1;
+
+/* Type 10: S_HARD_LINK_TERMINATED */
+static gint hf_s5066_10_reason = -1;
+static const value_string s5066_10_reason[] = {
+ { 0, "--- undefined ---"},
+ { 1, "Link terminated by remote node"},
+ { 2, "Higher priority link requested"},
+ { 3, "Remote node not responding"},
+ { 4, "Destination Sap ID not bound"},
+ { 5, "Physical link broken"},
+ { 0, NULL },
+};
+static gint hf_s5066_10_link_type = -1;
+static gint hf_s5066_10_link_priority = -1;
+static gint hf_s5066_10_sapid = -1;
+
+/* Type 11: S_HARD_LINK_INDICATION */
+static gint hf_s5066_11_remote_status = -1;
+static const value_string s5066_11_remote_status[] = {
+ { 0, "ERROR"},
+ { 1, "OK"},
+ { 0, NULL },
+};
+static gint hf_s5066_11_link_type = -1;
+static gint hf_s5066_11_link_priority = -1;
+static gint hf_s5066_11_sapid = -1;
+
+/* Type 12: S_HARD_LINK_ACCEPT */
+static gint hf_s5066_12_link_type = -1;
+static gint hf_s5066_12_link_priority = -1;
+static gint hf_s5066_12_sapid = -1;
+
+/* Type 13: S_HARD_LINK_REJECT */
+static gint hf_s5066_13_reason = -1;
+static const value_string s5066_13_reason[] = {
+ { 0, "--- undefined ---"},
+ { 0, NULL },
+};
+static gint hf_s5066_13_link_type = -1;
+static gint hf_s5066_13_link_priority = -1;
+static gint hf_s5066_13_sapid = -1;
+
+/* Type 14: S_SUBNET_AVAILABILITY */
+static gint hf_s5066_14_status= -1;
+static const value_string s5066_14_status[] = {
+ { 0, "Off"},
+ { 1, "On"},
+ { 2, "Receive only"},
+ { 3, "Half-duplex"},
+ { 4, "Full-duplex"},
+ { 0, NULL },
+};
+static gint hf_s5066_14_reason= -1;
+static const value_string s5066_14_reason[] = {
+ { 0, "Unknown reason"},
+ { 1, "Local node in EMCON"},
+ { 2, "Higher priority link requested"},
+ { 0, NULL },
+};
+
+/* Type 15: S_DATAFLOW_ON */
+/* --- no subfields --- */
+
+/* Type 16: S_DATAFLOW_OFF */
+/* --- no subfields --- */
+
+/* Type 17: S_KEEP_ALIVE */
+/* --- no subfields --- */
+
+/* Type 18: S_MANAGEMENT_MESSAGE_REQUEST */
+static gint hf_s5066_18_type = -1;
+static gint hf_s5066_18_body = -1;
+
+/* Type 19: S_MANAGEMENT_MESSAGE_INDICATION */
+static gint hf_s5066_19_type = -1;
+static gint hf_s5066_19_body = -1;
+
+/* Type 20: S_UNIDATA_REQUEST */
+static gint hf_s5066_20_priority = -1;
+static gint hf_s5066_20_sapid = -1;
+static gint hf_s5066_20_ttl = -1;
+static gint hf_s5066_20_size = -1;
+
+/* Type 21: S_UNIDATA_INDICATION */
+/* TODO: handle RockwellCollins (v2.1 and earlier) 4-byte offset. */
+/* TODO: handle NON-ARQ With Errors case. */
+static gint hf_s5066_21_priority = -1;
+static gint hf_s5066_21_dest_sapid = -1;
+static gint hf_s5066_21_tx_mode = -1;
+static gint hf_s5066_21_src_sapid = -1;
+static gint hf_s5066_21_size = -1;
+static gint hf_s5066_21_err_blocks = -1;
+static gint hf_s5066_21_nrx_blocks = -1;
+
+
+/* Type 22: S_UNIDATA_REQUEST_CONFIRM */
+static gint hf_s5066_22_unused = -1;
+static gint hf_s5066_22_sapid = -1;
+static gint hf_s5066_22_size = -1;
+
+/* Type 23: S_UNIDATA_REQUEST_REJECTED */
+static gint hf_s5066_23_reason = -1;
+static const value_string s5066_23_reason[] = {
+ { 0, "Unknown reason"},
+ { 1, "Time-To-Live expired"},
+ { 2, "Destination SapID not bound"},
+ { 3, "Destination node not responding"},
+ { 4, "U_PDU larger than MTU"},
+ { 5, "Transmission Mode not specified"},
+ { 0, NULL },
+};
+static gint hf_s5066_23_sapid = -1;
+static gint hf_s5066_23_size = -1;
+
+/* Type 24: S_EXPEDITED_UNIDATA_REQUEST */
+static gint hf_s5066_24_unused = -1;
+static gint hf_s5066_24_sapid = -1;
+static gint hf_s5066_24_ttl = -1;
+static gint hf_s5066_24_size = -1;
+
+/* Type 25: S_EXPEDITED_UNIDATA_INDICATION */
+/* TODO: handle RockwellCollins (v2.1 and earlier) 4-byte offset. */
+/* TODO: handle NON-ARQ With Errors case. */
+static gint hf_s5066_25_unused = -1;
+static gint hf_s5066_25_dest_sapid = -1;
+static gint hf_s5066_25_tx_mode = -1;
+static gint hf_s5066_25_src_sapid = -1;
+static gint hf_s5066_25_size = -1;
+static gint hf_s5066_25_err_blocks = -1;
+static gint hf_s5066_25_nrx_blocks = -1;
+
+/* Type 26: S_EXPEDITED_UNIDATA_REQUEST_CONFIRM */
+static gint hf_s5066_26_unused = -1;
+static gint hf_s5066_26_sapid = -1;
+static gint hf_s5066_26_size = -1;
+
+/* Type 27: S_EXPEDITED_UNIDATA_REQUEST_REJECTED */
+static gint hf_s5066_27_reason = -1;
+static const value_string s5066_27_reason[] = {
+ { 0, "Unknown reason"},
+ { 1, "Time-To-Live expired"},
+ { 2, "Destination SapID not bound"},
+ { 3, "Destination node not responding"},
+ { 4, "U_PDU larger than MTU"},
+ { 5, "Transmission Mode not specified"},
+ { 0, NULL },
+};
+static gint hf_s5066_27_sapid = -1;
+static gint hf_s5066_27_size = -1;
+
+
+static gint ett_s5066 = -1;
+static gint ett_s5066_pdu = -1;
+static gint ett_s5066_servicetype = -1;
+static gint ett_s5066_address = -1;
+
+#ifndef ENABLE_STATIC
+G_MODULE_EXPORT void
+plugin_register(void)
+{
+ /* Register the protocol, protocol fields, and subtrees */
+ if (proto_s5066 == -1) { /* Execute protocol init only once */
+ proto_register_s5066();
+ }
+}
+
+G_MODULE_EXPORT void
+plugin_reg_handoff(void)
+{
+ proto_reg_handoff_s5066();
+}
+#endif
+
+void
+proto_register_s5066(void)
+{
+ static hf_register_info hf[] = {
+ { &hf_s5066_sync_word,
+ { "Sync preample", "s5066.sync", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }
+ },
+ { &hf_s5066_version,
+ { "S5066 version", "s5066.version", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }
+ },
+ { &hf_s5066_size,
+ { "S_Primitive size", "s5066.size", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ { &hf_s5066_type,
+ { "PDU Type", "s5066.type", FT_UINT8, BASE_DEC, VALS(s5066_pdu_type), 0x0, "", HFILL }
+ },
+ /* STANAG 5066 Address */
+ { &hf_s5066_ad_size,
+ { "Address size (1/2 Bytes)", "s5066.address.size", FT_UINT8, BASE_HEX, NULL, 0xE0, "", HFILL }
+ },
+ { &hf_s5066_ad_group,
+ { "Group address", "s5066.address.group", FT_UINT8, BASE_HEX, NULL, 0x10, "", HFILL }
+ },
+ { &hf_s5066_ad_address,
+ { "Address", "s5066.address.address", FT_IPv4, BASE_NONE, NULL, 0x1FFFFFFF, "", HFILL }
+ },
+ /* Service type */
+ { &hf_s5066_st_txmode,
+ { "Transmission mode", "s5066.st.txmode", FT_UINT8, BASE_HEX, VALS(s5066_st_txmode), 0xF0, "", HFILL }
+ },
+ { &hf_s5066_st_delivery_confirmation,
+ { "Delivery confirmation", "s5066.st.confirm", FT_UINT8, BASE_HEX, VALS(s5066_st_delivery_confirmation), 0x0C, "", HFILL }
+ },
+ { &hf_s5066_st_delivery_order,
+ { "Delivery order", "s5066.st.order", FT_UINT8, BASE_HEX, VALS(s5066_st_delivery_order), 0x02, "", HFILL }
+ },
+ { &hf_s5066_st_extended,
+ { "Extended field", "s5066.st.extended", FT_UINT8, BASE_HEX, VALS(s5066_st_extended), 0x01, "", HFILL }
+ },
+ { &hf_s5066_st_retries,
+ { "Minimum number of retransmissions", "s5066.st.retries", FT_UINT8, BASE_DEC, NULL, 0xF0, "", HFILL }
+ },
+ /* PDU Type 01: S_BIND_REQUEST */
+ { &hf_s5066_01_sapid,
+ { "Sap ID", "s5066.01.sapid", FT_UINT8, BASE_DEC, NULL, 0xF0, "", HFILL }
+ },
+ { &hf_s5066_01_rank,
+ { "Rank", "s5066.01.rank", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ { &hf_s5066_01_unused,
+ { "(Unused)", "s5066.01.unused", FT_UINT8, BASE_HEX, NULL, 0x0F, "", HFILL }
+ },
+ /* PDU Type 02: S_UNBIND_REQUEST */
+ /* --- no subfields --- */
+ /* PDU Type 03: S_BIND_ACCEPTED */
+ { &hf_s5066_03_sapid,
+ { "Sap ID", "s5066.03.sapid", FT_UINT8, BASE_DEC, NULL, 0xF0, "", HFILL }
+ },
+ { &hf_s5066_03_unused,
+ { "(Unused)", "s5066.03.unused", FT_UINT8, BASE_HEX, NULL, 0x0F, "", HFILL }
+ },
+ { &hf_s5066_03_mtu,
+ { "MTU", "s5066.03.mtu", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ /* PDU Type 04: S_BIND_REJECTED */
+ { &hf_s5066_04_reason,
+ { "Reason", "s5066.04.reason", FT_UINT8, BASE_DEC, VALS(s5066_04_reason), 0x0, "", HFILL }
+ },
+ /* PDU Type 05: S_UNBIND_INDICATION */
+ { &hf_s5066_05_reason,
+ { "Reason", "s5066.05.reason", FT_UINT8, BASE_DEC, VALS(s5066_05_reason), 0x0, "", HFILL }
+ },
+ /* Type 6: S_HARD_LINK_ESTABLISH */
+ { &hf_s5066_06_link_type,
+ { "Hardlink type", "s5066.06.type", FT_UINT8, BASE_DEC, VALS(s5066_hard_link_type), 0xC0, "", HFILL }
+ },
+ { &hf_s5066_06_link_priority,
+ { "Priority", "s5066.06.priority", FT_UINT8, BASE_DEC, NULL, 0x30, "", HFILL }
+ },
+ { &hf_s5066_06_sapid,
+ { "Remote Sap ID", "s5066.06.sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ /* Type 7: S_HARD_LINK_TERMINATE */
+ /* --- Only remote node address --- */
+ /* Type 8: S_HARD_LINK_ESTABLISHED */
+ { &hf_s5066_08_remote_status,
+ { "Remote node status", "s5066.08.status", FT_UINT8, BASE_DEC, VALS(s5066_08_remote_status), 0x0, "", HFILL }
+ },
+ { &hf_s5066_08_link_type,
+ { "Hardlink type", "s5066.08.type", FT_UINT8, BASE_DEC, VALS(s5066_hard_link_type), 0xC0, "", HFILL }
+ },
+ { &hf_s5066_08_link_priority,
+ { "Priority", "s5066.08.priority", FT_UINT8, BASE_DEC, NULL, 0x30, "", HFILL }
+ },
+ { &hf_s5066_08_sapid,
+ { "Remote Sap ID", "s5066.08.sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ /* Type 9: S_HARD_LINK_REJECTED */
+ { &hf_s5066_09_reason,
+ { "Reason", "s5066.09.reason", FT_UINT8, BASE_DEC, VALS(s5066_09_reason), 0x0, "", HFILL }
+ },
+ { &hf_s5066_09_link_type,
+ { "Hardlink type", "s5066.09.type", FT_UINT8, BASE_DEC, VALS(s5066_hard_link_type), 0xC0, "", HFILL }
+ },
+ { &hf_s5066_09_link_priority,
+ { "Priority", "s5066.09.priority", FT_UINT8, BASE_DEC, NULL, 0x30, "", HFILL }
+ },
+ { &hf_s5066_09_sapid,
+ { "Remote Sap ID", "s5066.09.sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ /* Type 10: S_HARD_LINK_TERMINATED */
+ { &hf_s5066_10_reason,
+ { "Reason", "s5066.10.reason", FT_UINT8, BASE_DEC, VALS(s5066_10_reason), 0x0, "", HFILL }
+ },
+ { &hf_s5066_10_link_type,
+ { "Hardlink type", "s5066.10.type", FT_UINT8, BASE_DEC, VALS(s5066_hard_link_type), 0xC0, "", HFILL }
+ },
+ { &hf_s5066_10_link_priority,
+ { "Priority", "s5066.10.priority", FT_UINT8, BASE_DEC, NULL, 0x30, "", HFILL }
+ },
+ { &hf_s5066_10_sapid,
+ { "Remote Sap ID", "s5066.10.sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ /* Type 11: S_HARD_LINK_INDICATION */
+ { &hf_s5066_11_remote_status,
+ { "Remote node status", "s5066.11.status", FT_UINT8, BASE_DEC, VALS(s5066_11_remote_status), 0x0, "", HFILL }
+ },
+ { &hf_s5066_11_link_type,
+ { "Hardlink type", "s5066.11.type", FT_UINT8, BASE_DEC, VALS(s5066_hard_link_type), 0xC0, "", HFILL }
+ },
+ { &hf_s5066_11_link_priority,
+ { "Priority", "s5066.11.priority", FT_UINT8, BASE_DEC, NULL, 0x30, "", HFILL }
+ },
+ { &hf_s5066_11_sapid,
+ { "Remote Sap ID", "s5066.11.sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ /* Type 12: S_HARD_LINK_ACCEPT */
+ { &hf_s5066_12_link_type,
+ { "Hardlink type", "s5066.12.type", FT_UINT8, BASE_DEC, VALS(s5066_hard_link_type), 0xC0, "", HFILL }
+ },
+ { &hf_s5066_12_link_priority,
+ { "Priority", "s5066.12.priority", FT_UINT8, BASE_DEC, NULL, 0x30, "", HFILL }
+ },
+ { &hf_s5066_12_sapid,
+ { "Remote Sap ID", "s5066.12.sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ /* Type 13: S_HARD_LINK_REJECT */
+ { &hf_s5066_13_reason,
+ { "Reason", "s5066.13.reason", FT_UINT8, BASE_DEC, VALS(s5066_13_reason), 0x0, "", HFILL }
+ },
+ { &hf_s5066_13_link_type,
+ { "Hardlink type", "s5066.13.type", FT_UINT8, BASE_DEC, VALS(s5066_hard_link_type), 0xC0, "", HFILL }
+ },
+ { &hf_s5066_13_link_priority,
+ { "Priority", "s5066.13.priority", FT_UINT8, BASE_DEC, NULL, 0x30, "", HFILL }
+ },
+ { &hf_s5066_13_sapid,
+ { "Remote Sap ID", "s5066.13.sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ /* Type 14: S_SUBNET_AVAILABILITY */
+ { &hf_s5066_14_status,
+ { "Status", "s5066.14.status", FT_UINT8, BASE_DEC, VALS(s5066_14_status), 0x0, "", HFILL }
+ },
+ { &hf_s5066_14_reason,
+ { "Reason", "s5066.14.reason", FT_UINT8, BASE_DEC, VALS(s5066_14_reason), 0x0, "", HFILL }
+ },
+ /* Type 15: S_DATAFLOW_ON */
+ /* --- no subfields --- */
+ /* Type 16: S_DATAFLOW_OFF */
+ /* --- no subfields --- */
+ /* Type 17: S_KEEP_ALIVE */
+ /* --- no subfields --- */
+ /* Type 18: S_MANAGEMENT_MESSAGE_REQUEST */
+ { &hf_s5066_18_type,
+ { "Message Type", "s5066.18.type", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }
+ },
+ { &hf_s5066_18_body,
+ { "Message Body", "s5066.18.body", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL }
+ },
+ /* Type 19: S_MANAGEMENT_MESSAGE_INDICATION */
+ { &hf_s5066_19_type,
+ { "Message Type", "s5066.19.type", FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }
+ },
+ { &hf_s5066_19_body,
+ { "Message Body", "s5066.19.body", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL }
+ },
+ /* Type 20: S_UNIDATA_REQUEST */
+ { &hf_s5066_20_priority,
+ { "Priority", "s5066.20.priority", FT_UINT8, BASE_DEC, NULL, 0xF0, "", HFILL }
+ },
+ { &hf_s5066_20_sapid,
+ { "Destination Sap ID", "s5066.20.sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ { &hf_s5066_20_ttl,
+ { "Time-To-Live (x2 seconds)", "s5066.20.ttl", FT_UINT24, BASE_DEC, NULL, 0x0FFFFF, "", HFILL }
+ },
+ { &hf_s5066_20_size,
+ { "U_PDU Size", "s5066.20.size", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ /* Type 21: S_UNIDATA_INDICATION */
+ { &hf_s5066_21_priority,
+ { "Priority", "s5066.21.priority", FT_UINT8, BASE_DEC, NULL, 0xF0, "", HFILL }
+ },
+ { &hf_s5066_21_dest_sapid,
+ { "Destination Sap ID", "s5066.21.dest_sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ { &hf_s5066_21_tx_mode,
+ { "Transmission Mode", "s5066.21.txmode", FT_UINT8, BASE_HEX, VALS(s5066_st_txmode), 0xF0, "", HFILL }
+ },
+ { &hf_s5066_21_src_sapid,
+ { "Source Sap ID", "s5066.21.src_sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ { &hf_s5066_21_size,
+ { "U_PDU Size", "s5066.21.size", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ { &hf_s5066_21_err_blocks,
+ { "Number of errored blocks", "s5066.21.err_blocks", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ { &hf_s5066_21_nrx_blocks,
+ { "Number of non-received blocks", "s5066.21.nrx_blocks", FT_UINT16, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ /* Type 22: S_UNIDATA_REQUEST_CONFIRM */
+ { &hf_s5066_22_unused,
+ { "(Unused)", "s5066.22.unused", FT_UINT8, BASE_DEC, NULL, 0xF0, "", HFILL }
+ },
+ { &hf_s5066_22_sapid,
+ { "Destination Sap ID", "s5066.22.sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ { &hf_s5066_22_size,
+ { "U_PDU Size", "s5066.22.size", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ /* Type 23: S_UNIDATA_REQUEST_REJECTED */
+ { &hf_s5066_23_reason,
+ { "Reason", "s5066.23.reason", FT_UINT8, BASE_DEC, VALS(s5066_23_reason), 0xF0, "", HFILL }
+ },
+ { &hf_s5066_23_sapid,
+ { "Destination Sap ID", "s5066.23.sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ { &hf_s5066_23_size,
+ { "U_PDU Size", "s5066.23.size", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ /* Type 24: S_EXPEDITED_UNIDATA_REQUEST */
+ { &hf_s5066_24_unused,
+ { "(Unused)", "s5066.24.unused", FT_UINT8, BASE_DEC, NULL, 0xF0, "", HFILL }
+ },
+ { &hf_s5066_24_sapid,
+ { "Destination Sap ID", "s5066.24.sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ { &hf_s5066_24_ttl,
+ { "Time-To-Live (x2 seconds)", "s5066.24.ttl", FT_UINT24, BASE_DEC, NULL, 0x0FFFFF, "", HFILL }
+ },
+ { &hf_s5066_24_size,
+ { "U_PDU Size", "s5066.24.size", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ /* Type 25: S_EXPEDITED_UNIDATA_INDICATION */
+ { &hf_s5066_25_unused,
+ { "(Unused)", "s5066.25.unused", FT_UINT8, BASE_DEC, NULL, 0xF0, "", HFILL }
+ },
+ { &hf_s5066_25_dest_sapid,
+ { "Destination Sap ID", "s5066.25.dest_sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ { &hf_s5066_25_tx_mode,
+ { "Transmission Mode", "s5066.25.txmode", FT_UINT8, BASE_HEX, VALS(s5066_st_txmode), 0xF0, "", HFILL }
+ },
+ { &hf_s5066_25_src_sapid,
+ { "Source Sap ID", "s5066.25.src_sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ { &hf_s5066_25_size,
+ { "U_PDU Size", "s5066.25.size", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ { &hf_s5066_25_err_blocks,
+ { "Number of errored blocks", "s5066.25.err_blocks", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ { &hf_s5066_25_nrx_blocks,
+ { "Number of non-received blocks", "s5066.25.nrx_blocks", FT_UINT16, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ /* Type 26: S_EXPEDITED_UNIDATA_REQUEST_CONFIRM */
+ { &hf_s5066_26_unused,
+ { "(Unused)", "s5066.26.unused", FT_UINT8, BASE_DEC, NULL, 0xF0, "", HFILL }
+ },
+ { &hf_s5066_26_sapid,
+ { "Destination Sap ID", "s5066.26.sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ { &hf_s5066_26_size,
+ { "U_PDU Size", "s5066.26.size", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ /* Type 27: S_UNIDATA_REQUEST_REJECTED */
+ { &hf_s5066_27_reason,
+ { "Reason", "s5066.27.reason", FT_UINT8, BASE_DEC, VALS(s5066_27_reason), 0xF0, "", HFILL }
+ },
+ { &hf_s5066_27_sapid,
+ { "Destination Sap ID", "s5066.27.sapid", FT_UINT8, BASE_DEC, NULL, 0x0F, "", HFILL }
+ },
+ { &hf_s5066_27_size,
+ { "U_PDU Size", "s5066.27.size", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+
+ };
+
+ /* Setup protocol subtree array */
+ static gint *ett[] = {
+ &ett_s5066,
+ &ett_s5066_pdu,
+ &ett_s5066_servicetype,
+ &ett_s5066_address,
+ };
+
+ module_t *s5066_module;
+
+ if (proto_s5066 == -1) {
+ proto_s5066 = proto_register_protocol (
+ "STANAG 5066 (SIS layer)", /* name */
+ "STANAG 5066", /* short name*/
+ "s5066" /* abbrev */
+ );
+ proto_register_field_array(proto_s5066, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+ }
+
+ s5066_module = prefs_register_protocol(proto_s5066, proto_reg_handoff_s5066);
+ prefs_register_bool_preference(s5066_module, "desegment_pdus",
+ "Reassemble S5066 PDUs spanning multiple TCP segments",
+ "Whether the S5066 dissector should dissect according to edition 1 of STANAG 5066."
+ " The default is to use editon 1.2 which is the more common one.",
+ &s5066_edition_one);
+ prefs_register_bool_preference(s5066_module, "edition_one",
+ "Dissect edition 1.0 of STANAG 5066",
+ "Whether the S5066 dissector should dissect editon 1 of the STANAG."
+ " This editon was never formally approved and is very rare. The common edition is editon 1.2.",
+ &s5066_edition_one);
+
+}
+
+void
+proto_reg_handoff_s5066(void)
+{
+ static gint Initialized = FALSE;
+
+ if (!Initialized) {
+ s5066_tcp_handle = create_dissector_handle(dissect_s5066_tcp, proto_s5066);
+ dissector_add("tcp.port", global_s5066_port, s5066_tcp_handle);
+
+ data_handle = find_dissector("data");
+ Initialized = TRUE;
+ }
+ if (!s5066_edition_one) {
+ s5066_header_size = 5;
+ s5066_size_offset = 3;
+ } else {
+ s5066_header_size = 4;
+ s5066_size_offset = 2;
+ }
+}
+
+static guint
+dissect_s5066_address(tvbuff_t *tvb, guint offset, proto_tree *tree, gint source)
+{
+ proto_item *ti = NULL;
+ proto_tree *s5066_tree_address = NULL;
+ guint32 address;
+
+ if (source) {
+ ti = proto_tree_add_text(tree, tvb, offset, 4, "Source Address");
+ }
+ else {
+ ti = proto_tree_add_text(tree, tvb, offset, 4, "Destination Address");
+ }
+ s5066_tree_address = proto_item_add_subtree(ti, ett_s5066_address);
+ proto_tree_add_item(s5066_tree_address, hf_s5066_ad_size, tvb, offset, 1, FALSE);
+ proto_tree_add_item(s5066_tree_address, hf_s5066_ad_group, tvb, offset, 1, FALSE);
+ address = tvb_get_ntohl(tvb, offset);
+ address = address & 0x1FFFFFFF;
+ proto_tree_add_ipv4(s5066_tree_address, hf_s5066_ad_address, tvb, offset, 4, g_htonl(address));
+
+ return offset += 4;
+}
+
+static guint
+dissect_s5066_servicetype(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_item *ti = NULL;
+ proto_tree *s5066_tree_servicetype = NULL;
+
+ ti = proto_tree_add_text(tree, tvb, offset, 2, "Service type");
+ s5066_tree_servicetype = proto_item_add_subtree(ti, ett_s5066_servicetype);
+
+ proto_tree_add_item(s5066_tree_servicetype, hf_s5066_st_txmode, tvb, offset, 1, FALSE);
+ proto_tree_add_item(s5066_tree_servicetype, hf_s5066_st_delivery_confirmation, tvb, offset, 1, FALSE);
+ proto_tree_add_item(s5066_tree_servicetype, hf_s5066_st_delivery_order, tvb, offset, 1, FALSE);
+ proto_tree_add_item(s5066_tree_servicetype, hf_s5066_st_extended, tvb, offset, 1, FALSE); offset++;
+ proto_tree_add_item(s5066_tree_servicetype, hf_s5066_st_retries, tvb, offset, 1, FALSE);
+
+ return offset;
+}
+
+/* S_BIND_REQUEST */
+static guint
+dissect_s5066_01(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_01_sapid, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_01_rank, tvb, offset, 1, FALSE); offset++;
+
+ offset = dissect_s5066_servicetype(tvb, offset, tree);
+
+ proto_tree_add_item(tree, hf_s5066_01_unused, tvb, offset, 1, FALSE); offset++;
+ return offset;
+}
+
+/* S_UNBIND_REQUEST */
+/* Commented out: does nothing and causes <variable not used> messages.
+static guint
+dissect_s5066_02(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ return offset;
+}
+*/
+
+/* S_BIND_ACCEPTED */
+static guint
+dissect_s5066_03(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_03_sapid, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_03_unused, tvb, offset, 1, FALSE); offset++;
+ proto_tree_add_item(tree, hf_s5066_03_mtu, tvb, offset, 2, FALSE); offset +=2;
+ return offset;
+}
+
+/* S_BIND_REJECTED */
+static guint
+dissect_s5066_04(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_04_reason, tvb, offset, 1, FALSE); offset++;
+ return offset;
+}
+
+/* S_UNBIND_INDICATION */
+static guint
+dissect_s5066_05(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_05_reason, tvb, offset, 1, FALSE); offset++;
+ return offset;
+}
+
+/* S_HARD_LINK_ESTABLISH */
+static guint
+dissect_s5066_06(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_06_link_type, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_06_link_priority, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_06_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, FALSE);
+ return offset;
+}
+
+/* S_HARD_LINK_TERMINATE */
+static guint
+dissect_s5066_07(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ offset = dissect_s5066_address(tvb, offset, tree, FALSE);
+ return offset;
+}
+
+/* S_HARD_LINK_ESTABLISHED */
+static guint
+dissect_s5066_08(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_08_remote_status, tvb, offset, 1, FALSE); offset++;
+ proto_tree_add_item(tree, hf_s5066_08_link_type, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_08_link_priority, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_08_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, FALSE);
+ return offset;
+}
+
+/* S_HARD_LINK_REJECTED */
+static guint
+dissect_s5066_09(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_09_reason, tvb, offset, 1, FALSE); offset++;
+ proto_tree_add_item(tree, hf_s5066_09_link_type, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_09_link_priority, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_09_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, FALSE);
+ return offset;
+}
+
+/* S_HARD_LINK_TERMINATED */
+static guint
+dissect_s5066_10(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_10_reason, tvb, offset, 1, FALSE); offset++;
+ proto_tree_add_item(tree, hf_s5066_10_link_type, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_10_link_priority, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_10_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, FALSE);
+ return offset;
+}
+
+/* S_HARD_LINK_INDICATION */
+static guint
+dissect_s5066_11(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_11_remote_status, tvb, offset, 1, FALSE); offset++;
+ proto_tree_add_item(tree, hf_s5066_11_link_type, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_11_link_priority, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_11_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, FALSE);
+ return offset;
+}
+
+/* S_HARD_LINK_ACCEPT */
+static guint
+dissect_s5066_12(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_12_link_type, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_12_link_priority, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_12_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, FALSE);
+ return offset;
+}
+
+/* S_HARD_LINK_REJECT */
+static guint
+dissect_s5066_13(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_13_reason, tvb, offset, 1, FALSE); offset++;
+ proto_tree_add_item(tree, hf_s5066_13_link_type, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_13_link_priority, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_13_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, FALSE);
+ return offset;
+}
+
+/* S_SUBNET_AVAILABILITY */
+static guint
+dissect_s5066_14(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_14_status, tvb, offset, 1, FALSE); offset++;
+ proto_tree_add_item(tree, hf_s5066_14_reason, tvb, offset, 1, FALSE); offset++;
+ return offset;
+}
+
+/* Following three commented out: do nothing and cause <variable not used> messages. */
+/* S_DATA_FLOW_ON */
+/*
+static guint
+dissect_s5066_15(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ return offset;
+}
+*/
+
+/* S_DATA_FLOW_OFF */
+/*
+static guint
+dissect_s5066_16(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ return offset;
+}
+*/
+
+/* S_KEEP_ALIVE */
+/*
+static guint
+dissect_s5066_17(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ return offset;
+}
+*/
+
+/* S_MANAGEMENT_MESSAGE_REQUEST */
+static guint
+dissect_s5066_18(tvbuff_t *tvb, guint offset, proto_tree *tree, guint pdu_size)
+{
+ guint body_size = 0;
+ proto_tree_add_item(tree, hf_s5066_18_type, tvb, offset, 1, FALSE); offset++;
+ body_size = pdu_size - offset;
+ proto_tree_add_bytes(tree, hf_s5066_18_body, tvb, offset, body_size, FALSE); offset += body_size;
+ return offset;
+}
+
+/* S_MANAGEMENT_MESSAGE_INDICATION */
+static guint
+dissect_s5066_19(tvbuff_t *tvb, guint offset, proto_tree *tree, guint pdu_size)
+{
+ guint body_size = 0;
+ proto_tree_add_item(tree, hf_s5066_19_type, tvb, offset, 1, FALSE); offset++;
+ body_size = pdu_size - offset;
+ proto_tree_add_bytes(tree, hf_s5066_19_body, tvb, offset, body_size, FALSE); offset += body_size;
+ return offset;
+}
+
+/* S_UNIDATA_REQUEST */
+static guint
+dissect_s5066_20(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_20_priority, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_20_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, FALSE);
+ offset = dissect_s5066_servicetype(tvb, offset, tree);
+ proto_tree_add_item(tree, hf_s5066_20_ttl, tvb, offset, 3, FALSE); offset += 3;
+ proto_tree_add_item(tree, hf_s5066_20_size, tvb, offset, 2, FALSE); offset += 2;
+
+ return offset;
+}
+
+/* S_UNIDATA_INDICATION */
+static guint
+dissect_s5066_21(tvbuff_t *tvb, guint offset, proto_tree *tree, guint pdu_size)
+{
+ proto_item *ti = NULL;
+ guint d_pdu_size = 0;
+ proto_tree_add_item(tree, hf_s5066_21_priority, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_21_dest_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, FALSE);
+ proto_tree_add_item(tree, hf_s5066_21_tx_mode, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_21_src_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, TRUE);
+
+ d_pdu_size = tvb_get_ntohs(tvb, offset);
+ proto_tree_add_item(tree, hf_s5066_21_size, tvb, offset, 2, FALSE); offset += 2;
+
+ /* Handle RockwellCollins (<= v2.1) 4-byte offset */
+ if ( (pdu_size - offset) == (d_pdu_size + 4) ) {
+ ti = proto_tree_add_item(tree, hf_s5066_21_err_blocks, tvb, offset, 2, FALSE); offset += 2;
+ proto_item_append_text(ti, ", (Field should not be present. Rockwell Collins v2.1 or earlier.) ");
+ ti = proto_tree_add_item(tree, hf_s5066_21_nrx_blocks, tvb, offset, 2, FALSE); offset += 2;
+ proto_item_append_text(ti, ", (Field should not be present. Rockwell Collins v2.1 or earlier.) ");
+ }
+ /* Handle Non-ARQ with errors */
+ if ( FALSE ) {
+ proto_tree_add_item(tree, hf_s5066_21_err_blocks, tvb, offset, 2, FALSE); offset += 2;
+ proto_tree_add_item(tree, hf_s5066_21_nrx_blocks, tvb, offset, 2, FALSE); offset += 2;
+ }
+ return offset;
+}
+
+/* S_UNIDATA_REQUEST_CONFIRM */
+static guint
+dissect_s5066_22(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_22_unused, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_22_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, FALSE);
+ proto_tree_add_item(tree, hf_s5066_22_size, tvb, offset, 2, FALSE); offset += 2;
+
+ return offset;
+}
+
+/* S_UNIDATA_REQUEST_REJECTED */
+static guint
+dissect_s5066_23(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_23_reason, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_23_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, FALSE);
+ proto_tree_add_item(tree, hf_s5066_23_size, tvb, offset, 2, FALSE); offset += 2;
+
+ return offset;
+}
+
+/* S_EXPEDITED_UNIDATA_REQUEST */
+static guint
+dissect_s5066_24(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_24_unused, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_24_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, FALSE);
+ offset = dissect_s5066_servicetype(tvb, offset, tree);
+ proto_tree_add_item(tree, hf_s5066_24_ttl, tvb, offset, 3, FALSE); offset += 3;
+ proto_tree_add_item(tree, hf_s5066_24_size, tvb, offset, 2, FALSE); offset += 2;
+
+ return offset;
+}
+
+/* S_EXPEDITED_UNIDATA_INDICATION */
+static guint
+dissect_s5066_25(tvbuff_t *tvb, guint offset, proto_tree *tree, guint pdu_size)
+{
+ proto_item *ti = NULL;
+ guint d_pdu_size = 0;
+
+ proto_tree_add_item(tree, hf_s5066_25_unused, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_25_dest_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, FALSE);
+ proto_tree_add_item(tree, hf_s5066_25_tx_mode, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_25_src_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, TRUE);
+ proto_tree_add_item(tree, hf_s5066_25_size, tvb, offset, 2, FALSE); offset += 2;
+
+ d_pdu_size = tvb_get_ntohs(tvb, offset);
+ proto_tree_add_item(tree, hf_s5066_21_size, tvb, offset, 2, FALSE); offset += 2;
+
+ /* Handle RockwellCollins (<= v2.1) 4-byte offset */
+ if ( (pdu_size - offset) == d_pdu_size + 4 ) {
+ ti = proto_tree_add_item(tree, hf_s5066_25_err_blocks, tvb, offset, 2, FALSE); offset += 2;
+ proto_item_append_text(ti, ", (Field should not be present. Rockwell Collins v2.1 or earlier.) ");
+ ti = proto_tree_add_item(tree, hf_s5066_25_nrx_blocks, tvb, offset, 2, FALSE); offset += 2;
+ proto_item_append_text(ti, ", (Field should not be present. Rockwell Collins v2.1 or earlier.) ");
+ }
+ /* Handle Non-ARQ with errors */
+ if ( FALSE ) {
+ proto_tree_add_item(tree, hf_s5066_25_err_blocks, tvb, offset, 2, FALSE); offset += 2;
+ proto_tree_add_item(tree, hf_s5066_25_nrx_blocks, tvb, offset, 2, FALSE); offset += 2;
+ }
+ return offset;
+}
+
+/* S_EXPEDITED_UNIDATA_REQUEST_CONFIRM */
+static guint
+dissect_s5066_26(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_26_unused, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_26_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, FALSE);
+ proto_tree_add_item(tree, hf_s5066_26_size, tvb, offset, 2, FALSE); offset += 2;
+
+ return offset;
+}
+
+/* S_EXPEDITED_UNIDATA_REQUEST_REJECTED */
+static guint
+dissect_s5066_27(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_s5066_27_reason, tvb, offset, 1, FALSE);
+ proto_tree_add_item(tree, hf_s5066_27_sapid, tvb, offset, 1, FALSE); offset++;
+ offset = dissect_s5066_address(tvb, offset, tree, FALSE);
+ proto_tree_add_item(tree, hf_s5066_27_size, tvb, offset, 2, FALSE); offset += 2;
+
+ return offset;
+}
+
+static guint
+get_s5066_pdu_len(tvbuff_t *tvb, int offset)
+{
+ guint16 plen;
+
+ /* Get the length of the S5066 PDU. */
+ plen = tvb_get_ntohs(tvb, offset + s5066_size_offset);
+
+ /* That length doesn't include the sync, version and length fields; add that in. */
+ return plen + s5066_header_size;
+}
+
+static void
+dissect_s5066_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ tcp_dissect_pdus(tvb, pinfo, tree, s5066_desegment, s5066_header_size, get_s5066_pdu_len, dissect_s5066_common);
+}
+
+static void
+dissect_s5066_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ guint offset = 0;
+ guint pdu_size = 0;
+ proto_item *ti_s5066 = NULL;
+ proto_item *ti_pdu = NULL;
+ tvbuff_t *next_tvb;
+ gint available_length, reported_length;
+
+ /* Determine PDU type to display in INFO column */
+ guint8 pdu_type = tvb_get_guint8(tvb, s5066_header_size);
+
+ if (check_col(pinfo->cinfo, COL_PROTOCOL)) {
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "S5066");
+ }
+ /* Clear out stuff in the info column, the add PDU type */
+ if (check_col(pinfo->cinfo, COL_INFO)) {
+ col_clear(pinfo->cinfo, COL_INFO);
+ }
+ if (check_col(pinfo->cinfo, COL_INFO)) {
+ col_add_fstr(pinfo->cinfo, COL_INFO, "PDU type %s", val_to_str(pdu_type, s5066_pdu_type, "Unknown (0x%02x)"));
+ }
+
+ if (tree) { /* We are being asked for details */
+ proto_tree *s5066_tree = NULL;
+ proto_tree *s5066_tree_pdu = NULL;
+
+ pdu_size = tvb_get_ntohs(tvb, s5066_size_offset) + s5066_header_size;
+
+ ti_s5066 = proto_tree_add_item(tree, proto_s5066, tvb, 0, -1, FALSE);
+ proto_item_append_text(ti_s5066, ", PDU type %s", val_to_str(pdu_type, s5066_pdu_type, "Unknown (0x%02x)"));
+ s5066_tree = proto_item_add_subtree(ti_s5066, ett_s5066);
+ proto_tree_add_item(s5066_tree, hf_s5066_sync_word, tvb, offset, 2, FALSE); offset +=2;
+ if (!s5066_edition_one) {
+ proto_tree_add_item(s5066_tree, hf_s5066_version, tvb, offset, 1, FALSE); offset++;
+ }
+ proto_tree_add_item(s5066_tree, hf_s5066_size, tvb, offset, 2, FALSE); offset +=2;
+ ti_pdu = proto_tree_add_item(s5066_tree, hf_s5066_type, tvb, offset, 1, FALSE); offset++;
+ s5066_tree_pdu = proto_item_add_subtree(ti_pdu, ett_s5066_pdu);
+ switch (pdu_type) {
+ case 1: offset = dissect_s5066_01(tvb, offset, s5066_tree_pdu); break;
+ /* case 2: offset = dissect_s5066_02(tvb, offset, s5066_tree_pdu); break; */
+ case 3: offset = dissect_s5066_03(tvb, offset, s5066_tree_pdu); break;
+ case 4: offset = dissect_s5066_04(tvb, offset, s5066_tree_pdu); break;
+ case 5: offset = dissect_s5066_05(tvb, offset, s5066_tree_pdu); break;
+ case 6: offset = dissect_s5066_06(tvb, offset, s5066_tree_pdu); break;
+ case 7: offset = dissect_s5066_07(tvb, offset, s5066_tree_pdu); break;
+ case 8: offset = dissect_s5066_08(tvb, offset, s5066_tree_pdu); break;
+ case 9: offset = dissect_s5066_09(tvb, offset, s5066_tree_pdu); break;
+ case 10: offset = dissect_s5066_10(tvb, offset, s5066_tree_pdu); break;
+ case 11: offset = dissect_s5066_11(tvb, offset, s5066_tree_pdu); break;
+ case 12: offset = dissect_s5066_12(tvb, offset, s5066_tree_pdu); break;
+ case 13: offset = dissect_s5066_13(tvb, offset, s5066_tree_pdu); break;
+ case 14: offset = dissect_s5066_14(tvb, offset, s5066_tree_pdu); break;
+ /* case 15: offset = dissect_s5066_15(tvb, offset, s5066_tree_pdu); break; */
+ /* case 16: offset = dissect_s5066_16(tvb, offset, s5066_tree_pdu); break; */
+ /* case 17: offset = dissect_s5066_17(tvb, offset, s5066_tree_pdu); break; */
+ case 18: offset = dissect_s5066_18(tvb, offset, s5066_tree_pdu, pdu_size); break;
+ case 19: offset = dissect_s5066_19(tvb, offset, s5066_tree_pdu, pdu_size); break;
+ case 20: offset = dissect_s5066_20(tvb, offset, s5066_tree_pdu); break;
+ case 21: offset = dissect_s5066_21(tvb, offset, s5066_tree_pdu, pdu_size); break;
+ case 22: offset = dissect_s5066_22(tvb, offset, s5066_tree_pdu); break;
+ case 23: offset = dissect_s5066_23(tvb, offset, s5066_tree_pdu); break;
+ case 24: offset = dissect_s5066_24(tvb, offset, s5066_tree_pdu); break;
+ case 25: offset = dissect_s5066_25(tvb, offset, s5066_tree_pdu, pdu_size); break;
+ case 26: offset = dissect_s5066_26(tvb, offset, s5066_tree_pdu); break;
+ case 27: offset = dissect_s5066_27(tvb, offset, s5066_tree_pdu); break;
+ }
+ }
+ proto_item_set_len(ti_s5066, offset);
+ /* proto_item_set_len(ti_pdu, offset - s5066_header_size); */
+
+ /* Call sub dissector(s) */
+ reported_length = pdu_size - offset;
+ available_length = tvb_length(tvb) - offset;
+
+ next_tvb = tvb_new_subset(tvb, offset, MIN(available_length, reported_length), reported_length);
+ call_dissector(data_handle, next_tvb, pinfo, tree);
+
+ return;
+}
+
+
Index: plugins/Makefile.nmake
===================================================================
--- plugins/Makefile.nmake (revision 16219)
+++ plugins/Makefile.nmake (working copy)
@@ -29,6 +29,7 @@
rlm \
rtnet \
rudp \
+ s5066 \
stats_tree \
v5ua
@@ -142,6 +143,11 @@
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake
cd ..
+s5066::
+ cd s5066
+ $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake
+ cd ..
+
stats_tree::
cd stats_tree
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake
@@ -198,6 +204,8 @@
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
cd ../rudp
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
+ cd ../s5066
+ $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
cd ../stats_tree
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
cd ../v5ua
@@ -249,6 +257,8 @@
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
cd ../rudp
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
+ cd ../s5066
+ $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
cd ../stats_tree
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
cd ../v5ua
@@ -298,6 +308,8 @@
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
cd ../rudp
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
+ cd ../s5066
+ $(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
cd ../stats_tree
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
cd ../v5ua
@@ -335,6 +347,7 @@
xcopy rlm\*.dll $(VERSION) /d
xcopy rtnet\*.dll $(VERSION) /d
xcopy rudp\*.dll $(VERSION) /d
+ xcopy s5066\*.dll $(VERSION) /d
xcopy stats_tree\*.dll $(VERSION) /d
xcopy v5ua\*.dll $(VERSION) /d
!ENDIF
Index: plugins/Makefile.am
===================================================================
--- plugins/Makefile.am (revision 16219)
+++ plugins/Makefile.am (working copy)
@@ -44,6 +44,7 @@
rlm \
rtnet \
rudp \
+ s5066 \
stats_tree \
v5ua
- Follow-Ups:
- [Ethereal-dev] Re: New dissector: STANAG 5066
- From: ronnie sahlberg
- [Ethereal-dev] Re: New dissector: STANAG 5066
- Prev by Date: [Ethereal-dev] New dissector: STANAG 5066
- Next by Date: RE: [Ethereal-dev] G_malloc vs malloc
- Previous by thread: [Ethereal-dev] New dissector: STANAG 5066
- Next by thread: [Ethereal-dev] Re: New dissector: STANAG 5066
- Index(es):





