diff options
author | Richard van der Hoff <richardv@mxtelecom.com> | 2007-08-24 13:44:59 +0000 |
---|---|---|
committer | Richard van der Hoff <richardv@mxtelecom.com> | 2007-08-24 13:44:59 +0000 |
commit | e184617c04e10d54081319e0960c0c91e2da8475 (patch) | |
tree | 887da7f2c19df3f248b072379cfc5dffb2a957e8 /plugins | |
parent | a312d7833c6a0417f1272dd701d94a47873f32ae (diff) |
complete the death of the h223 plugin
svn path=/trunk/; revision=22635
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/Makefile.am | 1 | ||||
-rw-r--r-- | plugins/h223/AUTHORS | 4 | ||||
-rw-r--r-- | plugins/h223/COPYING | 340 | ||||
-rw-r--r-- | plugins/h223/ChangeLog | 5 | ||||
-rw-r--r-- | plugins/h223/Makefile.am | 125 | ||||
-rw-r--r-- | plugins/h223/Makefile.common | 40 | ||||
-rw-r--r-- | plugins/h223/Makefile.nmake | 96 | ||||
-rw-r--r-- | plugins/h223/moduleinfo.h | 18 | ||||
-rw-r--r-- | plugins/h223/moduleinfo.nmake | 28 | ||||
-rw-r--r-- | plugins/h223/packet-h223.c | 1584 | ||||
-rw-r--r-- | plugins/h223/packet-h223.h | 31 | ||||
-rw-r--r-- | plugins/h223/plugin.rc.in | 34 |
12 files changed, 0 insertions, 2306 deletions
diff --git a/plugins/Makefile.am b/plugins/Makefile.am index eb99da0e3f..2dfa2d2536 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -30,7 +30,6 @@ SUBDIRS = \ enttec \ giop \ gryphon \ - h223 \ irda \ lwres \ m2m \ diff --git a/plugins/h223/AUTHORS b/plugins/h223/AUTHORS deleted file mode 100644 index 16664ae607..0000000000 --- a/plugins/h223/AUTHORS +++ /dev/null @@ -1,4 +0,0 @@ -Author : -Richard van der Hoff <richardv@mxtelecom.com> - - diff --git a/plugins/h223/COPYING b/plugins/h223/COPYING deleted file mode 100644 index d60c31a97a..0000000000 --- a/plugins/h223/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - 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. diff --git a/plugins/h223/ChangeLog b/plugins/h223/ChangeLog deleted file mode 100644 index 98d6a87710..0000000000 --- a/plugins/h223/ChangeLog +++ /dev/null @@ -1,5 +0,0 @@ -2004-04-14 Richard van der Hoff <richardv@mxtelecom.com> - - * initial version - - diff --git a/plugins/h223/Makefile.am b/plugins/h223/Makefile.am deleted file mode 100644 index 2bfec3064b..0000000000 --- a/plugins/h223/Makefile.am +++ /dev/null @@ -1,125 +0,0 @@ -# Makefile.am -# Automake file for H.223 plugin -# -# $Id$ -# -# Wireshark - Network traffic analyzer -# By Gerald Combs <gerald@wireshark.org> -# 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 - -if HAVE_WARNINGS_AS_ERRORS -AM_CFLAGS = -Werror -endif - -plugindir = @plugindir@ - -plugin_LTLIBRARIES = h223.la -h223_la_SOURCES = \ - plugin.c \ - moduleinfo.h \ - $(DISSECTOR_SRC) \ - $(DISSECTOR_SUPPORT_SRC) \ - $(DISSECTOR_INCLUDES) -h223_la_LDFLAGS = -module -avoid-version -h223_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 = \ - h223 \ - *~ - -MAINTAINERCLEANFILES = \ - Makefile.in \ - plugin.c - -EXTRA_DIST = \ - Makefile.common \ - Makefile.nmake \ - moduleinfo.nmake \ - plugin.rc.in diff --git a/plugins/h223/Makefile.common b/plugins/h223/Makefile.common deleted file mode 100644 index bc60a65d81..0000000000 --- a/plugins/h223/Makefile.common +++ /dev/null @@ -1,40 +0,0 @@ -# Makefile.common for H.223 plugin -# Contains the stuff from Makefile.am and Makefile.nmake that is -# a) common to both files and -# b) portable between both files -# -# $Id$ -# -# Wireshark - Network traffic analyzer -# By Gerald Combs <gerald@wireshark.org> -# 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 = h223 - -# the dissector sources (without any helpers) -DISSECTOR_SRC = \ - packet-h223.c - -# corresponding headers -DISSECTOR_INCLUDES = \ - packet-h223.h - -# Dissector helpers. They're included in the source files in this -# directory, but they're not dissectors themselves, i.e. they're not -# used to generate "register.c"). -DISSECTOR_SUPPORT_SRC = diff --git a/plugins/h223/Makefile.nmake b/plugins/h223/Makefile.nmake deleted file mode 100644 index dbc7d1c4e7..0000000000 --- a/plugins/h223/Makefile.nmake +++ /dev/null @@ -1,96 +0,0 @@ -# Makefile.nmake -# nmake file for Wireshark plugin -# -# $Id$ -# - -include ..\..\config.nmake -include moduleinfo.nmake - -include Makefile.common - -CFLAGS=/WX /DHAVE_CONFIG_H /I../.. /I../../wiretap $(GLIB_CFLAGS) \ - /I$(PCAP_DIR)\include -D_U_="" $(LOCAL_CFLAGS) - -LDFLAGS = $(PLUGIN_LDFLAGS) - -!IFDEF ENABLE_LIBWIRESHARK -LINK_PLUGIN_WITH=..\..\epan\libwireshark.lib -CFLAGS=/DHAVE_WIN32_LIBWIRESHARK_LIB /D_NEED_VAR_IMPORT_ $(CFLAGS) - -DISSECTOR_OBJECTS = $(DISSECTOR_SRC:.c=.obj) - -DISSECTOR_SUPPORT_OBJECTS = $(DISSECTOR_SUPPORT_SRC:.c=.obj) - -OBJECTS = $(DISSECTOR_OBJECTS) $(DISSECTOR_SUPPORT_OBJECTS) plugin.obj - -RESOURCE=$(PLUGIN_NAME).res - -all: $(PLUGIN_NAME).dll - -$(PLUGIN_NAME).rc : moduleinfo.nmake - sed -e s/@PLUGIN_NAME@/$(PLUGIN_NAME)/ \ - -e s/@RC_MODULE_VERSION@/$(RC_MODULE_VERSION)/ \ - -e s/@RC_VERSION@/$(RC_VERSION)/ \ - -e s/@MODULE_VERSION@/$(MODULE_VERSION)/ \ - -e s/@PACKAGE@/$(PACKAGE)/ \ - -e s/@VERSION@/$(VERSION)/ \ - -e s/@MSVC_VARIANT@/$(MSVC_VARIANT)/ \ - < plugin.rc.in > $@ - -$(PLUGIN_NAME).dll $(PLUGIN_NAME).exp $(PLUGIN_NAME).lib : $(OBJECTS) $(LINK_PLUGIN_WITH) $(RESOURCE) - link -dll /out:$(PLUGIN_NAME).dll $(LDFLAGS) $(OBJECTS) $(LINK_PLUGIN_WITH) \ - $(GLIB_LIBS) $(RESOURCE) - -# -# 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) ../../tools/make-dissector-reg.py ../../tools/make-dissector-reg -!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) $(RESOURCE) plugin.c *.pdb \ - $(PLUGIN_NAME).dll $(PLUGIN_NAME).dll.manifest $(PLUGIN_NAME).lib \ - $(PLUGIN_NAME).exp $(PLUGIN_NAME).rc - -distclean: clean - -maintainer-clean: distclean diff --git a/plugins/h223/moduleinfo.h b/plugins/h223/moduleinfo.h deleted file mode 100644 index cbb5be5b86..0000000000 --- a/plugins/h223/moduleinfo.h +++ /dev/null @@ -1,18 +0,0 @@ -/* Included *after* config.h, in order to re-define these macros */ - -#ifdef PACKAGE -#undef PACKAGE -#endif - -/* Name of package */ -#define PACKAGE "h223" - - -#ifdef VERSION -#undef VERSION -#endif - -/* Version number of package */ -#define VERSION "0.0.1" - - diff --git a/plugins/h223/moduleinfo.nmake b/plugins/h223/moduleinfo.nmake deleted file mode 100644 index 2b9908aeb6..0000000000 --- a/plugins/h223/moduleinfo.nmake +++ /dev/null @@ -1,28 +0,0 @@ -# -# $Id$ -# - -# The name -PACKAGE=h223 - -# The version -MODULE_VERSION_MAJOR=0 -MODULE_VERSION_MINOR=0 -MODULE_VERSION_MICRO=1 -MODULE_VERSION_EXTRA=0 - -# -# The RC_VERSION should be comma-separated, not dot-separated, -# as per Graham Bloice's message in -# -# http://www.ethereal.com/lists/ethereal-dev/200303/msg00283.html -# -# "The RC_VERSION variable in config.nmake should be comma separated. -# This allows the resources to be built correctly and the version -# number to be correctly displayed in the explorer properties dialog -# for the executables, and XP's tooltip, rather than 0.0.0.0." -# - -MODULE_VERSION=$(MODULE_VERSION_MAJOR).$(MODULE_VERSION_MINOR).$(MODULE_VERSION_MICRO).$(MODULE_VERSION_EXTRA) -RC_MODULE_VERSION=$(MODULE_VERSION_MAJOR),$(MODULE_VERSION_MINOR),$(MODULE_VERSION_MICRO),$(MODULE_VERSION_EXTRA) - diff --git a/plugins/h223/packet-h223.c b/plugins/h223/packet-h223.c deleted file mode 100644 index 2cd86d7fe4..0000000000 --- a/plugins/h223/packet-h223.c +++ /dev/null @@ -1,1584 +0,0 @@ -/* packet-h223.c - * Routines for H.223 packet dissection - * Copyright (c) 2004-5 MX Telecom Ltd <richardv@mxtelecom.com> - * - * $Id$ - * - * Wireshark - Network traffic analyzer - * By Gerald Combs <gerald@wireshark.org> - * 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. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <stdio.h> - -#include <gmodule.h> -#include <glib.h> -#include <epan/emem.h> -#include <epan/bitswap.h> -#include <epan/circuit.h> -#include <epan/conversation.h> -#include <epan/packet.h> -#include <epan/stream.h> -#include <epan/reassemble.h> -#include <epan/golay.h> -#include <epan/iax2_codec_type.h> -#include <epan/dissectors/packet-frame.h> -#include <epan/asn1.h> -#include <epan/dissectors/packet-h245.h> - -#include "packet-h223.h" - -#include <string.h> - -/* #define DEBUG_H223 */ - -/* debug the mux-pdu defragmentation code. warning: verbose output! */ -/* #define DEBUG_H223_FRAGMENTATION */ - -#define PROTO_TAG_H223 "H223" - -/* Wireshark ID of the H.223 protocol */ -static int proto_h223 = -1; -static int proto_h223_bitswapped = -1; - -/* The following hf_* variables are used to hold the Wireshark IDs of - * our header fields; they are filled out when we call - * proto_register_field_array() in proto_register_h223() - */ -static int hf_h223_non_h223_data = -1; -static int hf_h223_mux_stuffing_pdu = -1; -static int hf_h223_mux_pdu = -1; -static int hf_h223_mux_header = -1; -static int hf_h223_mux_rawhdr = -1; -static int hf_h223_mux_correctedhdr = -1; -static int hf_h223_mux_mc = -1; -static int hf_h223_mux_mpl = -1; -static int hf_h223_mux_deact = -1; -static int hf_h223_mux_vc = -1; -static int hf_h223_mux_extra = -1; -static int hf_h223_mux_hdlc2 = -1; -static int hf_h223_mux_fragments = -1; -static int hf_h223_mux_fragment = -1; -static int hf_h223_mux_fragment_overlap = -1; -static int hf_h223_mux_fragment_overlap_conflict = -1; -static int hf_h223_mux_fragment_multiple_tails = -1; -static int hf_h223_mux_fragment_too_long_fragment = -1; -static int hf_h223_mux_fragment_error = -1; -static int hf_h223_mux_reassembled_in = -1; - -static int hf_h223_al_fragments = -1; -static int hf_h223_al_fragment = -1; -static int hf_h223_al_fragment_overlap = -1; -static int hf_h223_al_fragment_overlap_conflict = -1; -static int hf_h223_al_fragment_multiple_tails = -1; -static int hf_h223_al_fragment_too_long_fragment = -1; -static int hf_h223_al_fragment_error = -1; -static int hf_h223_al_reassembled_in = -1; - -static int hf_h223_al1 = -1; -static int hf_h223_al1_framed = -1; -static int hf_h223_al2 = -1; -static int hf_h223_al2_sequenced = -1; -static int hf_h223_al2_unsequenced = -1; -static int hf_h223_al2_seqno = -1; -static int hf_h223_al2_crc = -1; -static int hf_h223_al2_crc_bad = -1; - -static int hf_h223_al_payload = -1; - -/* These are the ids of the subtrees that we may be creating */ -static gint ett_h223 = -1; -static gint ett_h223_non_h223_data = -1; -static gint ett_h223_mux_stuffing_pdu = -1; -static gint ett_h223_mux_pdu = -1; -static gint ett_h223_mux_header = -1; -static gint ett_h223_mux_deact = -1; -static gint ett_h223_mux_vc = -1; -static gint ett_h223_mux_extra = -1; -static gint ett_h223_mux_fragments = -1; -static gint ett_h223_mux_fragment = -1; -static gint ett_h223_al_fragments = -1; -static gint ett_h223_al_fragment = -1; -static gint ett_h223_al1 = -1; -static gint ett_h223_al2 = -1; -static gint ett_h223_al_payload = -1; - -/* These are the handles of our subdissectors */ -static dissector_handle_t data_handle=NULL; -static dissector_handle_t srp_handle=NULL; -static dissector_handle_t h245dg_handle=NULL; - -static const fragment_items h223_mux_frag_items _U_ = { - &ett_h223_mux_fragment, - &ett_h223_mux_fragments, - &hf_h223_mux_fragments, - &hf_h223_mux_fragment, - &hf_h223_mux_fragment_overlap, - &hf_h223_mux_fragment_overlap_conflict, - &hf_h223_mux_fragment_multiple_tails, - &hf_h223_mux_fragment_too_long_fragment, - &hf_h223_mux_fragment_error, - &hf_h223_mux_reassembled_in, - "fragments" -}; - -static const fragment_items h223_al_frag_items = { - &ett_h223_al_fragment, - &ett_h223_al_fragments, - &hf_h223_al_fragments, - &hf_h223_al_fragment, - &hf_h223_al_fragment_overlap, - &hf_h223_al_fragment_overlap_conflict, - &hf_h223_al_fragment_multiple_tails, - &hf_h223_al_fragment_too_long_fragment, - &hf_h223_al_fragment_error, - &hf_h223_al_reassembled_in, - "fragments" -}; - -/* this is a fudge to pass pdu_offset into add_h223_mux_element() */ -static guint32 pdu_offset; - -/*************************************************************************** - * - * virtual circuit number handling - * - * we have to be able to manage more than one H.223 call at a time, - * so have a hash which maps {call,vc} to an integer. - */ - -typedef struct _h223_call_info h223_call_info; - -typedef struct { - const h223_call_info* call; /* h223 call */ - guint32 vc; /* child circuit */ -} circuit_chain_key; - -static GHashTable *circuit_chain_hashtable = NULL; -static guint circuit_chain_count = 1; - -/* Hash Functions */ -static gint circuit_chain_equal(gconstpointer v, gconstpointer w) -{ - const circuit_chain_key *v1 = (const circuit_chain_key *)v; - const circuit_chain_key *v2 = (const circuit_chain_key *)w; - gint result; - result = ( v1->call == v2->call && - v1->vc == v2 -> vc ); - return result;; -} - -static guint circuit_chain_hash (gconstpointer v) -{ - const circuit_chain_key *key = (const circuit_chain_key *)v; - guint hash_val = ((guint32)(unsigned long)(key->call))^(((guint32)key->vc) << 16); - return hash_val; -} - -static guint32 circuit_chain_lookup(const h223_call_info* call_info, - guint32 child_vc) -{ - circuit_chain_key key, *new_key; - guint32 circuit_id; - key.call = call_info; - key.vc = child_vc; - circuit_id = GPOINTER_TO_UINT(g_hash_table_lookup( circuit_chain_hashtable, &key )); - if( circuit_id == 0 ) { - new_key = se_alloc(sizeof(circuit_chain_key)); - *new_key = key; - circuit_id = ++circuit_chain_count; - g_hash_table_insert(circuit_chain_hashtable, new_key, GUINT_TO_POINTER(circuit_id)); - } - return circuit_id; -} - -static void circuit_chain_init(void) -{ - if (circuit_chain_hashtable) - g_hash_table_destroy(circuit_chain_hashtable); - circuit_chain_hashtable = g_hash_table_new(circuit_chain_hash, circuit_chain_equal); - circuit_chain_count = 1; -} - - -/*************************************************************************** - * - * Call information management - * - */ - -/* we keep information on each call in an h223_call_info structure - * - * We attach the h223_call_info structures to individual calls with - * circuit_add_proto_data(). -*/ - -typedef struct _h223_mux_element_listitem h223_mux_element_listitem; -struct _h223_mux_element_listitem { - h223_mux_element *me; - guint32 first_frame; - guint32 pdu_offset; - h223_mux_element_listitem *next; -}; - -/* we have this information for each stream */ -typedef struct { - h223_mux_element_listitem* mux_table[16]; -} h223_call_direction_data; - - -struct _h223_call_info { - /* H.223 level: 0 for standard H223, 1, 2 or 3 for the enhanced protocols - specified in the annexes - */ - int h223_level; - - /* for H.223 streams over TCP (as opposed to IAX), this - stores the source address and port of the first packet spotted, - so that we can differentiate directions. - */ - address srcaddress; - guint32 srcport; - - h223_call_direction_data direction_data[2]; -}; - -typedef struct _h223_lc_params_listitem h223_lc_params_listitem; -struct _h223_lc_params_listitem -{ - h223_lc_params *lc_params; - guint32 first_frame; - guint32 last_frame; - h223_lc_params_listitem *next; -}; - -typedef struct { - h223_lc_params_listitem *lc_params[2]; - h223_call_info *call_info; -} h223_vc_info; - -static void add_h223_mux_element(h223_call_direction_data *direct, guint8 mc, h223_mux_element *me, guint32 framenum) -{ - h223_mux_element_listitem *li; - h223_mux_element_listitem **old_li_ptr; - h223_mux_element_listitem *old_li; - - DISSECTOR_ASSERT(mc < 16); - - li = se_alloc(sizeof(h223_mux_element_listitem)); - old_li_ptr = &(direct->mux_table[mc]); - old_li = *old_li_ptr; - if( !old_li ) { - direct->mux_table[mc] = li; - } else { - while( old_li->next ) { - old_li_ptr = &(old_li->next); - old_li = *old_li_ptr; - } - if( framenum < old_li->first_frame || (framenum == old_li->first_frame && pdu_offset < old_li->pdu_offset) ) - return; - else if ( framenum == old_li->first_frame && pdu_offset == old_li->pdu_offset ) - *old_li_ptr = li; /* replace the tail of the list with the new item, since */ - /* a single h223 pdu has just set the same MC twice.. */ - else - old_li->next = li; - } - li->first_frame = framenum; - li->pdu_offset = pdu_offset; - li->next = 0; - li->me = me; -} - -static h223_mux_element* find_h223_mux_element(h223_call_direction_data* direct, guint8 mc, guint32 framenum, guint32 pkt_offset) -{ - h223_mux_element_listitem* li; - - DISSECTOR_ASSERT(mc < 16); - - li = direct->mux_table[mc]; - - while( li && li->next && li->next->first_frame < framenum ) - li = li->next; - while( li && li->next && li->next->first_frame == framenum && li->next->pdu_offset < pkt_offset ) - li = li->next; - if( li ) { - return li->me; - } else { - return NULL; - } -} - -static void add_h223_lc_params(h223_vc_info* vc_info, int direction, h223_lc_params *lc_params, guint32 framenum ) -{ - h223_lc_params_listitem *li = se_alloc(sizeof(h223_lc_params_listitem)); - h223_lc_params_listitem **old_li_ptr = &(vc_info->lc_params[direction ? 0 : 1]); - h223_lc_params_listitem *old_li = *old_li_ptr; - if( !old_li ) { - vc_info->lc_params[direction ? 0 : 1] = li; - } else { - while( old_li->next ) { - old_li_ptr = &(old_li->next); - old_li = *old_li_ptr; - } - if( framenum < old_li->first_frame ) - return; - else if( framenum == old_li->first_frame ) - *old_li_ptr = li; - else { - old_li->next = li; - old_li->last_frame = framenum - 1; - } - } - li->first_frame = framenum; - li->last_frame = 0; - li->next = 0; - li->lc_params = lc_params; -} - -static h223_lc_params* find_h223_lc_params(h223_vc_info* vc_info, int direction, guint32 framenum) -{ - h223_lc_params_listitem* li = vc_info->lc_params[direction? 0 : 1]; - while( li && li->next && li->next->first_frame <= framenum ) - li = li->next; - if( li ) - return li->lc_params; - else - return NULL; -} - -static void init_direction_data(h223_call_direction_data *direct) -{ - int i; - h223_mux_element *mc0_element; - - for ( i = 0; i < 16; ++i ) - direct->mux_table[i] = NULL; - - /* set up MC 0 to contain just VC 0 */ - mc0_element = se_alloc(sizeof(h223_mux_element)); - add_h223_mux_element( direct, 0, mc0_element, 0 ); - mc0_element->sublist = NULL; - mc0_element->vc = 0; - mc0_element->repeat_count = 0; /* until closing flag */ - mc0_element->next = NULL; -} - -static h223_vc_info* h223_vc_info_new( h223_call_info* call_info ) -{ - h223_vc_info *vc_info = se_alloc(sizeof(h223_vc_info)); - vc_info->lc_params[0] = vc_info->lc_params[1] = NULL; - vc_info->call_info = call_info; - return vc_info; -} - -static void init_logical_channel( guint32 start_frame, h223_call_info* call_info, int vc, int direction, h223_lc_params* params ) -{ - guint32 circuit_id = circuit_chain_lookup(call_info, vc); - circuit_t *subcircuit; - h223_vc_info *vc_info; - subcircuit = find_circuit( CT_H223, circuit_id, start_frame ); - - if( subcircuit == NULL ) { - subcircuit = circuit_new( CT_H223, circuit_id, start_frame ); -#ifdef DEBUG_H223 - g_debug("%d: Created new circuit %d for call %p VC %d", start_frame, circuit_id, call_info, vc); -#endif - vc_info = h223_vc_info_new( call_info ); - circuit_add_proto_data( subcircuit, proto_h223, vc_info ); - } else { - vc_info = circuit_get_proto_data( subcircuit, proto_h223 ); - } - add_h223_lc_params( vc_info, direction, params, start_frame ); -} - -/* create a brand-new h223_call_info structure */ -static h223_call_info *create_call_info( guint32 start_frame ) -{ - h223_call_info *data; - h223_lc_params *vc0_params; - - data = se_alloc(sizeof(h223_call_info)); - - /* initialise the call info */ - init_direction_data(&data -> direction_data[0]); - init_direction_data(&data -> direction_data[1]); - - /* FIXME shouldn't this be figured out dynamically? */ - data -> h223_level = 2; - - vc0_params = se_alloc(sizeof(h223_lc_params)); - vc0_params->al_type = al1Framed; - vc0_params->al_params = NULL; - vc0_params->segmentable = TRUE; - vc0_params->subdissector = srp_handle; - init_logical_channel( start_frame, data, 0, P2P_DIR_SENT, vc0_params ); - init_logical_channel( start_frame, data, 0, P2P_DIR_RECV, vc0_params ); - return data; -} - -/* find or create call_info struct for calls over circuits (eg, IAX) */ -static h223_call_info *find_or_create_call_info_circ(packet_info * pinfo) -{ - h223_call_info *data; - circuit_t *circ = NULL; - - if(pinfo->ctype != CT_NONE) - circ = find_circuit( pinfo->ctype, pinfo->circuit_id, pinfo->fd->num ); - if(circ == NULL) - return NULL; - - data = (h223_call_info *)circuit_get_proto_data(circ, proto_h223); - - if( data == NULL ) { - data = create_call_info(pinfo->fd->num); - -#ifdef DEBUG_H223 - g_debug("%u: Created new call %p for circuit %p ctype %d, id %u", - pinfo->fd->num, data, circ, pinfo->ctype, pinfo->circuit_id); -#endif - circuit_add_proto_data(circ, proto_h223, data); - } - - /* work out what direction we're really going in */ - if( pinfo->p2p_dir < 0 || pinfo->p2p_dir > 1) - pinfo->p2p_dir = P2P_DIR_SENT; - - return data; -} - -/* find or create call_info struct for calls over conversations (eg, RTP) */ -static h223_call_info *find_or_create_call_info_conv(packet_info * pinfo) -{ - h223_call_info *data; - conversation_t *conv; - - /* assume we're running atop TCP or RTP; use the conversation support */ - conv = find_conversation( pinfo->fd->num, - &pinfo->src,&pinfo->dst, - pinfo->ptype, - pinfo->srcport,pinfo->destport, 0 ); - - /* both RTP and TCP track their conversations, so just assert here if - * we can't find one */ - DISSECTOR_ASSERT(conv); - - data = (h223_call_info *)conversation_get_proto_data(conv, proto_h223); - - if(data == NULL && pinfo->ptype == PT_UDP ) { - conversation_t *conv2; - - /* RTP tracks the two sides of the conversation totally separately; - * this messes us up totally. - * - * Look for another converstation, going in the opposite direction. - */ - conv2 = find_conversation( pinfo->fd->num, - &pinfo->dst,&pinfo->src, - pinfo->ptype, - pinfo->destport,pinfo->srcport, 0 ); - if(conv2 != NULL) - data = (h223_call_info *)conversation_get_proto_data(conv2, proto_h223); - - if(data != NULL) { -#ifdef DEBUG_H223 - g_debug("%u: Identified conv %p as reverse of conv %p with call %p and type=%u src=%u.%u.%u.%u:%u dst=%u.%u.%u.%u:%u", - pinfo->fd->num, conv, conv2, data, pinfo->ptype, - pinfo->dst.data[0], pinfo->dst.data[1], pinfo->dst.data[2], pinfo->dst.data[3], - pinfo->destport, - pinfo->src.data[0], pinfo->src.data[1], pinfo->src.data[2], pinfo->src.data[3], - pinfo->srcport); -#endif - conversation_add_proto_data(conv, proto_h223, data); - } - } - - /* we still haven't found any call data - create a new one for this - * conversation */ - if(data == NULL) { - data = create_call_info(pinfo->fd->num); - -#ifdef DEBUG_H223 - g_debug("%u: Created new call %p for conv %p type=%u src=%u.%u.%u.%u:%u dst=%u.%u.%u.%u:%u", - pinfo->fd->num, data, conv, pinfo->ptype, - pinfo->src.data[0], pinfo->src.data[1], pinfo->src.data[2], pinfo->src.data[3], - pinfo->srcport, - pinfo->dst.data[0], pinfo->dst.data[1], pinfo->dst.data[2], pinfo->dst.data[3], - pinfo->destport); -#endif - - conversation_add_proto_data(conv, proto_h223, data); - /* add the source details so we can distinguish directions - * in future */ - COPY_ADDRESS(&(data -> srcaddress), &(pinfo->src)); - data -> srcport = pinfo->srcport; - } - - /* work out what direction we're really going in */ - if( ADDRESSES_EQUAL( &(pinfo->src), &(data->srcaddress)) - && pinfo->srcport == data->srcport ) - pinfo->p2p_dir = P2P_DIR_SENT; - else - pinfo->p2p_dir = P2P_DIR_RECV; - - return data; -} - -static h223_call_info *find_or_create_call_info ( packet_info * pinfo ) -{ - h223_call_info *data; - - data = find_or_create_call_info_circ(pinfo); - if(data == NULL) - data = find_or_create_call_info_conv(pinfo); - return data; -} - -/* called from the h245 dissector to handle a MultiplexEntrySend message */ -static void h223_set_mc( packet_info* pinfo, guint8 mc, h223_mux_element* me ) -{ - circuit_t *circ = find_circuit( pinfo->ctype, pinfo->circuit_id, pinfo->fd->num ); - h223_vc_info* vc_info; - - /* if this h245 pdu packet came from an h223 circuit, add the details on - * the new mux entry */ - if(circ) { - vc_info = circuit_get_proto_data(circ, proto_h223); - add_h223_mux_element( &(vc_info->call_info->direction_data[pinfo->p2p_dir ? 0 : 1]), mc, me, pinfo->fd->num ); - } -} - -/* called from the h245 dissector to handle an OpenLogicalChannelAck message */ -static void h223_add_lc( packet_info* pinfo, guint16 lc, h223_lc_params* params ) -{ - circuit_t *circ = find_circuit( pinfo->ctype, pinfo->circuit_id, pinfo->fd->num ); - h223_vc_info* vc_info; - - /* if this h245 pdu packet came from an h223 circuit, add the details on - * the new channel */ - if(circ) { - vc_info = circuit_get_proto_data(circ, proto_h223); - init_logical_channel( pinfo->fd->num, vc_info->call_info, lc, pinfo->p2p_dir, params ); - } -} - -/************************************************************************************ - * - * AL-PDU dissection - */ - -const guint8 crctable[256] = { - 0x00, 0x91, 0xe3, 0x72, 0x07, 0x96, 0xe4, 0x75, 0x0e, 0x9f, 0xed, 0x7c, 0x09, 0x98, 0xea, 0x7b, - 0x1c, 0x8d, 0xff, 0x6e, 0x1b, 0x8a, 0xf8, 0x69, 0x12, 0x83, 0xf1, 0x60, 0x15, 0x84, 0xf6, 0x67, - 0x38, 0xa9, 0xdb, 0x4a, 0x3f, 0xae, 0xdc, 0x4d, 0x36, 0xa7, 0xd5, 0x44, 0x31, 0xa0, 0xd2, 0x43, - 0x24, 0xb5, 0xc7, 0x56, 0x23, 0xb2, 0xc0, 0x51, 0x2a, 0xbb, 0xc9, 0x58, 0x2d, 0xbc, 0xce, 0x5f, - 0x70, 0xe1, 0x93, 0x02, 0x77, 0xe6, 0x94, 0x05, 0x7e, 0xef, 0x9d, 0x0c, 0x79, 0xe8, 0x9a, 0x0b, - 0x6c, 0xfd, 0x8f, 0x1e, 0x6b, 0xfa, 0x88, 0x19, 0x62, 0xf3, 0x81, 0x10, 0x65, 0xf4, 0x86, 0x17, - 0x48, 0xd9, 0xab, 0x3a, 0x4f, 0xde, 0xac, 0x3d, 0x46, 0xd7, 0xa5, 0x34, 0x41, 0xd0, 0xa2, 0x33, - 0x54, 0xc5, 0xb7, 0x26, 0x53, 0xc2, 0xb0, 0x21, 0x5a, 0xcb, 0xb9, 0x28, 0x5d, 0xcc, 0xbe, 0x2f, - 0xe0, 0x71, 0x03, 0x92, 0xe7, 0x76, 0x04, 0x95, 0xee, 0x7f, 0x0d, 0x9c, 0xe9, 0x78, 0x0a, 0x9b, - 0xfc, 0x6d, 0x1f, 0x8e, 0xfb, 0x6a, 0x18, 0x89, 0xf2, 0x63, 0x11, 0x80, 0xf5, 0x64, 0x16, 0x87, - 0xd8, 0x49, 0x3b, 0xaa, 0xdf, 0x4e, 0x3c, 0xad, 0xd6, 0x47, 0x35, 0xa4, 0xd1, 0x40, 0x32, 0xa3, - 0xc4, 0x55, 0x27, 0xb6, 0xc3, 0x52, 0x20, 0xb1, 0xca, 0x5b, 0x29, 0xb8, 0xcd, 0x5c, 0x2e, 0xbf, - 0x90, 0x01, 0x73, 0xe2, 0x97, 0x06, 0x74, 0xe5, 0x9e, 0x0f, 0x7d, 0xec, 0x99, 0x08, 0x7a, 0xeb, - 0x8c, 0x1d, 0x6f, 0xfe, 0x8b, 0x1a, 0x68, 0xf9, 0x82, 0x13, 0x61, 0xf0, 0x85, 0x14, 0x66, 0xf7, - 0xa8, 0x39, 0x4b, 0xda, 0xaf, 0x3e, 0x4c, 0xdd, 0xa6, 0x37, 0x45, 0xd4, 0xa1, 0x30, 0x42, 0xd3, - 0xb4, 0x25, 0x57, 0xc6, 0xb3, 0x22, 0x50, 0xc1, 0xba, 0x2b, 0x59, 0xc8, 0xbd, 0x2c, 0x5e, 0xcf }; - -static guint8 h223_al2_crc8bit( tvbuff_t *tvb ) { - guint32 len = tvb_reported_length(tvb) - 1; - const guint8* data = tvb_get_ptr( tvb, 0, len ); - unsigned char crc = 0; - guint32 pos = 0; - DISSECTOR_ASSERT(tvb_reported_length(tvb) >= 1); - while ( len-- ) - crc = crctable[crc^data[pos++]]; - return crc; -} - -static void dissect_mux_al_pdu( tvbuff_t *tvb, - packet_info *pinfo, - proto_tree *vc_tree, -/* circuit_t* vc_circuit, */ - h223_lc_params* lc_params ) -{ - proto_tree *al_tree = NULL; - proto_item *al_item; - proto_tree *al_subtree; - proto_item *al_subitem = NULL; - proto_item *tmp_item; - tvbuff_t *next_tvb = NULL; - dissector_handle_t subdissector = lc_params->subdissector; - guint32 len = tvb_reported_length(tvb); - - guint8 calc_checksum; - guint8 real_checksum; - gboolean al2_sequenced = FALSE; - int data_start; - - switch( lc_params->al_type ) { - case al1Framed: - case al1NotFramed: - al_item = proto_tree_add_none_format(vc_tree, hf_h223_al1, tvb, 0, -1, "H.223 AL1 (%sframed)", - (lc_params->al_type==al1Framed)?"":"not "); - al_tree = proto_item_add_subtree (al_item, ett_h223_al1); - if(lc_params->al_type == al1Framed) - proto_tree_add_boolean_hidden(al_tree, hf_h223_al1_framed, tvb, 0, 1, TRUE ); - next_tvb = tvb; - al_subitem = proto_tree_add_item(al_tree, hf_h223_al_payload, next_tvb, 0, -1, FALSE); - break; - - case al2WithSequenceNumbers: - al2_sequenced = TRUE; - /* fall-through */ - case al2WithoutSequenceNumbers: - tmp_item = proto_tree_add_boolean(vc_tree, hf_h223_al2, tvb, 0, 0, TRUE ); - - al_item = proto_tree_add_item(vc_tree, - al2_sequenced?hf_h223_al2_sequenced:hf_h223_al2_unsequenced, - tvb, 0, -1,FALSE); - al_tree = proto_item_add_subtree (al_item, ett_h223_al2); - - PROTO_ITEM_SET_GENERATED(tmp_item); - - /* check minimum payload length */ - if(len < (al2_sequenced?2U:1U)) - THROW(BoundsError); - - data_start = 0; - if( al2_sequenced ) { - proto_tree_add_item(al_tree, hf_h223_al2_seqno, tvb, 0, 1, TRUE); - data_start++; - } - - next_tvb = tvb_new_subset( tvb, data_start, len-1-data_start, len-1-data_start ); - al_subitem = proto_tree_add_item(al_tree, hf_h223_al_payload, next_tvb, 0, -1, FALSE); - - calc_checksum = h223_al2_crc8bit(tvb); - real_checksum = tvb_get_guint8(tvb, len - 1); - - if( calc_checksum == real_checksum ) { - proto_tree_add_uint_format(al_tree, hf_h223_al2_crc, tvb, len - 1, 1, real_checksum, - "CRC: 0x%02x (correct)", real_checksum ); - } else { - proto_tree_add_uint_format(al_tree, hf_h223_al2_crc, tvb, len - 1, 1, real_checksum, - "CRC: 0x%02x (incorrect, should be 0x%02x)", real_checksum, calc_checksum ); - tmp_item = proto_tree_add_boolean( al_tree, hf_h223_al2_crc_bad, tvb, len - 1, 1, TRUE ); - PROTO_ITEM_SET_GENERATED(tmp_item); - - /* don't pass pdus which fail checksums on to the subdissector */ - subdissector = data_handle; - } - break; - default: - call_dissector(data_handle, tvb, pinfo, vc_tree); - return; - } - - if (!subdissector) - subdissector = data_handle; - - al_subtree = proto_item_add_subtree(al_subitem, ett_h223_al_payload); - call_dissector(subdissector, next_tvb, pinfo, al_subtree); -} - -/************************************************************************************ - * - * MUX-PDU dissection - */ - - -/* dissect a fragment of a MUX-PDU which belongs to a particular VC - * - * tvb buffer containing the MUX-PDU fragment - * pinfo info on the packet containing the last fragment of the MUX-PDU - * pkt_offset offset within the block from the superdissector where the - * fragment starts (must increase monotonically for constant pinfo->fd->num) - * pdu_tree dissection tree for the PDU; a single item will be added (with - * its own subtree) - * vc VC for this SDU - * end_of_mux_sdu true if this is a segmentable VC and this is the last - * fragment in an SDU - */ -static void dissect_mux_sdu_fragment(tvbuff_t *volatile next_tvb, - packet_info *pinfo, - guint32 pkt_offset, - proto_tree *pdu_tree, - h223_call_info* call_info, - guint16 vc, gboolean end_of_mux_sdu) -{ - /* update the circuit details before passing to a subdissector */ - guint32 orig_circuit = pinfo->circuit_id; - guint32 orig_ctype = pinfo->ctype; - pinfo->circuit_id=circuit_chain_lookup(call_info, vc); - pinfo->ctype=CT_H223; - - TRY { - circuit_t *subcircuit=find_circuit(pinfo->ctype,pinfo->circuit_id,pinfo->fd->num); - proto_tree *vc_tree = NULL; - proto_item *vc_item; - h223_vc_info *vc_info = NULL; - h223_lc_params *lc_params = NULL; - - if(pdu_tree) { - vc_item = proto_tree_add_uint(pdu_tree, hf_h223_mux_vc, next_tvb, 0, tvb_reported_length(next_tvb), vc); - vc_tree = proto_item_add_subtree (vc_item, ett_h223_mux_vc); - } - - if( subcircuit == NULL ) { - g_message( "Frame %d: Subcircuit id %d not found for call %p VC %d", pinfo->fd->num, - pinfo->circuit_id, call_info, vc ); - } else { - vc_info = circuit_get_proto_data(subcircuit, proto_h223); - if( vc_info != NULL ) { - lc_params = find_h223_lc_params( vc_info, pinfo->p2p_dir, pinfo->fd->num ); - } - } - - - if( lc_params != NULL ) { - if( lc_params->segmentable && lc_params->al_type != al1NotFramed ) { - stream_t *substream; - stream_pdu_fragment_t *frag; - - substream = find_stream_circ(subcircuit,pinfo->p2p_dir); - if(substream == NULL ) - substream = stream_new_circ(subcircuit,pinfo->p2p_dir); - frag = stream_find_frag(substream,pinfo->fd->num,pkt_offset); - - if(frag == NULL ) { -#ifdef DEBUG_H223 - g_debug("%d: New H.223 VC fragment: Parent circuit %d; subcircuit %d; offset %d; len %d, end %d", - pinfo->fd->num, orig_circuit, pinfo->circuit_id, pkt_offset, tvb_reported_length(next_tvb), end_of_mux_sdu); -#endif - frag = stream_add_frag(substream,pinfo->fd->num,pkt_offset, - next_tvb,pinfo,!end_of_mux_sdu); - } else { -#ifdef DEBUG_H223 - g_debug("%d: Found H.223 VC fragment: Parent circuit %d; subcircuit %d; offset %d; len %d, end %d", - pinfo->fd->num, orig_circuit, pinfo->circuit_id, pkt_offset, tvb_reported_length(next_tvb), end_of_mux_sdu); -#endif - } - - next_tvb = stream_process_reassembled( - next_tvb, 0, pinfo, - "Reassembled H.223 AL-PDU", - frag, &h223_al_frag_items, - NULL, vc_tree); - } - - if(next_tvb) { - /* fudge to pass pkt_offset down to add_h223_mux_element, - * should it be called */ - pdu_offset = pkt_offset; - dissect_mux_al_pdu(next_tvb, pinfo, vc_tree,/* subcircuit,*/ lc_params ); - } - } else { - call_dissector(data_handle,next_tvb,pinfo,vc_tree); - } - } - - /* restore the original circuit details for future PDUs */ - FINALLY { - pinfo->ctype=orig_ctype; - pinfo->circuit_id=orig_circuit; - } - ENDTRY; -} - -static guint32 mux_element_sublist_size( h223_mux_element* me ) -{ - h223_mux_element *current_me = me; - guint32 length = 0; - while ( current_me ) { - current_me = current_me->next; - if ( current_me->sublist ) - length += current_me->repeat_count * mux_element_sublist_size( current_me->sublist ); - else - length += current_me->repeat_count; - } - if ( length == 0 ) { /* should never happen, but to avoid infinite loops... */ - DISSECTOR_ASSERT_NOT_REACHED(); - length = 1; - } - return length; -} - -/* dissect part of a MUX-PDU payload according to a multiplex list - * - * tvb buffer containing entire mux-pdu payload - * pinfo info on the packet containing the last fragment of the MUX-PDU - * pkt_offset offset within the block from the superdissector where the - * MUX-PDU starts (must increase monotonically for constant - * pinfo->fd->num) - * pdu_tree dissection tree for the PDU - * call_info data structure for h223 call - * me top of mux list - * offset offset within tvb to start work - * endOfMuxSdu true if the end-of-sdu flag was set - */ -static guint32 dissect_mux_payload_by_me_list( tvbuff_t *tvb, packet_info *pinfo, guint32 pkt_offset, - proto_tree *pdu_tree, - h223_call_info* call_info, h223_mux_element* me, guint32 offset, gboolean endOfMuxSdu ) -{ - guint32 len = tvb_reported_length(tvb); - guint32 frag_len; - guint32 sublist_len; - int i; - while ( me ) { - if ( me->sublist ) { - if ( me->repeat_count == 0 ) { - for(sublist_len = mux_element_sublist_size( me->sublist ); - offset + sublist_len <= len; - offset = dissect_mux_payload_by_me_list( tvb, pinfo, pkt_offset, pdu_tree, - call_info, me->sublist, offset, endOfMuxSdu ) ); - } else { - for(i = 0; i < me->repeat_count; ++i) - offset = dissect_mux_payload_by_me_list( tvb, pinfo, pkt_offset, pdu_tree, - call_info, me->sublist, offset, endOfMuxSdu ); - } - } else { - if ( me->repeat_count == 0 ) - frag_len = len - offset; - else - frag_len = me->repeat_count; - if(frag_len > 0) { - tvbuff_t *next_tvb; - next_tvb = tvb_new_subset(tvb, offset, frag_len, frag_len); - dissect_mux_sdu_fragment( next_tvb, pinfo, pkt_offset + offset, pdu_tree, - call_info, me->vc, (offset+frag_len==len) && endOfMuxSdu); - offset += frag_len; - } - } - me = me->next; - } - return offset; -} - -/* dissect the payload of a MUX-PDU - * - * tvb buffer containing entire mux-pdu payload - * pinfo info on the packet containing the last fragment of the MUX-PDU - * pkt_offset offset within the block from the superdissector where the - * MUX-PDU starts (must increase monotonically for constant - * pinfo->fd->num) - * pdu_tree dissection tree for the PDU - * call_info data structure for h223 call - * mc multiplex code for this PDU - * endOfMuxSdu true if the end-of-sdu flag was set - */ -static void dissect_mux_payload( tvbuff_t *tvb, packet_info *pinfo, guint32 pkt_offset, - proto_tree *pdu_tree, - h223_call_info* call_info, guint8 mc, gboolean endOfMuxSdu ) -{ - guint32 len = tvb_reported_length(tvb); - - h223_mux_element* me = find_h223_mux_element( &(call_info->direction_data[pinfo->p2p_dir ? 0 : 1]), mc, pinfo->fd->num, pkt_offset ); - - if( me ) { - dissect_mux_payload_by_me_list( tvb, pinfo, pkt_offset, pdu_tree, call_info, me, 0, endOfMuxSdu ); - } else { - /* no entry found in mux-table. ignore packet and dissect as data */ - proto_tree *vc_tree = NULL; - - if(pdu_tree) { - proto_item *vc_item = proto_tree_add_item(pdu_tree, hf_h223_mux_deact, tvb, 0, len, FALSE); - vc_tree = proto_item_add_subtree(vc_item, ett_h223_mux_deact); - } - call_dissector(data_handle,tvb,pinfo,vc_tree); - } -} - -/* dissect a reassembled mux-pdu - * - * tvb buffer containing mux-pdu, including header and closing flag - * pinfo packet info for packet containing the end of the mux-pdu - * pkt_offset offset within the block from the superdissector where the - * MUX-PDU starts (must increase monotonically for constant - * pinfo->fd->num) - * h223_tree dissection tree for h223 protocol; a single item will be added - * (with a sub-tree) - * call_info h223 info structure for this h223 call - * pdu_no index of this pdu within the call - */ -static void dissect_mux_pdu( tvbuff_t *tvb, packet_info * pinfo, - guint32 pkt_offset, - proto_tree *h223_tree, - h223_call_info *call_info) -{ - guint32 offset = 0; - /* actual (as opposed to reported) payload len */ - guint32 len; - guint32 raw_hdr = 0, correct_hdr = 0; - gint32 errors = 0; - guint16 closing_flag = 0; - guint8 mc = 0; - guint8 mpl = 0; - gboolean end_of_mux_sdu = FALSE; - tvbuff_t *pdu_tvb; - - proto_item *pdu_item = NULL; - proto_tree *pdu_tree = NULL; - -#ifdef DEBUG_H223_FRAGMENTATION - g_debug("%u: dissecting complete H.223 MUX-PDU, pkt_offset %u, len %u", - pinfo->fd->num, pkt_offset, tvb_reported_length(tvb)); -#endif - - switch(call_info->h223_level) { - case 0: case 1: - raw_hdr = tvb_get_guint8(tvb,0); - mc = (guint8)((raw_hdr>>1) & 0xf); - end_of_mux_sdu = raw_hdr & 1; - offset++; - /* closing flag is one byte long for h223 level 0, two for level 1 */ - len = mpl = tvb_length_remaining(tvb, offset)-(call_info->h223_level+1); - - /* XXX should ignore pdus with incorrect HECs */ - break; - - case 2: - raw_hdr = tvb_get_letoh24(tvb,0); - errors = golay_errors(raw_hdr); - offset += 3; - len = tvb_length_remaining(tvb,offset)-2; - - if(errors != -1) { - correct_hdr = raw_hdr ^ (guint32)errors; - - mc = (guint8)(correct_hdr & 0xf); - mpl = (guint8)((correct_hdr >> 4) & 0xff); - - /* we should never have been called if there's not enough data in - * available. */ - DISSECTOR_ASSERT(len >= mpl); - - closing_flag = tvb_get_ntohs(tvb,offset+len); - end_of_mux_sdu = (closing_flag==(0xE14D ^ 0xFFFF)); - } else { - mc = 0; - mpl = len; - } - break; - - case 3: - /* XXX not implemented */ - default: - len=0; - DISSECTOR_ASSERT_NOT_REACHED(); - } - - - if( h223_tree ) { - if( mpl == 0 ) { - pdu_item = proto_tree_add_item (h223_tree, hf_h223_mux_stuffing_pdu, tvb, 0, -1, FALSE); - pdu_tree = proto_item_add_subtree (pdu_item, ett_h223_mux_stuffing_pdu); - } else { - pdu_item = proto_tree_add_item (h223_tree, hf_h223_mux_pdu, tvb, 0, -1, FALSE); - pdu_tree = proto_item_add_subtree (pdu_item, ett_h223_mux_pdu); - } - } - - if( pdu_tree ) { - proto_item *item = proto_tree_add_item (pdu_tree, hf_h223_mux_header, tvb, 0, offset, FALSE); - proto_tree *hdr_tree = proto_item_add_subtree (item, ett_h223_mux_header); - - switch(call_info->h223_level) { - case 0: case 1: - proto_tree_add_uint(hdr_tree,hf_h223_mux_mc,tvb,0,1,mc); - break; - - case 2: - if( errors == -1 ) { - proto_tree_add_uint_format(hdr_tree, hf_h223_mux_rawhdr, tvb, - 0, 3, raw_hdr, - "Raw value: 0x%06x (uncorrectable errors)", raw_hdr ); - } else { - if( errors == 0 ) { - proto_tree_add_uint_format(hdr_tree, hf_h223_mux_rawhdr, tvb, - 0, 3, raw_hdr, - "Raw value: 0x%06x (correct)", raw_hdr ); - } else { - proto_tree_add_uint_format(hdr_tree, hf_h223_mux_rawhdr, tvb, - 0, 3, raw_hdr, - "Raw value: 0x%06x (errors are 0x%06x)", raw_hdr, errors ); - } - item = proto_tree_add_uint(hdr_tree,hf_h223_mux_correctedhdr,tvb,0,3, - correct_hdr); - PROTO_ITEM_SET_GENERATED(item); - proto_tree_add_uint(hdr_tree,hf_h223_mux_mc,tvb,0,1,mc); - proto_tree_add_uint(hdr_tree,hf_h223_mux_mpl,tvb,0,2,mpl); - } - break; - - case 3: - /* XXX not implemented */ - default: - DISSECTOR_ASSERT_NOT_REACHED(); - } - } - - if(mpl > 0) { - pdu_tvb = tvb_new_subset(tvb, offset, len, mpl); - if(errors != -1) { - dissect_mux_payload(pdu_tvb,pinfo,pkt_offset+offset,pdu_tree,call_info,mc,end_of_mux_sdu); - } else { - call_dissector(data_handle,pdu_tvb,pinfo,pdu_tree); - } - offset += mpl; - } - - /* any extra data in the PDU, beyond that indictated by the mpl, is - dissected as data. */ - len -= mpl; - if( len > 0 ) { - tvbuff_t *next_tvb = tvb_new_subset(tvb, offset, len, len); - proto_tree *vc_tree = NULL; - - if( pdu_tree ) { - proto_item *vc_item = proto_tree_add_item(pdu_tree, hf_h223_mux_extra, next_tvb, 0, len, FALSE); - vc_tree = proto_item_add_subtree(vc_item, ett_h223_mux_deact); - } - call_dissector(data_handle,next_tvb,pinfo,vc_tree); - - offset += len; - } - - /* add the closing HDLC flag */ - if( pdu_tree ) - proto_tree_add_item(pdu_tree,hf_h223_mux_hdlc2,tvb,offset,2,FALSE); -} - - -/************************************************************************************ - * - * MUX-PDU delineation and defragmentation - */ - -/* attempt to parse the header of a mux pdu */ -static gboolean attempt_mux_level0_header_parse(guint32 nbytes, guint32 hdr, guint32 *minlen) -{ - /* level 0 isn't byte-aligned, so is a complete pain to implement */ - DISSECTOR_ASSERT_NOT_REACHED(); - nbytes = nbytes; - hdr=hdr; - minlen=minlen; - return FALSE; -} - -static gboolean attempt_mux_level1_header_parse(guint32 nbytes, guint32 hdr, guint32 *minlen) -{ - /* this is untested */ - DISSECTOR_ASSERT_NOT_REACHED(); - - if(nbytes < 2) - return FALSE; - - hdr &= 0xffff; - /* don't interpret a repeated hdlc as a header */ - if(hdr == 0xE14D) - return FALSE; - - /* + 1 byte of header and 2 bytes of closing HDLC */ - *minlen = (guint8)((hdr >> 12) & 0xff) + 3; - return TRUE; -} - -static gboolean attempt_mux_level2_3_header_parse(guint32 nbytes, guint32 hdr, guint32 *minlen) -{ - gint32 errors; - - if(nbytes < 3) - return FALSE; - - /* + 3 bytes of header and 2 bytes of closing HDLC */ - *minlen = 5; - - /* bah, we get the header in the wrong order */ - hdr = - ((hdr & 0xFF0000) >> 16) | - (hdr & 0x00FF00) | - ((hdr & 0x0000FF) << 16); - - errors = golay_errors(hdr); - if(errors != -1) { - hdr ^= errors; - *minlen += ((hdr >> 4) & 0xff); - } - - return TRUE; -} - -static gboolean (* const attempt_mux_header_parse[])(guint32 nbytes, guint32 header_buf, guint32 *minlen) = { - attempt_mux_level0_header_parse, - attempt_mux_level1_header_parse, - attempt_mux_level2_3_header_parse, - attempt_mux_level2_3_header_parse -}; - -static gboolean h223_mux_check_hdlc(int h223_level, guint32 nbytes, guint32 tail_buf) -{ - guint32 masked; - - switch(h223_level) { - case 0: - /* level 0 isn't byte-aligned, so is a complete pain to implement */ - DISSECTOR_ASSERT_NOT_REACHED(); - return FALSE; - break; - - case 1: - masked = tail_buf & 0xffff; - return nbytes >= 2 && masked == 0xE14D; - - case 2: case 3: - masked = tail_buf & 0xffff; - return nbytes >= 2 && (masked == 0xE14D || masked == (0xE14D ^ 0xFFFF)); - - default: - DISSECTOR_ASSERT_NOT_REACHED(); - return FALSE; - } -} - -/* read a pdu (or the start of a pdu) from the tvb, and dissect it - * - * returns the number of bytes processed, or the negative of the number of - * extra bytes needed, or zero if we don't know yet - */ - -static gint dissect_mux_pdu_fragment( tvbuff_t *tvb, guint32 start_offset, packet_info * pinfo, - proto_tree *h223_tree, - h223_call_info *call_info) -{ - tvbuff_t *volatile next_tvb; - volatile guint32 offset = start_offset; - gboolean more_frags = TRUE; - - gboolean header_parsed = FALSE; - guint32 header_buf = 0, tail_buf = 0; - guint32 pdu_minlen = 0; - - -#ifdef DEBUG_H223_FRAGMENTATION - g_debug("%d: dissecting H.223 PDU, start_offset %u, %u bytes left", - pinfo->fd->num,start_offset, tvb_reported_length_remaining( tvb, start_offset )); -#endif - - while( more_frags && offset < tvb_reported_length( tvb )) { - guint8 byte = tvb_get_guint8(tvb, offset++); - - /* read a byte into the header buf, if necessary */ - if((offset-start_offset) <= 4) { - header_buf <<= 8; - header_buf |= byte; - } - - /* read the byte into the tail buf */ - tail_buf <<= 8; - tail_buf |= byte; - - /* if we haven't parsed the header yet, attempt to do so now */ - if(!header_parsed) - /* this sets current_pdu_header parsed if current_pdu_read == 3 */ - header_parsed = (attempt_mux_header_parse[call_info->h223_level]) - (offset-start_offset,header_buf,&pdu_minlen); - - /* if we have successfully parsed the header, we have sufficient data, - * and we have found the closing hdlc, we are done here */ - if(header_parsed && (offset-start_offset) >= pdu_minlen) { - if(h223_mux_check_hdlc(call_info->h223_level,offset-start_offset,tail_buf)) { - more_frags = FALSE; - } - } - } - - if( more_frags ) { - if(pdu_minlen <= (offset-start_offset)) { - /* we haven't found the closing hdlc yet, but we don't know how - * much more we need */ -#ifdef DEBUG_H223_FRAGMENTATION - g_debug("\tBailing, requesting more bytes"); -#endif - return 0; - } else { - guint32 needed = pdu_minlen-(offset-start_offset); -#ifdef DEBUG_H223_FRAGMENTATION - g_debug("\tBailing, requesting %i-%i=%u more bytes", pdu_minlen,(offset-start_offset),needed); -#endif - return - (gint) needed; - } - } - - /* create a tvb for the fragment */ - next_tvb = tvb_new_subset(tvb, start_offset, offset-start_offset, - offset-start_offset); - - - /* we catch boundserrors on the pdu so that errors on an - * individual pdu don't screw up the whole of the rest of the - * stream */ - TRY { - dissect_mux_pdu( next_tvb, pinfo, start_offset, h223_tree, call_info); - } - - CATCH2(BoundsError,ReportedBoundsError) { - if (check_col(pinfo->cinfo, COL_INFO)) - col_append_str(pinfo->cinfo, COL_INFO, - "[Malformed Packet]"); - proto_tree_add_protocol_format(h223_tree, proto_malformed, - tvb, 0, 0, "[Malformed Packet: %s]", pinfo->current_proto); - } - - ENDTRY; - - return (offset-start_offset); -} - -/************************************************************************************ - * - * main dissector entry points - */ - -/* dissects PDUs from the tvb - * - * Updates desegment_offset and desegment_len if the end of the data didn't - * line up with the end of a pdu. - */ -static void dissect_h223 (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree) -{ - proto_tree *h223_tree = NULL; - proto_item *h223_item = NULL; - h223_call_info *call_info = NULL; - guint32 offset = 0; - - /* set up the protocol and info fields in the summary pane */ - if (check_col (pinfo->cinfo, COL_PROTOCOL)) - col_set_str (pinfo->cinfo, COL_PROTOCOL, PROTO_TAG_H223); - - if (check_col (pinfo->cinfo, COL_INFO)) - col_clear (pinfo->cinfo, COL_INFO); - - /* find or create the call_info for this call */ - call_info = find_or_create_call_info(pinfo); - - /* add the 'h223' tree to the main tree */ - if (tree) { - h223_item = proto_tree_add_item (tree, proto_h223, tvb, 0, -1, FALSE); - h223_tree = proto_item_add_subtree (h223_item, ett_h223); - } - - while( offset < tvb_reported_length( tvb )) { - int res = dissect_mux_pdu_fragment( tvb, offset, pinfo, - h223_tree, call_info); - if(res <= 0) { - /* the end of the tvb held the start of a PDU */ - pinfo->desegment_offset = offset; - - /* if res != 0, we actually know how much more data we need for a - * PDU. - * - * However, if we return that, it means that we get called twice - * for the next packet; this makes it hard to tell how far throught - * the stream we are and we have to start messing about with - * getting the seqno from the superdissector's private data. So we - * don't do that. - * - * pinfo->desegment_len = (res == 0 ? DESEGMENT_ONE_MORE_SEGMENT : -res); - */ - pinfo -> desegment_len = DESEGMENT_ONE_MORE_SEGMENT; - - if(h223_item) { - /* shrink the h223 protocol item such that it only includes the - * bits we dissected */ - proto_item_set_len(h223_item,offset); - } - - if(offset == 0) { - if(check_col (pinfo->cinfo, COL_INFO)) - col_set_str (pinfo->cinfo, COL_INFO, "(No complete PDUs)"); - } - return; - } - offset += res; - } -} - -/* H.223 specifies that the least-significant bit is transmitted first; - * however this is at odds with IAX which transmits bytes with the - * first-received bit as the MSB. - * - * This dissector swaps the ordering of the bits in each byte before using the - * normal entry point. - */ -static void dissect_h223_bitswapped (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree) -{ - tvbuff_t *reversed_tvb; - guint8 *data; - guint len; - guint i; - - len = tvb_length(tvb); - data = g_malloc(len); - for( i=0; i<len; i++) - data[i]=BIT_SWAP(tvb_get_guint8(tvb,i)); - - reversed_tvb = tvb_new_real_data(data,len,tvb_reported_length(tvb)); - - /* - * Add the reversed tvbuff to the list of tvbuffs to which - * the tvbuff we were handed refers, so it'll get - * cleaned up when that tvbuff is cleaned up. - */ - tvb_set_child_real_data_tvbuff(tvb, reversed_tvb); - - /* Add a freer */ - tvb_set_free_cb(reversed_tvb, g_free); - - /* Add the reversed data to the data source list. */ - add_new_data_source(pinfo, reversed_tvb, "Bit-swapped H.223 frame" ); - - dissect_h223(reversed_tvb,pinfo,tree); -} - -/******************************************************************************/ - -static void h223_init_protocol (void) -{ - circuit_chain_init(); -} - - -void proto_register_h223 (void) -{ - /* A header field is something you can search/filter on. - * - * We create a structure to register our fields. It consists of an - * array of hf_register_info structures, each of which are of the format - * {&(field id), {name, abbrev, type, display, strings, bitmask, blurb, HFILL}}. - */ - - static hf_register_info hf[] = { - { &hf_h223_non_h223_data, - { "Non-H.223 data", "h223.non-h223", FT_NONE, BASE_NONE, NULL, 0x0, - "Initial data in stream, not a PDU", HFILL }}, - - { &hf_h223_mux_stuffing_pdu, - { "H.223 stuffing PDU", "h223.mux.stuffing", FT_NONE, BASE_NONE, NULL, 0x0, - "Empty PDU used for stuffing when no data available", HFILL }}, - - { &hf_h223_mux_pdu, - { "H.223 MUX-PDU", "h223.mux", FT_NONE, BASE_NONE, NULL, 0x0, - "H.223 MUX-PDU", HFILL }}, - - { &hf_h223_mux_header, - { "Header", "h223.mux.header", FT_NONE, BASE_NONE, NULL, 0x0, - "H.223 MUX header", HFILL }}, - - { &hf_h223_mux_rawhdr, - { "Raw value", "h223.mux.rawhdr", FT_UINT24, BASE_HEX, NULL, 0x0, - "Raw header bytes", HFILL }}, - - { &hf_h223_mux_correctedhdr, - { "Corrected value", "h223.mux.correctedhdr", FT_UINT24, BASE_HEX, NULL, 0x0, - "Corrected header bytes", HFILL }}, - - { &hf_h223_mux_mc, - { "Multiplex Code", "h223.mux.mc", FT_UINT8, BASE_DEC, NULL, 0x0, - "H.223 MUX multiplex code", HFILL }}, - - { &hf_h223_mux_mpl, - { "Multiplex Payload Length", "h223.mux.mpl", FT_UINT8, BASE_DEC, NULL, 0x0, - "H.223 MUX multiplex Payload Length", HFILL }}, - - { &hf_h223_mux_deact, - { "Deactivated multiplex table entry", "h223.mux.deactivated", FT_NONE, BASE_NONE, NULL, 0x0, - "mpl refers to an entry in the multiplex table which is not active", HFILL }}, - - { &hf_h223_mux_vc, - { "H.223 virtual circuit", "h223.mux.vc", FT_UINT16, BASE_DEC, NULL, 0x0, - "H.223 Virtual Circuit", HFILL }}, - - { &hf_h223_mux_extra, - { "Extraneous data", "h223.mux.extra", FT_NONE, BASE_DEC, NULL, 0x0, - "data beyond mpl", HFILL }}, - - { &hf_h223_mux_hdlc2, - { "HDLC flag", "h223.mux.hdlc", FT_UINT16, BASE_HEX, NULL, 0x0, - "framing flag", HFILL }}, - - /* fields for h.223-mux fragments */ - { &hf_h223_mux_fragment_overlap, - { "Fragment overlap", "h223.mux.fragment.overlap", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "Fragment overlaps with other fragments", HFILL }}, - - { &hf_h223_mux_fragment_overlap_conflict, - { "Conflicting data in fragment overlap", "h223.mux.fragment.overlap.conflict", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "Overlapping fragments contained conflicting data", HFILL }}, - - { &hf_h223_mux_fragment_multiple_tails, - { "Multiple tail fragments found", "h223.mux.fragment.multipletails", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "Several tails were found when defragmenting the packet", HFILL }}, - - { &hf_h223_mux_fragment_too_long_fragment, - { "Fragment too long", "h223.mux.fragment.toolongfragment", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "Fragment contained data past end of packet", HFILL }}, - - { &hf_h223_mux_fragment_error, - { "Defragmentation error", "h223.mux.fragment.error", FT_FRAMENUM, BASE_NONE, NULL, 0x0, - "Defragmentation error due to illegal fragments", HFILL }}, - - { &hf_h223_mux_fragment, - { "H.223 MUX-PDU Fragment", "h223.mux.fragment", FT_FRAMENUM, BASE_NONE, NULL, 0x0, - "H.223 MUX-PDU Fragment", HFILL }}, - - { &hf_h223_mux_fragments, - { "H.223 MUX-PDU Fragments", "h223.mux.fragments", FT_NONE, BASE_NONE, NULL, 0x0, - "H.223 MUX-PDU Fragments", HFILL }}, - - { &hf_h223_mux_reassembled_in, - { "MUX-PDU fragment, reassembled in frame", "h223.mux.reassembled_in", FT_FRAMENUM, BASE_NONE, NULL, 0x0, - "This H.223 MUX-PDU packet is reassembled in this frame", HFILL }}, - - /* fields for h.223-al fragments */ - { &hf_h223_al_fragment_overlap, - { "Fragment overlap", "h223.al.fragment.overlap", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "Fragment overlaps with other fragments", HFILL }}, - - { &hf_h223_al_fragment_overlap_conflict, - { "Conflicting data in fragment overlap", "h223.al.fragment.overlap.conflict", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "Overlapping fragments contained conflicting data", HFILL }}, - - { &hf_h223_al_fragment_multiple_tails, - { "Multiple tail fragments found", "h223.al.fragment.multipletails", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "Several tails were found when defragmenting the packet", HFILL }}, - - { &hf_h223_al_fragment_too_long_fragment, - { "Fragment too long", "h223.al.fragment.toolongfragment", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "Fragment contained data past end of packet", HFILL }}, - - { &hf_h223_al_fragment_error, - { "Defragmentation error", "h223.al.fragment.error", FT_FRAMENUM, BASE_NONE, NULL, 0x0, - "Defragmentation error due to illegal fragments", HFILL }}, - - { &hf_h223_al_fragment, - { "H.223 AL-PDU Fragment", "h223.al.fragment", FT_FRAMENUM, BASE_NONE, NULL, 0x0, - "H.223 AL-PDU Fragment", HFILL }}, - - { &hf_h223_al_fragments, - { "H.223 AL-PDU Fragments", "h223.al.fragments", FT_NONE, BASE_NONE, NULL, 0x0, - "H.223 AL-PDU Fragments", HFILL }}, - - { &hf_h223_al_reassembled_in, - { "AL-PDU fragment, reassembled in frame", "h223.al.reassembled_in", FT_FRAMENUM, BASE_NONE, NULL, 0x0, - "This H.223 AL-PDU packet is reassembled in this frame", HFILL }}, - - /* h223-als */ - - { &hf_h223_al1, - { "H.223 AL1", "h223.al1", FT_NONE, BASE_NONE, NULL, 0x0, - "H.223 AL-PDU using AL1", HFILL }}, - - { &hf_h223_al1_framed, - { "H.223 AL1 framing", "h223.al1.framed", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "", HFILL }}, - - { &hf_h223_al2, - { "H.223 AL2", "h223.al2", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "H.223 AL-PDU using AL2", HFILL }}, - - { &hf_h223_al2_sequenced, - { "H.223 sequenced AL2", "h223.sequenced_al2", FT_NONE, BASE_NONE, NULL, 0x0, - "H.223 AL-PDU using AL2 with sequence numbers", HFILL }}, - - { &hf_h223_al2_unsequenced, - { "H.223 unsequenced AL2", "h223.unsequenced_al2", FT_NONE, BASE_NONE, NULL, 0x0, - "H.223 AL-PDU using AL2 without sequence numbers", HFILL }}, - - { &hf_h223_al2_seqno, - { "Sequence Number", "h223.al2.seqno", FT_UINT8, BASE_DEC, NULL, 0x0, - "H.223 AL2 sequence number", HFILL }}, - - { &hf_h223_al2_crc, - { "CRC", "h223.al2.crc", FT_UINT8, BASE_HEX, NULL, 0x0, - "CRC", HFILL }}, - - { &hf_h223_al2_crc_bad, - { "Bad CRC","h223.al2.crc_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "", HFILL }}, - - { &hf_h223_al_payload, - { "H.223 AL Payload", "h223.al.payload", FT_NONE, BASE_NONE, NULL, 0x0, - "H.223 AL-PDU Payload", HFILL }}, - - }; - - static gint *ett[] = { - &ett_h223, - &ett_h223_non_h223_data, - &ett_h223_mux_stuffing_pdu, - &ett_h223_mux_pdu, - &ett_h223_mux_header, - &ett_h223_mux_deact, - &ett_h223_mux_vc, - &ett_h223_mux_extra, - &ett_h223_mux_fragments, - &ett_h223_mux_fragment, - &ett_h223_al_fragments, - &ett_h223_al_fragment, - &ett_h223_al1, - &ett_h223_al2, - &ett_h223_al_payload - }; - - if (proto_h223 == -1) { /* execute protocol initialization only once */ - proto_h223 = - proto_register_protocol ("ITU-T Recommendation H.223", "H.223", "h223"); - proto_h223_bitswapped = - proto_register_protocol ("Bitswapped ITU-T Recommendation H.223", "H.223 (Bitswapped)", "h223_bitswapped"); - - proto_register_field_array (proto_h223, hf, array_length (hf)); - proto_register_subtree_array (ett, array_length (ett)); - register_dissector("h223", dissect_h223, proto_h223); - register_dissector("h223_bitswapped", dissect_h223_bitswapped, proto_h223_bitswapped); - - /* register our init routine to be called at the start of a capture, - to clear out our hash tables etc */ - register_init_routine(&h223_init_protocol); - } - - h245_set_h223_set_mc_handle( &h223_set_mc ); - h245_set_h223_add_lc_handle( &h223_add_lc ); -} - -void proto_reg_handoff_h223(void) -{ - dissector_handle_t h223_bitswapped = find_dissector("h223_bitswapped"); - dissector_handle_t h223 = find_dissector("h223"); - data_handle = find_dissector("data"); - h245dg_handle = find_dissector("h245dg"); - srp_handle = find_dissector("srp"); - - dissector_add_handle("tcp.port", h223); - dissector_add_handle("tcp.port", h223_bitswapped); - dissector_add_string("rtp_dyn_payload_type","CLEARMODE", h223_bitswapped); - dissector_add("iax2.dataformat", AST_DATAFORMAT_H223_H245, h223_bitswapped); -} -/* vim:set ts=8 et: */ diff --git a/plugins/h223/packet-h223.h b/plugins/h223/packet-h223.h deleted file mode 100644 index 9f00cfdeb6..0000000000 --- a/plugins/h223/packet-h223.h +++ /dev/null @@ -1,31 +0,0 @@ -/* $Id$ - * - * Routines for H.223 packet dissection - * 2004 Richard van der Hoff <richardv@mxtelecom.com> - * - * Wireshark - Network traffic analyzer - * By Gerald Combs <gerald@wireshark.org> - * 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. - */ - -#ifndef __PACKET_H223_H__ -#define __PACKET_H223_H__ - -void proto_register_h223 (void); -void proto_reg_handoff_h223(void); - -#endif /* __PACKET_H223_H__ */ diff --git a/plugins/h223/plugin.rc.in b/plugins/h223/plugin.rc.in deleted file mode 100644 index 72b4de0775..0000000000 --- a/plugins/h223/plugin.rc.in +++ /dev/null @@ -1,34 +0,0 @@ -#include "winver.h" - -VS_VERSION_INFO VERSIONINFO - FILEVERSION @RC_MODULE_VERSION@ - PRODUCTVERSION @RC_VERSION@,0 - FILEFLAGSMASK 0x0L -#ifdef _DEBUG - FILEFLAGS VS_FF_PRERELEASE+VS_FF_DEBUG -#else - FILEFLAGS VS_FF_PRERELEASE -#endif - FILEOS VOS_NT_WINDOWS32 - FILETYPE VFT_DLL -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "CompanyName", "The Wireshark developer community, http://www.wireshark.org/\0" - VALUE "FileDescription", "@PACKAGE@ dissector\0" - VALUE "FileVersion", "@MODULE_VERSION@\0" - VALUE "InternalName", "@PACKAGE@ @MODULE_VERSION@\0" - VALUE "LegalCopyright", "Copyright © 1998 Gerald Combs <gerald@wireshark.org>, Gilbert Ramirez <gram@alumni.rice.edu> and others\0" - VALUE "OriginalFilename", "@PLUGIN_NAME@.dll\0" - VALUE "ProductName", "Wireshark\0" - VALUE "ProductVersion", "@VERSION@\0" - VALUE "Comments", "Build with @MSVC_VARIANT@\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END |