diff --git a/cmm/.project b/cmm/.project
new file mode 100644
index 0000000..18bbfe2
--- /dev/null
+++ b/cmm/.project
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>cmm</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+			<triggers>clean,full,incremental,</triggers>
+			<arguments>
+				<dictionary>
+					<key>?name?</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.append_environment</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildArguments</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value>${workspace_loc:/cmm/Debug}</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.contents</key>
+					<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/cmm/AUTHORS b/cmm/AUTHORS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cmm/AUTHORS
diff --git a/cmm/COPYING b/cmm/COPYING
new file mode 100644
index 0000000..a43ea21
--- /dev/null
+++ b/cmm/COPYING
@@ -0,0 +1,339 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          675 Mass Ave, Cambridge, MA 02139, 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
+
+	Appendix: 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) 19yy  <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., 675 Mass Ave, Cambridge, MA 02139, 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) 19yy 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/cmm/ChangeLog b/cmm/ChangeLog
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cmm/ChangeLog
diff --git a/cmm/INSTALL b/cmm/INSTALL
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cmm/INSTALL
diff --git a/cmm/Makefile.am b/cmm/Makefile.am
new file mode 100644
index 0000000..736d0c1
--- /dev/null
+++ b/cmm/Makefile.am
@@ -0,0 +1,4 @@
+AM_CFLAGS = -O2 -g -Wall
+
+SUBDIRS	= src
+
diff --git a/cmm/Makefile.in b/cmm/Makefile.in
new file mode 100644
index 0000000..6349d1f
--- /dev/null
+++ b/cmm/Makefile.in
@@ -0,0 +1,601 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \
+	ChangeLog INSTALL NEWS config.guess config.sub depcomp \
+	install-sh ltmain.sh missing
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-exec-recursive install-info-recursive \
+	install-recursive installcheck-recursive installdirs-recursive \
+	pdf-recursive ps-recursive uninstall-info-recursive \
+	uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d $(distdir) \
+    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CMM_LIBS = @CMM_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBNFCONNTRACK_CFLAGS = @LIBNFCONNTRACK_CFLAGS@
+LIBNFCONNTRACK_LIBS = @LIBNFCONNTRACK_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AM_CFLAGS = -O2 -g -Wall
+SUBDIRS = src
+all: all-recursive
+
+.SUFFIXES:
+am--refresh:
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
+	      cd $(srcdir) && $(AUTOMAKE) --gnu  \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	@failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	dot_seen=no; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	rev=''; for subdir in $$list; do \
+	  if test "$$subdir" = "."; then :; else \
+	    rev="$$subdir $$rev"; \
+	  fi; \
+	done; \
+	rev="$$rev ."; \
+	target=`echo $@ | sed s/-recursive//`; \
+	for subdir in $$rev; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	mkdir $(distdir)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test -d "$(distdir)/$$subdir" \
+	    || $(mkdir_p) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	    distdir=`$(am__cd) $(distdir) && pwd`; \
+	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+	    (cd $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$top_distdir" \
+	        distdir="$$distdir/$$subdir" \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r $(distdir)
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+dist-tarZ: distdir
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__remove_distdir)
+
+dist-shar: distdir
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+dist dist-all: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir); chmod a+w $(distdir)
+	mkdir $(distdir)/_build
+	mkdir $(distdir)/_inst
+	chmod a-w $(distdir)
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && cd $(distdir)/_build \
+	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+	$(am__remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+	@cd $(distuninstallcheck_dir) \
+	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+	check-am clean clean-generic clean-libtool clean-recursive \
+	ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
+	dist-shar dist-tarZ dist-zip distcheck distclean \
+	distclean-generic distclean-libtool distclean-recursive \
+	distclean-tags distcleancheck distdir distuninstallcheck dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-man install-strip \
+	installcheck installcheck-am installdirs installdirs-am \
+	maintainer-clean maintainer-clean-generic \
+	maintainer-clean-recursive mostlyclean mostlyclean-generic \
+	mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
+	tags tags-recursive uninstall uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/cmm/NEWS b/cmm/NEWS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cmm/NEWS
diff --git a/cmm/README b/cmm/README
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/cmm/README
@@ -0,0 +1 @@
+
diff --git a/cmm/aclocal.m4 b/cmm/aclocal.m4
new file mode 100644
index 0000000..a281810
--- /dev/null
+++ b/cmm/aclocal.m4
@@ -0,0 +1,8974 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool 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.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 56 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+_LT_PROG_ECHO_BACKSLASH
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "X$<var>" | $Xsed -e "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Fix-up fallback echo if it was mangled by the above quoting rules.
+case \$lt_ECHO in
+*'\\\[$]0 --fallback-echo"')dnl "
+  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\`
+  ;;
+esac
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+cat >"$CONFIG_LT" <<_LTEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate a libtool stub with the current configuration.
+
+lt_cl_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AS_SHELL_SANITIZE
+_AS_PREPARE
+
+exec AS_MESSAGE_FD>&1
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2008 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+if test "$no_create" != yes; then
+  lt_cl_success=:
+  test "$silent" = yes &&
+    lt_config_lt_args="$lt_config_lt_args --quiet"
+  exec AS_MESSAGE_LOG_FD>/dev/null
+  $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+  exec AS_MESSAGE_LOG_FD>>config.log
+  $lt_cl_success || AS_EXIT(1)
+fi
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_XSI_SHELLFNS
+
+  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
+    || (rm -f "$cfgfile"; exit 1)
+
+  mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS="$save_LDFLAGS"
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES
+# --------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=echo
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX
+# -----------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi],[])
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+	     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+	 [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_SHELL_INIT
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[_LT_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$lt_ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+  ;;
+esac
+
+ECHO=${lt_ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X[$]1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
+  # Yippee, $ECHO works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<_LT_EOF
+[$]*
+_LT_EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$lt_ECHO"; then
+  if test "X${echo_test_string+set}" != Xset; then
+    # find a string as large as possible, as long as the shell can cope with it
+    for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
+	 { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
+      then
+        break
+      fi
+    done
+  fi
+
+  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+     test "X$echo_testing_string" = "X$echo_test_string"; then
+    :
+  else
+    # The Solaris, AIX, and Digital Unix default echo programs unquote
+    # backslashes.  This makes it impossible to quote backslashes using
+    #   echo "$something" | sed 's/\\/\\\\/g'
+    #
+    # So, first we look for a working echo in the user's PATH.
+
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for dir in $PATH /usr/ucb; do
+      IFS="$lt_save_ifs"
+      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        ECHO="$dir/echo"
+        break
+      fi
+    done
+    IFS="$lt_save_ifs"
+
+    if test "X$ECHO" = Xecho; then
+      # We didn't find a better echo, so look for alternatives.
+      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
+         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
+         test "X$echo_testing_string" = "X$echo_test_string"; then
+        # This shell has a builtin print -r that does the trick.
+        ECHO='print -r'
+      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
+	   test "X$CONFIG_SHELL" != X/bin/ksh; then
+        # If we have ksh, try running configure again with it.
+        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+        export ORIGINAL_CONFIG_SHELL
+        CONFIG_SHELL=/bin/ksh
+        export CONFIG_SHELL
+        exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+      else
+        # Try using printf.
+        ECHO='printf %s\n'
+        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
+	   echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	  # Cool, printf works
+	  :
+        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	  export CONFIG_SHELL
+	  SHELL="$CONFIG_SHELL"
+	  export SHELL
+	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
+        elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+	     test "X$echo_testing_string" = 'X\t' &&
+	     echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	     test "X$echo_testing_string" = "X$echo_test_string"; then
+	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
+        else
+	  # maybe with a smaller string...
+	  prev=:
+
+	  for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+	    if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
+	    then
+	      break
+	    fi
+	    prev="$cmd"
+	  done
+
+	  if test "$prev" != 'sed 50q "[$]0"'; then
+	    echo_test_string=`eval $prev`
+	    export echo_test_string
+	    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+	  else
+	    # Oops.  We lost completely, so just stick with echo.
+	    ECHO=echo
+	  fi
+        fi
+      fi
+    fi
+  fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+lt_ECHO=$ECHO
+if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+   lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(lt_ECHO)
+])
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1],
+    [An echo program that does not interpret backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[AC_CHECK_TOOL(AR, ar, false)
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1])
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
+	         = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[123]]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # Some binutils ld are patched to set DT_RUNPATH
+  save_LDFLAGS=$LDFLAGS
+  save_libdir=$libdir
+  eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+       LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+    [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+       [shlibpath_overrides_runpath=yes])])
+  LDFLAGS=$save_LDFLAGS
+  libdir=$save_libdir
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_DECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method == "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :)
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+const struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC*)
+	    # IBM XL 8.0 on PPC
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl*)
+	# IBM XL C 8.0/Fortran 10.1 on PPC
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+	*Sun\ F*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+  ;;
+  cygwin* | mingw* | cegcc*)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  linux* | k*bsd*-gnu)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+  ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  esac
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+	xl[[cC]]*)			# IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+      # FIXME: Should let the user specify the lib program.
+      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    freebsd1*)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+        save_LDFLAGS="$LDFLAGS"
+        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+        AC_LINK_IFELSE(int foo(void) {},
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+        )
+        LDFLAGS="$save_LDFLAGS"
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	     ;;
+	   *)
+	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+      $RM conftest*
+      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+        _LT_TAGVAR(allow_undefined_flag, $1)=
+        if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+        then
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        else
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+        fi
+        _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $RM conftest*
+      AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)])
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
+    [[If ld is used when linking, flag to hardcode $libdir into a binary
+    during linking.  This must work even if $libdir does not exist]])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [fix_srcfile_path], [1],
+    [Fix the shell variable $srcfile for the compiler])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_PROG_CXX
+# ------------
+# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++
+# compiler, we have our own version here.
+m4_defun([_LT_PROG_CXX],
+[
+pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes])
+AC_PROG_CXX
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_CXX
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_CXX], [])
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[AC_REQUIRE([_LT_PROG_CXX])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+        # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+        # as there is no search path for DLLs.
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+        _LT_TAGVAR(always_export_symbols, $1)=no
+        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+          # If the export-symbols file already is a .def file (1st line
+          # is EXPORTS), use it as is; otherwise, prepend...
+          _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    cp $export_symbols $output_objdir/$soname.def;
+          else
+	    echo EXPORTS > $output_objdir/$soname.def;
+	    cat $export_symbols >> $output_objdir/$soname.def;
+          fi~
+          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        else
+          _LT_TAGVAR(ld_shlibs, $1)=no
+        fi
+        ;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd[[12]]*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
+		$RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 will use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+	  xl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='echo'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=echo
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='echo'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+])
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       else
+	 prev=
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 case $p in
+	 -L* | -R*)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       ;;
+
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_PROG_F77
+# ------------
+# Since AC_PROG_F77 is broken, in that it returns the empty string
+# if there is no fortran compiler, we have our own version here.
+m4_defun([_LT_PROG_F77],
+[
+pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes])
+AC_PROG_F77
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_F77
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_F77], [])
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_REQUIRE([_LT_PROG_F77])dnl
+AC_LANG_PUSH(Fortran 77)
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  CC=${F77-"f77"}
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_PROG_FC
+# -----------
+# Since AC_PROG_FC is broken, in that it returns the empty string
+# if there is no fortran compiler, we have our own version here.
+m4_defun([_LT_PROG_FC],
+[
+pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes])
+AC_PROG_FC
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+popdef([AC_MSG_ERROR])
+])# _LT_PROG_FC
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([_LT_PROG_FC], [])
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_REQUIRE([_LT_PROG_FC])dnl
+AC_LANG_PUSH(Fortran)
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  CC=${FC-"f95"}
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC="$lt_save_CC"
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_XSI_SHELLFNS
+# ---------------------
+# Bourne and XSI compatible variants of some useful shell functions.
+m4_defun([_LT_PROG_XSI_SHELLFNS],
+[case $xsi_shell in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result="${1##*/}"
+}
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+  case ${1} in
+    */*) func_dirname_result="${1%/*}${2}" ;;
+    *  ) func_dirname_result="${3}" ;;
+  esac
+  func_basename_result="${1##*/}"
+}
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+func_stripname ()
+{
+  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+  # positional parameters, so assign one to ordinary parameter first.
+  func_stripname_result=${3}
+  func_stripname_result=${func_stripname_result#"${1}"}
+  func_stripname_result=${func_stripname_result%"${2}"}
+}
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=${1%%=*}
+  func_opt_split_arg=${1#*=}
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  case ${1} in
+    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+    *)    func_lo2o_result=${1} ;;
+  esac
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=${1%.*}.lo
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=$(( $[*] ))
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=${#1}
+}
+
+_LT_EOF
+    ;;
+  *) # Bourne compatible functions.
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+  # Extract subdirectory from the argument.
+  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
+  if test "X$func_dirname_result" = "X${1}"; then
+    func_dirname_result="${3}"
+  else
+    func_dirname_result="$func_dirname_result${2}"
+  fi
+}
+
+# func_basename file
+func_basename ()
+{
+  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
+}
+
+dnl func_dirname_and_basename
+dnl A portable version of this function is already defined in general.m4sh
+dnl so there is no need for it here.
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+  case ${2} in
+    .*) func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
+    *)  func_stripname_result=`$ECHO "X${3}" \
+           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
+  esac
+}
+
+# sed scripts:
+my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q'
+my_sed_long_arg='1s/^-[[^=]]*=//'
+
+# func_opt_split
+func_opt_split ()
+{
+  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
+  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
+}
+
+# func_lo2o object
+func_lo2o ()
+{
+  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
+}
+
+# func_xform libobj-or-source
+func_xform ()
+{
+  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'`
+}
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+  func_arith_result=`expr "$[@]"`
+}
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+  func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len`
+}
+
+_LT_EOF
+esac
+
+case $lt_shell_append in
+  yes)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$[1]+=\$[2]"
+}
+_LT_EOF
+    ;;
+  *)
+    cat << \_LT_EOF >> "$cfgfile"
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+  eval "$[1]=\$$[1]\$[2]"
+}
+
+_LT_EOF
+    ;;
+  esac
+])
+
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+  		   [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [0], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [pic_mode="$withval"],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
+
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
+
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# Generated from ltversion.in.
+
+# serial 3017 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.2.6b])
+m4_define([LT_PACKAGE_REVISION], [1.3017])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.2.6b'
+macro_revision='1.3017'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
+
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 4 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_RC],		[AC_DEFUN([AC_LIBTOOL_RC])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+
+# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
+# 
+# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This 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.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# PKG_PROG_PKG_CONFIG([MIN-VERSION])
+# ----------------------------------
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=m4_default([$1], [0.9.0])
+	AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		AC_MSG_RESULT([yes])
+	else
+		AC_MSG_RESULT([no])
+		PKG_CONFIG=""
+	fi
+		
+fi[]dnl
+])# PKG_PROG_PKG_CONFIG
+
+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# Check to see whether a particular set of modules exists.  Similar
+# to PKG_CHECK_MODULES(), but does not set variables or print errors.
+#
+#
+# Similar to PKG_CHECK_MODULES, make sure that the first instance of
+# this or PKG_CHECK_MODULES is called, or make sure to call
+# PKG_CHECK_EXISTS manually
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+  m4_ifval([$2], [$2], [:])
+m4_ifvaln([$3], [else
+  $3])dnl
+fi])
+
+
+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+# ---------------------------------------------
+m4_define([_PKG_CONFIG],
+[if test -n "$PKG_CONFIG"; then
+    if test -n "$$1"; then
+        pkg_cv_[]$1="$$1"
+    else
+        PKG_CHECK_EXISTS([$3],
+                         [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
+			 [pkg_failed=yes])
+    fi
+else
+	pkg_failed=untried
+fi[]dnl
+])# _PKG_CONFIG
+
+# _PKG_SHORT_ERRORS_SUPPORTED
+# -----------------------------
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi[]dnl
+])# _PKG_SHORT_ERRORS_SUPPORTED
+
+
+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+#
+# Note that if there is a possibility the first call to
+# PKG_CHECK_MODULES might not happen, you should be sure to include an
+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test $_pkg_short_errors_supported = yes; then
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
+        else 
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+	ifelse([$4], , [AC_MSG_ERROR(dnl
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT
+])],
+		[AC_MSG_RESULT([no])
+                $4])
+elif test $pkg_failed = untried; then
+	ifelse([$4], , [AC_MSG_FAILURE(dnl
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])],
+		[$4])
+else
+	$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+	$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+        AC_MSG_RESULT([yes])
+	ifelse([$3], , :, [$3])
+fi[]dnl
+])# PKG_CHECK_MODULES
+
+# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+	 [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`AS_DIRNAME("$mf")`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`AS_DIRNAME(["$file"])`
+    AS_MKDIR_P([$dirpart/$fdir])
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+	      		     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_CC],
+                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_CXX],
+                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $1 | $1:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake.  There are at least two reasons why we must not
+# use `-m 0755':
+#   - it causes special bits like SGID to be ignored,
+#   - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out.  Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
diff --git a/cmm/config.guess b/cmm/config.guess
new file mode 100644
index 0000000..115f944
--- /dev/null
+++ b/cmm/config.guess
@@ -0,0 +1,1502 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+#   Free Software Foundation, Inc.
+
+timestamp='2010-04-03'
+
+# This file 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., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner.  Please send patches (context
+# diff format) to <config-patches@gnu.org> and include a ChangeLog
+# entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
+Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' HUP INT TERM
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" HUP INT PIPE TERM ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux${UNAME_RELEASE}
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[456])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	case ${UNAME_MACHINE} in
+	    pc98)
+		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:windows32*:*)
+    	# uname -m includes "-pc" on this system.
+    	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:*)
+    	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    authenticamd | genuineintel | EM64T)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    8664:Windows_NT:*)
+	echo x86_64-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+    	echo frv-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	LIBC=gnu
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=${UNAME_MACHINE}el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=${UNAME_MACHINE}
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo or32-unknown-linux-gnu
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-gnu
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit ;;
+    xtensa*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+        exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    i386)
+		eval $set_cc_for_build
+		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		      grep IS_64BIT_ARCH >/dev/null
+		  then
+		      UNAME_PROCESSOR="x86_64"
+		  fi
+		fi ;;
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/cmm/config.sub b/cmm/config.sub
new file mode 100644
index 0000000..204218c
--- /dev/null
+++ b/cmm/config.sub
@@ -0,0 +1,1731 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+#   Free Software Foundation, Inc.
+
+timestamp='2010-05-21'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file 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., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted GNU ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
+Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray | -microblaze)
+		os=
+		basic_machine=$1
+		;;
+        -bluegene*)
+	        os=-cnk
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| rx \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu | strongarm \
+	| tahoe | thumb | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+	| ubicom32 \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	c54x)
+		basic_machine=tic54x-unknown
+		;;
+	c55x)
+		basic_machine=tic55x-unknown
+		;;
+	c6x)
+		basic_machine=tic6x-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | picochip)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* | rx-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tile-* | tilegx-* \
+	| tron-* \
+	| ubicom32-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	bluegene*)
+		basic_machine=powerpc-ibm
+		os=-cnk
+		;;
+	c54x-*)
+		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c55x-*)
+		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c6x-*)
+		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+        cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+        microblaze)
+		basic_machine=microblaze-xilinx
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+        # This must be matched before tile*.
+        tilegx*)
+		basic_machine=tilegx-unknown
+		os=-linux-gnu
+		;;
+	tile*)
+		basic_machine=tile-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+        -auroraux)
+	        os=-auroraux
+		;;
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+	      | -sym* | -kopensolaris* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+        -nacl*)
+	        ;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+        score-*)
+		os=-elf
+		;;
+        spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+        c4x-* | tic4x-*)
+        	os=-coff
+		;;
+	tic54x-*)
+		os=-coff
+		;;
+	tic55x-*)
+		os=-coff
+		;;
+	tic6x-*)
+		os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+        mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-cnk*|-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/cmm/configure b/cmm/configure
new file mode 100755
index 0000000..68224fa
--- /dev/null
+++ b/cmm/configure
@@ -0,0 +1,21347 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.61.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes && 	 (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  case $as_dir in
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+	   done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+	 # Try only shells that exist, to save several forks.
+	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		{ ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+	       as_have_required=yes
+	       if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf@gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+  # Remove one level of quotation (which was required for Make).
+  ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
+  ;;
+esac
+
+echo=${ECHO-echo}
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell.
+  exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+  for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+    if (echo_test_string=`eval $cmd`) 2>/dev/null &&
+       echo_test_string=`eval $cmd` &&
+       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+    then
+      break
+    fi
+  done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+   echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+   test "X$echo_testing_string" = "X$echo_test_string"; then
+  :
+else
+  # The Solaris, AIX, and Digital Unix default echo programs unquote
+  # backslashes.  This makes it impossible to quote backslashes using
+  #   echo "$something" | sed 's/\\/\\\\/g'
+  #
+  # So, first we look for a working echo in the user's PATH.
+
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for dir in $PATH /usr/ucb; do
+    IFS="$lt_save_ifs"
+    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      echo="$dir/echo"
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+
+  if test "X$echo" = Xecho; then
+    # We didn't find a better echo, so look for alternatives.
+    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+       echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+       test "X$echo_testing_string" = "X$echo_test_string"; then
+      # This shell has a builtin print -r that does the trick.
+      echo='print -r'
+    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+	 test "X$CONFIG_SHELL" != X/bin/ksh; then
+      # If we have ksh, try running configure again with it.
+      ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+      export ORIGINAL_CONFIG_SHELL
+      CONFIG_SHELL=/bin/ksh
+      export CONFIG_SHELL
+      exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
+    else
+      # Try using printf.
+      echo='printf %s\n'
+      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+	 echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+	 test "X$echo_testing_string" = "X$echo_test_string"; then
+	# Cool, printf works
+	:
+      elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+	   test "X$echo_testing_string" = 'X\t' &&
+	   echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+	export CONFIG_SHELL
+	SHELL="$CONFIG_SHELL"
+	export SHELL
+	echo="$CONFIG_SHELL $0 --fallback-echo"
+      elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+	   test "X$echo_testing_string" = 'X\t' &&
+	   echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+	   test "X$echo_testing_string" = "X$echo_test_string"; then
+	echo="$CONFIG_SHELL $0 --fallback-echo"
+      else
+	# maybe with a smaller string...
+	prev=:
+
+	for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+	  if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+	  then
+	    break
+	  fi
+	  prev="$cmd"
+	done
+
+	if test "$prev" != 'sed 50q "$0"'; then
+	  echo_test_string=`eval $prev`
+	  export echo_test_string
+	  exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+	else
+	  # Oops.  We lost completely, so just stick with echo.
+	  echo=echo
+	fi
+      fi
+    fi
+  fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+   ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+fi
+
+
+
+
+tagnames=${tagnames+${tagnames},}CXX
+
+tagnames=${tagnames+${tagnames},}F77
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+INSTALL_PROGRAM
+INSTALL_SCRIPT
+INSTALL_DATA
+am__isrc
+CYGPATH_W
+PACKAGE
+VERSION
+ACLOCAL
+AUTOCONF
+AUTOMAKE
+AUTOHEADER
+MAKEINFO
+install_sh
+STRIP
+INSTALL_STRIP_PROGRAM
+mkdir_p
+AWK
+SET_MAKE
+am__leading_dot
+AMTAR
+am__tar
+am__untar
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+DEPDIR
+am__include
+am__quote
+AMDEP_TRUE
+AMDEP_FALSE
+AMDEPBACKSLASH
+CCDEPMODE
+am__fastdepCC_TRUE
+am__fastdepCC_FALSE
+build
+build_cpu
+build_vendor
+build_os
+host
+host_cpu
+host_vendor
+host_os
+SED
+GREP
+EGREP
+LN_S
+ECHO
+AR
+RANLIB
+DSYMUTIL
+NMEDIT
+CPP
+CXX
+CXXFLAGS
+ac_ct_CXX
+CXXDEPMODE
+am__fastdepCXX_TRUE
+am__fastdepCXX_FALSE
+CXXCPP
+F77
+FFLAGS
+ac_ct_F77
+LIBTOOL
+PKG_CONFIG
+LIBNFCONNTRACK_CFLAGS
+LIBNFCONNTRACK_LIBS
+CMM_LIBS
+LIBOBJS
+LTLIBOBJS'
+ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+CXX
+CXXFLAGS
+CCC
+CXXCPP
+F77
+FFLAGS
+PKG_CONFIG
+LIBNFCONNTRACK_CFLAGS
+LIBNFCONNTRACK_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)	ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$0" : 'X\(//\)[^/]' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+   { (exit 1); exit 1; }; }
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+			  [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+			  [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/PACKAGE]
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-static[=PKGS]  build static libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-pic              try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-tags[=TAGS]      include additional configurations [automatic]
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  CXXCPP      C++ preprocessor
+  F77         Fortran 77 compiler command
+  FFLAGS      Fortran 77 compiler flags
+  PKG_CONFIG  path to pkg-config utility
+  LIBNFCONNTRACK_CFLAGS
+              C compiler flags for LIBNFCONNTRACK, overriding pkg-config
+  LIBNFCONNTRACK_LIBS
+              linker flags for LIBNFCONNTRACK, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" || continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.61
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+	"$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+	ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+am__api_version='1.10'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+done
+IFS=$as_save_IFS
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm -f conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+{ echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5
+echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; }
+if test -z "$MKDIR_P"; then
+  if test "${ac_cv_path_mkdir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+done
+IFS=$as_save_IFS
+
+fi
+
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    test -d ./--version && rmdir ./--version
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5
+echo "${ECHO_T}$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  SET_MAKE=
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE=apps
+ VERSION=1.00.0
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  SET_MAKE=
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort.  b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions.  Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
+
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+
+
+{ echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CC"   am_compiler_list=
+
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+# Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+# Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=yes
+fi
+
+
+# Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+{ echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6; }
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+echo "$as_me: error: invalid value of canonical build" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6; }
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+echo "$as_me: error: invalid value of canonical host" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
+echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6; }
+if test "${lt_cv_path_SED+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if { test -f "$as_dir/$lt_ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$lt_ac_prog$ac_exec_ext"; }; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+
+fi
+
+SED=$lt_cv_path_SED
+
+{ echo "$as_me:$LINENO: result: $SED" >&5
+echo "${ECHO_T}$SED" >&6; }
+
+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # Extract the first word of "grep ggrep" to use in msg output
+if test -z "$GREP"; then
+set dummy grep ggrep; ac_prog_name=$2
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_GREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in grep ggrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+    # Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_GREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+GREP="$ac_cv_path_GREP"
+if test -z "$GREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     # Extract the first word of "egrep" to use in msg output
+if test -z "$EGREP"; then
+set dummy egrep; ac_prog_name=$2
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_EGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in egrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+    # Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_EGREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+EGREP="$ac_cv_path_EGREP"
+if test -z "$EGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+
+   fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; }
+else
+  { echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; }
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; }
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+{ echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
+echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6; }
+if test "${lt_cv_ld_reload_flag+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
+echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+{ echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
+echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6; }
+if test "${lt_cv_path_NM+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
+echo "${ECHO_T}$lt_cv_path_NM" >&6; }
+NM="$lt_cv_path_NM"
+
+{ echo "$as_me:$LINENO: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6; }
+fi
+
+{ echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5
+echo $ECHO_N "checking how to recognize dependent libraries... $ECHO_C" >&6; }
+if test "${lt_cv_deplibs_check_method+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+nto-qnx*)
+  lt_cv_deplibs_check_method=unknown
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
+echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6; }
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+  enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+    *ELF-32*)
+      HPUX_IA64_MODE="32"
+      ;;
+    *ELF-64*)
+      HPUX_IA64_MODE="64"
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line 4344 "configure"' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+   if test "$lt_cv_prog_gnu_ld" = yes; then
+    case `/usr/bin/file conftest.$ac_objext` in
+    *32-bit*)
+      LD="${LD-ld} -melf32bsmip"
+      ;;
+    *N32*)
+      LD="${LD-ld} -melf32bmipn32"
+      ;;
+    *64-bit*)
+      LD="${LD-ld} -melf64bmip"
+      ;;
+    esac
+   else
+    case `/usr/bin/file conftest.$ac_objext` in
+    *32-bit*)
+      LD="${LD-ld} -32"
+      ;;
+    *N32*)
+      LD="${LD-ld} -n32"
+      ;;
+    *64-bit*)
+      LD="${LD-ld} -64"
+      ;;
+    esac
+   fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    case `/usr/bin/file conftest.o` in
+    *32-bit*)
+      case $host in
+        x86_64-*kfreebsd*-gnu)
+          LD="${LD-ld} -m elf_i386_fbsd"
+          ;;
+        x86_64-*linux*)
+          LD="${LD-ld} -m elf_i386"
+          ;;
+        ppc64-*linux*|powerpc64-*linux*)
+          LD="${LD-ld} -m elf32ppclinux"
+          ;;
+        s390x-*linux*)
+          LD="${LD-ld} -m elf_s390"
+          ;;
+        sparc64-*linux*)
+          LD="${LD-ld} -m elf32_sparc"
+          ;;
+      esac
+      ;;
+    *64-bit*)
+      case $host in
+        x86_64-*kfreebsd*-gnu)
+          LD="${LD-ld} -m elf_x86_64_fbsd"
+          ;;
+        x86_64-*linux*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        ppc*-*linux*|powerpc*-*linux*)
+          LD="${LD-ld} -m elf64ppc"
+          ;;
+        s390*-*linux*)
+          LD="${LD-ld} -m elf64_s390"
+          ;;
+        sparc*-*linux*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  { echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
+echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6; }
+if test "${lt_cv_cc_needs_belf+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  lt_cv_cc_needs_belf=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	lt_cv_cc_needs_belf=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
+echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6; }
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+sparc*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*) LD="${LD-ld} -m elf64_sparc" ;;
+      *)
+        if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+
+esac
+
+need_locks="$enable_libtool_lock"
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_header_stdc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_header in dlfcn.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; }
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; }
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	CXXFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cxx_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+depcc="$CXX"  am_compiler_list=
+
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+
+
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; }
+if test -z "$CXXCPP"; then
+  if test "${ac_cv_prog_CXXCPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+fi
+
+
+ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_F77+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$F77"; then
+  ac_cv_prog_F77="$F77" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_F77="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+F77=$ac_cv_prog_F77
+if test -n "$F77"; then
+  { echo "$as_me:$LINENO: result: $F77" >&5
+echo "${ECHO_T}$F77" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$F77" && break
+  done
+fi
+if test -z "$F77"; then
+  ac_ct_F77=$F77
+  for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_F77+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_F77"; then
+  ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_F77="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_F77=$ac_cv_prog_ac_ct_F77
+if test -n "$ac_ct_F77"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_F77" >&5
+echo "${ECHO_T}$ac_ct_F77" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_F77" && break
+done
+
+  if test "x$ac_ct_F77" = x; then
+    F77=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    F77=$ac_ct_F77
+  fi
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for Fortran 77 compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+rm -f a.out
+
+# If we don't use `.F' as extension, the preprocessor is not run on the
+# input file.  (Note that this only needs to work for GNU compilers.)
+ac_save_ext=$ac_ext
+ac_ext=F
+{ echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6; }
+if test "${ac_cv_f77_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+      program main
+#ifndef __GNUC__
+       choke me
+#endif
+
+      end
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_f77_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_f77_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6; }
+ac_ext=$ac_save_ext
+ac_test_FFLAGS=${FFLAGS+set}
+ac_save_FFLAGS=$FFLAGS
+FFLAGS=
+{ echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5
+echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_f77_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  FFLAGS=-g
+cat >conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_f77_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_f77_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_prog_f77_g=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5
+echo "${ECHO_T}$ac_cv_prog_f77_g" >&6; }
+if test "$ac_test_FFLAGS" = set; then
+  FFLAGS=$ac_save_FFLAGS
+elif test $ac_cv_prog_f77_g = yes; then
+  if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+    FFLAGS="-g -O2"
+  else
+    FFLAGS="-g"
+  fi
+else
+  if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+    FFLAGS="-O2"
+  else
+    FFLAGS=
+  fi
+fi
+
+G77=`test $ac_compiler_gnu = yes && echo yes`
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+# find the maximum length of command line arguments
+{ echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
+echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6; }
+if test "${lt_cv_sys_max_cmd_len+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ 	]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \
+	       = "XX$teststring") >/dev/null 2>&1 &&
+	      new_result=`expr "X$teststring" : ".*" 2>&1` &&
+	      lt_cv_sys_max_cmd_len=$new_result &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on massive
+      # amounts of additional arguments before passing them to the linker.
+      # It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
+echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6; }
+fi
+
+
+
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
+echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6; }
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*) # Its linker distinguishes data from code symbols
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+  lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+  ;;
+linux* | k*bsd*-gnu)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDGIRSTW]'
+    lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+    lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ 	]\($symcode$symcode*\)[ 	][ 	]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+  if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
+  (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if grep ' nm_test_var$' "$nlist" >/dev/null; then
+	if grep ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+	  cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+	  cat <<\EOF >> conftest.$ac_ext
+  {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_save_LIBS="$LIBS"
+	  lt_save_CFLAGS="$CFLAGS"
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS="$lt_save_LIBS"
+	  CFLAGS="$lt_save_CFLAGS"
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { echo "$as_me:$LINENO: result: failed" >&5
+echo "${ECHO_T}failed" >&6; }
+else
+  { echo "$as_me:$LINENO: result: ok" >&5
+echo "${ECHO_T}ok" >&6; }
+fi
+
+{ echo "$as_me:$LINENO: checking for objdir" >&5
+echo $ECHO_N "checking for objdir... $ECHO_C" >&6; }
+if test "${lt_cv_objdir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
+echo "${ECHO_T}$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AR="${ac_tool_prefix}ar"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+  ac_ct_AR=$AR
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_AR="ar"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+else
+  AR="$ac_cv_prog_AR"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
+echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6; }
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { echo "$as_me:$LINENO: checking for file" >&5
+echo $ECHO_N "checking for file... $ECHO_C" >&6; }
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_DSYMUTIL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { echo "$as_me:$LINENO: result: $DSYMUTIL" >&5
+echo "${ECHO_T}$DSYMUTIL" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_DSYMUTIL" >&5
+echo "${ECHO_T}$ac_ct_DSYMUTIL" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_NMEDIT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { echo "$as_me:$LINENO: result: $NMEDIT" >&5
+echo "${ECHO_T}$NMEDIT" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_NMEDIT" >&5
+echo "${ECHO_T}$ac_ct_NMEDIT" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+
+    { echo "$as_me:$LINENO: checking for -single_module linker flag" >&5
+echo $ECHO_N "checking for -single_module linker flag... $ECHO_C" >&6; }
+if test "${lt_cv_apple_cc_single_mod+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+   # By default we will add the -single_module flag. You can override
+   # by either setting the environment variable LT_MULTI_MODULE
+   # non-empty at configure time, or by adding -multi_module to the
+   # link flags.
+   echo "int foo(void){return 1;}" > conftest.c
+   $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+     -dynamiclib ${wl}-single_module conftest.c
+   if test -f libconftest.dylib; then
+     lt_cv_apple_cc_single_mod=yes
+     rm -rf libconftest.dylib*
+   fi
+   rm conftest.c
+      fi
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5
+echo "${ECHO_T}$lt_cv_apple_cc_single_mod" >&6; }
+    { echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5
+echo $ECHO_N "checking for -exported_symbols_list linker flag... $ECHO_C" >&6; }
+if test "${lt_cv_ld_exported_symbols_list+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  lt_cv_ld_exported_symbols_list=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	lt_cv_ld_exported_symbols_list=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5
+echo "${ECHO_T}$lt_cv_ld_exported_symbols_list" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[0123])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+     _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*)
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+   10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+     _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+   10.[012]*)
+     _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+   10.*)
+     _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}"
+    fi
+    if test "$DSYMUTIL" != ":"; then
+      _lt_dsymutil="~$DSYMUTIL \$lib || :"
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+
+enable_dlopen=no
+enable_win32_dll=no
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+  enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then
+  withval=$with_pic; pic_mode="$withval"
+else
+  pic_mode=default
+fi
+
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm -r conftest*
+
+
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  lt_prog_compiler_no_builtin_flag=' -fno-builtin'
+
+
+{ echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+  ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:7396: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:7400: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; }
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+      darwin*)
+        # PIC is the default on this platform
+        # Common symbols not allowed in MH_DYLIB files
+       case $cc_basename in
+         xlc*)
+         lt_prog_compiler_pic='-qnocommon'
+         lt_prog_compiler_wl='-Wl,'
+         ;;
+       esac
+       ;;
+
+    mingw* | cygwin* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    linux* | k*bsd*-gnu)
+      case $cc_basename in
+      icc* | ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      *)
+        case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+	*Sun\ F*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic" >&6; }
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+
+{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_pic_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+  ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:7686: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:7690: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_static_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $rm -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_static_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $rm -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:7790: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:7794: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $rm conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+   $rm out/* && rmdir out
+   cd ..
+   rmdir conftest
+   $rm conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; }
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; }
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  enable_shared_with_static_runtimes=no
+  archive_cmds=
+  archive_expsym_cmds=
+  old_archive_From_new_cmds=
+  old_archive_from_expsyms_cmds=
+  export_dynamic_flag_spec=
+  whole_archive_flag_spec=
+  thread_safe_flag_spec=
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_flag_spec_ld=
+  hardcode_libdir_separator=
+  hardcode_direct=no
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  link_all_deplibs=unknown
+  hardcode_automatic=no
+  module_cmds=
+  module_expsym_cmds=
+  always_export_symbols=no
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+  # Just being paranoid about ensuring that cc_basename is set.
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+  case $host_os in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+	whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+  	whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>/dev/null` in
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs=no
+	cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+
+      # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we can't use
+      # them.
+      ld_shlibs=no
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | k*bsd*-gnu)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	tmp_addflag=
+	case $cc_basename,$host_cpu in
+	pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	*)
+	  tmp_sharedflag='-shared' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+	if test $supports_anon_versioning = yes; then
+	  archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~
+  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+  $echo "local: *; };" >> $output_objdir/$libname.ver~
+	  $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	fi
+	link_all_deplibs=no
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+  	    aix_use_runtimelinking=yes
+  	    break
+  	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" && \
+  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	  then
+  	  # We have reworked collect2
+  	  :
+	  else
+  	  # We have old collect2
+  	  hardcode_direct=unsupported
+  	  # It fails to find uninstalled libraries when the uninstalled
+  	  # path is not listed in the libpath.  Setting hardcode_minus_L
+  	  # to unsupported forces relinking
+  	  hardcode_minus_L=yes
+  	  hardcode_libdir_flag_spec='-L$libdir'
+  	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+  	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+       # Determine the default libpath from the value encoded in an empty executable.
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+       hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+       else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an empty executable.
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' ${wl}-bernotok'
+	  allow_undefined_flag=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  whole_archive_flag_spec='$convenience'
+	  archive_cmds_need_lc=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      # see comment about different semantics on the GNU ld section
+      ld_shlibs=no
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      allow_undefined_flag=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      old_archive_From_new_cmds='true'
+      # FIXME: Should let the user specify the lib program.
+      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      fix_srcfile_path='`cygpath -w "$srcfile"`'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    darwin* | rhapsody*)
+      case $host_os in
+        rhapsody* | darwin1.[012])
+         allow_undefined_flag='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[012])
+               allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+      esac
+      archive_cmds_need_lc=no
+      hardcode_direct=no
+      hardcode_automatic=yes
+      hardcode_shlibpath_var=unsupported
+      whole_archive_flag_spec=''
+      link_all_deplibs=yes
+    if test "$GCC" = yes ; then
+    	output_verbose_link_cmd='echo'
+        archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+        module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+        archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+        module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    else
+      case $cc_basename in
+        xlc*)
+         output_verbose_link_cmd='echo'
+         archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
+         module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+         archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          module_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         ld_shlibs=no
+          ;;
+      esac
+    fi
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    freebsd1*)
+      ld_shlibs=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+
+	hardcode_direct=yes
+	export_dynamic_flag_spec='${wl}-E'
+
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_libdir_flag_spec_ld='+b $libdir'
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  export_dynamic_flag_spec='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_ld='-rpath $libdir'
+      fi
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      link_all_deplibs=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+        fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z text'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+      else
+	wlarc=''
+	archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+ 	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+  fi
+
+{ echo "$as_me:$LINENO: result: $ld_shlibs" >&5
+echo "${ECHO_T}$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; }
+      $rm conftest*
+      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl
+	pic_flag=$lt_prog_compiler_pic
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag
+        allow_undefined_flag=
+        if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+        then
+	  archive_cmds_need_lc=no
+        else
+	  archive_cmds_need_lc=yes
+        fi
+        allow_undefined_flag=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $rm conftest*
+      { echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
+echo "${ECHO_T}$archive_cmds_need_lc" >&6; }
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; }
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+  if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'`
+  else
+    lt_search_path_spec=`echo "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+  fi
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  sys_lib_search_path_spec=`echo $lt_search_path_spec`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+   hppa*64*)
+     shrext_cmds='.sl'
+     hardcode_into_libs=yes
+     dynamic_linker="$host_os dld.sl"
+     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+     soname_spec='${libname}${release}${shared_ext}$major'
+     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+     ;;
+   *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix[3-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ 	]*hwcap[ 	]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+nto-qnx*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+    shlibpath_overrides_runpath=no
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    shlibpath_overrides_runpath=yes
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"
+fi
+
+sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"
+fi
+
+sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+   test -n "$runpath_var" || \
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ echo "$as_me:$LINENO: result: $hardcode_action" >&5
+echo "${ECHO_T}$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+striplib=
+old_striplib=
+{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+   darwin*)
+       if test -n "$STRIP" ; then
+         striplib="$STRIP -x"
+         old_striplib="$STRIP -S"
+         { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+       else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+       ;;
+   *)
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+    ;;
+  esac
+fi
+
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+   ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+   ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_dl_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_lib_dl_dlopen=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; }
+if test $ac_cv_lib_dl_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+   ;;
+
+  *)
+    { echo "$as_me:$LINENO: checking for shl_load" >&5
+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; }
+if test "${ac_cv_func_shl_load+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define shl_load innocuous_shl_load
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char shl_load (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef shl_load
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_shl_load || defined __stub___shl_load
+choke me
+#endif
+
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_func_shl_load=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_func_shl_load=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+echo "${ECHO_T}$ac_cv_func_shl_load" >&6; }
+if test $ac_cv_func_shl_load = yes; then
+  lt_cv_dlopen="shl_load"
+else
+  { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; }
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_dld_shl_load=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_lib_dld_shl_load=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; }
+if test $ac_cv_lib_dld_shl_load = yes; then
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  { echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; }
+if test "${ac_cv_func_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define dlopen innocuous_dlopen
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char dlopen (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef dlopen
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_dlopen || defined __stub___dlopen
+choke me
+#endif
+
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_func_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_func_dlopen=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6; }
+if test $ac_cv_func_dlopen = yes; then
+  lt_cv_dlopen="dlopen"
+else
+  { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_dl_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_lib_dl_dlopen=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; }
+if test $ac_cv_lib_dl_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; }
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_svld_dlopen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_lib_svld_dlopen=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; }
+if test $ac_cv_lib_svld_dlopen = yes; then
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; }
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_dld_dld_link=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_lib_dld_dld_link=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; }
+if test $ac_cv_lib_dld_dld_link = yes; then
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; }
+if test "${lt_cv_dlopen_self+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<EOF
+#line 10167 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+    exit (status);
+}
+EOF
+  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self" >&6; }
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; }
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<EOF
+#line 10267 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+    exit (status);
+}
+EOF
+  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+# Report which library types will actually be built
+{ echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6; }
+
+{ echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; }
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+  test "$enable_shared" = yes && enable_static=no
+  if test -n "$RANLIB"; then
+    archive_cmds="$archive_cmds~\$RANLIB \$lib"
+    postinstall_cmds='$RANLIB $lib'
+  fi
+  ;;
+
+aix[4-9]*)
+  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+    test "$enable_shared" = yes && enable_static=no
+  fi
+    ;;
+esac
+{ echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6; }
+
+{ echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; }
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+{ echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6; }
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    compiler \
+    CC \
+    LD \
+    lt_prog_compiler_wl \
+    lt_prog_compiler_pic \
+    lt_prog_compiler_static \
+    lt_prog_compiler_no_builtin_flag \
+    export_dynamic_flag_spec \
+    thread_safe_flag_spec \
+    whole_archive_flag_spec \
+    enable_shared_with_static_runtimes \
+    old_archive_cmds \
+    old_archive_from_new_cmds \
+    predep_objects \
+    postdep_objects \
+    predeps \
+    postdeps \
+    compiler_lib_search_path \
+    compiler_lib_search_dirs \
+    archive_cmds \
+    archive_expsym_cmds \
+    postinstall_cmds \
+    postuninstall_cmds \
+    old_archive_from_expsyms_cmds \
+    allow_undefined_flag \
+    no_undefined_flag \
+    export_symbols_cmds \
+    hardcode_libdir_flag_spec \
+    hardcode_libdir_flag_spec_ld \
+    hardcode_libdir_separator \
+    hardcode_automatic \
+    module_cmds \
+    module_expsym_cmds \
+    lt_cv_prog_compiler_c_o \
+    fix_srcfile_path \
+    exclude_expsyms \
+    include_expsyms; do
+
+    case $var in
+    old_archive_cmds | \
+    old_archive_from_new_cmds | \
+    archive_cmds | \
+    archive_expsym_cmds | \
+    module_cmds | \
+    module_expsym_cmds | \
+    old_archive_from_expsyms_cmds | \
+    export_symbols_cmds | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\$0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+cfgfile="${ofile}T"
+  trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+  $rm -f "$cfgfile"
+  { echo "$as_me:$LINENO: creating $ofile" >&5
+echo "$as_me: creating $ofile" >&6;}
+
+  cat <<__EOF__ >> "$cfgfile"
+#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e 1s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps
+
+# The directories searched by this compiler when creating a shared
+# library
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# ### END LIBTOOL CONFIG
+
+__EOF__
+
+
+  case $host_os in
+  aix3*)
+    cat <<\EOF >> "$cfgfile"
+
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+EOF
+    ;;
+  esac
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
+
+  mv -f "$cfgfile" "$ofile" || \
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+
+# Check whether --with-tags was given.
+if test "${with_tags+set}" = set; then
+  withval=$with_tags; tagnames="$withval"
+fi
+
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+  if test ! -f "${ofile}"; then
+    { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5
+echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;}
+  fi
+
+  if test -z "$LTCC"; then
+    eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+    if test -z "$LTCC"; then
+      { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5
+echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;}
+    else
+      { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5
+echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;}
+    fi
+  fi
+  if test -z "$LTCFLAGS"; then
+    eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
+  fi
+
+  # Extract list of available tagged configurations in $ofile.
+  # Note that this assumes the entire list is on one line.
+  available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+  lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+  for tagname in $tagnames; do
+    IFS="$lt_save_ifs"
+    # Check whether tagname contains only valid characters
+    case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in
+    "") ;;
+    *)  { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5
+echo "$as_me: error: invalid tag name: $tagname" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+    esac
+
+    if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+    then
+      { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5
+echo "$as_me: error: tag name \"$tagname\" already exists" >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+
+    # Update the list of available tags.
+    if test -n "$tagname"; then
+      echo appending configuration tag \"$tagname\" to $ofile
+
+      case $tagname in
+      CXX)
+	if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+	    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+	    (test "X$CXX" != "Xg++"))) ; then
+	  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_flag_spec_ld_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+compiler_lib_search_dirs_CXX=
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm -r conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_LD=$LD
+lt_save_GCC=$GCC
+GCC=$GXX
+lt_save_with_gnu_ld=$with_gnu_ld
+lt_save_path_LD=$lt_cv_path_LD
+if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+  lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+else
+  $as_unset lt_cv_prog_gnu_ld
+fi
+if test -n "${lt_cv_path_LDCXX+set}"; then
+  lt_cv_path_LD=$lt_cv_path_LDCXX
+else
+  $as_unset lt_cv_path_LD
+fi
+test -z "${LDCXX+set}" || LD=$LDCXX
+CC=${CXX-"c++"}
+compiler=$CC
+compiler_CXX=$CC
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# We don't want -fno-exception wen compiling C++ code, so set the
+# no_builtin_flag separately
+if test "$GXX" = yes; then
+  lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+else
+  lt_prog_compiler_no_builtin_flag_CXX=
+fi
+
+if test "$GXX" = yes; then
+  # Set up default GNU C++ configuration
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; }
+else
+  { echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; }
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; }
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+  # Check if GNU C++ uses GNU ld as the underlying linker, since the
+  # archiving commands below assume that GNU ld is being used.
+  if test "$with_gnu_ld" = yes; then
+    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+    archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+    #     investigate it a little bit more. (MM)
+    wlarc='${wl}'
+
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
+	grep 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec_CXX=
+    fi
+  else
+    with_gnu_ld=no
+    wlarc=
+
+    # A generic and very simple default shared library creation
+    # command for GNU C++ for the case where it uses the native
+    # linker, instead of GNU ld.  If possible, this setting should
+    # overridden to take advantage of the native linker features on
+    # the platform it is being used on.
+    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+  fi
+
+  # Commands to make compiler produce verbose output that lists
+  # what "hidden" libraries, object files and flags are used when
+  # linking a shared library.
+  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+else
+  GXX=no
+  with_gnu_ld=no
+  wlarc=
+fi
+
+# PORTME: fill in a description of your system's C++ link characteristics
+{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; }
+ld_shlibs_CXX=yes
+case $host_os in
+  aix3*)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+  aix[4-9]*)
+    if test "$host_cpu" = ia64; then
+      # On IA64, the linker does run time linking by default, so we don't
+      # have to do anything special.
+      aix_use_runtimelinking=no
+      exp_sym_flag='-Bexport'
+      no_entry_flag=""
+    else
+      aix_use_runtimelinking=no
+
+      # Test if we are trying to use run time linking or normal
+      # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+      # need to do runtime linking.
+      case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	for ld_flag in $LDFLAGS; do
+	  case $ld_flag in
+	  *-brtl*)
+	    aix_use_runtimelinking=yes
+	    break
+	    ;;
+	  esac
+	done
+	;;
+      esac
+
+      exp_sym_flag='-bexport'
+      no_entry_flag='-bnoentry'
+    fi
+
+    # When large executables or shared objects are built, AIX ld can
+    # have problems creating the table of contents.  If linking a library
+    # or program results in "error TOC overflow" add -mminimal-toc to
+    # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+    # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+    archive_cmds_CXX=''
+    hardcode_direct_CXX=yes
+    hardcode_libdir_separator_CXX=':'
+    link_all_deplibs_CXX=yes
+
+    if test "$GXX" = yes; then
+      case $host_os in aix4.[012]|aix4.[012].*)
+      # We only want to do this on AIX 4.2 and lower, the check
+      # below for broken collect2 doesn't work under 4.3+
+	collect2name=`${CC} -print-prog-name=collect2`
+	if test -f "$collect2name" && \
+	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	then
+	  # We have reworked collect2
+	  :
+	else
+	  # We have old collect2
+	  hardcode_direct_CXX=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L_CXX=yes
+	  hardcode_libdir_flag_spec_CXX='-L$libdir'
+	  hardcode_libdir_separator_CXX=
+	fi
+	;;
+      esac
+      shared_flag='-shared'
+      if test "$aix_use_runtimelinking" = yes; then
+	shared_flag="$shared_flag "'${wl}-G'
+      fi
+    else
+      # not using gcc
+      if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	shared_flag='-G'
+      else
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag='${wl}-G'
+	else
+	  shared_flag='${wl}-bM:SRE'
+	fi
+      fi
+    fi
+
+    # It seems that -bexpall does not export symbols beginning with
+    # underscore (_), so it is better to generate a list of symbols to export.
+    always_export_symbols_CXX=yes
+    if test "$aix_use_runtimelinking" = yes; then
+      # Warning - without using the other runtime loading flags (-brtl),
+      # -berok will link without error, but may produce a broken library.
+      allow_undefined_flag_CXX='-berok'
+      # Determine the default libpath from the value encoded in an empty executable.
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+      hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+      archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+     else
+      if test "$host_cpu" = ia64; then
+	hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+	allow_undefined_flag_CXX="-z nodefs"
+	archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+      else
+	# Determine the default libpath from the value encoded in an empty executable.
+	cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+	hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+	# Warning - without using the other run time loading flags,
+	# -berok will link without error, but may produce a broken library.
+	no_undefined_flag_CXX=' ${wl}-bernotok'
+	allow_undefined_flag_CXX=' ${wl}-berok'
+	# Exported symbols can be pulled into shared objects from archives
+	whole_archive_flag_spec_CXX='$convenience'
+	archive_cmds_need_lc_CXX=yes
+	# This is similar to how AIX traditionally builds its shared libraries.
+	archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+      fi
+    fi
+    ;;
+
+  beos*)
+    if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+      allow_undefined_flag_CXX=unsupported
+      # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+      # support --undefined.  This deserves some investigation.  FIXME
+      archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+    else
+      ld_shlibs_CXX=no
+    fi
+    ;;
+
+  chorus*)
+    case $cc_basename in
+      *)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+    esac
+    ;;
+
+  cygwin* | mingw* | pw32*)
+    # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+    # as there is no search path for DLLs.
+    hardcode_libdir_flag_spec_CXX='-L$libdir'
+    allow_undefined_flag_CXX=unsupported
+    always_export_symbols_CXX=no
+    enable_shared_with_static_runtimes_CXX=yes
+
+    if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+      archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      # If the export-symbols file already is a .def file (1st line
+      # is EXPORTS), use it as is; otherwise, prepend...
+      archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	cp $export_symbols $output_objdir/$soname.def;
+      else
+	echo EXPORTS > $output_objdir/$soname.def;
+	cat $export_symbols >> $output_objdir/$soname.def;
+      fi~
+      $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+    else
+      ld_shlibs_CXX=no
+    fi
+  ;;
+      darwin* | rhapsody*)
+      archive_cmds_need_lc_CXX=no
+      hardcode_direct_CXX=no
+      hardcode_automatic_CXX=yes
+      hardcode_shlibpath_var_CXX=unsupported
+      whole_archive_flag_spec_CXX=''
+      link_all_deplibs_CXX=yes
+      allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
+      if test "$GXX" = yes ; then
+      output_verbose_link_cmd='echo'
+      archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+      module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+      module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+      if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+        archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+        archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+      fi
+      else
+      case $cc_basename in
+        xlc*)
+         output_verbose_link_cmd='echo'
+          archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
+          module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+          archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         ld_shlibs_CXX=no
+          ;;
+      esac
+      fi
+        ;;
+
+  dgux*)
+    case $cc_basename in
+      ec++*)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      ghcx*)
+	# Green Hills C++ Compiler
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+    esac
+    ;;
+  freebsd[12]*)
+    # C++ shared libraries reported to be fairly broken before switch to ELF
+    ld_shlibs_CXX=no
+    ;;
+  freebsd-elf*)
+    archive_cmds_need_lc_CXX=no
+    ;;
+  freebsd* | dragonfly*)
+    # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+    # conventions
+    ld_shlibs_CXX=yes
+    ;;
+  gnu*)
+    ;;
+  hpux9*)
+    hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+    hardcode_libdir_separator_CXX=:
+    export_dynamic_flag_spec_CXX='${wl}-E'
+    hardcode_direct_CXX=yes
+    hardcode_minus_L_CXX=yes # Not in the search PATH,
+				# but as the default
+				# location of the library.
+
+    case $cc_basename in
+    CC*)
+      # FIXME: insert proper C++ library support
+      ld_shlibs_CXX=no
+      ;;
+    aCC*)
+      archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      #
+      # There doesn't appear to be a way to prevent this compiler from
+      # explicitly linking system object files so we need to strip them
+      # from the output so that they don't get included in the library
+      # dependencies.
+      output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+      ;;
+    *)
+      if test "$GXX" = yes; then
+        archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+      fi
+      ;;
+    esac
+    ;;
+  hpux10*|hpux11*)
+    if test $with_gnu_ld = no; then
+      hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator_CXX=:
+
+      case $host_cpu in
+      hppa*64*|ia64*) ;;
+      *)
+	export_dynamic_flag_spec_CXX='${wl}-E'
+        ;;
+      esac
+    fi
+    case $host_cpu in
+    hppa*64*|ia64*)
+      hardcode_direct_CXX=no
+      hardcode_shlibpath_var_CXX=no
+      ;;
+    *)
+      hardcode_direct_CXX=yes
+      hardcode_minus_L_CXX=yes # Not in the search PATH,
+					      # but as the default
+					      # location of the library.
+      ;;
+    esac
+
+    case $cc_basename in
+      CC*)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      aCC*)
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  ;;
+	esac
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes; then
+	  if test $with_gnu_ld = no; then
+	    case $host_cpu in
+	    hppa*64*)
+	      archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      ;;
+	    ia64*)
+	      archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      ;;
+	    *)
+	      archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      ;;
+	    esac
+	  fi
+	else
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	fi
+	;;
+    esac
+    ;;
+  interix[3-9]*)
+    hardcode_direct_CXX=no
+    hardcode_shlibpath_var_CXX=no
+    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+    export_dynamic_flag_spec_CXX='${wl}-E'
+    # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+    # Instead, shared libraries are loaded at an image base (0x10000000 by
+    # default) and relocated if they conflict, which is a slow very memory
+    # consuming and fragmenting process.  To avoid this, we pick a random,
+    # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+    # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+    archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+    archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+    ;;
+  irix5* | irix6*)
+    case $cc_basename in
+      CC*)
+	# SGI C++
+	archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	# Archives containing C++ object files must be created using
+	# "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	# necessary to make sure instantiated templates are included
+	# in the archive.
+	old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	;;
+      *)
+	if test "$GXX" = yes; then
+	  if test "$with_gnu_ld" = no; then
+	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	  else
+	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
+	  fi
+	fi
+	link_all_deplibs_CXX=yes
+	;;
+    esac
+    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+    hardcode_libdir_separator_CXX=:
+    ;;
+  linux* | k*bsd*-gnu)
+    case $cc_basename in
+      KCC*)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+	hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir'
+	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+	# Archives containing C++ object files must be created using
+	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+	;;
+      icpc*)
+	# Intel C++
+	with_gnu_ld=yes
+	# version 8.0 and above of icpc choke on multiply defined symbols
+	# if we add $predep_objects and $postdep_objects, however 7.1 and
+	# earlier do not add the objects themselves.
+	case `$CC -V 2>&1` in
+	*"Version 7."*)
+  	  archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+  	  archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  ;;
+	*)  # Version 8.0 or newer
+	  tmp_idyn=
+	  case $host_cpu in
+	    ia64*) tmp_idyn=' -i_dynamic';;
+	  esac
+  	  archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	  archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  ;;
+	esac
+	archive_cmds_need_lc_CXX=no
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	;;
+      pgCC* | pgcpp*)
+        # Portland Group C++ compiler
+	archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+  	archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+
+	hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+        ;;
+      cxx*)
+	# Compaq C++
+	archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	runpath_var=LD_RUN_PATH
+	hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+	hardcode_libdir_separator_CXX=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)
+	  # Sun C++ 5.9
+	  no_undefined_flag_CXX=' -zdefs'
+	  archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	  hardcode_libdir_flag_spec_CXX='-R$libdir'
+	  whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+
+	  # Not sure whether something based on
+	  # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	  # would be better.
+	  output_verbose_link_cmd='echo'
+
+	  # Archives containing C++ object files must be created using
+	  # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	  # necessary to make sure instantiated templates are included
+	  # in the archive.
+	  old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	  ;;
+	esac
+	;;
+    esac
+    ;;
+  lynxos*)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+  m88k*)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+  mvs*)
+    case $cc_basename in
+      cxx*)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+    esac
+    ;;
+  netbsd* | netbsdelf*-gnu)
+    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+      archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+      wlarc=
+      hardcode_libdir_flag_spec_CXX='-R$libdir'
+      hardcode_direct_CXX=yes
+      hardcode_shlibpath_var_CXX=no
+    fi
+    # Workaround some broken pre-1.5 toolchains
+    output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+    ;;
+  openbsd2*)
+    # C++ shared libraries are fairly broken
+    ld_shlibs_CXX=no
+    ;;
+  openbsd*)
+    if test -f /usr/libexec/ld.so; then
+      hardcode_direct_CXX=yes
+      hardcode_shlibpath_var_CXX=no
+      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	export_dynamic_flag_spec_CXX='${wl}-E'
+	whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      fi
+      output_verbose_link_cmd='echo'
+    else
+      ld_shlibs_CXX=no
+    fi
+    ;;
+  osf3*)
+    case $cc_basename in
+      KCC*)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	hardcode_libdir_separator_CXX=:
+
+	# Archives containing C++ object files must be created using
+	# "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+
+	;;
+      RCC*)
+	# Rational C++ 2.4.1
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      cxx*)
+	allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	hardcode_libdir_separator_CXX=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	  archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+	  hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	  hardcode_libdir_separator_CXX=:
+
+	  # Commands to make compiler produce verbose output that lists
+	  # what "hidden" libraries, object files and flags are used when
+	  # linking a shared library.
+	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+	else
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	fi
+	;;
+    esac
+    ;;
+  osf4* | osf5*)
+    case $cc_basename in
+      KCC*)
+	# Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	# KCC will only create a shared library if the output file
+	# ends with ".so" (or ".sl" for HP-UX), so rename the library
+	# to its proper name (with version) after linking.
+	archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	hardcode_libdir_separator_CXX=:
+
+	# Archives containing C++ object files must be created using
+	# the KAI C++ compiler.
+	old_archive_cmds_CXX='$CC -o $oldlib $oldobjs'
+	;;
+      RCC*)
+	# Rational C++ 2.4.1
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      cxx*)
+	allow_undefined_flag_CXX=' -expect_unresolved \*'
+	archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	  echo "-hidden">> $lib.exp~
+	  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp  `test -n "$verstring" && echo -set_version	$verstring` -update_registry ${output_objdir}/so_locations -o $lib~
+	  $rm $lib.exp'
+
+	hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+	hardcode_libdir_separator_CXX=:
+
+	# Commands to make compiler produce verbose output that lists
+	# what "hidden" libraries, object files and flags are used when
+	# linking a shared library.
+	#
+	# There doesn't appear to be a way to prevent this compiler from
+	# explicitly linking system object files so we need to strip them
+	# from the output so that they don't get included in the library
+	# dependencies.
+	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+	;;
+      *)
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	 archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+	  hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	  hardcode_libdir_separator_CXX=:
+
+	  # Commands to make compiler produce verbose output that lists
+	  # what "hidden" libraries, object files and flags are used when
+	  # linking a shared library.
+	  output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+	else
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	fi
+	;;
+    esac
+    ;;
+  psos*)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+  sunos4*)
+    case $cc_basename in
+      CC*)
+	# Sun C++ 4.x
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      lcc*)
+	# Lucid
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+    esac
+    ;;
+  solaris*)
+    case $cc_basename in
+      CC*)
+	# Sun C++ 4.2, 5.x and Centerline C++
+        archive_cmds_need_lc_CXX=yes
+	no_undefined_flag_CXX=' -zdefs'
+	archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	$CC -G${allow_undefined_flag}  ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	hardcode_libdir_flag_spec_CXX='-R$libdir'
+	hardcode_shlibpath_var_CXX=no
+	case $host_os in
+	  solaris2.[0-5] | solaris2.[0-5].*) ;;
+	  *)
+	    # The compiler driver will combine and reorder linker options,
+	    # but understands `-z linker_flag'.
+	    # Supported since Solaris 2.6 (maybe 2.5.1?)
+	    whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+	    ;;
+	esac
+	link_all_deplibs_CXX=yes
+
+	output_verbose_link_cmd='echo'
+
+	# Archives containing C++ object files must be created using
+	# "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	# necessary to make sure instantiated templates are included
+	# in the archive.
+	old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	;;
+      gcx*)
+	# Green Hills C++ Compiler
+	archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	# The C++ compiler must be used to create the archive.
+	old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	;;
+      *)
+	# GNU C++ compiler with Solaris linker
+	if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	  no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+	  if $CC --version | grep -v '^2\.7' > /dev/null; then
+	    archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+	  else
+	    # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	    # platform.
+	    archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+		$CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+	  fi
+
+	  hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+	  case $host_os in
+	  solaris2.[0-5] | solaris2.[0-5].*) ;;
+	  *)
+	    whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	    ;;
+	  esac
+	fi
+	;;
+    esac
+    ;;
+  sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+    no_undefined_flag_CXX='${wl}-z,text'
+    archive_cmds_need_lc_CXX=no
+    hardcode_shlibpath_var_CXX=no
+    runpath_var='LD_RUN_PATH'
+
+    case $cc_basename in
+      CC*)
+	archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      *)
+	archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+    esac
+    ;;
+  sysv5* | sco3.2v5* | sco5v6*)
+    # Note: We can NOT use -z defs as we might desire, because we do not
+    # link with -lc, and that would cause any symbols used from libc to
+    # always be unresolved, which means just about no library would
+    # ever link correctly.  If we're not using GNU ld we use -z text
+    # though, which does catch some bad symbols but isn't as heavy-handed
+    # as -z defs.
+    # For security reasons, it is highly recommended that you always
+    # use absolute paths for naming shared libraries, and exclude the
+    # DT_RUNPATH tag from executables and libraries.  But doing so
+    # requires that you compile everything twice, which is a pain.
+    # So that behaviour is only enabled if SCOABSPATH is set to a
+    # non-empty value in the environment.  Most likely only useful for
+    # creating official distributions of packages.
+    # This is a hack until libtool officially supports absolute path
+    # names for shared libraries.
+    no_undefined_flag_CXX='${wl}-z,text'
+    allow_undefined_flag_CXX='${wl}-z,nodefs'
+    archive_cmds_need_lc_CXX=no
+    hardcode_shlibpath_var_CXX=no
+    hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+    hardcode_libdir_separator_CXX=':'
+    link_all_deplibs_CXX=yes
+    export_dynamic_flag_spec_CXX='${wl}-Bexport'
+    runpath_var='LD_RUN_PATH'
+
+    case $cc_basename in
+      CC*)
+	archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      *)
+	archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+    esac
+    ;;
+  tandem*)
+    case $cc_basename in
+      NCC*)
+	# NonStop-UX NCC 3.20
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+      *)
+	# FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+    esac
+    ;;
+  vxworks*)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+  *)
+    # FIXME: insert proper C++ library support
+    ld_shlibs_CXX=no
+    ;;
+esac
+{ echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6; }
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+GCC_CXX="$GXX"
+LD_CXX="$LD"
+
+cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+EOF
+
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  # The `*' in the case matches for architectures that use `case' in
+  # $output_verbose_cmd can trigger glob expansion during the loop
+  # eval without this substitution.
+  output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
+
+  for p in `eval $output_verbose_link_cmd`; do
+    case $p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" \
+	  || test $p = "-R"; then
+	 prev=$p
+	 continue
+       else
+	 prev=
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 case $p in
+	 -L* | -R*)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$compiler_lib_search_path_CXX"; then
+	     compiler_lib_search_path_CXX="${prev}${p}"
+	   else
+	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$postdeps_CXX"; then
+	   postdeps_CXX="${prev}${p}"
+	 else
+	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+	 fi
+       fi
+       ;;
+
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$predep_objects_CXX"; then
+	   predep_objects_CXX="$p"
+	 else
+	   predep_objects_CXX="$predep_objects_CXX $p"
+	 fi
+       else
+	 if test -z "$postdep_objects_CXX"; then
+	   postdep_objects_CXX="$p"
+	 else
+	   postdep_objects_CXX="$postdep_objects_CXX $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$rm -f confest.$objext
+
+compiler_lib_search_dirs_CXX=
+if test -n "$compiler_lib_search_path_CXX"; then
+  compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  predep_objects_CXX=
+  postdep_objects_CXX=
+  postdeps_CXX=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+    #
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+
+lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; }
+
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    lt_prog_compiler_wl_CXX='-Wl,'
+    lt_prog_compiler_static_CXX='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_CXX='-Bstatic'
+      fi
+      ;;
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+      ;;
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_CXX='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      lt_prog_compiler_pic_CXX=
+      ;;
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_CXX=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	;;
+      *)
+	lt_prog_compiler_pic_CXX='-fPIC'
+	;;
+      esac
+      ;;
+    *)
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[4-9]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  lt_prog_compiler_static_CXX='-Bstatic'
+	else
+	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+       darwin*)
+         # PIC is the default on this platform
+         # Common symbols not allowed in MH_DYLIB files
+         case $cc_basename in
+           xlc*)
+           lt_prog_compiler_pic_CXX='-qnocommon'
+           lt_prog_compiler_wl_CXX='-Wl,'
+           ;;
+         esac
+       ;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      lt_prog_compiler_pic_CXX='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      lt_prog_compiler_pic_CXX='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    ;;
+	  icpc* | ecpc*)
+	    # Intel C++
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fpic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      lt_prog_compiler_pic_CXX='-KPIC'
+	      lt_prog_compiler_static_CXX='-Bstatic'
+	      lt_prog_compiler_wl_CXX='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    lt_prog_compiler_pic_CXX='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    lt_prog_compiler_wl_CXX='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    lt_prog_compiler_pic_CXX='-pic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	lt_prog_compiler_can_build_shared_CXX=no
+	;;
+    esac
+  fi
+
+{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6; }
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+
+{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_pic_works_CXX=no
+  ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:12668: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:12672: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_CXX=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
+    case $lt_prog_compiler_pic_CXX in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+     esac
+else
+    lt_prog_compiler_pic_CXX=
+     lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_CXX=
+    ;;
+  *)
+    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+    ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_static_works_CXX=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_CXX=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_CXX=yes
+     fi
+   fi
+   $rm -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
+    :
+else
+    lt_prog_compiler_static_CXX=
+fi
+
+
+{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $rm -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:12772: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:12776: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $rm conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+   $rm out/* && rmdir out
+   cd ..
+   rmdir conftest
+   $rm conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; }
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; }
+
+  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  case $host_os in
+  aix[4-9]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+    else
+      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    export_symbols_cmds_CXX="$ltdll_cmds"
+  ;;
+  cygwin* | mingw*)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+  ;;
+  linux* | k*bsd*-gnu)
+    link_all_deplibs_CXX=no
+  ;;
+  *)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  ;;
+  esac
+  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+
+{ echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6; }
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_CXX=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_CXX in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; }
+      $rm conftest*
+      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl_CXX
+	pic_flag=$lt_prog_compiler_pic_CXX
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+        allow_undefined_flag_CXX=
+        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+        then
+	  archive_cmds_need_lc_CXX=no
+        else
+	  archive_cmds_need_lc_CXX=yes
+        fi
+        allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $rm conftest*
+      { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6; }
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; }
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+   hppa*64*)
+     shrext_cmds='.sl'
+     hardcode_into_libs=yes
+     dynamic_linker="$host_os dld.sl"
+     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+     soname_spec='${libname}${release}${shared_ext}$major'
+     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+     ;;
+   *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix[3-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ 	]*hwcap[ 	]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+nto-qnx*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+    shlibpath_overrides_runpath=no
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    shlibpath_overrides_runpath=yes
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"
+fi
+
+sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"
+fi
+
+sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" || \
+   test -n "$runpath_var_CXX" || \
+   test "X$hardcode_automatic_CXX" = "Xyes" ; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct_CXX" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
+     test "$hardcode_minus_L_CXX" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_CXX=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_CXX=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_CXX=unsupported
+fi
+{ echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5
+echo "${ECHO_T}$hardcode_action_CXX" >&6; }
+
+if test "$hardcode_action_CXX" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    compiler_CXX \
+    CC_CXX \
+    LD_CXX \
+    lt_prog_compiler_wl_CXX \
+    lt_prog_compiler_pic_CXX \
+    lt_prog_compiler_static_CXX \
+    lt_prog_compiler_no_builtin_flag_CXX \
+    export_dynamic_flag_spec_CXX \
+    thread_safe_flag_spec_CXX \
+    whole_archive_flag_spec_CXX \
+    enable_shared_with_static_runtimes_CXX \
+    old_archive_cmds_CXX \
+    old_archive_from_new_cmds_CXX \
+    predep_objects_CXX \
+    postdep_objects_CXX \
+    predeps_CXX \
+    postdeps_CXX \
+    compiler_lib_search_path_CXX \
+    compiler_lib_search_dirs_CXX \
+    archive_cmds_CXX \
+    archive_expsym_cmds_CXX \
+    postinstall_cmds_CXX \
+    postuninstall_cmds_CXX \
+    old_archive_from_expsyms_cmds_CXX \
+    allow_undefined_flag_CXX \
+    no_undefined_flag_CXX \
+    export_symbols_cmds_CXX \
+    hardcode_libdir_flag_spec_CXX \
+    hardcode_libdir_flag_spec_ld_CXX \
+    hardcode_libdir_separator_CXX \
+    hardcode_automatic_CXX \
+    module_cmds_CXX \
+    module_expsym_cmds_CXX \
+    lt_cv_prog_compiler_c_o_CXX \
+    fix_srcfile_path_CXX \
+    exclude_expsyms_CXX \
+    include_expsyms_CXX; do
+
+    case $var in
+    old_archive_cmds_CXX | \
+    old_archive_from_new_cmds_CXX | \
+    archive_cmds_CXX | \
+    archive_expsym_cmds_CXX | \
+    module_cmds_CXX | \
+    module_expsym_cmds_CXX | \
+    old_archive_from_expsyms_cmds_CXX | \
+    export_symbols_cmds_CXX | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\$0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+cfgfile="$ofile"
+
+  cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_CXX
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_CXX
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_CXX
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_CXX
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_CXX
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_CXX
+
+# The directories searched by this compiler when creating a shared
+# library
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+with_gnu_ld=$lt_save_with_gnu_ld
+lt_cv_path_LDCXX=$lt_cv_path_LD
+lt_cv_path_LD=$lt_save_path_LD
+lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+
+	else
+	  tagname=""
+	fi
+	;;
+
+      F77)
+	if test -n "$F77" && test "X$F77" != "Xno"; then
+
+ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+
+
+archive_cmds_need_lc_F77=no
+allow_undefined_flag_F77=
+always_export_symbols_F77=no
+archive_expsym_cmds_F77=
+export_dynamic_flag_spec_F77=
+hardcode_direct_F77=no
+hardcode_libdir_flag_spec_F77=
+hardcode_libdir_flag_spec_ld_F77=
+hardcode_libdir_separator_F77=
+hardcode_minus_L_F77=no
+hardcode_automatic_F77=no
+module_cmds_F77=
+module_expsym_cmds_F77=
+link_all_deplibs_F77=unknown
+old_archive_cmds_F77=$old_archive_cmds
+no_undefined_flag_F77=
+whole_archive_flag_spec_F77=
+enable_shared_with_static_runtimes_F77=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+objext_F77=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="\
+      program t
+      end
+"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm -r conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${F77-"f77"}
+compiler=$CC
+compiler_F77=$CC
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+{ echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6; }
+
+{ echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; }
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+  test "$enable_shared" = yes && enable_static=no
+  if test -n "$RANLIB"; then
+    archive_cmds="$archive_cmds~\$RANLIB \$lib"
+    postinstall_cmds='$RANLIB $lib'
+  fi
+  ;;
+aix[4-9]*)
+  if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+    test "$enable_shared" = yes && enable_static=no
+  fi
+  ;;
+esac
+{ echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6; }
+
+{ echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; }
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+{ echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6; }
+
+GCC_F77="$G77"
+LD_F77="$LD"
+
+lt_prog_compiler_wl_F77=
+lt_prog_compiler_pic_F77=
+lt_prog_compiler_static_F77=
+
+{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; }
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl_F77='-Wl,'
+    lt_prog_compiler_static_F77='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_F77='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4'
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_F77='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_F77='-fno-common'
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared_F77=no
+      enable_shared=no
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_F77=-Kconform_pic
+      fi
+      ;;
+
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_F77='-fPIC'
+	;;
+      esac
+      ;;
+
+    *)
+      lt_prog_compiler_pic_F77='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_F77='-Bstatic'
+      else
+	lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+      darwin*)
+        # PIC is the default on this platform
+        # Common symbols not allowed in MH_DYLIB files
+       case $cc_basename in
+         xlc*)
+         lt_prog_compiler_pic_F77='-qnocommon'
+         lt_prog_compiler_wl_F77='-Wl,'
+         ;;
+       esac
+       ;;
+
+    mingw* | cygwin* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic_F77='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_F77='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static_F77='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static_F77='-non_shared'
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    linux* | k*bsd*-gnu)
+      case $cc_basename in
+      icc* | ecc*)
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='-KPIC'
+	lt_prog_compiler_static_F77='-static'
+        ;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='-fpic'
+	lt_prog_compiler_static_F77='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl_F77='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static_F77='-non_shared'
+        ;;
+      *)
+        case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic_F77='-KPIC'
+	  lt_prog_compiler_static_F77='-Bstatic'
+	  lt_prog_compiler_wl_F77='-Wl,'
+	  ;;
+	*Sun\ F*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic_F77='-KPIC'
+	  lt_prog_compiler_static_F77='-Bstatic'
+	  lt_prog_compiler_wl_F77=''
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static_F77='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static_F77='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	lt_prog_compiler_wl_F77='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl_F77='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl_F77='-Qoption ld '
+      lt_prog_compiler_pic_F77='-PIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic_F77='-Kconform_pic'
+	lt_prog_compiler_static_F77='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      lt_prog_compiler_can_build_shared_F77=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic_F77='-pic'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared_F77=no
+      ;;
+    esac
+  fi
+
+{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6; }
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_F77"; then
+
+{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_pic_works_F77+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_pic_works_F77=no
+  ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_F77"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:14370: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:14374: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_F77=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_F77" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_pic_works_F77" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works_F77" = xyes; then
+    case $lt_prog_compiler_pic_F77 in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;;
+     esac
+else
+    lt_prog_compiler_pic_F77=
+     lt_prog_compiler_can_build_shared_F77=no
+fi
+
+fi
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_F77=
+    ;;
+  *)
+    lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77"
+    ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\"
+{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_static_works_F77+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_static_works_F77=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_F77=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_F77=yes
+     fi
+   fi
+   $rm -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_F77" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_static_works_F77" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works_F77" = xyes; then
+    :
+else
+    lt_prog_compiler_static_F77=
+fi
+
+
+{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o_F77=no
+   $rm -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:14474: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:14478: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_F77=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $rm conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+   $rm out/* && rmdir out
+   cd ..
+   rmdir conftest
+   $rm conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6; }
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; }
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; }
+
+  runpath_var=
+  allow_undefined_flag_F77=
+  enable_shared_with_static_runtimes_F77=no
+  archive_cmds_F77=
+  archive_expsym_cmds_F77=
+  old_archive_From_new_cmds_F77=
+  old_archive_from_expsyms_cmds_F77=
+  export_dynamic_flag_spec_F77=
+  whole_archive_flag_spec_F77=
+  thread_safe_flag_spec_F77=
+  hardcode_libdir_flag_spec_F77=
+  hardcode_libdir_flag_spec_ld_F77=
+  hardcode_libdir_separator_F77=
+  hardcode_direct_F77=no
+  hardcode_minus_L_F77=no
+  hardcode_shlibpath_var_F77=unsupported
+  link_all_deplibs_F77=unknown
+  hardcode_automatic_F77=no
+  module_cmds_F77=
+  module_expsym_cmds_F77=
+  always_export_symbols_F77=no
+  export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms_F77=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+  # Just being paranoid about ensuring that cc_basename is set.
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+  case $host_os in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs_F77=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec_F77='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+	whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+  	whole_archive_flag_spec_F77=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>/dev/null` in
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs_F77=no
+	cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_minus_L_F77=yes
+
+      # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we can't use
+      # them.
+      ld_shlibs_F77=no
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag_F77=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      allow_undefined_flag_F77=unsupported
+      always_export_symbols_F77=no
+      enable_shared_with_static_runtimes_F77=yes
+      export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct_F77=no
+      hardcode_shlibpath_var_F77=no
+      hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec_F77='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | k*bsd*-gnu)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	tmp_addflag=
+	case $cc_basename,$host_cpu in
+	pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec_F77='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	*)
+	  tmp_sharedflag='-shared' ;;
+	esac
+	archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+	if test $supports_anon_versioning = yes; then
+	  archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~
+  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+  $echo "local: *; };" >> $output_objdir/$libname.ver~
+	  $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	fi
+	link_all_deplibs_F77=no
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+	ld_shlibs_F77=no
+	cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs_F77=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+	    archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+	    archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+	  else
+	    ld_shlibs_F77=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs_F77" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec_F77=
+      export_dynamic_flag_spec_F77=
+      whole_archive_flag_spec_F77=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag_F77=unsupported
+      always_export_symbols_F77=yes
+      archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L_F77=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct_F77=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+	  export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+  	    aix_use_runtimelinking=yes
+  	    break
+  	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds_F77=''
+      hardcode_direct_F77=yes
+      hardcode_libdir_separator_F77=':'
+      link_all_deplibs_F77=yes
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" && \
+  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	  then
+  	  # We have reworked collect2
+  	  :
+	  else
+  	  # We have old collect2
+  	  hardcode_direct_F77=unsupported
+  	  # It fails to find uninstalled libraries when the uninstalled
+  	  # path is not listed in the libpath.  Setting hardcode_minus_L
+  	  # to unsupported forces relinking
+  	  hardcode_minus_L_F77=yes
+  	  hardcode_libdir_flag_spec_F77='-L$libdir'
+  	  hardcode_libdir_separator_F77=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+  	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols_F77=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag_F77='-berok'
+       # Determine the default libpath from the value encoded in an empty executable.
+       cat >conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_f77_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+       hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
+	archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+       else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag_F77="-z nodefs"
+	  archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an empty executable.
+	 cat >conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_f77_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+	 hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag_F77=' ${wl}-bernotok'
+	  allow_undefined_flag_F77=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  whole_archive_flag_spec_F77='$convenience'
+	  archive_cmds_need_lc_F77=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_minus_L_F77=yes
+      # see comment about different semantics on the GNU ld section
+      ld_shlibs_F77=no
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec_F77=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec_F77=' '
+      allow_undefined_flag_F77=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      old_archive_From_new_cmds_F77='true'
+      # FIXME: Should let the user specify the lib program.
+      old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      fix_srcfile_path_F77='`cygpath -w "$srcfile"`'
+      enable_shared_with_static_runtimes_F77=yes
+      ;;
+
+    darwin* | rhapsody*)
+      case $host_os in
+        rhapsody* | darwin1.[012])
+         allow_undefined_flag_F77='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[012])
+               allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+      esac
+      archive_cmds_need_lc_F77=no
+      hardcode_direct_F77=no
+      hardcode_automatic_F77=yes
+      hardcode_shlibpath_var_F77=unsupported
+      whole_archive_flag_spec_F77=''
+      link_all_deplibs_F77=yes
+    if test "$GCC" = yes ; then
+    	output_verbose_link_cmd='echo'
+        archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+        module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+        archive_expsym_cmds_F77="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+        module_expsym_cmds_F77="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    else
+      case $cc_basename in
+        xlc*)
+         output_verbose_link_cmd='echo'
+         archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
+         module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+         archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         ld_shlibs_F77=no
+          ;;
+      esac
+    fi
+      ;;
+
+    dgux*)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    freebsd1*)
+      ld_shlibs_F77=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_F77=yes
+      hardcode_minus_L_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator_F77=:
+      hardcode_direct_F77=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L_F77=yes
+      export_dynamic_flag_spec_F77='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_F77=:
+
+	hardcode_direct_F77=yes
+	export_dynamic_flag_spec_F77='${wl}-E'
+
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L_F77=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_F77=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_libdir_flag_spec_ld_F77='+b $libdir'
+	  hardcode_direct_F77=no
+	  hardcode_shlibpath_var_F77=no
+	  ;;
+	*)
+	  hardcode_direct_F77=yes
+	  export_dynamic_flag_spec_F77='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L_F77=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_ld_F77='-rpath $libdir'
+      fi
+      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_F77=:
+      link_all_deplibs_F77=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    newsos6)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_F77=yes
+      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_F77=:
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct_F77=yes
+	hardcode_shlibpath_var_F77=no
+	if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec_F77='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec_F77='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+        fi
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_minus_L_F77=yes
+      allow_undefined_flag_F77=unsupported
+      archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag_F77=' -expect_unresolved \*'
+	archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_F77=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag_F77=' -expect_unresolved \*'
+	archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec_F77='-rpath $libdir'
+      fi
+      hardcode_libdir_separator_F77=:
+      ;;
+
+    solaris*)
+      no_undefined_flag_F77=' -z text'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+      else
+	wlarc=''
+	archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+      fi
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_shlibpath_var_F77=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+ 	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec_F77='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs_F77=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_direct_F77=yes
+      hardcode_minus_L_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_F77=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds_F77='$CC -r -o $output$reload_objs'
+	  hardcode_direct_F77=no
+        ;;
+	motorola)
+	  archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var_F77=no
+      export_dynamic_flag_spec_F77='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var_F77=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs_F77=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_F77='${wl}-z,text'
+      archive_cmds_need_lc_F77=no
+      hardcode_shlibpath_var_F77=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag_F77='${wl}-z,text'
+      allow_undefined_flag_F77='${wl}-z,nodefs'
+      archive_cmds_need_lc_F77=no
+      hardcode_shlibpath_var_F77=no
+      hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+      hardcode_libdir_separator_F77=':'
+      link_all_deplibs_F77=yes
+      export_dynamic_flag_spec_F77='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    *)
+      ld_shlibs_F77=no
+      ;;
+    esac
+  fi
+
+{ echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5
+echo "${ECHO_T}$ld_shlibs_F77" >&6; }
+test "$ld_shlibs_F77" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_F77" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_F77=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_F77 in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; }
+      $rm conftest*
+      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl_F77
+	pic_flag=$lt_prog_compiler_pic_F77
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag_F77
+        allow_undefined_flag_F77=
+        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+        then
+	  archive_cmds_need_lc_F77=no
+        else
+	  archive_cmds_need_lc_F77=yes
+        fi
+        allow_undefined_flag_F77=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $rm conftest*
+      { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6; }
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; }
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+   hppa*64*)
+     shrext_cmds='.sl'
+     hardcode_into_libs=yes
+     dynamic_linker="$host_os dld.sl"
+     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+     soname_spec='${libname}${release}${shared_ext}$major'
+     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+     ;;
+   *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix[3-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ 	]*hwcap[ 	]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+nto-qnx*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+    shlibpath_overrides_runpath=no
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    shlibpath_overrides_runpath=yes
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"
+fi
+
+sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"
+fi
+
+sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; }
+hardcode_action_F77=
+if test -n "$hardcode_libdir_flag_spec_F77" || \
+   test -n "$runpath_var_F77" || \
+   test "X$hardcode_automatic_F77" = "Xyes" ; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct_F77" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no &&
+     test "$hardcode_minus_L_F77" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_F77=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_F77=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_F77=unsupported
+fi
+{ echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5
+echo "${ECHO_T}$hardcode_action_F77" >&6; }
+
+if test "$hardcode_action_F77" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    compiler_F77 \
+    CC_F77 \
+    LD_F77 \
+    lt_prog_compiler_wl_F77 \
+    lt_prog_compiler_pic_F77 \
+    lt_prog_compiler_static_F77 \
+    lt_prog_compiler_no_builtin_flag_F77 \
+    export_dynamic_flag_spec_F77 \
+    thread_safe_flag_spec_F77 \
+    whole_archive_flag_spec_F77 \
+    enable_shared_with_static_runtimes_F77 \
+    old_archive_cmds_F77 \
+    old_archive_from_new_cmds_F77 \
+    predep_objects_F77 \
+    postdep_objects_F77 \
+    predeps_F77 \
+    postdeps_F77 \
+    compiler_lib_search_path_F77 \
+    compiler_lib_search_dirs_F77 \
+    archive_cmds_F77 \
+    archive_expsym_cmds_F77 \
+    postinstall_cmds_F77 \
+    postuninstall_cmds_F77 \
+    old_archive_from_expsyms_cmds_F77 \
+    allow_undefined_flag_F77 \
+    no_undefined_flag_F77 \
+    export_symbols_cmds_F77 \
+    hardcode_libdir_flag_spec_F77 \
+    hardcode_libdir_flag_spec_ld_F77 \
+    hardcode_libdir_separator_F77 \
+    hardcode_automatic_F77 \
+    module_cmds_F77 \
+    module_expsym_cmds_F77 \
+    lt_cv_prog_compiler_c_o_F77 \
+    fix_srcfile_path_F77 \
+    exclude_expsyms_F77 \
+    include_expsyms_F77; do
+
+    case $var in
+    old_archive_cmds_F77 | \
+    old_archive_from_new_cmds_F77 | \
+    archive_cmds_F77 | \
+    archive_expsym_cmds_F77 | \
+    module_cmds_F77 | \
+    module_expsym_cmds_F77 | \
+    old_archive_from_expsyms_cmds_F77 | \
+    export_symbols_cmds_F77 | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\$0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+cfgfile="$ofile"
+
+  cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_F77
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_F77
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_F77
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_F77
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_F77
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_F77
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_F77
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_F77
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_F77
+archive_expsym_cmds=$lt_archive_expsym_cmds_F77
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_F77
+module_expsym_cmds=$lt_module_expsym_cmds_F77
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_F77
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_F77
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_F77
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_F77
+
+# The directories searched by this compiler when creating a shared
+# library
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_F77
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_F77
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_F77
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_F77
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_F77
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_F77
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_F77
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_F77
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_F77
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_F77
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_F77
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_F77
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_F77
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+	else
+	  tagname=""
+	fi
+	;;
+
+      GCJ)
+	if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+objext_GCJ=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm -r conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${GCJ-"gcj"}
+compiler=$CC
+compiler_GCJ=$CC
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+archive_cmds_need_lc_GCJ=no
+
+old_archive_cmds_GCJ=$old_archive_cmds
+
+
+lt_prog_compiler_no_builtin_flag_GCJ=
+
+if test "$GCC" = yes; then
+  lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin'
+
+
+{ echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+  ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:16694: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:16698: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+lt_prog_compiler_wl_GCJ=
+lt_prog_compiler_pic_GCJ=
+lt_prog_compiler_static_GCJ=
+
+{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; }
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl_GCJ='-Wl,'
+    lt_prog_compiler_static_GCJ='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_GCJ='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      # FIXME: we need at least 68020 code to build shared libraries, but
+      # adding the `-m68020' flag to GCC prevents building anything better,
+      # like `-m68040'.
+      lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4'
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_GCJ='-fno-common'
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared_GCJ=no
+      enable_shared=no
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_GCJ=-Kconform_pic
+      fi
+      ;;
+
+    hpux*)
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_GCJ='-fPIC'
+	;;
+      esac
+      ;;
+
+    *)
+      lt_prog_compiler_pic_GCJ='-fPIC'
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_GCJ='-Bstatic'
+      else
+	lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+      darwin*)
+        # PIC is the default on this platform
+        # Common symbols not allowed in MH_DYLIB files
+       case $cc_basename in
+         xlc*)
+         lt_prog_compiler_pic_GCJ='-qnocommon'
+         lt_prog_compiler_wl_GCJ='-Wl,'
+         ;;
+       esac
+       ;;
+
+    mingw* | cygwin* | pw32* | os2*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_GCJ='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static_GCJ='-non_shared'
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic_GCJ='-KPIC'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      ;;
+
+    linux* | k*bsd*-gnu)
+      case $cc_basename in
+      icc* | ecc*)
+	lt_prog_compiler_wl_GCJ='-Wl,'
+	lt_prog_compiler_pic_GCJ='-KPIC'
+	lt_prog_compiler_static_GCJ='-static'
+        ;;
+      pgcc* | pgf77* | pgf90* | pgf95*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl_GCJ='-Wl,'
+	lt_prog_compiler_pic_GCJ='-fpic'
+	lt_prog_compiler_static_GCJ='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl_GCJ='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static_GCJ='-non_shared'
+        ;;
+      *)
+        case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic_GCJ='-KPIC'
+	  lt_prog_compiler_static_GCJ='-Bstatic'
+	  lt_prog_compiler_wl_GCJ='-Wl,'
+	  ;;
+	*Sun\ F*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic_GCJ='-KPIC'
+	  lt_prog_compiler_static_GCJ='-Bstatic'
+	  lt_prog_compiler_wl_GCJ=''
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static_GCJ='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static_GCJ='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic_GCJ='-KPIC'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95*)
+	lt_prog_compiler_wl_GCJ='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl_GCJ='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl_GCJ='-Qoption ld '
+      lt_prog_compiler_pic_GCJ='-PIC'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      lt_prog_compiler_pic_GCJ='-KPIC'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic_GCJ='-Kconform_pic'
+	lt_prog_compiler_static_GCJ='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      lt_prog_compiler_pic_GCJ='-KPIC'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl_GCJ='-Wl,'
+      lt_prog_compiler_can_build_shared_GCJ=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic_GCJ='-pic'
+      lt_prog_compiler_static_GCJ='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared_GCJ=no
+      ;;
+    esac
+  fi
+
+{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6; }
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_GCJ"; then
+
+{ echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_pic_works_GCJ+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_pic_works_GCJ=no
+  ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_GCJ"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:16984: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:16988: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_GCJ=yes
+     fi
+   fi
+   $rm conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_GCJ" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_pic_works_GCJ" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works_GCJ" = xyes; then
+    case $lt_prog_compiler_pic_GCJ in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;;
+     esac
+else
+    lt_prog_compiler_pic_GCJ=
+     lt_prog_compiler_can_build_shared_GCJ=no
+fi
+
+fi
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_GCJ=
+    ;;
+  *)
+    lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ"
+    ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\"
+{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_static_works_GCJ+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_static_works_GCJ=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_GCJ=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_GCJ=yes
+     fi
+   fi
+   $rm -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_GCJ" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_static_works_GCJ" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works_GCJ" = xyes; then
+    :
+else
+    lt_prog_compiler_static_GCJ=
+fi
+
+
+{ echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
+if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_prog_compiler_c_o_GCJ=no
+   $rm -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:17088: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:17092: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_GCJ=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $rm conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+   $rm out/* && rmdir out
+   cd ..
+   rmdir conftest
+   $rm conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6; }
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; }
+  hard_links=yes
+  $rm conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+{ echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; }
+
+  runpath_var=
+  allow_undefined_flag_GCJ=
+  enable_shared_with_static_runtimes_GCJ=no
+  archive_cmds_GCJ=
+  archive_expsym_cmds_GCJ=
+  old_archive_From_new_cmds_GCJ=
+  old_archive_from_expsyms_cmds_GCJ=
+  export_dynamic_flag_spec_GCJ=
+  whole_archive_flag_spec_GCJ=
+  thread_safe_flag_spec_GCJ=
+  hardcode_libdir_flag_spec_GCJ=
+  hardcode_libdir_flag_spec_ld_GCJ=
+  hardcode_libdir_separator_GCJ=
+  hardcode_direct_GCJ=no
+  hardcode_minus_L_GCJ=no
+  hardcode_shlibpath_var_GCJ=unsupported
+  link_all_deplibs_GCJ=unknown
+  hardcode_automatic_GCJ=no
+  module_cmds_GCJ=
+  module_expsym_cmds_GCJ=
+  always_export_symbols_GCJ=no
+  export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms_GCJ=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms_GCJ='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+  # Just being paranoid about ensuring that cc_basename is set.
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+  case $host_os in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs_GCJ=yes
+  if test "$with_gnu_ld" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir'
+    export_dynamic_flag_spec_GCJ='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+	whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      else
+  	whole_archive_flag_spec_GCJ=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>/dev/null` in
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs_GCJ=no
+	cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_minus_L_GCJ=yes
+
+      # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we can't use
+      # them.
+      ld_shlibs_GCJ=no
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag_GCJ=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs_GCJ=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      allow_undefined_flag_GCJ=unsupported
+      always_export_symbols_GCJ=no
+      enable_shared_with_static_runtimes_GCJ=yes
+      export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs_GCJ=no
+      fi
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct_GCJ=no
+      hardcode_shlibpath_var_GCJ=no
+      hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec_GCJ='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | k*bsd*-gnu)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	tmp_addflag=
+	case $cc_basename,$host_cpu in
+	pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec_GCJ='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	*)
+	  tmp_sharedflag='-shared' ;;
+	esac
+	archive_cmds_GCJ='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+	if test $supports_anon_versioning = yes; then
+	  archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~
+  cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+  $echo "local: *; };" >> $output_objdir/$libname.ver~
+	  $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	fi
+	link_all_deplibs_GCJ=no
+      else
+	ld_shlibs_GCJ=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+	ld_shlibs_GCJ=no
+	cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_GCJ=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs_GCJ=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+	    archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+	    archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+	  else
+	    ld_shlibs_GCJ=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_GCJ=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs_GCJ" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec_GCJ=
+      export_dynamic_flag_spec_GCJ=
+      whole_archive_flag_spec_GCJ=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag_GCJ=unsupported
+      always_export_symbols_GCJ=yes
+      archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L_GCJ=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct_GCJ=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+	  export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+  	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+  	    aix_use_runtimelinking=yes
+  	    break
+  	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds_GCJ=''
+      hardcode_direct_GCJ=yes
+      hardcode_libdir_separator_GCJ=':'
+      link_all_deplibs_GCJ=yes
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" && \
+  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
+	  then
+  	  # We have reworked collect2
+  	  :
+	  else
+  	  # We have old collect2
+  	  hardcode_direct_GCJ=unsupported
+  	  # It fails to find uninstalled libraries when the uninstalled
+  	  # path is not listed in the libpath.  Setting hardcode_minus_L
+  	  # to unsupported forces relinking
+  	  hardcode_minus_L_GCJ=yes
+  	  hardcode_libdir_flag_spec_GCJ='-L$libdir'
+  	  hardcode_libdir_separator_GCJ=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+  	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+  	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols_GCJ=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag_GCJ='-berok'
+       # Determine the default libpath from the value encoded in an empty executable.
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+       hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
+	archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+       else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag_GCJ="-z nodefs"
+	  archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an empty executable.
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+
+lt_aix_libpath_sed='
+    /Import File Strings/,/^$/ {
+	/^0/ {
+	    s/^0  *\(.*\)$/\1/
+	    p
+	}
+    }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+	 hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag_GCJ=' ${wl}-bernotok'
+	  allow_undefined_flag_GCJ=' ${wl}-berok'
+	  # Exported symbols can be pulled into shared objects from archives
+	  whole_archive_flag_spec_GCJ='$convenience'
+	  archive_cmds_need_lc_GCJ=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_minus_L_GCJ=yes
+      # see comment about different semantics on the GNU ld section
+      ld_shlibs_GCJ=no
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec_GCJ=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec_GCJ=' '
+      allow_undefined_flag_GCJ=unsupported
+      # Tell ltmain to make .lib files, not .a files.
+      libext=lib
+      # Tell ltmain to make .dll files, not .so files.
+      shrext_cmds=".dll"
+      # FIXME: Setting linknames here is a bad hack.
+      archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+      # The linker will automatically build a .lib file if we build a DLL.
+      old_archive_From_new_cmds_GCJ='true'
+      # FIXME: Should let the user specify the lib program.
+      old_archive_cmds_GCJ='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`'
+      enable_shared_with_static_runtimes_GCJ=yes
+      ;;
+
+    darwin* | rhapsody*)
+      case $host_os in
+        rhapsody* | darwin1.[012])
+         allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress'
+         ;;
+       *) # Darwin 1.3 on
+         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+           allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+         else
+           case ${MACOSX_DEPLOYMENT_TARGET} in
+             10.[012])
+               allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+               ;;
+             10.*)
+               allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup'
+               ;;
+           esac
+         fi
+         ;;
+      esac
+      archive_cmds_need_lc_GCJ=no
+      hardcode_direct_GCJ=no
+      hardcode_automatic_GCJ=yes
+      hardcode_shlibpath_var_GCJ=unsupported
+      whole_archive_flag_spec_GCJ=''
+      link_all_deplibs_GCJ=yes
+    if test "$GCC" = yes ; then
+    	output_verbose_link_cmd='echo'
+        archive_cmds_GCJ="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+        module_cmds_GCJ="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+        archive_expsym_cmds_GCJ="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+        module_expsym_cmds_GCJ="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    else
+      case $cc_basename in
+        xlc*)
+         output_verbose_link_cmd='echo'
+         archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
+         module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+          # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+         archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+          ;;
+       *)
+         ld_shlibs_GCJ=no
+          ;;
+      esac
+    fi
+      ;;
+
+    dgux*)
+      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    freebsd1*)
+      ld_shlibs_GCJ=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec_GCJ='-R$libdir'
+      hardcode_direct_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2*)
+      archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_GCJ=yes
+      hardcode_minus_L_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec_GCJ='-R$libdir'
+      hardcode_direct_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator_GCJ=:
+      hardcode_direct_GCJ=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L_GCJ=yes
+      export_dynamic_flag_spec_GCJ='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_GCJ=:
+
+	hardcode_direct_GCJ=yes
+	export_dynamic_flag_spec_GCJ='${wl}-E'
+
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L_GCJ=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_GCJ=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_libdir_flag_spec_ld_GCJ='+b $libdir'
+	  hardcode_direct_GCJ=no
+	  hardcode_shlibpath_var_GCJ=no
+	  ;;
+	*)
+	  hardcode_direct_GCJ=yes
+	  export_dynamic_flag_spec_GCJ='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L_GCJ=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir'
+      fi
+      hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_GCJ=:
+      link_all_deplibs_GCJ=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+	archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec_GCJ='-R$libdir'
+      hardcode_direct_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    newsos6)
+      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_GCJ=yes
+      hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_GCJ=:
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct_GCJ=yes
+	hardcode_shlibpath_var_GCJ=no
+	if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec_GCJ='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec_GCJ='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+        fi
+      else
+	ld_shlibs_GCJ=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_minus_L_GCJ=yes
+      allow_undefined_flag_GCJ=unsupported
+      archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag_GCJ=' -expect_unresolved \*'
+	archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_GCJ=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag_GCJ=' -expect_unresolved \*'
+	archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+	$LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec_GCJ='-rpath $libdir'
+      fi
+      hardcode_libdir_separator_GCJ=:
+      ;;
+
+    solaris*)
+      no_undefined_flag_GCJ=' -z text'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+	  $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+      else
+	wlarc=''
+	archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+  	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+      fi
+      hardcode_libdir_flag_spec_GCJ='-R$libdir'
+      hardcode_shlibpath_var_GCJ=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+ 	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs_GCJ=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_direct_GCJ=yes
+      hardcode_minus_L_GCJ=yes
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_GCJ=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds_GCJ='$CC -r -o $output$reload_objs'
+	  hardcode_direct_GCJ=no
+        ;;
+	motorola)
+	  archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var_GCJ=no
+      export_dynamic_flag_spec_GCJ='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var_GCJ=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs_GCJ=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_GCJ='${wl}-z,text'
+      archive_cmds_need_lc_GCJ=no
+      hardcode_shlibpath_var_GCJ=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag_GCJ='${wl}-z,text'
+      allow_undefined_flag_GCJ='${wl}-z,nodefs'
+      archive_cmds_need_lc_GCJ=no
+      hardcode_shlibpath_var_GCJ=no
+      hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+      hardcode_libdir_separator_GCJ=':'
+      link_all_deplibs_GCJ=yes
+      export_dynamic_flag_spec_GCJ='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_GCJ='-L$libdir'
+      hardcode_shlibpath_var_GCJ=no
+      ;;
+
+    *)
+      ld_shlibs_GCJ=no
+      ;;
+    esac
+  fi
+
+{ echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5
+echo "${ECHO_T}$ld_shlibs_GCJ" >&6; }
+test "$ld_shlibs_GCJ" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_GCJ" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_GCJ=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_GCJ in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; }
+      $rm conftest*
+      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+      if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } 2>conftest.err; then
+        soname=conftest
+        lib=conftest
+        libobjs=conftest.$ac_objext
+        deplibs=
+        wl=$lt_prog_compiler_wl_GCJ
+	pic_flag=$lt_prog_compiler_pic_GCJ
+        compiler_flags=-v
+        linker_flags=-v
+        verstring=
+        output_objdir=.
+        libname=conftest
+        lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ
+        allow_undefined_flag_GCJ=
+        if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+  (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+        then
+	  archive_cmds_need_lc_GCJ=no
+        else
+	  archive_cmds_need_lc_GCJ=yes
+        fi
+        allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag
+      else
+        cat conftest.err 1>&5
+      fi
+      $rm conftest*
+      { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6; }
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+{ echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; }
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  library_names_spec='$libname.ixlibrary $libname.a'
+  # Create ${libname}_ixlibrary.a entries in /sys/libs.
+  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$host_os in
+  yes,cygwin* | yes,mingw* | yes,pw32*)
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $rm \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+      ;;
+    mingw*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+      if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH printed by
+        # mingw gcc, but we are running on Cygwin. Gcc prints its search
+        # path with ; separators, and with drive letters. We can handle the
+        # drive letters (cygwin fileutils understands them), so leave them,
+        # especially as we might pass files found there to a mingw objdump,
+        # which wouldn't understand a cygwinified path. Ahh.
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    ;;
+
+  *)
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    ;;
+  esac
+  dynamic_linker='Win32 ld.exe'
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd1*)
+  dynamic_linker=no
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[123]*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+   hppa*64*)
+     shrext_cmds='.sl'
+     hardcode_into_libs=yes
+     dynamic_linker="$host_os dld.sl"
+     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+     library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+     soname_spec='${libname}${release}${shared_ext}$major'
+     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+     ;;
+   *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555.
+  postinstall_cmds='chmod 555 $lib'
+  ;;
+
+interix[3-9]*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ 	]*hwcap[ 	]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+nto-qnx*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+    *)                         need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+    shlibpath_overrides_runpath=no
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    shlibpath_overrides_runpath=yes
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+uts4*)
+  version_type=linux
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"
+fi
+
+sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"
+fi
+
+sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+{ echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; }
+hardcode_action_GCJ=
+if test -n "$hardcode_libdir_flag_spec_GCJ" || \
+   test -n "$runpath_var_GCJ" || \
+   test "X$hardcode_automatic_GCJ" = "Xyes" ; then
+
+  # We can hardcode non-existant directories.
+  if test "$hardcode_direct_GCJ" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no &&
+     test "$hardcode_minus_L_GCJ" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_GCJ=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_GCJ=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_GCJ=unsupported
+fi
+{ echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5
+echo "${ECHO_T}$hardcode_action_GCJ" >&6; }
+
+if test "$hardcode_action_GCJ" = relink; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    compiler_GCJ \
+    CC_GCJ \
+    LD_GCJ \
+    lt_prog_compiler_wl_GCJ \
+    lt_prog_compiler_pic_GCJ \
+    lt_prog_compiler_static_GCJ \
+    lt_prog_compiler_no_builtin_flag_GCJ \
+    export_dynamic_flag_spec_GCJ \
+    thread_safe_flag_spec_GCJ \
+    whole_archive_flag_spec_GCJ \
+    enable_shared_with_static_runtimes_GCJ \
+    old_archive_cmds_GCJ \
+    old_archive_from_new_cmds_GCJ \
+    predep_objects_GCJ \
+    postdep_objects_GCJ \
+    predeps_GCJ \
+    postdeps_GCJ \
+    compiler_lib_search_path_GCJ \
+    compiler_lib_search_dirs_GCJ \
+    archive_cmds_GCJ \
+    archive_expsym_cmds_GCJ \
+    postinstall_cmds_GCJ \
+    postuninstall_cmds_GCJ \
+    old_archive_from_expsyms_cmds_GCJ \
+    allow_undefined_flag_GCJ \
+    no_undefined_flag_GCJ \
+    export_symbols_cmds_GCJ \
+    hardcode_libdir_flag_spec_GCJ \
+    hardcode_libdir_flag_spec_ld_GCJ \
+    hardcode_libdir_separator_GCJ \
+    hardcode_automatic_GCJ \
+    module_cmds_GCJ \
+    module_expsym_cmds_GCJ \
+    lt_cv_prog_compiler_c_o_GCJ \
+    fix_srcfile_path_GCJ \
+    exclude_expsyms_GCJ \
+    include_expsyms_GCJ; do
+
+    case $var in
+    old_archive_cmds_GCJ | \
+    old_archive_from_new_cmds_GCJ | \
+    archive_cmds_GCJ | \
+    archive_expsym_cmds_GCJ | \
+    module_cmds_GCJ | \
+    module_expsym_cmds_GCJ | \
+    old_archive_from_expsyms_cmds_GCJ | \
+    export_symbols_cmds_GCJ | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\$0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+cfgfile="$ofile"
+
+  cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_GCJ
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_GCJ
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_GCJ
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_GCJ
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_GCJ
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_GCJ
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_GCJ
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_GCJ
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_GCJ
+archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_GCJ
+module_expsym_cmds=$lt_module_expsym_cmds_GCJ
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_GCJ
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_GCJ
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_GCJ
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_GCJ
+
+# The directories searched by this compiler when creating a shared
+# library
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_GCJ
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_GCJ
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_GCJ
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_GCJ
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_GCJ
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_GCJ
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_GCJ
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_GCJ
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_GCJ
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_GCJ
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_GCJ
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_GCJ
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+	else
+	  tagname=""
+	fi
+	;;
+
+      RC)
+
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+objext_RC=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm -r conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+compiler_RC=$CC
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+lt_cv_prog_compiler_c_o_RC=yes
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+  # See if we are running on zsh, and set the options which allow our commands through
+  # without removal of \ escapes.
+  if test -n "${ZSH_VERSION+set}" ; then
+    setopt NO_GLOB_SUBST
+  fi
+  # Now quote all the things that may contain metacharacters while being
+  # careful not to overquote the AC_SUBSTed values.  We take copies of the
+  # variables and quote the copies for generation of the libtool script.
+  for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+    SED SHELL STRIP \
+    libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+    old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+    deplibs_check_method reload_flag reload_cmds need_locks \
+    lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+    lt_cv_sys_global_symbol_to_c_name_address \
+    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+    old_postinstall_cmds old_postuninstall_cmds \
+    compiler_RC \
+    CC_RC \
+    LD_RC \
+    lt_prog_compiler_wl_RC \
+    lt_prog_compiler_pic_RC \
+    lt_prog_compiler_static_RC \
+    lt_prog_compiler_no_builtin_flag_RC \
+    export_dynamic_flag_spec_RC \
+    thread_safe_flag_spec_RC \
+    whole_archive_flag_spec_RC \
+    enable_shared_with_static_runtimes_RC \
+    old_archive_cmds_RC \
+    old_archive_from_new_cmds_RC \
+    predep_objects_RC \
+    postdep_objects_RC \
+    predeps_RC \
+    postdeps_RC \
+    compiler_lib_search_path_RC \
+    compiler_lib_search_dirs_RC \
+    archive_cmds_RC \
+    archive_expsym_cmds_RC \
+    postinstall_cmds_RC \
+    postuninstall_cmds_RC \
+    old_archive_from_expsyms_cmds_RC \
+    allow_undefined_flag_RC \
+    no_undefined_flag_RC \
+    export_symbols_cmds_RC \
+    hardcode_libdir_flag_spec_RC \
+    hardcode_libdir_flag_spec_ld_RC \
+    hardcode_libdir_separator_RC \
+    hardcode_automatic_RC \
+    module_cmds_RC \
+    module_expsym_cmds_RC \
+    lt_cv_prog_compiler_c_o_RC \
+    fix_srcfile_path_RC \
+    exclude_expsyms_RC \
+    include_expsyms_RC; do
+
+    case $var in
+    old_archive_cmds_RC | \
+    old_archive_from_new_cmds_RC | \
+    archive_cmds_RC | \
+    archive_expsym_cmds_RC | \
+    module_cmds_RC | \
+    module_expsym_cmds_RC | \
+    old_archive_from_expsyms_cmds_RC | \
+    export_symbols_cmds_RC | \
+    extract_expsyms_cmds | reload_cmds | finish_cmds | \
+    postinstall_cmds | postuninstall_cmds | \
+    old_postinstall_cmds | old_postuninstall_cmds | \
+    sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+      # Double-quote double-evaled strings.
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+      ;;
+    *)
+      eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+      ;;
+    esac
+  done
+
+  case $lt_echo in
+  *'\$0 --fallback-echo"')
+    lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+    ;;
+  esac
+
+cfgfile="$ofile"
+
+  cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_RC
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_RC
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_RC
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_RC
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_RC
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_RC
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_RC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_RC
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_RC
+archive_expsym_cmds=$lt_archive_expsym_cmds_RC
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_RC
+module_expsym_cmds=$lt_module_expsym_cmds_RC
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_RC
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_RC
+
+# The directories searched by this compiler when creating a shared
+# library
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_RC
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_RC
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_RC
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_RC
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_RC
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_RC
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_RC
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_RC
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_RC
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_RC
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_RC
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_RC
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_RC
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_RC
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+  # If there is no Makefile yet, we rely on a make rule to execute
+  # `config.status --recheck' to rerun these tests and create the
+  # libtool script then.
+  ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+  if test -f "$ltmain_in"; then
+    test -f Makefile && make "$ltmain"
+  fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+	;;
+
+      *)
+	{ { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5
+echo "$as_me: error: Unsupported tag name: $tagname" >&2;}
+   { (exit 1); exit 1; }; }
+	;;
+      esac
+
+      # Append the new tag name to the list of available tags.
+      if test -n "$tagname" ; then
+      available_tags="$available_tags $tagname"
+    fi
+    fi
+  done
+  IFS="$lt_save_ifs"
+
+  # Now substitute the updated list of available tags.
+  if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+    mv "${ofile}T" "$ofile"
+    chmod +x "$ofile"
+  else
+    rm -f "${ofile}T"
+    { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5
+echo "$as_me: error: unable to update list of available tagged configurations." >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+fi
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Prevent multiple expansion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+done
+IFS=$as_save_IFS
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+package=cmm
+
+LIBNFCONNTRACK_REQUIRED=0.0.16
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
+echo "${ECHO_T}$PKG_CONFIG" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5
+echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=0.9.0
+	{ echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5
+echo $ECHO_N "checking pkg-config is at least version $_pkg_min_version... $ECHO_C" >&6; }
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	else
+		{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+		PKG_CONFIG=""
+	fi
+
+fi
+
+pkg_failed=no
+{ echo "$as_me:$LINENO: checking for LIBNFCONNTRACK" >&5
+echo $ECHO_N "checking for LIBNFCONNTRACK... $ECHO_C" >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LIBNFCONNTRACK_CFLAGS"; then
+        pkg_cv_LIBNFCONNTRACK_CFLAGS="$LIBNFCONNTRACK_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libnetfilter_conntrack >= \$LIBNFCONNTRACK_REQUIRED\"") >&5
+  ($PKG_CONFIG --exists --print-errors "libnetfilter_conntrack >= $LIBNFCONNTRACK_REQUIRED") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LIBNFCONNTRACK_CFLAGS=`$PKG_CONFIG --cflags "libnetfilter_conntrack >= $LIBNFCONNTRACK_REQUIRED" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LIBNFCONNTRACK_LIBS"; then
+        pkg_cv_LIBNFCONNTRACK_LIBS="$LIBNFCONNTRACK_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libnetfilter_conntrack >= \$LIBNFCONNTRACK_REQUIRED\"") >&5
+  ($PKG_CONFIG --exists --print-errors "libnetfilter_conntrack >= $LIBNFCONNTRACK_REQUIRED") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LIBNFCONNTRACK_LIBS=`$PKG_CONFIG --libs "libnetfilter_conntrack >= $LIBNFCONNTRACK_REQUIRED" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LIBNFCONNTRACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libnetfilter_conntrack >= $LIBNFCONNTRACK_REQUIRED"`
+        else
+	        LIBNFCONNTRACK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libnetfilter_conntrack >= $LIBNFCONNTRACK_REQUIRED"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LIBNFCONNTRACK_PKG_ERRORS" >&5
+
+	{ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+                { { echo "$as_me:$LINENO: error: Cannot find libnetfilter_conntrack >= $LIBNFNCONNTRACK_REQUIRED" >&5
+echo "$as_me: error: Cannot find libnetfilter_conntrack >= $LIBNFNCONNTRACK_REQUIRED" >&2;}
+   { (exit 1); exit 1; }; }
+elif test $pkg_failed = untried; then
+	{ { echo "$as_me:$LINENO: error: Cannot find libnetfilter_conntrack >= $LIBNFNCONNTRACK_REQUIRED" >&5
+echo "$as_me: error: Cannot find libnetfilter_conntrack >= $LIBNFNCONNTRACK_REQUIRED" >&2;}
+   { (exit 1); exit 1; }; }
+else
+	LIBNFCONNTRACK_CFLAGS=$pkg_cv_LIBNFCONNTRACK_CFLAGS
+	LIBNFCONNTRACK_LIBS=$pkg_cv_LIBNFCONNTRACK_LIBS
+        { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+	:
+fi
+
+CFLAGS="$CFLAGS $LIBNFCONNTRACK_CFLAGS"
+CMM_LIBS="$LIBNFCONNTRACK_LIBS"
+
+
+ac_config_files="$ac_config_files Makefile src/Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+t clear
+:clear
+s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*([^)]*)\)[	 ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[	 `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+	g
+	s/^\n//
+	s/\n/ /g
+	p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+		   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2006 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --he | --h |  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+am__isrc!$am__isrc$ac_delim
+CYGPATH_W!$CYGPATH_W$ac_delim
+PACKAGE!$PACKAGE$ac_delim
+VERSION!$VERSION$ac_delim
+ACLOCAL!$ACLOCAL$ac_delim
+AUTOCONF!$AUTOCONF$ac_delim
+AUTOMAKE!$AUTOMAKE$ac_delim
+AUTOHEADER!$AUTOHEADER$ac_delim
+MAKEINFO!$MAKEINFO$ac_delim
+install_sh!$install_sh$ac_delim
+STRIP!$STRIP$ac_delim
+INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim
+mkdir_p!$mkdir_p$ac_delim
+AWK!$AWK$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+am__leading_dot!$am__leading_dot$ac_delim
+AMTAR!$AMTAR$ac_delim
+am__tar!$am__tar$ac_delim
+am__untar!$am__untar$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+DEPDIR!$DEPDIR$ac_delim
+am__include!$am__include$ac_delim
+am__quote!$am__quote$ac_delim
+AMDEP_TRUE!$AMDEP_TRUE$ac_delim
+AMDEP_FALSE!$AMDEP_FALSE$ac_delim
+AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim
+CCDEPMODE!$CCDEPMODE$ac_delim
+am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim
+am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim
+build!$build$ac_delim
+build_cpu!$build_cpu$ac_delim
+build_vendor!$build_vendor$ac_delim
+build_os!$build_os$ac_delim
+host!$host$ac_delim
+host_cpu!$host_cpu$ac_delim
+host_vendor!$host_vendor$ac_delim
+host_os!$host_os$ac_delim
+SED!$SED$ac_delim
+GREP!$GREP$ac_delim
+EGREP!$EGREP$ac_delim
+LN_S!$LN_S$ac_delim
+ECHO!$ECHO$ac_delim
+AR!$AR$ac_delim
+RANLIB!$RANLIB$ac_delim
+DSYMUTIL!$DSYMUTIL$ac_delim
+NMEDIT!$NMEDIT$ac_delim
+CPP!$CPP$ac_delim
+CXX!$CXX$ac_delim
+CXXFLAGS!$CXXFLAGS$ac_delim
+ac_ct_CXX!$ac_ct_CXX$ac_delim
+CXXDEPMODE!$CXXDEPMODE$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+CEOF$ac_eof
+_ACEOF
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+am__fastdepCXX_TRUE!$am__fastdepCXX_TRUE$ac_delim
+am__fastdepCXX_FALSE!$am__fastdepCXX_FALSE$ac_delim
+CXXCPP!$CXXCPP$ac_delim
+F77!$F77$ac_delim
+FFLAGS!$FFLAGS$ac_delim
+ac_ct_F77!$ac_ct_F77$ac_delim
+LIBTOOL!$LIBTOOL$ac_delim
+PKG_CONFIG!$PKG_CONFIG$ac_delim
+LIBNFCONNTRACK_CFLAGS!$LIBNFCONNTRACK_CFLAGS$ac_delim
+LIBNFCONNTRACK_LIBS!$LIBNFCONNTRACK_LIBS$ac_delim
+CMM_LIBS!$CMM_LIBS$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 13; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[	 ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
+
+
+for ac_tag in  :F $CONFIG_FILES      :C $CONFIG_COMMANDS
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+	  echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+  esac
+ ;;
+
+
+  :C)  { echo "$as_me:$LINENO: executing $ac_file commands" >&5
+echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # Grep'ing the whole file is not good either: AIX grep has a line
+  # limit of 2048, but all sed's we know have understand at least 4000.
+  if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+    dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    { as_dir=$dirpart/$fdir
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+ ;;
+
+  esac
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/cmm/configure.in b/cmm/configure.in
new file mode 100644
index 0000000..c371224
--- /dev/null
+++ b/cmm/configure.in
@@ -0,0 +1,19 @@
+AC_INIT
+AM_INIT_AUTOMAKE(apps, 1.00.0)
+
+AC_PROG_MAKE_SET
+AC_PROG_CC
+AC_PROG_LIBTOOL
+AC_PROG_INSTALL
+
+package=cmm
+
+LIBNFCONNTRACK_REQUIRED=0.0.16
+PKG_CHECK_MODULES(LIBNFCONNTRACK, libnetfilter_conntrack >= $LIBNFCONNTRACK_REQUIRED,,
+	AC_MSG_ERROR(Cannot find libnetfilter_conntrack >= $LIBNFNCONNTRACK_REQUIRED))
+
+CFLAGS="$CFLAGS $LIBNFCONNTRACK_CFLAGS"
+CMM_LIBS="$LIBNFCONNTRACK_LIBS"
+AC_SUBST(CMM_LIBS)
+
+AC_OUTPUT(Makefile src/Makefile)
diff --git a/cmm/depcomp b/cmm/depcomp
new file mode 100644
index 0000000..edb5d38
--- /dev/null
+++ b/cmm/depcomp
@@ -0,0 +1,479 @@
+#! /bin/sh
+
+# depcomp - compile a program generating dependencies as side-effects
+# Copyright 1999, 2000, 2003 Free Software Foundation, Inc.
+
+# 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, 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.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+# `libtool' can also be set to `yes' or `no'.
+
+if test -z "$depfile"; then
+   base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'`
+   dir=`echo "$object" | sed 's,/.*$,/,'`
+   if test "$dir" = "$object"; then
+      dir=
+   fi
+   # FIXME: should be _deps on DOS.
+   depfile="$dir.deps/$base"
+fi
+
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+  "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> $depfile
+    echo >> $depfile
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> $depfile
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
+  tmpdepfile="$stripped.u"
+  if test "$libtool" = yes; then
+    "$@" -Wc,-M
+  else
+    "$@" -M
+  fi
+  stat=$?
+
+  if test -f "$tmpdepfile"; then :
+  else
+    stripped=`echo "$stripped" | sed 's,^.*/,,'`
+    tmpdepfile="$stripped.u"
+  fi
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+
+  if test -f "$tmpdepfile"; then
+    outname="$stripped.o"
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+tru64)
+   # The Tru64 compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      tmpdepfile1="$dir.libs/$base.lo.d"
+      tmpdepfile2="$dir.libs/$base.d"
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1="$dir$base.o.d"
+      tmpdepfile2="$dir$base.d"
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2"
+      exit $stat
+   fi
+
+   if test -f "$tmpdepfile1"; then
+      tmpdepfile="$tmpdepfile1"
+   else
+      tmpdepfile="$tmpdepfile2"
+   fi
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no
+  for arg in "$@"; do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix="`echo $object | sed 's/^.*\././'`"
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o,
+  # because we must use -o when running libtool.
+  "$@" || exit $?
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+	set fnord "$@"
+	shift
+	shift
+	;;
+    *)
+	set fnord "$@" "$arg"
+	shift
+	shift
+	;;
+    esac
+  done
+  "$@" -E |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
+  echo "	" >> "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
diff --git a/cmm/doc/cmm_developers_guide.odt b/cmm/doc/cmm_developers_guide.odt
new file mode 100644
index 0000000..a64475f
--- /dev/null
+++ b/cmm/doc/cmm_developers_guide.odt
Binary files differ
diff --git a/cmm/install-sh b/cmm/install-sh
new file mode 100644
index 0000000..6ce63b9
--- /dev/null
+++ b/cmm/install-sh
@@ -0,0 +1,294 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+#
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+	-c) instcmd=$cpprog
+	    shift
+	    continue;;
+
+	-d) dir_arg=true
+	    shift
+	    continue;;
+
+	-m) chmodcmd="$chmodprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-o) chowncmd="$chownprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-g) chgrpcmd="$chgrpprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-s) stripcmd=$stripprog
+	    shift
+	    continue;;
+
+	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
+	    shift
+	    continue;;
+
+	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+	    shift
+	    continue;;
+
+	*)  if [ x"$src" = x ]
+	    then
+		src=$1
+	    else
+		# this colon is to work around a 386BSD /bin/sh bug
+		:
+		dst=$1
+	    fi
+	    shift
+	    continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+	echo "$0: no input file specified" >&2
+	exit 1
+else
+	:
+fi
+
+if [ x"$dir_arg" != x ]; then
+	dst=$src
+	src=""
+
+	if [ -d "$dst" ]; then
+		instcmd=:
+		chmodcmd=""
+	else
+		instcmd=$mkdirprog
+	fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+	if [ -f "$src" ] || [ -d "$src" ]
+	then
+		:
+	else
+		echo "$0: $src does not exist" >&2
+		exit 1
+	fi
+
+	if [ x"$dst" = x ]
+	then
+		echo "$0: no destination specified" >&2
+		exit 1
+	else
+		:
+	fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+	if [ -d "$dst" ]
+	then
+		dst=$dst/`basename "$src"`
+	else
+		:
+	fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+	'
+IFS="${IFS-$defaultIFS}"
+
+oIFS=$IFS
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS=$oIFS
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+	pathcomp=$pathcomp$1
+	shift
+
+	if [ ! -d "$pathcomp" ] ;
+        then
+		$mkdirprog "$pathcomp"
+	else
+		:
+	fi
+
+	pathcomp=$pathcomp/
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+	$doit $instcmd "$dst" &&
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+	if [ x"$transformarg" = x ]
+	then
+		dstfile=`basename "$dst"`
+	else
+		dstfile=`basename "$dst" $transformbasename |
+			sed $transformarg`$transformbasename
+	fi
+
+# don't allow the sed command to completely eliminate the filename
+
+	if [ x"$dstfile" = x ]
+	then
+		dstfile=`basename "$dst"`
+	else
+		:
+	fi
+
+# Make a couple of temp file names in the proper directory.
+
+	dsttmp=$dstdir/_inst.$$_
+	rmtmp=$dstdir/_rm.$$_
+
+# Trap to clean up temp files at exit.
+
+	trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
+	trap '(exit $?); exit' 1 2 13 15
+
+# Move or copy the file name to the temp name
+
+	$doit $instcmd "$src" "$dsttmp" &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
+
+# Now remove or move aside any old file at destination location.  We try this
+# two ways since rm can't unlink itself on some systems and the destination
+# file might be busy for other reasons.  In this case, the final cleanup
+# might fail but the new file should still install successfully.
+
+{
+	if [ -f "$dstdir/$dstfile" ]
+	then
+		$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
+		$doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
+		{
+		  echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+		  (exit 1); exit
+		}
+	else
+		:
+	fi
+} &&
+
+# Now rename the file to the real destination.
+
+	$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+
+fi &&
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+
+{
+	(exit 0); exit
+}
diff --git a/cmm/ltmain.sh b/cmm/ltmain.sh
new file mode 100644
index 0000000..e420fac
--- /dev/null
+++ b/cmm/ltmain.sh
@@ -0,0 +1,6964 @@
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun configure.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008  Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+basename="s,^.*/,,g"
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+# The name of this program:
+progname=`echo "$progpath" | $SED $basename`
+modename="$progname"
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION="1.5.26 Debian 1.5.26-1ubuntu1"
+TIMESTAMP=" (1.1220.2.493 2008/02/01 16:58:18)"
+
+# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE).
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Check that we have a working $echo.
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell, and then maybe $echo will work.
+  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit $EXIT_SUCCESS
+fi
+
+default_mode=
+help="Try \`$progname --help' for more information."
+magic="%%%MAGIC variable%%%"
+mkdir="mkdir"
+mv="mv -f"
+rm="rm -f"
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  SP2NL='tr \040 \012'
+  NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  SP2NL='tr \100 \n'
+  NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+# We save the old values to restore during execute mode.
+lt_env=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+	  save_$lt_var=\$$lt_var
+	  lt_env=\"$lt_var=\$$lt_var \$lt_env\"
+	  $lt_var=C
+	  export $lt_var
+	fi"
+done
+
+if test -n "$lt_env"; then
+  lt_env="env $lt_env"
+fi
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+  $echo "$modename: not configured to build any kind of library" 1>&2
+  $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+  exit $EXIT_FAILURE
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+duplicate_deps=no
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+#####################################
+# Shell function definitions:
+# This seems to be the best place for them
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+	# Failing that, at least try and use $RANDOM to avoid a race
+	my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+	save_mktempdir_umask=`umask`
+	umask 0077
+	$mkdir "$my_tmpdir"
+	umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || {
+        $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2
+	exit $EXIT_FAILURE
+      }
+    fi
+
+    $echo "X$my_tmpdir" | $Xsed
+}
+
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+func_win32_libid ()
+{
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \
+      $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+      win32_nmres=`eval $NM -f posix -A $1 | \
+	$SED -n -e '1,100{
+		/ I /{
+			s,.*,import,
+			p
+			q
+			}
+		}'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $echo $win32_libid_type
+}
+
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+	case $arg in
+	  *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	CC_quoted="$CC_quoted $arg"
+      done
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	    # Double-quote args containing other shell metacharacters.
+	    case $arg in
+	      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	      arg="\"$arg\""
+	      ;;
+	    esac
+	    CC_quoted="$CC_quoted $arg"
+	  done
+	    case "$@ " in
+	      " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  $echo "$modename: unable to infer tagged configuration"
+	  $echo "$modename: specify a tag with \`--tag'" 1>&2
+	  exit $EXIT_FAILURE
+#        else
+#          $echo "$modename: using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+
+    $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)"
+    $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $?
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2
+      exit $EXIT_FAILURE
+    fi
+}
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+    my_status=""
+
+    $show "${rm}r $my_gentop"
+    $run ${rm}r "$my_gentop"
+    $show "$mkdir $my_gentop"
+    $run $mkdir "$my_gentop"
+    my_status=$?
+    if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then
+      exit $my_status
+    fi
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'`
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  extracted_serial=`expr $extracted_serial + 1`
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
+
+      $show "${rm}r $my_xdir"
+      $run ${rm}r "$my_xdir"
+      $show "$mkdir $my_xdir"
+      $run $mkdir "$my_xdir"
+      exit_status=$?
+      if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then
+	exit $exit_status
+      fi
+      case $host in
+      *-darwin*)
+	$show "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	if test -z "$run"; then
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'`
+	  darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null`
+	  if test -n "$darwin_arches"; then 
+	    darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    $show "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+      ## Okay now we have a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
+	      lipo -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    ${rm}r unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd "$darwin_orig_dir"
+ 	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	fi # $run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+        ;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+    done
+    func_extract_archives_result="$my_oldobjs"
+}
+# End of Shell function definitions
+#####################################
+
+# Darwin sucks
+eval std_shrext=\"$shrext_cmds\"
+
+disable_libs=no
+
+# Parse our command line options once, thoroughly.
+while test "$#" -gt 0
+do
+  arg="$1"
+  shift
+
+  case $arg in
+  -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) optarg= ;;
+  esac
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$prev"; then
+    case $prev in
+    execute_dlfiles)
+      execute_dlfiles="$execute_dlfiles $arg"
+      ;;
+    tag)
+      tagname="$arg"
+      preserve_args="${preserve_args}=$arg"
+
+      # Check whether tagname contains only valid characters
+      case $tagname in
+      *[!-_A-Za-z0-9,/]*)
+	$echo "$progname: invalid tag name: $tagname" 1>&2
+	exit $EXIT_FAILURE
+	;;
+      esac
+
+      case $tagname in
+      CC)
+	# Don't test for the "default" C tag, as we know, it's there, but
+	# not specially marked.
+	;;
+      *)
+	if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then
+	  taglist="$taglist $tagname"
+	  # Evaluate the configuration.
+	  eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`"
+	else
+	  $echo "$progname: ignoring unknown tag $tagname" 1>&2
+	fi
+	;;
+      esac
+      ;;
+    *)
+      eval "$prev=\$arg"
+      ;;
+    esac
+
+    prev=
+    prevopt=
+    continue
+  fi
+
+  # Have we seen a non-optional argument yet?
+  case $arg in
+  --help)
+    show_help=yes
+    ;;
+
+  --version)
+    echo "\
+$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP
+
+Copyright (C) 2008  Free Software Foundation, Inc.
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+    exit $?
+    ;;
+
+  --config)
+    ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath"
+    done
+    exit $?
+    ;;
+
+  --debug)
+    $echo "$progname: enabling shell trace mode"
+    set -x
+    preserve_args="$preserve_args $arg"
+    ;;
+
+  --dry-run | -n)
+    run=:
+    ;;
+
+  --features)
+    $echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      $echo "enable shared libraries"
+    else
+      $echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      $echo "enable static libraries"
+    else
+      $echo "disable static libraries"
+    fi
+    exit $?
+    ;;
+
+  --finish) mode="finish" ;;
+
+  --mode) prevopt="--mode" prev=mode ;;
+  --mode=*) mode="$optarg" ;;
+
+  --preserve-dup-deps) duplicate_deps="yes" ;;
+
+  --quiet | --silent)
+    show=:
+    preserve_args="$preserve_args $arg"
+    ;;
+
+  --tag)
+    prevopt="--tag"
+    prev=tag
+    preserve_args="$preserve_args --tag"
+    ;;
+  --tag=*)
+    set tag "$optarg" ${1+"$@"}
+    shift
+    prev=tag
+    preserve_args="$preserve_args --tag"
+    ;;
+
+  -dlopen)
+    prevopt="-dlopen"
+    prev=execute_dlfiles
+    ;;
+
+  -*)
+    $echo "$modename: unrecognized option \`$arg'" 1>&2
+    $echo "$help" 1>&2
+    exit $EXIT_FAILURE
+    ;;
+
+  *)
+    nonopt="$arg"
+    break
+    ;;
+  esac
+done
+
+if test -n "$prevopt"; then
+  $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+  $echo "$help" 1>&2
+  exit $EXIT_FAILURE
+fi
+
+case $disable_libs in
+no) 
+  ;;
+shared)
+  build_libtool_libs=no
+  build_old_libs=yes
+  ;;
+static)
+  build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+  ;;
+esac
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+if test -z "$show_help"; then
+
+  # Infer the operation mode.
+  if test -z "$mode"; then
+    $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2
+    $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2
+    case $nonopt in
+    *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*)
+      mode=link
+      for arg
+      do
+	case $arg in
+	-c)
+	   mode=compile
+	   break
+	   ;;
+	esac
+      done
+      ;;
+    *db | *dbx | *strace | *truss)
+      mode=execute
+      ;;
+    *install*|cp|mv)
+      mode=install
+      ;;
+    *rm)
+      mode=uninstall
+      ;;
+    *)
+      # If we have no mode, but dlfiles were specified, then do execute mode.
+      test -n "$execute_dlfiles" && mode=execute
+
+      # Just use the default operation mode.
+      if test -z "$mode"; then
+	if test -n "$nonopt"; then
+	  $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+	else
+	  $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+	fi
+      fi
+      ;;
+    esac
+  fi
+
+  # Only execute mode is allowed to have -dlopen flags.
+  if test -n "$execute_dlfiles" && test "$mode" != execute; then
+    $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+    $echo "$help" 1>&2
+    exit $EXIT_FAILURE
+  fi
+
+  # Change the help message to a mode-specific one.
+  generic_help="$help"
+  help="Try \`$modename --help --mode=$mode' for more information."
+
+  # These modes are in order of execution frequency so that they run quickly.
+  case $mode in
+  # libtool compile mode
+  compile)
+    modename="$modename: compile"
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  if test -n "$libobj" ; then
+	    $echo "$modename: you cannot specify \`-o' more than once" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-static | -prefer-pic | -prefer-non-pic)
+	  later="$later $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+ 	  for arg in $args; do
+	    IFS="$save_ifs"
+
+	    # Double-quote args containing other shell metacharacters.
+	    # Many Bourne shells cannot handle close brackets correctly
+	    # in scan sets, so we specify it separately.
+	    case $arg in
+	      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	      arg="\"$arg\""
+	      ;;
+	    esac
+	    lastarg="$lastarg $arg"
+	  done
+	  IFS="$save_ifs"
+	  lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+
+	  # Add the arguments to base_compile.
+	  base_compile="$base_compile $lastarg"
+	  continue
+	  ;;
+
+	* )
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+      case $lastarg in
+      # Double-quote args containing other shell metacharacters.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, and some SunOS ksh mistreat backslash-escaping
+      # in scan sets (worked around with variable expansion),
+      # and furthermore cannot handle '|' '&' '(' ')' in scan sets 
+      # at all, so we specify them separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	lastarg="\"$lastarg\""
+	;;
+      esac
+
+      base_compile="$base_compile $lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      $echo "$modename: you must specify an argument for -Xcompile"
+      exit $EXIT_FAILURE
+      ;;
+    target)
+      $echo "$modename: you must specify a target with \`-o'" 1>&2
+      exit $EXIT_FAILURE
+      ;;
+    *)
+      # Get the name of the library object.
+      [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    xform='[cCFSifmso]'
+    case $libobj in
+    *.ada) xform=ada ;;
+    *.adb) xform=adb ;;
+    *.ads) xform=ads ;;
+    *.asm) xform=asm ;;
+    *.c++) xform=c++ ;;
+    *.cc) xform=cc ;;
+    *.ii) xform=ii ;;
+    *.class) xform=class ;;
+    *.cpp) xform=cpp ;;
+    *.cxx) xform=cxx ;;
+    *.[fF][09]?) xform=[fF][09]. ;;
+    *.for) xform=for ;;
+    *.java) xform=java ;;
+    *.obj) xform=obj ;;
+    *.sx) xform=sx ;;
+    esac
+
+    libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+    case $libobj in
+    *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+    *)
+      $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
+      exit $EXIT_FAILURE
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -static)
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"`
+    case $qlibobj in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	qlibobj="\"$qlibobj\"" ;;
+    esac
+    test "X$libobj" != "X$qlibobj" \
+	&& $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' 	&()|`$[]' \
+	&& $echo "$modename: libobj name \`$libobj' may not contain shell special characters."
+    objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+    xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+    if test "X$xdir" = "X$obj"; then
+      xdir=
+    else
+      xdir=$xdir/
+    fi
+    lobj=${xdir}$objdir/$objname
+
+    if test -z "$base_compile"; then
+      $echo "$modename: you must specify a compilation command" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    $run $rm $removelist
+    trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+      removelist="$removelist $output_obj $lockfile"
+      trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $run ln "$progpath" "$lockfile" 2>/dev/null; do
+	$show "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$echo "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+      $echo "$srcfile" > "$lockfile"
+    fi
+
+    if test -n "$fix_srcfile_path"; then
+      eval srcfile=\"$fix_srcfile_path\"
+    fi
+    qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"`
+    case $qsrcfile in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+      qsrcfile="\"$qsrcfile\"" ;;
+    esac
+
+    $run $rm "$libobj" "${libobj}T"
+
+    # Create a libtool object file (analogous to a ".la" file),
+    # but don't create it if we're doing a dry run.
+    test -z "$run" && cat > ${libobj}T <<EOF
+# $libobj - a libtool object file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+EOF
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      if test ! -d "${xdir}$objdir"; then
+	$show "$mkdir ${xdir}$objdir"
+	$run $mkdir ${xdir}$objdir
+	exit_status=$?
+	if test "$exit_status" -ne 0 && test ! -d "${xdir}$objdir"; then
+	  exit $exit_status
+	fi
+      fi
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	command="$command -o $lobj"
+      fi
+
+      $run $rm "$lobj" "$output_obj"
+
+      $show "$command"
+      if $run eval $lt_env "$command"; then :
+      else
+	test -n "$output_obj" && $run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	$show "$mv $output_obj $lobj"
+	if $run $mv $output_obj $lobj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # Append the name of the PIC object to the libtool object file.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object='$objdir/$objname'
+
+EOF
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+        suppress_output=' >/dev/null 2>&1'
+      fi
+    else
+      # No PIC object so indicate it doesn't exist in the libtool
+      # object file.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object=none
+
+EOF
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	command="$command -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      command="$command$suppress_output"
+      $run $rm "$obj" "$output_obj"
+      $show "$command"
+      if $run eval $lt_env "$command"; then :
+      else
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	$show "$mv $output_obj $obj"
+	if $run $mv $output_obj $obj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # Append the name of the non-PIC object the libtool object file.
+      # Only append if the libtool object file exists.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object='$objname'
+
+EOF
+    else
+      # Append the name of the non-PIC object the libtool object file.
+      # Only append if the libtool object file exists.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object=none
+
+EOF
+    fi
+
+    $run $mv "${libobj}T" "${libobj}"
+
+    # Unlock the critical section if it was locked
+    if test "$need_locks" != no; then
+      $run $rm "$lockfile"
+    fi
+
+    exit $EXIT_SUCCESS
+    ;;
+
+  # libtool link mode
+  link | relink)
+    modename="$modename: link"
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args="$nonopt"
+    base_compile="$nonopt $@"
+    compile_command="$nonopt"
+    finalize_command="$nonopt"
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+
+    avoid_version=no
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    notinst_path= # paths that contain not-installed libtool libraries
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    single_module="${wl}-single_module"
+
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	esac
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
+	;;
+      *) qarg=$arg ;;
+      esac
+      libtool_args="$libtool_args $qarg"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  compile_command="$compile_command @OUTPUT@"
+	  finalize_command="$finalize_command @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    compile_command="$compile_command @SYMFILE@"
+	    finalize_command="$finalize_command @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      dlfiles="$dlfiles $arg"
+	    else
+	      dlprefiles="$dlprefiles $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  if test ! -f "$arg"; then
+	    $echo "$modename: symbol file \`$arg' does not exist"
+	    exit $EXIT_FAILURE
+	  fi
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat $save_arg`
+	    do
+#	      moreargs="$moreargs $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		# If there is no directory component, then add one.
+		case $arg in
+		*/* | *\\*) . $arg ;;
+		*) . ./$arg ;;
+		esac
+
+		if test -z "$pic_object" || \
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none && \
+		   test "$non_pic_object" = none; then
+		  $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+		  exit $EXIT_FAILURE
+		fi
+
+		# Extract subdirectory from the argument.
+		xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+		if test "X$xdir" = "X$arg"; then
+		  xdir=
+		else
+		  xdir="$xdir/"
+		fi
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      dlfiles="$dlfiles $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    dlprefiles="$dlprefiles $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  libobjs="$libobjs $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  non_pic_objects="$non_pic_objects $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  non_pic_objects="$non_pic_objects $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if test -z "$run"; then
+		  $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+		  exit $EXIT_FAILURE
+		else
+		  # Dry-run case.
+
+		  # Extract subdirectory from the argument.
+		  xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+		  if test "X$xdir" = "X$arg"; then
+		    xdir=
+		  else
+		    xdir="$xdir/"
+		  fi
+
+		  pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+		  non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+		  libobjs="$libobjs $pic_object"
+		  non_pic_objects="$non_pic_objects $non_pic_object"
+		fi
+	      fi
+	    done
+	  else
+	    $echo "$modename: link input file \`$save_arg' does not exist"
+	    exit $EXIT_FAILURE
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    $echo "$modename: only absolute run-paths are allowed" 1>&2
+	    exit $EXIT_FAILURE
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) rpath="$rpath $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) xrpath="$xrpath $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	xcompiler)
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  compile_command="$compile_command $qarg"
+	  finalize_command="$finalize_command $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $wl$qarg"
+	  prev=
+	  compile_command="$compile_command $wl$qarg"
+	  finalize_command="$finalize_command $wl$qarg"
+	  continue
+	  ;;
+	xcclinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  compile_command="$compile_command $qarg"
+	  finalize_command="$finalize_command $qarg"
+	  continue
+	  ;;
+	shrext)
+  	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	darwin_framework|darwin_framework_skip)
+	  test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg"
+	  compile_command="$compile_command $arg"
+	  finalize_command="$finalize_command $arg"
+	  prev=
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  compile_command="$compile_command $link_static_flag"
+	  finalize_command="$finalize_command $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	$echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+	continue
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  $echo "$modename: more than one -exported-symbols argument is not allowed"
+	  exit $EXIT_FAILURE
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework|-arch|-isysroot)
+	case " $CC " in
+	  *" ${arg} ${1} "* | *" ${arg}	${1} "*) 
+		prev=darwin_framework_skip ;;
+	  *) compiler_flags="$compiler_flags $arg"
+	     prev=darwin_framework ;;
+	esac
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  compile_command="$compile_command $arg"
+	  finalize_command="$finalize_command $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  if test -z "$absdir"; then
+	    $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
+	    absdir="$dir"
+	    notinst_path="$notinst_path $dir"
+	  fi
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "*) ;;
+	*)
+	  deplibs="$deplibs -L$dir"
+	  lib_search_path="$lib_search_path $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    deplibs="$deplibs -framework System"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	deplibs="$deplibs $arg"
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      -model)
+	compile_command="$compile_command $arg"
+	compiler_flags="$compiler_flags $arg"
+	finalize_command="$finalize_command $arg"
+	prev=xcompiler
+	continue
+	;;
+
+     -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+	compiler_flags="$compiler_flags $arg"
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+	continue
+	;;
+
+      -multi_module)
+	single_module="${wl}-multi_module"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
+      # -r[0-9][0-9]* specifies the processor on the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
+      # +DA*, +DD* enable 64-bit mode on the HP compiler
+      # -q* pass through compiler args for the IBM compiler
+      # -m* pass through architecture-specific compiler args for GCC
+      # -m*, -t[45]*, -txscale* pass through architecture-specific
+      # compiler args for GCC
+      # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
+      # -F/path gives path to uninstalled frameworks, gcc on darwin
+      # @file GCC response files
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
+
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+        compile_command="$compile_command $arg"
+        finalize_command="$finalize_command $arg"
+        compiler_flags="$compiler_flags $arg"
+        continue
+        ;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
+	  $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  $echo "$modename: only absolute run-paths are allowed" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) xrpath="$xrpath $dir" ;;
+	esac
+	continue
+	;;
+
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -Wc,*)
+	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+	  case $flag in
+	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	    flag="\"$flag\""
+	    ;;
+	  esac
+	  arg="$arg $wl$flag"
+	  compiler_flags="$compiler_flags $flag"
+	done
+	IFS="$save_ifs"
+	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+	;;
+
+      -Wl,*)
+	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+	  case $flag in
+	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	    flag="\"$flag\""
+	    ;;
+	  esac
+	  arg="$arg $wl$flag"
+	  compiler_flags="$compiler_flags $wl$flag"
+	  linker_flags="$linker_flags $flag"
+	done
+	IFS="$save_ifs"
+	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # Some other compiler flag.
+      -* | +*)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+
+      *.$objext)
+	# A standard object.
+	objs="$objs $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  # If there is no directory component, then add one.
+	  case $arg in
+	  */* | *\\*) . $arg ;;
+	  *) . ./$arg ;;
+	  esac
+
+	  if test -z "$pic_object" || \
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none && \
+	     test "$non_pic_object" = none; then
+	    $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+	  if test "X$xdir" = "X$arg"; then
+	    xdir=
+ 	  else
+	    xdir="$xdir/"
+	  fi
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		dlfiles="$dlfiles $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      dlprefiles="$dlprefiles $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    libobjs="$libobjs $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    non_pic_objects="$non_pic_objects $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    non_pic_objects="$non_pic_objects $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if test -z "$run"; then
+	    $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+	    exit $EXIT_FAILURE
+	  else
+	    # Dry-run case.
+
+	    # Extract subdirectory from the argument.
+	    xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+	    if test "X$xdir" = "X$arg"; then
+	      xdir=
+	    else
+	      xdir="$xdir/"
+	    fi
+
+	    pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+	    non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+	    libobjs="$libobjs $pic_object"
+	    non_pic_objects="$non_pic_objects $non_pic_object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	deplibs="$deplibs $arg"
+	old_deplibs="$old_deplibs $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  dlfiles="$dlfiles $arg"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  dlprefiles="$dlprefiles $arg"
+	  prev=
+	else
+	  deplibs="$deplibs $arg"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+      fi
+    done # argument parsing loop
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      compile_command="$compile_command $arg"
+      finalize_command="$finalize_command $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+    if test "X$output_objdir" = "X$output"; then
+      output_objdir="$objdir"
+    else
+      output_objdir="$output_objdir/$objdir"
+    fi
+    # Create the object directory.
+    if test ! -d "$output_objdir"; then
+      $show "$mkdir $output_objdir"
+      $run $mkdir $output_objdir
+      exit_status=$?
+      if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then
+	exit $exit_status
+      fi
+    fi
+
+    # Determine the type of output
+    case $output in
+    "")
+      $echo "$modename: you must specify an output file" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    case $host in
+    *cygwin* | *mingw* | *pw32*)
+      # don't eliminate duplications in $postdeps and $predeps
+      duplicate_compiler_generated_deps=yes
+      ;;
+    *)
+      duplicate_compiler_generated_deps=$duplicate_deps
+      ;;
+    esac
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if test "X$duplicate_deps" = "Xyes" ; then
+	case "$libs " in
+	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	esac
+      fi
+      libs="$libs $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+	  esac
+	  pre_post_deps="$pre_post_deps $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    case $linkmode in
+    lib)
+	passes="conv link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
+	    exit $EXIT_FAILURE
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+    for pass in $passes; do
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link)
+	  libs="$deplibs %DEPLIBS%"
+	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+	  ;;
+	esac
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    compiler_flags="$compiler_flags $deplib"
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2
+	    continue
+	  fi
+	  name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
+	  if test "$linkmode" = lib; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if (${SED} -e '2q' $lib |
+                    grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+		  library_names=
+		  old_library=
+		  case $lib in
+		  */* | *\\*) . $lib ;;
+		  *) . ./$lib ;;
+		  esac
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+		    test "X$ladir" = "X$lib" && ladir="."
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+	        ;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+	    ;;
+	  *)
+	    $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) xrpath="$xrpath $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la) lib="$deplib" ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    valid_a_lib=no
+	    case $deplibs_check_method in
+	      match_pattern*)
+		set dummy $deplibs_check_method
+	        match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+		if eval $echo \"$deplib\" 2>/dev/null \
+		    | $SED 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		  valid_a_lib=yes
+		fi
+		;;
+	      pass_all)
+		valid_a_lib=yes
+		;;
+            esac
+	    if test "$valid_a_lib" != yes; then
+	      $echo
+	      $echo "*** Warning: Trying to link with static lib archive $deplib."
+	      $echo "*** I have the capability to make that library automatically link in when"
+	      $echo "*** you link to this library.  But I can only do this if you have a"
+	      $echo "*** shared version of the library, which you do not appear to have"
+	      $echo "*** because the file extensions .$libext of this argument makes me believe"
+	      $echo "*** that it is just a static archive that I should not used here."
+	    else
+	      $echo
+	      $echo "*** Warning: Linking the shared library $output against the"
+	      $echo "*** static library $deplib is not portable!"
+	      deplibs="$deplib $deplibs"
+	    fi
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      newdlprefiles="$newdlprefiles $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      newdlfiles="$newdlfiles $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$ladir" = "X$lib" && ladir="."
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	case $lib in
+	*/* | *\\*) . $lib ;;
+	*) . ./$lib ;;
+	esac
+
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+	      exit $EXIT_FAILURE
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    convenience="$convenience $ladir/$objdir/$old_library"
+	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+              if test "X$duplicate_deps" = "Xyes" ; then
+	        case "$tmp_libs " in
+	        *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	        esac
+              fi
+	      tmp_libs="$tmp_libs $deplib"
+	    done
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    $echo "$modename: \`$lib' is not a convenience library" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	for l in $old_library $library_names; do
+	  linklib="$l"
+	done
+	if test -z "$linklib"; then
+	  $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    dlprefiles="$dlprefiles $lib $dependency_libs"
+	  else
+	    newdlfiles="$newdlfiles $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
+	    $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    $echo "$modename: warning: library \`$lib' was moved." 1>&2
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$libdir"
+	    absdir="$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  fi
+	fi # $installed = yes
+	name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir"; then
+	    $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  # Prefer using a static library (so that no silly _DYNAMIC symbols
+	  # are required to link).
+	  if test -n "$old_library"; then
+	    newdlprefiles="$newdlprefiles $dir/$old_library"
+	  # Otherwise, use the dlname, so that lt_dlopen finds it.
+	  elif test -n "$dlname"; then
+	    newdlprefiles="$newdlprefiles $dir/$dlname"
+	  else
+	    newdlprefiles="$newdlprefiles $dir/$linklib"
+	  fi
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  newlib_search_path="$newlib_search_path $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if test "X$duplicate_deps" = "Xyes" ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { { test "$prefer_static_libs" = no ||
+		 test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath " in
+	      *" $dir "*) ;;
+	      *" $absdir "*) ;;
+	      *) temp_rpath="$temp_rpath $absdir" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes ; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  if test "$installed" = no; then
+	    notinst_deplibs="$notinst_deplibs $lib"
+	    need_relink=yes
+	  fi
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on
+	  # some systems (darwin)
+	  if test "$shouldnotlink" = yes && test "$pass" = link ; then
+	    $echo
+	    if test "$linkmode" = prog; then
+	      $echo "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $echo "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $echo "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    realname="$2"
+	    shift; shift
+	    libname=`eval \\$echo \"$libname_spec\"`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw*)
+		major=`expr $current - $age`
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    soname=`$echo $soroot | ${SED} -e 's/^.*\///'`
+	    newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a"
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      $show "extracting exported symbol list from \`$soname'"
+	      save_ifs="$IFS"; IFS='~'
+	      cmds=$extract_expsyms_cmds
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd" || exit $?
+	      done
+	      IFS="$save_ifs"
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      $show "generating import library for \`$soname'"
+	      save_ifs="$IFS"; IFS='~'
+	      cmds=$old_archive_from_expsyms_cmds
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd" || exit $?
+	      done
+	      IFS="$save_ifs"
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a module then we can not link against
+		    # it, someone is ignoring the new warnings I added
+		    if /usr/bin/file -L $add 2> /dev/null |
+                      $EGREP ": [^:]* bundle" >/dev/null ; then
+		      $echo "** Warning, lib $linklib is a module, not a shared library"
+		      if test -z "$old_library" ; then
+		        $echo
+		        $echo "** And there doesn't seem to be a static archive available"
+		        $echo "** The link will probably fail, sorry"
+		      else
+		        add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$dir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      $echo "$modename: configuration error: unsupported hardcode properties"
+	      exit $EXIT_FAILURE
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes && \
+		 test "$hardcode_minus_L" != yes && \
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+	        add="$inst_prefix_dir$libdir/$linklib"
+	      else
+	        add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    $echo
+	    $echo "*** Warning: This system can not link to static lib archive $lib."
+	    $echo "*** I have the capability to make that library automatically link in when"
+	    $echo "*** you link to this library.  But I can only do this if you have a"
+	    $echo "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      $echo "*** But as you try to build a module library, libtool will still create "
+	      $echo "*** a static module, that should work as long as the dlopening application"
+	      $echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		$echo
+		$echo "*** However, this would only work if libtool was able to extract symbol"
+		$echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		$echo "*** not find such a program.  So, this module is probably useless."
+		$echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) xrpath="$xrpath $temp_xrpath";;
+		   esac;;
+	      *) temp_deplibs="$temp_deplibs $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  newlib_search_path="$newlib_search_path $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    if test "X$duplicate_deps" = "Xyes" ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+		dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
+		test "X$dir" = "X$deplib" && dir="."
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if grep "^installed=no" $deplib > /dev/null; then
+		  path="$absdir/$objdir"
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  if test -z "$libdir"; then
+		    $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+		    exit $EXIT_FAILURE
+		  fi
+		  if test "$absdir" != "$libdir"; then
+		    $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
+		  fi
+		  path="$absdir"
+		fi
+		depdepl=
+		case $host in
+		*-*-darwin*)
+		  # we do not want to link against static libs,
+		  # but need to link against shared
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$deplibdir/$depdepl" ; then
+		      depdepl="$deplibdir/$depdepl"
+	      	    elif test -f "$path/$depdepl" ; then
+		      depdepl="$path/$depdepl"
+		    else
+		      # Can't find it, oh well...
+		      depdepl=
+		    fi
+		    # do not add paths which are already there
+		    case " $newlib_search_path " in
+		    *" $path "*) ;;
+		    *) newlib_search_path="$newlib_search_path $path";;
+		    esac
+		  fi
+		  path=""
+		  ;;
+		*)
+		  path="-L$path"
+		  ;;
+		esac
+		;;
+	      -l*)
+		case $host in
+		*-*-darwin*)
+		  # Again, we only want to link against shared libraries
+		  eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"`
+		  for tmp in $newlib_search_path ; do
+		    if test -f "$tmp/lib$tmp_libs.dylib" ; then
+		      eval depdepl="$tmp/lib$tmp_libs.dylib"
+		      break
+		    fi
+		  done
+		  path=""
+		  ;;
+		*) continue ;;
+		esac
+		;;
+	      *) continue ;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	      case " $deplibs " in
+	      *" $depdepl "*) ;;
+	      *) deplibs="$depdepl $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) lib_search_path="$lib_search_path $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) tmp_libs="$tmp_libs $deplib" ;;
+	      esac
+	      ;;
+	    *) tmp_libs="$tmp_libs $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  tmp_libs="$tmp_libs $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	$echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;;
+      esac
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+	$echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+	$echo "$modename: warning: \`-R' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	$echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
+      fi
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      objs="$objs$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	if test "$module" = no; then
+	  $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
+	  exit $EXIT_FAILURE
+	else
+	  $echo
+	  $echo "*** Warning: Linking the shared library $output against the non-libtool"
+	  $echo "*** objects $objs is not portable!"
+	  libobjs="$libobjs $objs"
+	fi
+      fi
+
+      if test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
+      fi
+
+      set dummy $rpath
+      if test "$#" -gt 2; then
+	$echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+      fi
+      install_libdir="$2"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	if test -n "$vinfo"; then
+	  $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2
+	fi
+
+	if test -n "$release"; then
+	  $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
+	fi
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	IFS="$save_ifs"
+
+	if test -n "$8"; then
+	  $echo "$modename: too many parameters to \`-version-info'" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$2"
+	  number_minor="$3"
+	  number_revision="$4"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  darwin|linux|osf|windows|none)
+	    current=`expr $number_major + $number_minor`
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    current=`expr $number_major + $number_minor`
+	    age="$number_minor"
+	    revision="$number_minor"
+	    lt_irix_increment=no
+	    ;;
+	  *)
+	    $echo "$modename: unknown library version type \`$version_type'" 1>&2
+	    $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+	    exit $EXIT_FAILURE
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$2"
+	  revision="$3"
+	  age="$4"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  major=.`expr $current - $age`
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  minor_current=`expr $current + 1`
+	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current";
+	  ;;
+
+	irix | nonstopux)
+	  if test "X$lt_irix_increment" = "Xno"; then
+	    major=`expr $current - $age`
+	  else
+	    major=`expr $current - $age + 1`
+	  fi
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    iface=`expr $revision - $loop`
+	    loop=`expr $loop - 1`
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux)
+	  major=.`expr $current - $age`
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  major=.`expr $current - $age`
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    iface=`expr $current - $loop`
+	    loop=`expr $loop - 1`
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  verstring="$verstring:${current}.0"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  major=`expr $current - $age`
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  $echo "$modename: unknown library version type \`$version_type'" 1>&2
+	  $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+      fi
+
+      if test "$mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$echo "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+	         if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+	         then
+		   continue
+		 fi
+	       fi
+	       removelist="$removelist $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	if test -n "$removelist"; then
+	  $show "${rm}r $removelist"
+	  $run ${rm}r $removelist
+	fi
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"`
+      #	deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"`
+      #	dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  temp_xrpath="$temp_xrpath -R$libdir"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) dlfiles="$dlfiles $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) dlprefiles="$dlprefiles $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    deplibs="$deplibs -framework System"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+ 	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      deplibs="$deplibs -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $rm conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $rm conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      name=`expr $i : '-l\(.*\)'`
+	      # If $name is empty we are operating on a -L argument.
+              if test "$name" != "" && test "$name" != "0"; then
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    newdeplibs="$newdeplibs $i"
+		    i=""
+		    ;;
+		  esac
+	        fi
+		if test -n "$i" ; then
+		  libname=`eval \\$echo \"$libname_spec\"`
+		  deplib_matches=`eval \\$echo \"$library_names_spec\"`
+		  set dummy $deplib_matches
+		  deplib_match=$2
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    newdeplibs="$newdeplibs $i"
+		  else
+		    droppeddeps=yes
+		    $echo
+		    $echo "*** Warning: dynamic linker does not accept needed library $i."
+		    $echo "*** I have the capability to make that library automatically link in when"
+		    $echo "*** you link to this library.  But I can only do this if you have a"
+		    $echo "*** shared version of the library, which I believe you do not have"
+		    $echo "*** because a test_compile did reveal that the linker did not use it for"
+		    $echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+	      else
+		newdeplibs="$newdeplibs $i"
+	      fi
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      name=`expr $i : '-l\(.*\)'`
+	      # If $name is empty we are operating on a -L argument.
+              if test "$name" != "" && test "$name" != "0"; then
+		$rm conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      newdeplibs="$newdeplibs $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval \\$echo \"$libname_spec\"`
+		    deplib_matches=`eval \\$echo \"$library_names_spec\"`
+		    set dummy $deplib_matches
+		    deplib_match=$2
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      newdeplibs="$newdeplibs $i"
+		    else
+		      droppeddeps=yes
+		      $echo
+		      $echo "*** Warning: dynamic linker does not accept needed library $i."
+		      $echo "*** I have the capability to make that library automatically link in when"
+		      $echo "*** you link to this library.  But I can only do this if you have a"
+		      $echo "*** shared version of the library, which you do not appear to have"
+		      $echo "*** because a test_compile did reveal that the linker did not use this one"
+		      $echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  $echo
+		  $echo "*** Warning!  Library $i is needed by this library but I was not able to"
+		  $echo "*** make it link in!  You will probably need to install it or some"
+		  $echo "*** library that it depends on before this library will be fully"
+		  $echo "*** functional.  Installing it before continuing would be even better."
+		fi
+	      else
+		newdeplibs="$newdeplibs $i"
+	      fi
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method
+	  file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    name=`expr $a_deplib : '-l\(.*\)'`
+	    # If $name is empty we are operating on a -L argument.
+            if test "$name" != "" && test  "$name" != "0"; then
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval \\$echo \"$libname_spec\"`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null \
+			 | grep " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
+			 | ${SED} 10q \
+			 | $EGREP "$file_magic_regex" > /dev/null; then
+			newdeplibs="$newdeplibs $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$echo
+		$echo "*** Warning: linker path does not have real file for library $a_deplib."
+		$echo "*** I have the capability to make that library automatically link in when"
+		$echo "*** you link to this library.  But I can only do this if you have a"
+		$echo "*** shared version of the library, which you do not appear to have"
+		$echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $echo "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $echo "*** with $libname and none of the candidates passed a file format test"
+		  $echo "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	    else
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	    fi
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    name=`expr $a_deplib : '-l\(.*\)'`
+	    # If $name is empty we are operating on a -L argument.
+	    if test -n "$name" && test "$name" != "0"; then
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval \\$echo \"$libname_spec\"`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval $echo \"$potent_lib\" 2>/dev/null \
+		        | ${SED} 10q \
+		        | $EGREP "$match_pattern_regex" > /dev/null; then
+		      newdeplibs="$newdeplibs $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$echo
+		$echo "*** Warning: linker path does not have real file for library $a_deplib."
+		$echo "*** I have the capability to make that library automatically link in when"
+		$echo "*** you link to this library.  But I can only do this if you have a"
+		$echo "*** shared version of the library, which you do not appear to have"
+		$echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $echo "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $echo "*** with $libname and none of the candidates passed a file format test"
+		  $echo "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	    else
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	    fi
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
+	    -e 's/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"`
+	    done
+	  fi
+	  if $echo "X $tmp_deplibs" | $Xsed -e 's/[ 	]//g' \
+	    | grep . >/dev/null; then
+	    $echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      $echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      $echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    $echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	  fi
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library is the System framework
+	  newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    $echo
+	    $echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $echo "*** dependencies of module $libname.  Therefore, libtool will create"
+	    $echo "*** a static module, that should work as long as the dlopening"
+	    $echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      $echo
+	      $echo "*** However, this would only work if libtool was able to extract symbol"
+	      $echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      $echo "*** not find such a program.  So, this module is probably useless."
+	      $echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    $echo "*** The inter-library dependencies that have been dropped here will be"
+	    $echo "*** automatically added whenever a program is linked with this library"
+	    $echo "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      $echo
+	      $echo "*** Since this library must not contain undefined symbols,"
+	      $echo "*** because either the platform does not support them or"
+	      $echo "*** it was explicitly requested with -no-undefined,"
+	      $echo "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		dep_rpath="$dep_rpath $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) perm_rpath="$perm_rpath $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    if test -n "$hardcode_libdir_flag_spec_ld"; then
+	      case $archive_cmds in
+	      *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;;
+	      *)      eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;;
+	      esac
+	    else
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+	    fi
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      rpath="$rpath$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	realname="$2"
+	shift; shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  linknames="$linknames $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    $show "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $run $rm $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      eval cmd=\"$cmd\"
+	      if len=`expr "X$cmd" : ".*"` &&
+	       test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	        $show "$cmd"
+	        $run eval "$cmd" || exit $?
+	        skipped_export=false
+	      else
+	        # The command line is too long to execute in one step.
+	        $show "using reloadable object file for export list..."
+	        skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex"; then
+	      $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
+	      $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      $show "$mv \"${export_symbols}T\" \"$export_symbols\""
+	      $run eval '$mv "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+		case " $convenience " in
+		*" $test_deplib "*) ;;
+		*)
+			tmp_deplibs="$tmp_deplibs $test_deplib"
+			;;
+		esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    generated="$generated $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    libobjs="$libobjs $func_extract_archives_result"
+	  fi
+	fi
+	
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  linker_flags="$linker_flags $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$mode" = relink; then
+	  $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	  eval test_cmds=\"$archive_expsym_cmds\"
+	  cmds=$archive_expsym_cmds
+	else
+	  eval test_cmds=\"$archive_cmds\"
+	  cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" &&
+	   len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+	   test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise.
+	  $echo "creating reloadable object files..."
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  output_la=`$echo "X$output" | $Xsed -e "$basename"`
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  delfiles=
+	  last_robj=
+	  k=1
+	  output=$output_objdir/$output_la-${k}.$objext
+	  # Loop over the list of objects to be linked.
+	  for obj in $save_libobjs
+	  do
+	    eval test_cmds=\"$reload_cmds $objlist $last_robj\"
+	    if test "X$objlist" = X ||
+	       { len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+		 test "$len" -le "$max_cmd_len"; }; then
+	      objlist="$objlist $obj"
+	    else
+	      # The command $test_cmds is almost too long, add a
+	      # command to the queue.
+	      if test "$k" -eq 1 ; then
+		# The first file doesn't have a previous command to add.
+		eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+	      else
+		# All subsequent reloadable object files will link in
+		# the last one created.
+		eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\"
+	      fi
+	      last_robj=$output_objdir/$output_la-${k}.$objext
+	      k=`expr $k + 1`
+	      output=$output_objdir/$output_la-${k}.$objext
+	      objlist=$obj
+	      len=1
+	    fi
+	  done
+	  # Handle the remaining objects by creating one last
+	  # reloadable object file.  All subsequent reloadable object
+	  # files will link in the last one created.
+	  test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	  eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+
+	  if ${skipped_export-false}; then
+	    $show "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $run $rm $export_symbols
+	    libobjs=$output
+	    # Append the command to create the export file.
+	    eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\"
+          fi
+
+	  # Set up a command to remove the reloadable object files
+	  # after they are used.
+	  i=0
+	  while test "$i" -lt "$k"
+	  do
+	    i=`expr $i + 1`
+	    delfiles="$delfiles $output_objdir/$output_la-${i}.$objext"
+	  done
+
+	  $echo "creating a temporary reloadable object file: $output"
+
+	  # Loop through the commands generated above and execute them.
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $concat_cmds; do
+	    IFS="$save_ifs"
+	    $show "$cmd"
+	    $run eval "$cmd" || exit $?
+	  done
+	  IFS="$save_ifs"
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    cmds=$archive_expsym_cmds
+	  else
+	    cmds=$archive_cmds
+	    fi
+	  fi
+
+	  # Append the command to remove the reloadable object files
+	  # to the just-reset $cmds.
+	  eval cmds=\"\$cmds~\$rm $delfiles\"
+	fi
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $show "$cmd"
+	  $run eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test "$mode" = relink; then
+	      $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$mode" = relink; then
+	  $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      $show "${rm}r $gentop"
+	      $run ${rm}r "$gentop"
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
+	    $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;;
+      esac
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+	$echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+	$echo "$modename: warning: \`-R' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for objects" 1>&2
+      fi
+
+      case $output in
+      *.lo)
+	if test -n "$objs$old_deplibs"; then
+	  $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+	libobj="$output"
+	obj=`$echo "X$output" | $Xsed -e "$lo2o"`
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $run $rm $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
+	else
+	  gentop="$output_objdir/${obj}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      cmds=$reload_cmds
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	eval cmd=\"$cmd\"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  $show "${rm}r $gentop"
+	  $run ${rm}r $gentop
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  $show "${rm}r $gentop"
+	  $run ${rm}r $gentop
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $run eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	cmds=$reload_cmds
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $show "$cmd"
+	  $run eval "$cmd" || exit $?
+	done
+	IFS="$save_ifs"
+      fi
+
+      if test -n "$gentop"; then
+	$show "${rm}r $gentop"
+	$run ${rm}r $gentop
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;
+      esac
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for programs" 1>&2
+      fi
+
+      if test "$preload" = yes; then
+	if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
+	   test "$dlopen_self_static" = unknown; then
+	  $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
+	fi
+      fi
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	;;
+      esac
+
+      case $host in
+      *darwin*)
+        # Don't allow lazy linking, it breaks C++ global constructors
+        if test "$tagname" = CXX ; then
+        compile_command="$compile_command ${wl}-bind_at_load"
+        finalize_command="$finalize_command ${wl}-bind_at_load"
+        fi
+        ;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      compile_command="$compile_command $compile_deplibs"
+      finalize_command="$finalize_command $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) perm_rpath="$perm_rpath $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+      fi
+
+      dlsyms=
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	  dlsyms="${outputname}S.c"
+	else
+	  $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+	fi
+      fi
+
+      if test -n "$dlsyms"; then
+	case $dlsyms in
+	"") ;;
+	*.c)
+	  # Discover the nlist of each of the dlfiles.
+	  nlist="$output_objdir/${outputname}.nm"
+
+	  $show "$rm $nlist ${nlist}S ${nlist}T"
+	  $run $rm "$nlist" "${nlist}S" "${nlist}T"
+
+	  # Parse the name list into a source file.
+	  $show "creating $output_objdir/$dlsyms"
+
+	  test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define lt_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+	  if test "$dlself" = yes; then
+	    $show "generating symbol list for \`$output'"
+
+	    test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+
+	    # Add our own program objects to the symbol list.
+	    progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	    for arg in $progfiles; do
+	      $show "extracting global C symbols from \`$arg'"
+	      $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+	    done
+
+	    if test -n "$exclude_expsyms"; then
+	      $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      $run eval '$mv "$nlist"T "$nlist"'
+	    fi
+
+	    if test -n "$export_symbols_regex"; then
+	      $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      $run eval '$mv "$nlist"T "$nlist"'
+	    fi
+
+	    # Prepare the list of exported symbols
+	    if test -z "$export_symbols"; then
+	      export_symbols="$output_objdir/$outputname.exp"
+	      $run $rm $export_symbols
+	      $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+              case $host in
+              *cygwin* | *mingw* )
+	        $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+		$run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+                ;;
+              esac
+	    else
+	      $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      $run eval 'mv "$nlist"T "$nlist"'
+              case $host in
+              *cygwin* | *mingw* )
+	        $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+		$run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+                ;;
+              esac
+	    fi
+	  fi
+
+	  for arg in $dlprefiles; do
+	    $show "extracting global C symbols from \`$arg'"
+	    name=`$echo "$arg" | ${SED} -e 's%^.*/%%'`
+	    $run eval '$echo ": $name " >> "$nlist"'
+	    $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -z "$run"; then
+	    # Make sure we have at least an empty file.
+	    test -f "$nlist" || : > "$nlist"
+
+	    if test -n "$exclude_expsyms"; then
+	      $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	      $mv "$nlist"T "$nlist"
+	    fi
+
+	    # Try sorting and uniquifying the output.
+	    if grep -v "^: " < "$nlist" |
+		if sort -k 3 </dev/null >/dev/null 2>&1; then
+		  sort -k 3
+		else
+		  sort +2
+		fi |
+		uniq > "$nlist"S; then
+	      :
+	    else
+	      grep -v "^: " < "$nlist" > "$nlist"S
+	    fi
+
+	    if test -f "$nlist"S; then
+	      eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
+	    else
+	      $echo '/* NONE */' >> "$output_objdir/$dlsyms"
+	    fi
+
+	    $echo >> "$output_objdir/$dlsyms" "\
+
+#undef lt_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+"
+
+	    case $host in
+	    *cygwin* | *mingw* )
+	  $echo >> "$output_objdir/$dlsyms" "\
+/* DATA imports from DLLs on WIN32 can't be const, because
+   runtime relocations are performed -- see ld's documentation
+   on pseudo-relocs */
+struct {
+"
+	      ;;
+	    * )
+	  $echo >> "$output_objdir/$dlsyms" "\
+const struct {
+"
+	      ;;
+	    esac
+
+
+	  $echo >> "$output_objdir/$dlsyms" "\
+  const char *name;
+  lt_ptr address;
+}
+lt_preloaded_symbols[] =
+{\
+"
+
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
+
+	    $echo >> "$output_objdir/$dlsyms" "\
+  {0, (lt_ptr) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	  fi
+
+	  pic_flag_for_symtable=
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    case "$compile_command " in
+	    *" -static "*) ;;
+	    *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";;
+	    esac;;
+	  *-*-hpux*)
+	    case "$compile_command " in
+	    *" -static "*) ;;
+	    *) pic_flag_for_symtable=" $pic_flag";;
+	    esac
+	  esac
+
+	  # Now compile the dynamic symbol file.
+	  $show "(cd $output_objdir && $LTCC  $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+	  $run eval '(cd $output_objdir && $LTCC  $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+
+	  # Clean up the generated files.
+	  $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
+	  $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
+
+	  # Transform the symbol file into the correct name.
+          case $host in
+          *cygwin* | *mingw* )
+            if test -f "$output_objdir/${outputname}.def" ; then
+              compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP`
+              finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP`
+            else
+              compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP`
+              finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP`
+             fi
+            ;;
+          * )
+            compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP`
+            finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP`
+            ;;
+          esac
+	  ;;
+	*)
+	  $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+      else
+	# We keep going just in case the user didn't refer to
+	# lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+	# really was required.
+
+	# Nullify the symbol file.
+	compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP`
+	finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP`
+      fi
+
+      if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+	# Replace the output file specification.
+	compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	$show "$link_command"
+	$run eval "$link_command"
+	exit_status=$?
+
+	# Delete the generated files.
+	if test -n "$dlsyms"; then
+	  $show "$rm $output_objdir/${outputname}S.${objext}"
+	  $run $rm "$output_objdir/${outputname}S.${objext}"
+	fi
+
+	exit $exit_status
+      fi
+
+      if test -n "$shlibpath_var"; then
+	# We should set the shlibpath_var
+	rpath=
+	for dir in $temp_rpath; do
+	  case $dir in
+	  [\\/]* | [A-Za-z]:[\\/]*)
+	    # Absolute path.
+	    rpath="$rpath$dir:"
+	    ;;
+	  *)
+	    # Relative path: add a thisdir entry.
+	    rpath="$rpath\$thisdir/$dir:"
+	    ;;
+	  esac
+	done
+	temp_rpath="$rpath"
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$run $rm $output
+	# Link the executable and exit
+	$show "$link_command"
+	$run eval "$link_command" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	$echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
+	$echo "$modename: \`$output' will be relinked during installation" 1>&2
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      $show "$link_command"
+      $run eval "$link_command" || exit $?
+
+      # Now create the wrapper script.
+      $show "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+	    relink_command="$var=\"$var_value\"; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP`
+      fi
+
+      # Quote $echo for shipping.
+      if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then
+	case $progpath in
+	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+	*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
+	esac
+	qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
+      else
+	qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if our run command is non-null.
+      if test -z "$run"; then
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+            output_name=`basename $output`
+            output_path=`dirname $output`
+            cwrappersource="$output_path/$objdir/lt-$output_name.c"
+            cwrapper="$output_path/$output_name.exe"
+            $rm $cwrappersource $cwrapper
+            trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    cat > $cwrappersource <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+
+   Currently, it simply execs the wrapper *script* "/bin/sh $output",
+   but could eventually absorb all of the scripts functionality and
+   exec $objdir/$outputname directly.
+*/
+EOF
+	    cat >> $cwrappersource<<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+        (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+/* -DDEBUG is fairly common in CFLAGS.  */
+#undef DEBUG
+#if defined DEBUGWRAPPER
+# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__)
+#else
+# define DEBUG(format, ...)
+#endif
+
+const char *program_name = NULL;
+
+void * xmalloc (size_t num);
+char * xstrdup (const char *string);
+const char * base_name (const char *name);
+char * find_executable(const char *wrapper);
+int    check_executable(const char *path);
+char * strendzap(char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  DEBUG("(main) argv[0]      : %s\n",argv[0]);
+  DEBUG("(main) program_name : %s\n",program_name);
+  newargz = XMALLOC(char *, argc+2);
+EOF
+
+            cat >> $cwrappersource <<EOF
+  newargz[0] = (char *) xstrdup("$SHELL");
+EOF
+
+            cat >> $cwrappersource <<"EOF"
+  newargz[1] = find_executable(argv[0]);
+  if (newargz[1] == NULL)
+    lt_fatal("Couldn't find %s", argv[0]);
+  DEBUG("(main) found exe at : %s\n",newargz[1]);
+  /* we know the script has the same name, without the .exe */
+  /* so make sure newargz[1] doesn't end in .exe */
+  strendzap(newargz[1],".exe");
+  for (i = 1; i < argc; i++)
+    newargz[i+1] = xstrdup(argv[i]);
+  newargz[argc+1] = NULL;
+
+  for (i=0; i<argc+1; i++)
+  {
+    DEBUG("(main) newargz[%d]   : %s\n",i,newargz[i]);
+    ;
+  }
+
+EOF
+
+            case $host_os in
+              mingw*)
+                cat >> $cwrappersource <<EOF
+  execv("$SHELL",(char const **)newargz);
+EOF
+              ;;
+              *)
+                cat >> $cwrappersource <<EOF
+  execv("$SHELL",newargz);
+EOF
+              ;;
+            esac
+
+            cat >> $cwrappersource <<"EOF"
+  return 127;
+}
+
+void *
+xmalloc (size_t num)
+{
+  void * p = (void *) malloc (num);
+  if (!p)
+    lt_fatal ("Memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
+;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char)name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable(const char * path)
+{
+  struct stat st;
+
+  DEBUG("(check_executable)  : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!");
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0) &&
+      (
+        /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */
+#if defined (S_IXOTH)
+       ((st.st_mode & S_IXOTH) == S_IXOTH) ||
+#endif
+#if defined (S_IXGRP)
+       ((st.st_mode & S_IXGRP) == S_IXGRP) ||
+#endif
+       ((st.st_mode & S_IXUSR) == S_IXUSR))
+      )
+    return 1;
+  else
+    return 0;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise */
+char *
+find_executable (const char* wrapper)
+{
+  int has_slash = 0;
+  const char* p;
+  const char* p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char* concat_name;
+
+  DEBUG("(find_executable)  : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!");
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':')
+  {
+    concat_name = xstrdup (wrapper);
+    if (check_executable(concat_name))
+      return concat_name;
+    XFREE(concat_name);
+  }
+  else
+  {
+#endif
+    if (IS_DIR_SEPARATOR (wrapper[0]))
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable(concat_name))
+        return concat_name;
+      XFREE(concat_name);
+    }
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+    {
+      has_slash = 1;
+      break;
+    }
+  if (!has_slash)
+  {
+    /* no slashes; search PATH */
+    const char* path = getenv ("PATH");
+    if (path != NULL)
+    {
+      for (p = path; *p; p = p_next)
+      {
+        const char* q;
+        size_t p_len;
+        for (q = p; *q; q++)
+          if (IS_PATH_SEPARATOR(*q))
+            break;
+        p_len = q - p;
+        p_next = (*q == '\0' ? q : q + 1);
+        if (p_len == 0)
+        {
+          /* empty path: current directory */
+          if (getcwd (tmp, LT_PATHMAX) == NULL)
+            lt_fatal ("getcwd failed");
+          tmp_len = strlen(tmp);
+          concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
+          memcpy (concat_name, tmp, tmp_len);
+          concat_name[tmp_len] = '/';
+          strcpy (concat_name + tmp_len + 1, wrapper);
+        }
+        else
+        {
+          concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1);
+          memcpy (concat_name, p, p_len);
+          concat_name[p_len] = '/';
+          strcpy (concat_name + p_len + 1, wrapper);
+        }
+        if (check_executable(concat_name))
+          return concat_name;
+        XFREE(concat_name);
+      }
+    }
+    /* not found in PATH; assume curdir */
+  }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal ("getcwd failed");
+  tmp_len = strlen(tmp);
+  concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable(concat_name))
+    return concat_name;
+  XFREE(concat_name);
+  return NULL;
+}
+
+char *
+strendzap(char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert(str != NULL);
+  assert(pat != NULL);
+
+  len = strlen(str);
+  patlen = strlen(pat);
+
+  if (patlen <= len)
+  {
+    str += len - patlen;
+    if (strcmp(str, pat) == 0)
+      *str = '\0';
+  }
+  return str;
+}
+
+static void
+lt_error_core (int exit_status, const char * mode,
+          const char * message, va_list ap)
+{
+  fprintf (stderr, "%s: %s: ", program_name, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+  va_end (ap);
+}
+EOF
+          # we should really use a build-platform specific compiler
+          # here, but OTOH, the wrappers (shell script and this C one)
+          # are only useful if you want to execute the "real" binary.
+          # Since the "real" binary is built for $host, then this
+          # wrapper might as well be built for $host, too.
+          $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource
+          ;;
+        esac
+        $rm $output
+        trap "$rm $output; exit $EXIT_FAILURE" 1 2 15
+
+	$echo > $output "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='${SED} -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE).
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variable:
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$echo are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    echo=\"$qecho\"
+    file=\"\$0\"
+    # Make sure echo works.
+    if test \"X\$1\" = X--no-reexec; then
+      # Discard the --no-reexec flag, and continue.
+      shift
+    elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
+      # Yippee, \$echo works!
+      :
+    else
+      # Restart under the correct shell, and then maybe \$echo will work.
+      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+    fi
+  fi\
+"
+	$echo >> $output "\
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+  done
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $echo >> $output "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" || \\
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $mkdir \"\$progdir\"
+    else
+      $rm \"\$progdir/\$file\"
+    fi"
+
+	  $echo >> $output "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$echo \"\$relink_command_output\" >&2
+	$rm \"\$progdir/\$file\"
+	exit $EXIT_FAILURE
+      fi
+    fi
+
+    $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $rm \"\$progdir/\$program\";
+      $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $rm \"\$progdir/\$file\"
+  fi"
+	else
+	  $echo >> $output "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$echo >> $output "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $echo >> $output "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	# fixup the dll searchpath if we need to.
+	if test -n "$dllsearchpath"; then
+	  $echo >> $output "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	$echo >> $output "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+"
+	case $host in
+	# Backslashes separate directories on plain windows
+	*-*-mingw | *-*-os2*)
+	  $echo >> $output "\
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+	  ;;
+
+	*)
+	  $echo >> $output "\
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+	  ;;
+	esac
+	$echo >> $output "\
+      \$echo \"\$0: cannot exec \$program \$*\"
+      exit $EXIT_FAILURE
+    fi
+  else
+    # The program doesn't exist.
+    \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$echo \"This script is just a wrapper for \$program.\" 1>&2
+    $echo \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit $EXIT_FAILURE
+  fi
+fi\
+"
+	chmod +x $output
+      fi
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	generated="$generated $gentop"
+
+	func_extract_archives $gentop $addlibs
+	oldobjs="$oldobjs $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+       cmds=$old_archive_from_new_cmds
+      else
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      $echo "X$obj" | $Xsed -e 's%^.*/%%'
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  $echo "copying selected object files to avoid basename conflicts..."
+
+	  if test -z "$gentop"; then
+	    gentop="$output_objdir/${outputname}x"
+	    generated="$generated $gentop"
+
+	    $show "${rm}r $gentop"
+	    $run ${rm}r "$gentop"
+	    $show "$mkdir $gentop"
+	    $run $mkdir "$gentop"
+	    exit_status=$?
+	    if test "$exit_status" -ne 0 && test ! -d "$gentop"; then
+	      exit $exit_status
+	    fi
+	  fi
+
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		counter=`expr $counter + 1`
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      $run ln "$obj" "$gentop/$newobj" ||
+	      $run cp "$obj" "$gentop/$newobj"
+	      oldobjs="$oldobjs $gentop/$newobj"
+	      ;;
+	    *) oldobjs="$oldobjs $obj" ;;
+	    esac
+	  done
+	fi
+
+	eval cmds=\"$old_archive_cmds\"
+
+	if len=`expr "X$cmds" : ".*"` &&
+	     test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  $echo "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  for obj in $save_oldobjs
+	  do
+	    oldobjs="$objlist $obj"
+	    objlist="$objlist $obj"
+	    eval test_cmds=\"$old_archive_cmds\"
+	    if len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+	       test "$len" -le "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+	        RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+        eval cmd=\"$cmd\"
+	IFS="$save_ifs"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$generated"; then
+      $show "${rm}r$generated"
+      $run ${rm}r$generated
+    fi
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      $show "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+	  relink_command="$var=\"$var_value\"; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+
+      # Only create the output if not a dry run.
+      if test -z "$run"; then
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		if test -z "$libdir"; then
+		  $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+		  exit $EXIT_FAILURE
+		fi
+		newdependency_libs="$newdependency_libs $libdir/$name"
+		;;
+	      *) newdependency_libs="$newdependency_libs $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+	      if test -z "$libdir"; then
+		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+		exit $EXIT_FAILURE
+	      fi
+	      newdlfiles="$newdlfiles $libdir/$name"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+	      if test -z "$libdir"; then
+		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+		exit $EXIT_FAILURE
+	      fi
+	      newdlprefiles="$newdlprefiles $libdir/$name"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlfiles="$newdlfiles $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlprefiles="$newdlprefiles $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $rm $output
+	  # place dlname in correct position for cygwin
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+	  esac
+	  $echo > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $echo >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      fi
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
+      $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+    ;;
+
+  # libtool install mode
+  install)
+    modename="$modename: install"
+
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       $echo "X$nonopt" | grep shtool > /dev/null; then
+      # Aesthetically quote it.
+      arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	arg="\"$arg\""
+	;;
+      esac
+      install_prog="$arg "
+      arg="$1"
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+    case $arg in
+    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+      arg="\"$arg\""
+      ;;
+    esac
+    install_prog="$install_prog$arg"
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    for arg
+    do
+      if test -n "$dest"; then
+	files="$files $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f) 
+      	case " $install_prog " in
+	*[\\\ /]cp\ *) ;;
+	*) prev=$arg ;;
+	esac
+	;;
+      -g | -m | -o) prev=$arg ;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	arg="\"$arg\""
+	;;
+      esac
+      install_prog="$install_prog $arg"
+    done
+
+    if test -z "$install_prog"; then
+      $echo "$modename: you must specify an install program" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prev' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	$echo "$modename: no file or destination specified" 1>&2
+      else
+	$echo "$modename: you must specify a destination" 1>&2
+      fi
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Strip any trailing slash from the destination.
+    dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+      test "X$destdir" = "X$dest" && destdir=.
+      destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files
+      if test "$#" -gt 2; then
+	$echo "$modename: \`$dest' is not a directory" 1>&2
+	$echo "$help" 1>&2
+	exit $EXIT_FAILURE
+      fi
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	staticlibs="$staticlibs $file"
+	;;
+
+      *.la)
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	library_names=
+	old_library=
+	relink_command=
+	# If there is no directory component, then add one.
+	case $file in
+	*/* | *\\*) . $file ;;
+	*) . ./$file ;;
+	esac
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) current_libdirs="$current_libdirs $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) future_libdirs="$future_libdirs $libdir" ;;
+	  esac
+	fi
+
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
+	test "X$dir" = "X$file/" && dir=
+	dir="$dir$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  if test "$inst_prefix_dir" = "$destdir"; then
+	    $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP`
+	  else
+	    relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP`
+	  fi
+
+	  $echo "$modename: warning: relinking \`$file'" 1>&2
+	  $show "$relink_command"
+	  if $run eval "$relink_command"; then :
+	  else
+	    $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names
+	if test -n "$2"; then
+	  realname="$2"
+	  shift
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  $show "$install_prog $dir/$srcname $destdir/$realname"
+	  $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
+	  if test -n "$stripme" && test -n "$striplib"; then
+	    $show "$striplib $destdir/$realname"
+	    $run eval "$striplib $destdir/$realname" || exit $?
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      if test "$linkname" != "$realname"; then
+                $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
+                $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
+	      fi
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  cmds=$postinstall_cmds
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $cmds; do
+	    IFS="$save_ifs"
+	    eval cmd=\"$cmd\"
+	    $show "$cmd"
+	    $run eval "$cmd" || {
+	      lt_exit=$?
+
+	      # Restore the uninstalled library and exit
+	      if test "$mode" = relink; then
+		$run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
+	      fi
+
+	      exit $lt_exit
+	    }
+	  done
+	  IFS="$save_ifs"
+	fi
+
+	# Install the pseudo-library for information purposes.
+	name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	instname="$dir/$name"i
+	$show "$install_prog $instname $destdir/$name"
+	$run eval "$install_prog $instname $destdir/$name" || exit $?
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	if test -n "$destfile"; then
+	  $show "$install_prog $file $destfile"
+	  $run eval "$install_prog $file $destfile" || exit $?
+	fi
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+
+	  $show "$install_prog $staticobj $staticdest"
+	  $run eval "$install_prog \$staticobj \$staticdest" || exit $?
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      file=`$echo $file|${SED} 's,.exe$,,'`
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin*|*mingw*)
+	    wrapper=`$echo $file | ${SED} -e 's,.exe$,,'`
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  # Note that it is not necessary on cygwin/mingw to append a dot to
+	  # foo even if both foo and FILE.exe exist: automatic-append-.exe
+	  # behavior happens only for exec(3), not for open(2)!  Also, sourcing
+	  # `FILE.' does not work on cygwin managed mounts.
+	  #
+	  # If there is no directory component, then add one.
+	  case $wrapper in
+	  */* | *\\*) . ${wrapper} ;;
+	  *) . ./${wrapper} ;;
+	  esac
+
+	  # Check the variables that should have been set.
+	  if test -z "$notinst_deplibs"; then
+	    $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      # If there is no directory component, then add one.
+	      case $lib in
+	      */* | *\\*) . $lib ;;
+	      *) . ./$lib ;;
+	      esac
+	    fi
+	    libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  # Note that it is not necessary on cygwin/mingw to append a dot to
+	  # foo even if both foo and FILE.exe exist: automatic-append-.exe
+	  # behavior happens only for exec(3), not for open(2)!  Also, sourcing
+	  # `FILE.' does not work on cygwin managed mounts.
+	  #
+	  # If there is no directory component, then add one.
+	  case $wrapper in
+	  */* | *\\*) . ${wrapper} ;;
+	  *) . ./${wrapper} ;;
+	  esac
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    if test "$finalize" = yes && test -z "$run"; then
+	      tmpdir=`func_mktempdir`
+	      file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'`
+	      outputname="$tmpdir/$file"
+	      # Replace the output file specification.
+	      relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP`
+
+	      $show "$relink_command"
+	      if $run eval "$relink_command"; then :
+	      else
+		$echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+		${rm}r "$tmpdir"
+		continue
+	      fi
+	      file="$outputname"
+	    else
+	      $echo "$modename: warning: cannot relink \`$file'" 1>&2
+	    fi
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway 
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'`
+	    ;;
+	  esac
+	  ;;
+	esac
+	$show "$install_prog$stripme $file $destfile"
+	$run eval "$install_prog\$stripme \$file \$destfile" || exit $?
+	test -n "$outputname" && ${rm}r "$tmpdir"
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+
+      $show "$install_prog $file $oldlib"
+      $run eval "$install_prog \$file \$oldlib" || exit $?
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	$show "$old_striplib $oldlib"
+	$run eval "$old_striplib $oldlib" || exit $?
+      fi
+
+      # Do each command in the postinstall commands.
+      cmds=$old_postinstall_cmds
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	eval cmd=\"$cmd\"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$future_libdirs"; then
+      $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+    fi
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      test -n "$run" && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+    ;;
+
+  # libtool finish mode
+  finish)
+    modename="$modename: finish"
+    libdirs="$nonopt"
+    admincmds=
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for dir
+      do
+	libdirs="$libdirs $dir"
+      done
+
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  cmds=$finish_cmds
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $cmds; do
+	    IFS="$save_ifs"
+	    eval cmd=\"$cmd\"
+	    $show "$cmd"
+	    $run eval "$cmd" || admincmds="$admincmds
+       $cmd"
+	  done
+	  IFS="$save_ifs"
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $run eval "$cmds" || admincmds="$admincmds
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    test "$show" = : && exit $EXIT_SUCCESS
+
+    $echo "X----------------------------------------------------------------------" | $Xsed
+    $echo "Libraries have been installed in:"
+    for libdir in $libdirs; do
+      $echo "   $libdir"
+    done
+    $echo
+    $echo "If you ever happen to want to link against installed libraries"
+    $echo "in a given directory, LIBDIR, you must either use libtool, and"
+    $echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+    $echo "flag during linking and do at least one of the following:"
+    if test -n "$shlibpath_var"; then
+      $echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+      $echo "     during execution"
+    fi
+    if test -n "$runpath_var"; then
+      $echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+      $echo "     during linking"
+    fi
+    if test -n "$hardcode_libdir_flag_spec"; then
+      libdir=LIBDIR
+      eval flag=\"$hardcode_libdir_flag_spec\"
+
+      $echo "   - use the \`$flag' linker flag"
+    fi
+    if test -n "$admincmds"; then
+      $echo "   - have your system administrator run these commands:$admincmds"
+    fi
+    if test -f /etc/ld.so.conf; then
+      $echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+    fi
+    $echo
+    $echo "See any operating system documentation about shared libraries for"
+    $echo "more information, such as the ld(1) and ld.so(8) manual pages."
+    $echo "X----------------------------------------------------------------------" | $Xsed
+    exit $EXIT_SUCCESS
+    ;;
+
+  # libtool execute mode
+  execute)
+    modename="$modename: execute"
+
+    # The first argument is the command name.
+    cmd="$nonopt"
+    if test -z "$cmd"; then
+      $echo "$modename: you must specify a COMMAND" 1>&2
+      $echo "$help"
+      exit $EXIT_FAILURE
+    fi
+
+    # Handle -dlopen flags immediately.
+    for file in $execute_dlfiles; do
+      if test ! -f "$file"; then
+	$echo "$modename: \`$file' is not a file" 1>&2
+	$echo "$help" 1>&2
+	exit $EXIT_FAILURE
+      fi
+
+      dir=
+      case $file in
+      *.la)
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+
+	# If there is no directory component, then add one.
+	case $file in
+	*/* | *\\*) . $file ;;
+	*) . ./$file ;;
+	esac
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$dir" = "X$file" && dir=.
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  dir="$dir/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$dir" = "X$file" && dir=.
+	;;
+
+      *)
+	$echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -*) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  # If there is no directory component, then add one.
+	  case $file in
+	  */* | *\\*) . $file ;;
+	  *) . ./$file ;;
+	  esac
+
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+      args="$args \"$file\""
+    done
+
+    if test -z "$run"; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+		$lt_var=\$save_$lt_var; export $lt_var
+	      fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+	$echo "export $shlibpath_var"
+      fi
+      $echo "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+    ;;
+
+  # libtool clean and uninstall mode
+  clean | uninstall)
+    modename="$modename: $mode"
+    rm="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) rm="$rm $arg"; rmforce=yes ;;
+      -*) rm="$rm $arg" ;;
+      *) files="$files $arg" ;;
+      esac
+    done
+
+    if test -z "$rm"; then
+      $echo "$modename: you must specify an RM program" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    rmdirs=
+
+    origobjdir="$objdir"
+    for file in $files; do
+      dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+      if test "X$dir" = "X$file"; then
+	dir=.
+	objdir="$origobjdir"
+      else
+	objdir="$dir/$origobjdir"
+      fi
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+      test "$mode" = uninstall && objdir="$dir"
+
+      # Remember objdir for removal later, being careful to avoid duplicates
+      if test "$mode" = clean; then
+	case " $rmdirs " in
+	  *" $objdir "*) ;;
+	  *) rmdirs="$rmdirs $objdir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if (test -L "$file") >/dev/null 2>&1 \
+	|| (test -h "$file") >/dev/null 2>&1 \
+	|| test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  . $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    rmfiles="$rmfiles $objdir/$n"
+	  done
+	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+
+	  case "$mode" in
+	  clean)
+	    case "  $library_names " in
+	    # "  " in the beginning catches empty $dlname
+	    *" $dlname "*) ;;
+	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
+	    esac
+	     test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      cmds=$postuninstall_cmds
+	      save_ifs="$IFS"; IFS='~'
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd"
+		if test "$?" -ne 0 && test "$rmforce" != yes; then
+		  exit_status=1
+		fi
+	      done
+	      IFS="$save_ifs"
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      cmds=$old_postuninstall_cmds
+	      save_ifs="$IFS"; IFS='~'
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd"
+		if test "$?" -ne 0 && test "$rmforce" != yes; then
+		  exit_status=1
+		fi
+	      done
+	      IFS="$save_ifs"
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+
+	  # Read the .lo file
+	  . $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" \
+	     && test "$pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" \
+	     && test "$non_pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    file=`$echo $file|${SED} 's,.exe$,,'`
+	    noexename=`$echo $name|${SED} 's,.exe$,,'`
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    rmfiles="$rmfiles $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	    relink_command=
+	    . $dir/$noexename
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      rmfiles="$rmfiles $objdir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      $show "$rm $rmfiles"
+      $run $rm $rmfiles || exit_status=1
+    done
+    objdir="$origobjdir"
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	$show "rmdir $dir"
+	$run rmdir $dir >/dev/null 2>&1
+      fi
+    done
+
+    exit $exit_status
+    ;;
+
+  "")
+    $echo "$modename: you must specify a MODE" 1>&2
+    $echo "$generic_help" 1>&2
+    exit $EXIT_FAILURE
+    ;;
+  esac
+
+  if test -z "$exec_cmd"; then
+    $echo "$modename: invalid operation mode \`$mode'" 1>&2
+    $echo "$generic_help" 1>&2
+    exit $EXIT_FAILURE
+  fi
+fi # test -z "$show_help"
+
+if test -n "$exec_cmd"; then
+  eval exec $exec_cmd
+  exit $EXIT_FAILURE
+fi
+
+# We need to display help for each of the modes.
+case $mode in
+"") $echo \
+"Usage: $modename [OPTION]... [MODE-ARG]...
+
+Provide generalized library-building support services.
+
+    --config          show all configuration variables
+    --debug           enable verbose shell tracing
+-n, --dry-run         display commands without modifying any files
+    --features        display basic configuration information and exit
+    --finish          same as \`--mode=finish'
+    --help            display this help message and exit
+    --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]
+    --quiet           same as \`--silent'
+    --silent          don't print informational messages
+    --tag=TAG         use configuration variables from tag TAG
+    --version         print version information
+
+MODE must be one of the following:
+
+      clean           remove files from the build directory
+      compile         compile a source file into a libtool object
+      execute         automatically set library path, then run a program
+      finish          complete the installation of libtool libraries
+      install         install libraries or executables
+      link            create a library or an executable
+      uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE.
+
+Report bugs to <bug-libtool@gnu.org>."
+  exit $EXIT_SUCCESS
+  ;;
+
+clean)
+  $echo \
+"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+  ;;
+
+compile)
+  $echo \
+"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -prefer-pic       try to building PIC objects only
+  -prefer-non-pic   try to building non-PIC objects only
+  -static           always build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+  ;;
+
+execute)
+  $echo \
+"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+  ;;
+
+finish)
+  $echo \
+"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+  ;;
+
+install)
+  $echo \
+"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+  ;;
+
+link)
+  $echo \
+"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+  ;;
+
+uninstall)
+  $echo \
+"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+  ;;
+
+*)
+  $echo "$modename: invalid operation mode \`$mode'" 1>&2
+  $echo "$help" 1>&2
+  exit $EXIT_FAILURE
+  ;;
+esac
+
+$echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit $?
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+disable_libs=shared
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+disable_libs=static
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/cmm/missing b/cmm/missing
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cmm/missing
diff --git a/cmm/src/Makefile.am b/cmm/src/Makefile.am
new file mode 100644
index 0000000..7ee3f55
--- /dev/null
+++ b/cmm/src/Makefile.am
@@ -0,0 +1,62 @@
+AM_CFLAGS = -O2 -g -Wall -Werror
+
+CMM_VERSION_FILE = version.h
+GIT_DIR = ../.git
+
+BUILT_SOURCES = version
+
+version:
+	if [ -d $(GIT_DIR) ] ; then \
+		echo retreiving cmm version from git ; \
+		git describe --always --tags --dirty ; \
+		CMM_GIT_VERSION=`git describe --dirty --always --tags` ; \
+		printf "/*Auto-generated file. Do not edit !*/\n#ifndef VERSION_H\n#define VERSION_H\n\n#define CMM_VERSION \"$${CMM_GIT_VERSION}\"\n\n#endif /* VERSION_H */\n" > $(CMM_VERSION_FILE) ; \
+	fi
+
+
+bin_PROGRAMS = cmm libcmm_sample
+
+cmm_SOURCES = 	neighbor_resolution.c  \
+		module_expt.c  \
+		cmm.c  \
+		conntrack.c  \
+		ffcontrol.c  \
+		forward_engine.c  \
+		route_cache.c \
+		pppoe.c \
+		ffbridge.c \
+		client_daemon.c  \
+		rtnl.c		\
+		module_rx.c  \
+		module_qm.c  \
+		module_prf.c \
+		module_vlan.c \
+		module_macvlan.c \
+		module_mcast.c \
+		module_mc6.c \
+		module_mc4.c \
+		keytrack.c \
+		timeout.c \
+		module_tunnel.c \
+		module_relay.c \
+		itf.c \
+		module_stat.c \
+		module_route.c \
+		module_socket.c \
+		module_rtp.c \
+		module_natpt.c \
+		module_wifi.c \
+		alt_conf.c \
+		voicebuf.c \
+		module_pktcap.c \
+		module_icc.c \
+		third_part.c \
+		cmm_asym_ff.c
+
+cmm_LDADD = -lpthread -lfci -lcli -lcmm -lpcap @CMM_LIBS@
+
+libcmm_sample_SOURCES = libcmm_sample.c
+libcmm_sample_LDADD = -lcmm
+
+lib_LTLIBRARIES = libcmm.la
+libcmm_la_SOURCES = libcmm.c
diff --git a/cmm/src/Makefile.in b/cmm/src/Makefile.in
new file mode 100644
index 0000000..09d0125
--- /dev/null
+++ b/cmm/src/Makefile.in
@@ -0,0 +1,616 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = cmm$(EXEEXT) libcmm_sample$(EXEEXT)
+subdir = src
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)"
+libLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(lib_LTLIBRARIES)
+libcmm_la_LIBADD =
+am_libcmm_la_OBJECTS = libcmm.lo
+libcmm_la_OBJECTS = $(am_libcmm_la_OBJECTS)
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_cmm_OBJECTS = neighbor_resolution.$(OBJEXT) module_expt.$(OBJEXT) \
+	cmm.$(OBJEXT) conntrack.$(OBJEXT) ffcontrol.$(OBJEXT) \
+	forward_engine.$(OBJEXT) route_cache.$(OBJEXT) pppoe.$(OBJEXT) \
+	ffbridge.$(OBJEXT) client_daemon.$(OBJEXT) rtnl.$(OBJEXT) \
+	module_rx.$(OBJEXT) module_qm.$(OBJEXT) module_prf.$(OBJEXT) \
+	module_vlan.$(OBJEXT) module_macvlan.$(OBJEXT) \
+	module_mcast.$(OBJEXT) module_mc6.$(OBJEXT) \
+	module_mc4.$(OBJEXT) keytrack.$(OBJEXT) timeout.$(OBJEXT) \
+	module_tunnel.$(OBJEXT) module_relay.$(OBJEXT) itf.$(OBJEXT) \
+	module_stat.$(OBJEXT) module_route.$(OBJEXT) \
+	module_socket.$(OBJEXT) module_rtp.$(OBJEXT) \
+	module_natpt.$(OBJEXT) module_wifi.$(OBJEXT) \
+	alt_conf.$(OBJEXT) voicebuf.$(OBJEXT) module_pktcap.$(OBJEXT) \
+	module_icc.$(OBJEXT) third_part.$(OBJEXT) cmm_asym_ff.$(OBJEXT) \
+	module_l2tp.$(OBJEXT)
+cmm_OBJECTS = $(am_cmm_OBJECTS)
+cmm_DEPENDENCIES =
+am_libcmm_sample_OBJECTS = libcmm_sample.$(OBJEXT)
+libcmm_sample_OBJECTS = $(am_libcmm_sample_OBJECTS)
+libcmm_sample_DEPENDENCIES =
+DEFAULT_INCLUDES = -I. -I$(srcdir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libcmm_la_SOURCES) $(cmm_SOURCES) $(libcmm_sample_SOURCES)
+DIST_SOURCES = $(libcmm_la_SOURCES) $(cmm_SOURCES) \
+	$(libcmm_sample_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CMM_LIBS = @CMM_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBNFCONNTRACK_CFLAGS = @LIBNFCONNTRACK_CFLAGS@
+LIBNFCONNTRACK_LIBS = @LIBNFCONNTRACK_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AM_CFLAGS = -O2 -g -Wall -Werror
+CMM_VERSION_FILE = version.h
+GIT_DIR = ../.git
+BUILT_SOURCES = version
+cmm_SOURCES = neighbor_resolution.c  \
+		module_expt.c  \
+		cmm.c  \
+		cmm_asym_ff.c  \
+		conntrack.c  \
+		ffcontrol.c  \
+		forward_engine.c  \
+		route_cache.c \
+		pppoe.c \
+		ffbridge.c \
+		client_daemon.c  \
+		rtnl.c		\
+		module_rx.c  \
+		module_qm.c  \
+		module_prf.c \
+		module_vlan.c \
+		module_macvlan.c \
+		module_mcast.c \
+		module_mc6.c \
+		module_mc4.c \
+		keytrack.c \
+		timeout.c \
+		module_tunnel.c \
+		module_relay.c \
+		itf.c \
+		module_stat.c \
+		module_route.c \
+		module_socket.c \
+		module_rtp.c \
+		module_natpt.c \
+		module_wifi.c \
+		alt_conf.c \
+		voicebuf.c \
+		module_pktcap.c \
+		module_icc.c \
+		third_part.c \
+		module_l2tp.c
+
+cmm_LDADD = -lpthread -lfci -lcli -lcmm -lpcap @CMM_LIBS@
+libcmm_sample_SOURCES = libcmm_sample.c
+libcmm_sample_LDADD = -lcmm
+lib_LTLIBRARIES = libcmm.la
+libcmm_la_SOURCES = libcmm.c
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    f=$(am__strip_dir) \
+	    echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+	    $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+	  else :; fi; \
+	done
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  p=$(am__strip_dir) \
+	  echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+	  $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+libcmm.la: $(libcmm_la_OBJECTS) $(libcmm_la_DEPENDENCIES) 
+	$(LINK) -rpath $(libdir) $(libcmm_la_LDFLAGS) $(libcmm_la_OBJECTS) $(libcmm_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	     || test -f $$p1 \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
+	done
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
+	done
+cmm$(EXEEXT): $(cmm_OBJECTS) $(cmm_DEPENDENCIES) 
+	@rm -f cmm$(EXEEXT)
+	$(LINK) $(cmm_LDFLAGS) $(cmm_OBJECTS) $(cmm_LDADD) $(LIBS)
+libcmm_sample$(EXEEXT): $(libcmm_sample_OBJECTS) $(libcmm_sample_DEPENDENCIES) 
+	@rm -f libcmm_sample$(EXEEXT)
+	$(LINK) $(libcmm_sample_LDFLAGS) $(libcmm_sample_OBJECTS) $(libcmm_sample_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alt_conf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client_daemon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmm_asym_ff.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conntrack.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffbridge.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffcontrol.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/forward_engine.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/itf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keytrack.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmm.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcmm_sample.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_expt.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_icc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_macvlan.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_mc4.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_mc6.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_mcast.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_natpt.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_pktcap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_prf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_qm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_relay.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_route.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_rtp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_rx.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_socket.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_stat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_tunnel.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_vlan.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_wifi.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/neighbor_resolution.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pppoe.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/route_cache.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtnl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/third_part.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timeout.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/voicebuf.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '    { files[$$0] = 1; } \
+	       END { for (i in files) print i; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+	list='$(DISTFILES)'; for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+	  esac; \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+	    dir="/$$dir"; \
+	    $(mkdir_p) "$(distdir)$$dir"; \
+	  else \
+	    dir=''; \
+	  fi; \
+	  if test -d $$d/$$file; then \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS)
+install-binPROGRAMS: install-libLTLIBRARIES
+
+installdirs:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
+	done
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
+	clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS install-libLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am \
+	uninstall-libLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+	clean-generic clean-libLTLIBRARIES clean-libtool ctags \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-exec install-exec-am \
+	install-info install-info-am install-libLTLIBRARIES \
+	install-man install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+	uninstall-am uninstall-binPROGRAMS uninstall-info-am \
+	uninstall-libLTLIBRARIES
+
+
+version:
+	if [ -d $(GIT_DIR) ] ; then \
+		echo retreiving cmm version from git ; \
+		git describe --always --tags --dirty ; \
+		CMM_GIT_VERSION=`git describe --dirty --always --tags` ; \
+		printf "/*Auto-generated file. Do not edit !*/\n#ifndef VERSION_H\n#define VERSION_H\n\n#define CMM_VERSION \"$${CMM_GIT_VERSION}\"\n\n#endif /* VERSION_H */\n" > $(CMM_VERSION_FILE) ; \
+	fi
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/cmm/src/alt_conf.c b/cmm/src/alt_conf.c
new file mode 100644
index 0000000..9f65dda
--- /dev/null
+++ b/cmm/src/alt_conf.c
@@ -0,0 +1,206 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+#include "cmm.h"
+#include "fpp.h"
+
+#include <net/if.h>
+#include <linux/if_vlan.h>
+#include <linux/sockios.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+
+
+/*
+** cmmAltconfClient
+** Client side demux - check input and find client side processor for it
+*/
+int cmmAltConfClient(int argc,char **argv,int firstarg ,daemon_handle_t daemon_handle)
+{
+	unsigned int option_id;
+	unsigned int num_params;
+	unsigned int params[FPP_ALTCONF_OPTION_MAX_PARAMS];
+        char * endptr;
+        unsigned int tmp;
+
+	cmm_print(DEBUG_COMMAND, "cmmAltConfClient\n");
+	if(!argv[firstarg])
+		goto usage;
+
+	if (argc <= firstarg) 
+		goto usage;
+
+	/* get option ID */
+	if (strncasecmp(argv[firstarg], "all", 1) == 0) {
+		if(argc < 2)
+			goto usage;
+		cmm_print(DEBUG_COMMAND, "cmmAltConfClient: ALTCONF_OPTION_ALL / ALTCONF_ALL_NUM_PARAMS (argc %d)\n", argc);
+		option_id = FPP_ALTCONF_OPTION_ALL; 
+		num_params = FPP_ALTCONF_ALL_NUM_PARAMS;
+		if (strncasecmp(argv[firstarg+1], "default", 1) == 0)
+			return altconfResetProcess(daemon_handle);
+		else
+			goto usage; 
+	}
+	else if (strncasecmp(argv[firstarg], "mcttl", 1) == 0) {
+		if(argc < 2)
+			goto usage;
+		cmm_print(DEBUG_COMMAND, "cmmAltConfClient: ALTCONF_OPTION_MCTTL / ALTCONF_MCTTL_NUM_PARAMS (argc %d)\n", argc);
+		option_id = FPP_ALTCONF_OPTION_MCTTL; 
+		num_params = FPP_ALTCONF_MCTTL_NUM_PARAMS;
+		if (strncasecmp(argv[firstarg+1], "default", 1) == 0)
+			params[0] = FPP_ALTCONF_MCTTL_MODE_DEFAULT;
+		else if	(strncasecmp(argv[firstarg+1], "ignore", 1) == 0)
+			params[0] = FPP_ALTCONF_MCTTL_MODE_IGNORE;
+		else
+			goto usage;	
+
+		return altconfSetProcess(daemon_handle, option_id, num_params, params);
+	}
+	else if (strcasecmp(argv[firstarg], "ipsecrl") == 0) {
+		if(argc < 2)
+			goto usage;
+		cmm_print(DEBUG_COMMAND, "cmmAltConfClient: ALTCONF_OPTION_IPSECRL / ALTCONF_MCTTL_NUM_PARAMS (argc %d)\n", argc);
+		option_id = FPP_ALTCONF_OPTION_IPSECRL; 
+		num_params = FPP_ALTCONF_IPSECRL_NUM_PARAMS;
+		if(!argv[firstarg+1])
+			goto usage;
+
+		if (strcasecmp(argv[firstarg+1], "on") == 0){
+			params[0] = FPP_ALTCONF_IPSECRL_ON; /* Setting action as on */
+			if((argv[firstarg+2] != NULL) && (strcasecmp(argv[firstarg+2], "rate") == 0))
+			{
+				if(!argv[firstarg+3])
+					goto usage;
+
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(argv[firstarg+3], &endptr, 0);
+				if ((argv[firstarg+3] == endptr) || (tmp < 8) || (tmp > ULONG_MAX))
+				{
+					cmm_print(DEBUG_CRIT, "rate_limiting ERROR: rate must be a number between 8 and %d (Kbps)\n", (unsigned int)ULONG_MAX);
+					goto usage;
+				}
+
+				params[1] = tmp; /* Setting bandwidth */
+				params[2] = 0; /* Setting bucketsize as bucketsize parameter is option. FPP sets to default value */
+			}
+			else
+			 goto usage;
+
+			/* bucket_size parameter is optional */
+			if((argv[firstarg+4] != NULL) && (strcasecmp(argv[firstarg+4], "bucket_size") == 0))
+			{
+				if(!argv[firstarg+5])
+					goto usage;
+
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(argv[firstarg+5], &endptr, 0);
+				if ((argv[firstarg+5] == endptr) || (tmp < 8) || (tmp > ULONG_MAX))
+				{
+					cmm_print(DEBUG_CRIT, "rate_limiting ERROR: bucket_size must be a number between 8 and %d\n", (unsigned int)ULONG_MAX);
+					goto usage;
+				}
+
+				params[2] = tmp; /* Setting bucket size */
+			}
+			
+                }
+		else if	(strcasecmp(argv[firstarg+1], "off") == 0)
+		{
+			params[0] = FPP_ALTCONF_IPSECRL_OFF; /* Setting action as off */
+                }
+		else
+			goto usage;	
+
+		return altconfSetProcess(daemon_handle, option_id, num_params, params);
+	}
+	else
+		goto usage;
+
+usage:
+	cmm_print(DEBUG_STDOUT, "Usage:\n\tconfig [option] [mode]\n");
+	cmm_print(DEBUG_STDOUT, "\tconfig mcttl default\n");
+	cmm_print(DEBUG_STDOUT, "\tconfig mcttl ignore\n");
+	cmm_print(DEBUG_STDOUT, "\tconfig ipsecrl {on|off}\n"
+                                    "\t\trate {Kbps}\n"
+                                    "\t\t[bucket_size {bits}]\n");
+	cmm_print(DEBUG_STDOUT, "\tconfig all default\n");
+	return 0;  
+}
+
+
+/*
+** altconfResetProcess
+** 
+*/
+int altconfResetProcess(daemon_handle_t daemon_handle)
+{
+	unsigned char rspbuf[512];
+	unsigned short rsplen;
+
+	 cmm_print(DEBUG_COMMAND, "altconfResetProcess\n");
+
+	if (((rsplen = cmmSendToDaemon(daemon_handle,FPP_CMD_ALTCONF_RESET,NULL,0,rspbuf)) < sizeof(unsigned short) ) || cmmDaemonCmdRC(rspbuf))
+	{
+		cmm_print(DEBUG_STDERR, "Error sending CMD_ALTCONF_RESET Register\n");
+		/*  break; */ return 0;
+	}  
+
+	return 0;
+}
+
+
+/*
+** altconfSetProcess
+**
+*/
+int altconfSetProcess(daemon_handle_t daemon_handle, unsigned int option_id, unsigned int num_params, unsigned int *params)
+{
+	unsigned char rspbuf[512];
+	unsigned short rsplen;
+	fpp_alt_set_cmd_t cmd;
+	int i;
+
+	cmm_print(DEBUG_COMMAND, "altconfSetProcess optionID 0x%04x, num_params %d\n", option_id, num_params);
+
+	cmd.option_id = option_id;
+	cmd.num_params = num_params;
+
+	for(i = 0; i < num_params; i++) {
+		cmd.params[i] = params[i];
+		cmm_print(DEBUG_COMMAND, "altconfSetProcess params[%d] 0x%x\n", i, params[i]);
+	}
+
+	if (((rsplen = cmmSendToDaemon(daemon_handle,FPP_CMD_ALTCONF_SET,&cmd,sizeof(cmd),rspbuf)) < sizeof(unsigned short) ) ||	cmmDaemonCmdRC(rspbuf))
+	{
+		cmm_print(DEBUG_STDERR, "Error sending CMD_ALTCONF_SET Register\n");
+		/*  break; */ return 0;
+	}  
+
+	return 0;
+
+}
+
+
+
+
diff --git a/cmm/src/alt_conf.h b/cmm/src/alt_conf.h
new file mode 100644
index 0000000..5425ee5
--- /dev/null
+++ b/cmm/src/alt_conf.h
@@ -0,0 +1,28 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __ALT_CONF_H__
+#define __ALT_CONF_H__
+
+int cmmAltConfClient(int argc, char **argv, int firstarg, daemon_handle_t daemon_handle);
+int altconfResetProcess(daemon_handle_t daemon_handle);
+int altconfSetProcess(daemon_handle_t daemon_handle, unsigned int option_id, unsigned int num_params, unsigned int *params);
+
+#endif
+
diff --git a/cmm/src/client_daemon.c b/cmm/src/client_daemon.c
new file mode 100644
index 0000000..40314e7
--- /dev/null
+++ b/cmm/src/client_daemon.c
@@ -0,0 +1,1389 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+
+#include "cmm.h"
+#include "libcmm.h"
+#include "fpp.h"
+#include "cmmd.h"
+#include "voicebuf.h"
+
+int dumpmem(int argc, char *argv[]);
+
+#ifndef caseretstr
+#define caseretstr(x) case x: return #x
+#endif
+
+char * getErrorString(unsigned short error)
+{
+	switch (error)
+	{
+	/* common errors */
+	caseretstr(FPP_ERR_UNKNOWN_COMMAND);
+	caseretstr(FPP_ERR_WRONG_COMMAND_SIZE);
+	caseretstr(FPP_ERR_WRONG_COMMAND_PARAM);
+	caseretstr(FPP_ERR_UNKNOWN_ACTION);
+
+	caseretstr(FPP_ERR_CT_ENTRY_ALREADY_REGISTERED);
+	caseretstr(FPP_ERR_CT_ENTRY_NOT_FOUND);
+
+	caseretstr(FPP_ERR_RT_ENTRY_ALREADY_REGISTERED);
+	caseretstr(FPP_ERR_RT_ENTRY_NOT_FOUND);
+
+	caseretstr(FPP_ERR_VLAN_ENTRY_ALREADY_REGISTERED);
+	caseretstr(FPP_ERR_VLAN_ENTRY_NOT_FOUND);
+
+	caseretstr(FPP_ERR_PPPOE_ENTRY_ALREADY_REGISTERED);
+	caseretstr(FPP_ERR_PPPOE_ENTRY_NOT_FOUND);
+
+	caseretstr(FPP_ERR_TNL_ENTRY_NOT_FOUND);
+	caseretstr(FPP_ERR_SA_ENTRY_NOT_FOUND);
+	caseretstr(FPP_ERR_MC_ENTRY_NOT_FOUND);
+
+	/* rtp stats errors */
+	caseretstr(FPP_ERR_SOCK_ALREADY_OPEN);
+	caseretstr(FPP_ERR_SOCKID_ALREADY_USED);
+	caseretstr(FPP_ERR_SOCK_ALREADY_OPENED_WITH_OTHER_ID);
+	caseretstr(FPP_ERR_TOO_MANY_SOCKET_OPEN);
+	caseretstr(FPP_ERR_SOCKID_UNKNOWN);
+	caseretstr(FPP_ERR_SOCK_ALREADY_IN_USE);
+	caseretstr(FPP_ERR_RTP_CALLID_IN_USE);
+	caseretstr(FPP_ERR_RTP_UNKNOWN_CALL);
+	caseretstr(FPP_ERR_WRONG_SOCKID);
+	caseretstr(FPP_ERR_RTP_SPECIAL_PKT_LEN);
+	caseretstr(FPP_ERR_RTP_CALL_TABLE_FULL);
+	caseretstr(FPP_ERR_WRONG_SOCK_FAMILY);
+	caseretstr(FPP_ERR_WRONG_SOCK_PROTO);
+	caseretstr(FPP_ERR_WRONG_SOCK_TYPE);
+
+	/* rtp stats errors */
+	caseretstr(FPP_ERR_RTP_STATS_MAX_ENTRIES);
+	caseretstr(FPP_ERR_RTP_STATS_STREAMID_ALREADY_USED);
+	caseretstr(FPP_ERR_RTP_STATS_STREAMID_UNKNOWN);
+	caseretstr(FPP_ERR_RTP_STATS_DUPLICATED);
+	caseretstr(FPP_ERR_RTP_STATS_WRONG_DTMF_PT);
+	caseretstr(FPP_ERR_RTP_STATS_WRONG_TYPE);
+
+	default:
+		return (char *) "Unknown error code";
+	}
+}
+
+
+/*****************************************************************
+ * cmmClientPrintHelp()
+ *
+ *      Print command syntax
+ *  
+ *****************************************************************/
+void cmmClientPrintHelp()
+{
+	
+	/*
+	 * The commands syntax must be:
+	 *    <set / show>  <module name>  <option1> <value1> <option2> <value2> .... 
+	 */
+
+	cmm_print(DEBUG_STDOUT, "Command usage: set <module_name> [option ...]\n"
+									"\trx: Manage RX module (ICC, Bridging  ...)\n"
+									"\tqm: Manage QM module (QOS, Rate Limiting ...)\n"
+									"\tmc6:	Manage IPv6 Multicast module\n"
+									"\tmc4:	Manage IPv4 Multicast module\n"
+                                    					"\tstat: Manage Statistics module\n"
+									"\troute: Manage Extended Route module\n"
+									"\tconfig: Manage Alternate Configurations\n"
+									"\tsocket: Manage Socket module\n"
+									"\tsocket6: Manage V6 socket module\n"
+									"\trtp: Manage RTP Relay module\n"
+									"\tnatpt: Manage NAT-PT module\n"
+									"\tsa_query_timer: Manage IPsec SA query timer module\n"
+#ifdef C2000_DPI
+									"\tdpi: Manage DPI Enable/disable\n"
+#endif
+									"\tasym_fastforward: Manage Asymmetric Fastforward Enable/disable\n"
+									"\trtpstats: Manage RTP Stats for Fast Forwarded connections\n"
+									"\tbridge: Manage bridge (timeout)\n"
+									"\ttimeout: set timeout for udp/tc flows\n"
+									"\texpt_queue: manage queue configurations\n"
+									"\tff: manage fast forwarding control\n"
+									"\tipsec: manage ipsec configurations\n"
+									"\tvoicebuf: manage voicebuf control \n"
+									"\tfrag: manage ipv4/ipv6 fragmentation configurations\n"		
+									"\t4rd-id-conversion: Enable/ Disable IPv4 header Identification conversion,\n"
+									"\t\tfor 4rd interfaces\n");
+	cmm_print(DEBUG_STDOUT, "\nCommand usage: show <module_name> [option ...]\n"
+									"\trx: show RX module (ICC, Bridging  ...)\n"
+									"\tqm: show QM module (QOS, Rate Limiting ...)\n"
+									"\tmc6:	show IPv6 Multicast module\n"
+									"\tmc4:	show  IPv4 Multicast module\n"
+                                    					"\tstat: show Statistics module\n"
+									"\troute: show Extended Route module\n"
+									"\tsocket: show Socket module\n"
+									"\tsocket6: show V6 socket module\n");
+	cmm_print(DEBUG_STDOUT, "\nCommand usage: query < module_name> \n"
+                              						"\trx: Receive (bridge)\n"
+                              						"\tvlan: VLAN devices\n"
+                              						"\tpppoe: PPPoE Sessions\n"
+                              						"\tsa: SA Entries\n"
+                              						"\tmc6: IPv6 Multicast Entries\n"
+                              						"\tmc4:	IPv4 Multicast Entries\n"
+                              						"\tqm: QOS information\n"
+                              						"\tqmexptrate: Exception Rate\n"
+                              						"\tconnections: IPV4 connections\n"
+                              						"\troute: IP routes\n"
+                              						"\tv6connections: IPV6 Connections\n"
+									"\tsocket: IPV4 sockets\n"
+									"\trtcp: RTP relay statistics\n"
+									"\trtpstats: RTP statistics for Fast Forwarded connections\n"
+				  					"\tnatpt: NAT-PT Entries\n"
+				  					"\tl2flows: L2 and L3-4 flows Entries\n"
+									"\tmacvlan: Mac-vlan interfaces\n"
+									"\ttunnels: tunnel interfaces\n");
+
+	cmm_print(DEBUG_STDOUT, "\nCommand usage: { msp | dm | prf | tunnel | relay | vlan | pktcapture | icc | ipv4 |ipv6 } <options> \n");
+
+}
+
+/*****************************************************************
+ * cmmSendToDaemon()
+ *
+ *      This function sends a message to cmm daemon
+ *      and waits for the answer.
+ *  
+ *****************************************************************/
+int cmmSendToDaemon(daemon_handle_t handle, unsigned short commandCode, void * dataToSend, int dataSize, void* dataToRcv)
+{
+	int rcvBytes = 0;
+#ifdef NEW_IPC
+	cmm_command_t cmd;
+	cmm_response_t res;
+
+	cmd.func = commandCode;
+	cmd.length = dataSize;
+	memcpy(cmd.buf, dataToSend, dataSize);
+
+	if(cmm_send(handle, &cmd, 0) < 0)
+	{
+		cmm_print(DEBUG_STDERR, "%s: cmm_send failed, %s\n", __func__, strerror(errno));
+		return -1;
+	}
+
+	rcvBytes = cmm_recv(handle, &res, 0);
+	if (rcvBytes < 0)
+	{
+		cmm_print(DEBUG_STDERR, "%s: cmm_recv failed, %s\n", __func__, strerror(errno));
+		return rcvBytes;
+	}
+
+	if (dataToRcv) {
+		/* XXX: to have same output as with old IPC,
+		 * this should be refactored
+		 */
+		memcpy(dataToRcv, res.buf, res.length);
+	}
+
+	rcvBytes = res.length;
+#else
+	int queueIdRx;
+	int queueIdTx;
+	struct cmm_msg msg;
+	key_t key;
+
+	handle = ((handle & 0xff) ^ ((handle >> 8) & 0xff)) | 1;
+
+	key = ftok("/tmp", handle);
+	if (key == (key_t)-1)
+	{
+		cmm_print(DEBUG_STDERR, "%s: ftok(%d) failed, %s\n", __func__, handle, strerror(errno));
+		return -1;
+	}
+
+	queueIdRx = msgget(key, 0);
+	if (queueIdRx < 0)
+	{
+		cmm_print(DEBUG_STDERR, "%s: rx msgget() failed, %s\n", __func__, strerror(errno));
+		return -1;
+	}
+
+	key = ftok("/tmp", handle ^ 0xff);
+	if (key == (key_t)-1)
+	{
+		cmm_print(DEBUG_STDERR, "%s: ftok(%d) failed, %s\n", __func__, handle ^ 0xff, strerror(errno));
+		return -1;
+	}
+
+	queueIdTx = msgget(key, 0);
+	if (queueIdTx < 0)
+	{
+		cmm_print(DEBUG_STDERR, "%s: tx msgget() failed, %s\n", __func__, strerror(errno));
+		return -1;
+	}
+
+	if (dataSize > sizeof(msg.buffer))
+		return -1;
+
+	msg.mtype = commandCode;
+	if (dataToSend)
+		memcpy(msg.buffer, dataToSend, dataSize);
+
+#if 0
+	if ((globalConf.debug_level & DEBUG_INFO) || (globalConf.log_level & DEBUG_INFO))
+	{
+		int rcvDataSize;
+		cmm_print(DEBUG_INFO, "commandCode: (%04x) \n", (unsigned int)msg.mtype);
+		for(rcvDataSize = 0; rcvDataSize < dataSize; rcvDataSize+=2)
+		{
+			cmm_print(DEBUG_INFO, "%02x%02x \n", msg.buffer[rcvDataSize + 1], msg.buffer[rcvDataSize]);
+		}
+		cmm_print(DEBUG_INFO, "\n");
+	}
+#endif
+
+	if (msgsnd(queueIdTx, &msg, dataSize, 0) < 0)
+	{
+		cmm_print(DEBUG_STDERR, "%s: msgsnd() failed, %s\n", __func__, strerror(errno));
+		return -1;
+	}
+
+	// Now wait for an answer
+	if ((rcvBytes = msgrcv(queueIdRx, &msg, sizeof(msg.buffer), commandCode, 0)) < 0)
+	{
+		// Error !!
+		cmm_print(DEBUG_STDERR, "%s: msgrcv() failed, %s\n", __func__, strerror(errno));
+		return -1;
+	}
+
+#if 0
+	if ((globalConf.debug_level & DEBUG_INFO) || (globalConf.log_level & DEBUG_INFO))
+	{
+		int rcvDataSize;
+		cmm_print(DEBUG_INFO, "commandAck:  (%04x) \n", (unsigned int)msg.mtype);
+		for(rcvDataSize = 0; rcvDataSize < rcvBytes ; rcvDataSize += 2)
+		{
+			cmm_print(DEBUG_INFO, "%04x \n", ((unsigned short *)msg.buffer)[rcvDataSize]);
+		}
+		cmm_print(DEBUG_INFO, "\n");
+	}
+#endif
+
+	if ((dataToRcv) && (rcvBytes))
+		memcpy(dataToRcv, msg.buffer, rcvBytes);
+#endif
+	return (rcvBytes );
+}
+
+
+/*****************************************************************
+ * cmmClientCommandParser()
+ *
+ *      cmm client command parser
+ *  
+ *****************************************************************/
+int cmmClientProcessCmd(char * command, int argc, char ** argv, daemon_handle_t daemon_handle)
+{
+	char * keywords[128];	/*We allow up to 256 keywords*/
+	int cpt,i;
+	char *saveptr, *strl = NULL;
+	if ((command == NULL) && (argc == 0))
+	  goto help;
+	/*
+	 * First split the string to get 
+	 * each keywords in a separate buffer
+	 */
+	if (command ) {
+	for (cpt = 0, strl = command; cpt < 128 ; cpt++, strl = NULL)
+	{
+		keywords[cpt] = strtok_r(strl, " ", &saveptr);
+		if(keywords[cpt] == NULL)
+			break;
+	}
+	} else {
+	  cpt = 0;
+	}
+	for(i=0; (i < argc) && (cpt < 128); i++) {
+	  keywords[cpt] = argv[i];
+	  cpt++;
+	}
+	if (cpt < 128)
+	  keywords[cpt] = NULL;
+	// We nead at least 2 keywords to perform the parsing
+	if(cpt < 1)
+		goto help;
+
+	/*
+	 * Check if first keyword is correct
+	 */
+	if(strcasecmp(keywords[0], "set")== 0)
+	{
+	  	if(cpt < 2)
+	    		goto help;
+		if (strcasecmp(keywords[1], "rx") == 0)
+		{
+			/*Call Rx process function*/
+			if (cmmRxSetProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "qm") == 0)
+		{
+			/*Call QM process function*/
+			if(cmmQmSetProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "mc6") == 0)
+		{
+			/*Call QM process function*/
+			if(cmmMc6SetProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "mc4") == 0)
+		{
+			/*Call QM process function*/
+			if(cmmMc4SetProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "timeout") == 0)
+		{
+			if(cmmtimeoutSet(daemon_handle, keywords, cpt, 2))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "stat") == 0)
+		{
+			if(cmmStatSetProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "expt_queue") == 0)
+		{
+			if(cmmExptSetProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "ff") == 0)
+		{
+			if(cmmFFControlProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "route") == 0)
+		{
+			if(cmmRouteSetProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "sa_query_timer") == 0)
+		{
+			if(cmmDPDSaQuerySetProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+#ifdef C2000_DPI
+		else if (strcasecmp(keywords[1], "dpi") == 0)
+		{
+			if(cmmDPIFlagSetProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+#endif
+		else if (strcasecmp(keywords[1], "asym_fastforward") == 0)
+		{
+			if(cmmAsymFFSetProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "config") == 0)
+		{
+			if (cmmAltConfClient(cpt,keywords,2,daemon_handle))
+				return -1;
+
+		}
+		else if (strcasecmp(keywords[1], "ipsec") == 0)
+		{
+			if(cmmIPsecSetProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "rtp") == 0)
+		{
+			if (cmmRTPSetProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (!strcasecmp(keywords[1], "socket") || !strcasecmp(keywords[1], "socket6"))
+		{
+			if (cmmSocketSetProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "rtpstats") == 0)
+		{
+			if (cmmRTPStatsSetProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "natpt") == 0)
+		{
+			if (cmmNATPTSetProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "voicebuf") == 0)
+		{
+			if (cmmVoiceBufSetProcess(cpt - 2, &keywords[2], daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "frag") == 0)
+		{
+			if (cmmFragTimeoutSet(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "bridge") == 0)
+		{
+			if (cmmBridgeControlProcess(keywords, 2, daemon_handle))
+				return -1;
+		}		
+		else if (strcasecmp(keywords[1], "4rd-id-conversion") == 0)
+		{
+			if (cmm4rdIdConvSetProcess(keywords, 2, (cpt - 2), daemon_handle))
+				return -1;
+		}
+		else
+			goto help;
+	}
+	else if (strcasecmp(keywords[0], "show") == 0)
+	{
+	  	if(cpt < 2)
+	    		goto help;
+		
+		if (strcasecmp(keywords[1], "rx") == 0)
+		{
+			/*Call Rx process function*/
+			if (cmmRxShowProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "qm") == 0)
+		{
+			/*Call QM process function*/
+			if(cmmQmShowProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "mc6") == 0)
+		{
+			/*Call QM process function*/
+			if(cmmMc6ShowProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "mc4") == 0)
+		{
+			/*Call QM process function*/
+			if(cmmMc4ShowProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "stat") == 0)
+		{
+			/*Call Stat process function*/
+			if(cmmStatShowProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "expt") == 0)
+		{
+			/*Call QM process function*/
+			if(cmmExptShowProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "route") == 0)
+		{
+			if(cmmRouteShowProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (!strcasecmp(keywords[1], "socket") || !strcasecmp(keywords[1], "socket6"))
+		{
+			if(cmmSocketShowProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else
+			goto help;
+	}
+	else if (strcasecmp(keywords[0], "query") == 0)
+	{
+	  	if(cpt < 2)
+	    		goto help;
+		
+		if (strcasecmp(keywords[1], "rx") == 0)
+		{
+			/*Call Rx process function*/
+			if (cmmRxQueryProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "qm") == 0)
+		{
+			/*Call QM process function*/
+			if(cmmQmQueryProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "qmexptrate") == 0)
+		{
+			/*Call QM process function*/
+			if(cmmQmExptRateQueryProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "mc6") == 0)
+		{
+			/*Call QM process function*/
+			if(cmmMc6QueryProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+		else if (strcasecmp(keywords[1], "mc4") == 0)
+		{
+			/*Call QM process function*/
+			if(cmmMc4QueryProcess(keywords, 2, daemon_handle))
+				return -1;
+		}
+                else if (strcasecmp(keywords[1], "pppoe") == 0)
+                {
+                        if(cmmPPPoEQueryProcess(keywords, 2, daemon_handle))
+                                return -1;
+                }
+                else if (strcasecmp(keywords[1], "route") == 0)
+                {
+                        if(cmmRtQueryProcess(keywords, 2, daemon_handle))
+                                return -1;
+                }
+                else if (strcasecmp(keywords[1], "connections") == 0)
+                {
+                        if(cmmCtQueryProcess(keywords, 2, daemon_handle))
+                                return -1;
+                }
+                else if (strcasecmp(keywords[1], "v6connections") == 0)
+                {
+                        if(cmmCt6QueryProcess(keywords, 2, daemon_handle))
+                                return -1;
+                }
+                else if (strcasecmp(keywords[1], "vlan") == 0)
+                {
+                        if(cmmVlanQuery(keywords, 2, daemon_handle))
+                                return -1;
+                }
+		else if (strcasecmp(keywords[1], "macvlan") == 0)
+                {
+                        if(cmmMacVlanQueryProcess(keywords, 2, daemon_handle))
+                                return -1;
+                }
+                else if (strcasecmp(keywords[1], "sa") == 0)
+                {
+                        if(cmmSAQueryProcess(keywords, 2, daemon_handle))
+                                return -1;
+                }
+                else if (strcasecmp(keywords[1], "rtcp") == 0)
+                {
+                        if(cmmRTCPQueryProcess(keywords, 2, daemon_handle))
+                        		return -1;
+                }
+                else if (strcasecmp(keywords[1], "rtpstats") == 0)
+                {
+                        if(cmmRTPStatsQueryProcess(keywords, 2, daemon_handle))
+		  				return -1;
+                }
+                else if (strcasecmp(keywords[1], "tunnels") == 0)
+                {
+                        if(cmmTnlQueryProcess(keywords, 2, daemon_handle))
+                        		return -1;
+                }
+		else if (strcasecmp(keywords[1], "natpt") == 0)
+		{
+		  		if(cmmNATPTQueryProcess(keywords, 2, daemon_handle))
+		  				return -1;
+  		}
+#ifdef AUTO_BRIDGE
+		else if (strcasecmp(keywords[1], "l2flows") == 0)
+		{
+		  		if(cmmL2FlowQueryProcess(keywords, 2, daemon_handle))
+		  				return -1;
+  		}
+#endif
+		else
+		{
+                	goto help;
+  		}
+	}
+	else if (strncasecmp(keywords[0], "msp",3) ==0)
+	{
+		/* mspmem */
+		if (cmmPrfMem(cpt,keywords,1,daemon_handle))
+			return -1;
+	}
+	else if (strncasecmp(keywords[0], "dm",2) ==0)
+	{
+		if (dumpmem(cpt,keywords))
+			return -1;
+	}
+	else if (strcasecmp(keywords[0],"prf") == 0) 
+	{
+		if (cmmPrfNM(cpt,keywords,1,daemon_handle))
+			return -1;
+	}
+	else if (strcasecmp(keywords[0],"tunnel") == 0) 
+	{
+		if (cmm_tunnel_parse_cmd(cpt,keywords,1,daemon_handle))
+			return -1;
+	}
+	else if (strcasecmp(keywords[0],"relay") == 0)
+	{
+		return cmmRelayParseCmd(cpt,keywords,1,daemon_handle);
+	}
+	else if (strncasecmp(keywords[0], "vlan", 4) == 0) 
+	{
+		if (cmmVlanClient(cpt,keywords, 1, daemon_handle))
+			return -1;
+	}
+	else if (strcasecmp(keywords[0], "ipv4") == 0)
+	{
+	  	if(cpt < 2)
+	    		goto help;
+		
+		if (strcasecmp(keywords[1], "update") == 0)
+		{
+			/*Call IPv4 update function*/
+			if (cmmCtChangeProcess4(keywords, 2, daemon_handle))
+				return -1;
+		}
+	}
+	else if (strcasecmp(keywords[0], "ipv6") == 0)
+	{
+	  	if(cpt < 2)
+	    		goto help;
+		
+		if (strcasecmp(keywords[1], "update") == 0)
+		{
+			/*Call IPv6 update function*/
+			if (cmmCtChangeProcess6(keywords, 2, daemon_handle))
+				return -1;
+		}
+	}
+	else if (strcasecmp(keywords[0], "pktcapture") == 0)
+        {
+                if (cpt < 2)
+                        goto help;
+
+                if (strcasecmp(keywords[1], "status") == 0)
+                {
+                        if (PktCapStatProcess(daemon_handle, cpt-2,  &keywords[2]))
+                                return -1;
+                }
+                else if (strcasecmp(keywords[1], "slice") == 0)
+                {
+                        if (PktCapSliceProcess(daemon_handle, cpt-2,&keywords[2]))
+                                return -1;
+                }
+                else if (strcasecmp(keywords[1], "filter") == 0)
+                {
+                        if (PktCapFilterProcess(daemon_handle , cpt-2 , &keywords[2]))
+                                return -1;
+                }
+		else
+		{
+			char buf[128];
+			print_all_gemac_ports(buf, 128);
+			cmm_print(DEBUG_STDOUT, "Command usage: pktcapture [status| slice| filter] [%s] <value>\n", buf);
+		}
+		
+        }
+	else if (strcasecmp(keywords[0], "icc") == 0)
+        {
+                if (cpt < 2)
+                        goto help;
+
+                if (strcasecmp(keywords[1], "reset") == 0)
+                {
+                        if (IccReset(daemon_handle, cpt-2,  &keywords[2]))
+                                return -1;
+                }
+                else if (strcasecmp(keywords[1], "threshold") == 0)
+                {
+                        if (IccThreshold(daemon_handle, cpt-2,&keywords[2]))
+                                return -1;
+                }
+                else if (strcasecmp(keywords[1], "add") == 0)
+                {
+                        if (IccAdd(daemon_handle , cpt-2 , &keywords[2]))
+                                return -1;
+                }
+                else if (strcasecmp(keywords[1], "delete") == 0)
+                {
+                        if (IccDelete(daemon_handle , cpt-2 , &keywords[2]))
+                                return -1;
+                }
+                else if (strcasecmp(keywords[1], "query") == 0)
+                {
+                        if (IccQuery(daemon_handle, cpt-2,&keywords[2]))
+                                return -1;
+                }
+		else
+		{
+			cmm_print(DEBUG_STDOUT, "Command usage: icc [reset | threshold | add | delete | query] <parameters...>\n");
+		}
+		
+        }
+
+	else
+		goto help;
+
+	return 0;
+
+help:
+	cmmClientPrintHelp();
+
+	return -1;
+}
+
+
+/*****************************************************************
+ * cmmClient()
+ *
+ *      cmm client main function
+ *  
+ *****************************************************************/
+int cmmClient(char * command, int argc, char **argv)
+{
+	daemon_handle_t daemon_handle;
+	int rc;
+
+#ifdef NEW_IPC
+	daemon_handle = cmm_open();
+	if (!daemon_handle)
+	{
+		cmm_print(DEBUG_STDERR, "%s: CMM handle creation failed\n", __func__);
+		return -1;
+	}
+#else
+	/*First check cmm daemon is alive*/
+	if( (daemon_handle = cmmIsDaemonRunning()) <= 0)
+	{
+		cmm_print(DEBUG_CRIT, "Error, cmm daemon is not running\n");
+		return -1;
+	}
+#endif
+
+	/*Process the command*/
+	rc = cmmClientProcessCmd(command, argc, argv, daemon_handle);
+
+#ifdef NEW_IPC
+	cmm_close(daemon_handle);
+#endif
+
+	return rc;
+}
+
+static int cmmCommandParse(struct cmm_daemon *ctx, int function_code, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len);
+
+/*****************************************************************
+ * cmmdaemonThread()
+ *
+ *      cmm client main function
+ *  
+ *****************************************************************/
+static void *cmmDaemonThread(void *data)
+{
+	struct cmm_daemon *ctx = data;
+
+#ifdef NEW_IPC
+	cmm_command_t cmd;
+	cmm_response_t res;
+#else
+	struct cmm_msg msg;
+#endif
+	int dataSize;
+	unsigned short dataRcvSize;
+	int rc;
+	unsigned int func;
+	u_int8_t *rx_buf;
+	u_int8_t *tx_buf;
+
+	cmm_print(DEBUG_INFO, "%s: pid %d\n", __func__, getpid());
+
+	while (1)
+	{
+		// Waiting for a message
+#ifdef NEW_IPC
+		/* We have to reset errno, because it could left after previous error condition,
+		 * and we will wrongly report it later as "daemon_errno" even if no error occured.
+		 * From 'man errno':
+		 * "Successful calls never set errno; once set, it remains until another error occurs".
+		 * XXX: this is a hack needed to support "daemon_errno" field in cmm_response_t.
+		 * CMM library on client side sets system errno according to "daemon_errno" 
+		 * and returns -1 when it's not 0.
+		 */
+		errno = 0;
+
+		memset(&cmd, 0, sizeof(cmd));
+		memset(&res, 0, sizeof(res));
+		msgrcv(ctx->queueIdRx, &cmd, sizeof(cmd), 0, 0);
+		res.msg_type = cmd.msg_type;
+		dataSize = cmd.length;
+		dataRcvSize = sizeof(res.buf);
+		func = cmd.func;
+		rx_buf = cmd.buf;
+		tx_buf = res.buf;
+#else
+		dataSize = msgrcv(ctx->queueIdRx, &msg, sizeof(msg.buffer), 0, 0);
+		dataRcvSize = sizeof(msg.buffer);
+		func = msg.mtype;
+		rx_buf = msg.buffer;
+		tx_buf = msg.buffer;
+#endif
+		if (dataSize < 0)
+		{
+			/* Exit if queue id no longer exists */
+			if ((errno == EIDRM) || (errno == ENOENT))
+				break;
+
+			// If we have an error receiving a msg, do nothing and continue waiting for a new one
+			cmm_print(DEBUG_WARNING, "%s: msgrcv() failed, %s\n", __func__, strerror(errno));
+			rc = -1;
+			dataRcvSize = 0;
+			goto answer;
+		}
+
+		if (dataSize > CMM_BUF_SIZE) { 
+			cmm_print(DEBUG_ERROR, "%s: message size exceeds limit of %d\n", __func__, CMM_BUF_SIZE); 
+			rc = -1; 
+			dataRcvSize = 0; 
+			goto answer; 
+		}
+
+		// Debug
+		if ((globalConf.debug_level & DEBUG_INFO) || (globalConf.log_level & DEBUG_INFO))
+		{
+			int x;
+			char outbuf[CMM_BUF_SIZE * 3 + 1]; /* 3 chars for each byte + trailing '\0' */
+			cmm_print(DEBUG_INFO, "%s: Received commandCode: (%04x) size %d\n", __func__, func, dataSize);
+			for (x = 0, outbuf[0] = '\0'; x < dataSize; x++)
+			{
+				snprintf(outbuf + strlen(outbuf), sizeof(outbuf) - strlen(outbuf), "%02x ", rx_buf[x]);
+				if ((x & 0xF) == 0xF || x == dataSize - 1)
+				{
+					cmm_print(DEBUG_INFO, "%s\n", outbuf);
+					outbuf[0] = '\0';
+				}
+			}
+			cmm_print(DEBUG_INFO, "\n");
+		}
+
+		rc = cmmCommandParse(ctx, func, rx_buf, dataSize, (u_int16_t*)tx_buf, &dataRcvSize);
+
+		if (dataRcvSize > CMM_BUF_SIZE) {
+			cmm_print(DEBUG_ERROR, "%s: message size exceeds limit of %d\n", __func__, CMM_BUF_SIZE);
+			rc = -1;
+			dataRcvSize = 0;
+			goto answer;
+		}
+
+		// Debug
+		if ((globalConf.debug_level & DEBUG_INFO) || (globalConf.log_level & DEBUG_INFO))
+		{
+			int x;
+			char outbuf[CMM_BUF_SIZE * 3 + 1]; /* 3 chars for each byte + trailing '\0' */
+			cmm_print(DEBUG_INFO, "%s: Sending ack commandCode: %04x, rc 0x%04x, dataSize: %d \n", __func__, func, rc ,dataRcvSize);
+			for (x = 0, outbuf[0] = '\0'; x < dataRcvSize; x++)
+			{
+				snprintf(outbuf + strlen(outbuf), sizeof(outbuf) - strlen(outbuf), "%02x ", tx_buf[x]);
+				if ((x & 0xF) == 0xF || x == dataRcvSize - 1)
+				{
+					cmm_print(DEBUG_INFO, "%s\n", outbuf);
+					outbuf[0] = '\0';
+				}
+			}
+			cmm_print(DEBUG_INFO, "\n");
+		}
+
+answer:
+		// Send answer to client		
+#ifdef NEW_IPC
+		res.func = func;
+		if (rc < 0) {
+			if (errno)
+				res.daemon_errno = errno;
+			else
+				res.daemon_errno = EIO;
+		}
+
+		res.length = dataRcvSize;
+		if (msgsnd(ctx->queueIdTx, &res, sizeof(res) - sizeof(res.buf) + res.length, 0) < 0)
+#else
+		if (msgsnd(ctx->queueIdTx, &msg, dataRcvSize, 0) < 0)
+#endif
+		{
+			cmm_print(DEBUG_WARNING, "%s: msgsnd() failed, %s\n", __func__, strerror(errno));
+			break;
+		}
+	}
+
+	cmm_print(DEBUG_INFO, "%s: exiting\n", __func__);
+
+	kill(0, SIGTERM);
+	pthread_exit(NULL);
+
+	return NULL;
+}
+
+int cmmDaemonInit(struct cmm_daemon *ctx)
+{
+	key_t key;
+	int id = (int)globalConf.cmmPid;
+
+	id = ((id & 0xff) ^ ((id >> 8) & 0xff)) | 1;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	key = ftok("/tmp", id ^ 0xff);
+	if (key == (key_t)-1)
+	{
+		cmm_print(DEBUG_CRIT, "%s: ftok(%d) failed, %s\n", __func__, id ^ 0xff, strerror(errno));
+		goto err0;
+	}
+
+	// Create the message queue
+	ctx->queueIdRx = msgget(key, IPC_CREAT | IPC_EXCL);
+	if (ctx->queueIdRx < 0)
+	{
+		cmm_print(DEBUG_CRIT, "%s: rx msgget() failed, %s\n", __func__, strerror(errno));
+		goto err0;
+	}
+
+	key = ftok("/tmp", id);
+	if (key == (key_t)-1)
+	{
+		cmm_print(DEBUG_CRIT, "%s: ftok(%d) failed, %s\n", __func__, id, strerror(errno));
+		goto err1;
+	}
+
+	ctx->queueIdTx = msgget(key, IPC_CREAT | IPC_EXCL);
+	if (ctx->queueIdTx < 0)
+	{
+		cmm_print(DEBUG_CRIT, "%s: tx msgget() failed, %s\n", __func__, strerror(errno));
+		goto err1;
+	}
+
+	ctx->fci_handle = fci_open(FCILIB_FF_TYPE, 0);
+	if (!ctx->fci_handle)
+	{
+		cmm_print(DEBUG_CRIT, "%s: fci_open() failed, %s\n", __func__, strerror(errno));
+		goto err2;
+	}
+
+#if !defined(IPSEC_SUPPORT_DISABLED)
+	ctx->fci_key_handle = fci_open(FCILIB_KEY_TYPE, 0);
+	if (!ctx->fci_key_handle)
+	{
+		cmm_print(DEBUG_CRIT, "%s::%d: fci_open() failed, %s\n", __func__, __LINE__, strerror(errno));
+		goto err3;
+	}
+#endif
+	voice_buffer_reset(ctx->fci_handle);
+
+	// Thread for getting cmm client command
+	if (pthread_create(&ctx->pthread, NULL, cmmDaemonThread, ctx) < 0)
+	{
+		cmm_print(DEBUG_CRIT, "%s: pthread_create() failed, %s\n", __func__, strerror(errno));
+		goto err4;
+	}
+
+	return 0;
+
+err4:
+#if !defined(IPSEC_SUPPORT_DISABLED)
+	fci_close(ctx->fci_key_handle);
+
+err3:
+#endif
+	fci_close(ctx->fci_handle);
+
+err2:
+	msgctl(ctx->queueIdTx, IPC_RMID, NULL);
+
+err1:
+	msgctl(ctx->queueIdRx, IPC_RMID, NULL);
+
+err0:
+	return -1;
+}
+
+void cmmDaemonExit(struct cmm_daemon *ctx)
+{
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+#if defined(__UCLIBC__)
+	/* workaround uclibc pthread_cancel() bug, force thread to exit */
+	msgctl(ctx->queueIdTx, IPC_RMID, NULL);
+	msgctl(ctx->queueIdRx, IPC_RMID, NULL);
+#else
+	pthread_cancel(ctx->pthread);
+#endif
+
+	pthread_join(ctx->pthread, NULL);
+
+	fci_close(ctx->fci_handle);
+#if !defined(IPSEC_SUPPORT_DISABLED)
+	fci_close(ctx->fci_key_handle);
+#endif
+#if !defined(__UCLIBC__)
+	msgctl(ctx->queueIdTx, IPC_RMID, NULL);
+	msgctl(ctx->queueIdRx, IPC_RMID, NULL);
+#endif
+
+	cmm_print(DEBUG_INFO, "%s: exiting\n", __func__);
+}
+
+/*****************************************************************
+ * cmmCommandParse()
+ *
+ * returns:
+ * 0  - success
+ * -1 - system error. errno variable indicates error in this case. 
+ *****************************************************************/
+static int cmmCommandParse(struct cmm_daemon *ctx, int function_code, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	if ((function_code &  FPP_CMD_TRC_MASK) == FPP_CMD_TRC_VAL)
+		goto FCI_CMD;
+
+	switch (function_code)
+	{
+        case CMMD_CMD_IPV4_CONNTRACK:
+        case CMMD_CMD_IPV6_CONNTRACK:
+		return cmmCtHandle(ctx->fci_handle, function_code, cmd_buf, cmd_len, res_buf, res_len);
+
+	case CMMD_CMD_IPV4_FF_CONTROL:
+		return cmmFeFFControl(ctx->fci_handle, cmd_buf, cmd_len, res_buf, res_len);
+
+	// Multicast commands, we accept but we need to do a local process
+	case CMMD_CMD_MC6_MULTICAST:
+	case CMMD_CMD_MC6_RESET:
+	case CMMD_CMD_MC6_MODE:
+		return cmmMc6ProcessClientCmd(ctx->fci_handle, function_code, cmd_buf, cmd_len, res_buf, res_len); 
+
+	case CMMD_CMD_MC4_MULTICAST:
+	case CMMD_CMD_MC4_RESET:
+		return cmmMc4ProcessClientCmd(ctx->fci_handle, function_code, cmd_buf, cmd_len, res_buf, res_len);
+
+	/* Tunnel commands */
+	case CMMD_CMD_TUNNEL_ADD:
+	case CMMD_CMD_TUNNEL_DEL: 
+ 	case CMMD_CMD_TUNNEL_SHOW:
+	case CMMD_CMD_TUNNEL_IDCONV_psid:
+#ifdef SAM_LEGACY	
+ 	case CMMD_CMD_TUNNEL_SAMREADY:
+#endif
+		return tunnel_daemon_msg_recv(ctx->fci_handle, ctx->fci_key_handle, function_code, cmd_buf, cmd_len, res_buf, res_len);
+
+        case CMMD_CMD_PPPOE_RELAY_ADD:
+        case CMMD_CMD_PPPOE_RELAY_REMOVE:
+		return cmmRelayProcessClientCmd(ctx->fci_handle, function_code, cmd_buf, cmd_len, res_buf, res_len);
+
+	case CMMD_CMD_VLAN_ENTRY:
+		return cmmVlanProcessClientCmd(ctx->fci_handle, function_code, cmd_buf, cmd_len, res_buf, res_len);
+
+	case CMMD_CMD_EXTROUTE:
+		return cmmRouteProcessClientCmd(ctx->fci_handle, function_code, cmd_buf, res_buf, res_len);
+								 
+	case CMMD_CMD_IPSEC_DPDSAQUERYTIMER:
+		return cmmDPDSAQUERYProcessClientCmd(cmd_buf, res_buf, res_len);
+#ifdef C2000_DPI
+	case CMMD_CMD_DPIENABLE:
+		return cmmDPIFlagProcessClientCmd(cmd_buf, res_buf, res_len);
+#endif
+	case CMMD_ASYM_FF_ENABLE:
+		return cmmAsymFFProcessClientCmd(cmd_buf, res_buf, res_len);
+	case CMMD_CMD_SOCKET_OPEN:
+	case CMMD_CMD_SOCKET_CLOSE:
+	case CMMD_CMD_SOCKET_UPDATE:
+	case CMMD_CMD_SOCKET_SHOW:
+		return socket_daemon(ctx->fci_handle, ctx->fci_key_handle, function_code, cmd_buf, cmd_len, res_buf, res_len);
+
+	case CMMD_CMD_VOICE_FILE_LOAD:
+		return voice_file_load(ctx->fci_handle, (cmmd_voice_file_load_cmd_t *)cmd_buf, res_buf, res_len);
+
+	case CMMD_CMD_VOICE_FILE_UNLOAD:
+		return voice_file_unload(ctx->fci_handle, (cmmd_voice_file_unload_cmd_t *)cmd_buf, res_buf, res_len);
+
+	case CMMD_CMD_L2TP_SESSION_CREATE:
+	case CMMD_CMD_L2TP_SESSION_DESTROY:
+		return l2tp_daemon(ctx->fci_handle,function_code, (cmmd_l2tp_session_t *) cmd_buf, cmd_len, res_buf, res_len);
+
+	//Bridge commands
+	case FPP_CMD_RX_L2BRIDGE_ENABLE:
+	case FPP_CMD_RX_L2BRIDGE_ADD:
+	case FPP_CMD_RX_L2BRIDGE_REMOVE:
+	case FPP_CMD_RX_L2BRIDGE_QUERY_STATUS:
+	case FPP_CMD_RX_L2BRIDGE_QUERY_ENTRY:
+		return cmmL2BridgeProcessClientCmd(ctx->fci_handle, function_code, cmd_buf, cmd_len, res_buf, res_len); 
+
+	// Special processing for QM Reset and Scheduler config (need to notify eth driver)
+	
+	case FPP_CMD_QM_RESET:
+		cmmQmResetQ2Prio((fpp_qm_reset_cmd_t *)cmd_buf, cmd_len);
+		goto FCI_CMD;
+
+	case FPP_CMD_QM_SCHED_CFG:
+		cmmQmUpdateQ2Prio((fpp_qm_scheduler_cfg_t *)cmd_buf, cmd_len);
+		goto FCI_CMD;
+
+	// Accept the remaining qm commands
+	case FPP_CMD_QM_QOSENABLE:
+	case FPP_CMD_QM_QOSALG:
+	case FPP_CMD_QM_NHIGH:
+	case FPP_CMD_QM_MAX_TXDEPTH:
+	case FPP_CMD_QM_MAX_QDEPTH:
+	case FPP_CMD_QM_MAX_WEIGHT:
+	case FPP_CMD_QM_RATE_LIMIT:
+	case FPP_CMD_QM_EXPT_RATE:
+	case FPP_CMD_QM_QUERY:
+	case FPP_CMD_QM_QUERY_EXPT_RATE:
+	case FPP_CMD_QM_SHAPER_CFG:
+	case FPP_CMD_QM_DSCP_MAP:
+	case FPP_CMD_QM_QUEUE_QOSENABLE:
+	// Accept ICC commands
+	case FPP_CMD_ICC_RESET:
+	case FPP_CMD_ICC_THRESHOLD:
+	case FPP_CMD_ICC_ADD_DELETE:
+	case FPP_CMD_ICC_QUERY:
+	// Accept some RX commands
+	case FPP_CMD_RX_CNG_ENABLE:
+	case FPP_CMD_RX_CNG_DISABLE:
+	case FPP_CMD_RX_CNG_SHOW:
+	case FPP_CMD_RX_L2FLOW_ENTRY:
+	case FPP_CMD_RX_L2BRIDGE_FLOW_TIMEOUT:	
+	// Accept timeout set command
+	case FPP_CMD_IPV4_SET_TIMEOUT:
+	case FPP_CMD_IPV4_FRAGTIMEOUT:
+	case FPP_CMD_IPV4_SAMFRAGTIMEOUT:
+	case FPP_CMD_IPV4_GET_TIMEOUT:
+	case FPP_CMD_IPV6_GET_TIMEOUT:
+	case FPP_CMD_IPV6_FRAGTIMEOUT:
+        // accept for ACTION_QUERY
+        case FPP_CMD_IP_ROUTE:
+        case FPP_CMD_PPPOE_ENTRY:
+        case FPP_CMD_IPSEC_SA_ACTION_QUERY:
+        case FPP_CMD_IPSEC_SA_ACTION_QUERY_CONT:
+
+	// Voice Buffer
+	case FPP_CMD_VOICE_BUFFER_START:
+	case FPP_CMD_VOICE_BUFFER_STOP:
+	// accept stat commands
+        case FPP_CMD_STAT_ENABLE:
+	case FPP_CMD_STAT_QUEUE:
+        case FPP_CMD_STAT_INTERFACE_PKT:
+        case FPP_CMD_STAT_CONNECTION:
+        case FPP_CMD_STAT_PPPOE_STATUS:
+        case FPP_CMD_STAT_PPPOE_ENTRY:
+        case FPP_CMD_STAT_BRIDGE_STATUS:
+        case FPP_CMD_STAT_BRIDGE_ENTRY:
+        case FPP_CMD_STAT_IPSEC_STATUS:
+        case FPP_CMD_STAT_IPSEC_ENTRY:
+        case FPP_CMD_STAT_VLAN_STATUS:
+        case FPP_CMD_STAT_VLAN_ENTRY:        
+	// accept alternate Configuration commands
+	case FPP_CMD_ALTCONF_SET:
+	case FPP_CMD_ALTCONF_RESET:
+	// Expt
+	case FPP_CMD_EXPT_QUEUE_RESET:
+	case FPP_CMD_EXPT_QUEUE_DSCP:
+	case FPP_CMD_EXPT_QUEUE_CONTROL:
+	case FPP_CMD_IPSEC_FRAG_CFG:
+	// Socket and RTP statistics
+	case FPP_CMD_RTP_CLOSE:
+	case FPP_CMD_RTP_CONTROL:
+	case FPP_CMD_RTP_OPEN:
+	case FPP_CMD_RTP_SPECTX_CTRL:
+	case FPP_CMD_RTP_SPECTX_PLD:
+	case FPP_CMD_RTP_TAKEOVER:
+	case FPP_CMD_RTP_UPDATE:
+	case FPP_CMD_RTCP_QUERY:
+	case FPP_CMD_RTP_STATS_ENABLE:
+	case FPP_CMD_RTP_STATS_DISABLE:
+	case FPP_CMD_RTP_STATS_QUERY:
+	case FPP_CMD_RTP_STATS_DTMF_PT:
+	case FPP_CMD_NATPT_OPEN:
+	case FPP_CMD_NATPT_CLOSE:
+	case FPP_CMD_NATPT_QUERY:
+	case FPP_CMD_PKTCAP_IFSTATUS:
+	case FPP_CMD_PKTCAP_SLICE:
+	case FPP_CMD_PKTCAP_FLF:
+	case FPP_CMD_PKTCAP_QUERY:
+	case FPP_CMD_MACVLAN_ENTRY:
+	case FPP_CMD_TUNNEL_QUERY:
+	case FPP_CMD_TUNNEL_QUERY_CONT:
+	case FPP_CMD_TUNNEL_4rd_ID_CONV_dport:
+		goto FCI_CMD;
+
+	// Other commands, we refuse
+	default:
+		res_buf[0] = CMMD_ERR_UNKNOWN_COMMAND;
+		*res_len = 2;
+	}
+
+	return 0;
+
+FCI_CMD:
+	//Sending message to FPP
+	return fci_cmd(ctx->fci_handle, function_code, (unsigned short *)cmd_buf, cmd_len, (unsigned short *)res_buf, res_len);
+}
+
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+int parse_value(char *p, u_int32_t *value, u_int32_t maxval)
+{
+	char *endp;
+	u_int32_t val;
+	val = strtoul(p, &endp, 0);
+	if (*endp || val > maxval)
+		return -1;
+	*value = val;
+	return 0;
+}
+
+
+int parse_range(char *p, u_int32_t *from, u_int32_t *to, u_int32_t maxval)
+{
+	char *endp;
+	u_int32_t fromval, toval;
+	fromval = strtoul(p, &endp, 0);
+	if (*endp)
+	{
+		if (*endp++ != '-')
+			return -1;
+		if (parse_value(endp, &toval, maxval) < 0)
+			return -1;
+	}
+	else
+		toval = fromval;
+	if (toval < fromval || toval > maxval)
+		return -1;
+	*from = fromval;
+	*to = toval;
+	return 0;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+#include<sys/stat.h>
+#include<sys/mman.h>
+
+#define DISP_LINE_LEN	16
+#define MMAP_SIZE	0x01000000
+
+volatile unsigned char *base_addr;
+
+int dumpmem(int argc, char *argv[])
+{
+	unsigned long	addr, size, length=16;
+	unsigned long	i, nbytes, linebytes;
+	unsigned char	*cp;
+	int fd;
+	int rc = 0;
+	char outbuf[256];
+
+	/* We use the last specified parameters, unless new ones are
+	 * entered.
+	 */
+
+	if (argc != 2 && argc != 3) {
+		cmm_print(DEBUG_ERROR, "Usage : dm[b|w|l] address [size]\n");
+		return(1);
+	}
+
+	switch(argv[0][2]) {
+	case 'b':
+		size = 1;
+		break;
+	case 'w':
+		size = 2;
+		break;
+	case 'l':
+		size = 4;
+		break;
+	default:
+		size = 4;
+		break;
+	}
+
+	addr = strtoul(argv[1], NULL, 16);
+	fd = open("/dev/mem", O_RDWR);
+	if (fd == -1) {
+		cmm_print(DEBUG_ERROR, "open() error. errno:%m\n");
+		return(1);
+	}
+	base_addr = mmap(0,
+			 MMAP_SIZE,
+			 PROT_READ|PROT_WRITE,
+			 MAP_SHARED,
+			 fd,
+			 (addr & 0xFF000000));
+	if (base_addr == (unsigned char*)(-1)){
+                cmm_print(DEBUG_ERROR, "mmap() error. errno:%m\n");
+                rc = 1;
+                goto err;
+        }
+
+	/* If another parameter, it is the length to display.
+	 * Length is the number of objects, not number of bytes.
+	 */
+	if (argc == 3) {
+		length = strtoul(argv[2], NULL, 16);
+	}
+
+	/* Print the lines.
+	 *
+	 * We buffer all read data, so we can make sure data is read only
+	 * once, and all accesses are with the specified bus width.
+	 */
+	nbytes = length * size;
+	if (nbytes > MMAP_SIZE) {
+		cmm_print(DEBUG_ERROR, "display size over ( 0x%08x > 0x%08x ).\n", (int)nbytes, MMAP_SIZE);
+		rc = 1;
+		goto err;
+	}
+	do {
+		u_int8_t	linebuf[DISP_LINE_LEN];
+		unsigned int	*uip = (unsigned int   *)linebuf;
+		unsigned short	*usp = (unsigned short *)linebuf;
+		unsigned char	*ucp = (unsigned char *)linebuf;
+
+		sprintf(outbuf, "%08lx:", addr);
+		linebytes = (nbytes>DISP_LINE_LEN)?DISP_LINE_LEN:nbytes;
+		for (i=0; i<linebytes; i+= size) {
+			if (size == 4) {
+				sprintf(outbuf + strlen(outbuf), " %08x", (*uip++ = *((unsigned int *)(base_addr+(addr&0x00ffffff)))));
+			} else if (size == 2) {
+				sprintf(outbuf + strlen(outbuf), " %04x", (*usp++ = *((unsigned short *)(base_addr+(addr&0x00ffffff)))));
+			} else {
+				sprintf(outbuf + strlen(outbuf), " %02x", (*ucp++ = *((unsigned char *)(base_addr+(addr&0x00ffffff)))));
+			}
+			addr += size;
+		}
+		sprintf(outbuf + strlen(outbuf), "    ");
+		cp = linebuf;
+		for (i=0; i<linebytes; i++) {
+			if ((*cp < 0x20) || (*cp > 0x7e))
+				sprintf(outbuf + strlen(outbuf), ".");
+			else
+				sprintf(outbuf + strlen(outbuf), "%c", *cp);
+			cp++;
+		}
+		cmm_print(DEBUG_STDOUT, "%s\n", outbuf);
+		nbytes -= linebytes;
+	} while (nbytes > 0);
+
+	munmap((void*)base_addr, MMAP_SIZE);
+err:
+	close(fd);
+	return (rc);
+}
diff --git a/cmm/src/client_daemon.h b/cmm/src/client_daemon.h
new file mode 100644
index 0000000..5e3b4d7
--- /dev/null
+++ b/cmm/src/client_daemon.h
@@ -0,0 +1,61 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __CLIENT_DAEMON_H__
+#define __CLIENT_DAEMON_H__
+
+	static __inline unsigned short cmmDaemonCmdRC(void *rspbuf)
+	{
+	  return *( (unsigned short *) rspbuf);
+	}
+
+static inline void setbit_in_array(u_int8_t *pbits, u_int32_t bitindex, u_int32_t bitval)
+{
+	if (bitval)
+		pbits[bitindex >> 3] |= 1 << (bitindex & 0x07);
+	else
+		pbits[bitindex >> 3] &= ~(1 << (bitindex & 0x07));
+}
+
+static inline u_int32_t testbit_in_array(u_int8_t *pbits, u_int32_t bitindex)
+{
+	u_int8_t x;
+	u_int32_t bitmask;
+	x = pbits[bitindex >> 3];
+	bitmask = 1 << (bitindex & 0x07);
+	return (x & bitmask);
+}
+
+
+	int cmmClient(char * command, int argc, char **argv);
+	int cmmSendToDaemon(daemon_handle_t daemon_handle, unsigned short commandCode, void * dataToSend, int dataSize, void* dataToRcv);
+
+	struct cmm_daemon;
+
+	int cmmCommandCheck(struct cmm_daemon *ctx, int function_code, char * buffer, int buffer_size_in, int max_buffer_size);
+	char * getErrorString(unsigned short error);
+	
+	int cmmDaemonInit(struct cmm_daemon *ctx);
+	void cmmDaemonExit(struct cmm_daemon *ctx);
+
+	int parse_value(char *p, u_int32_t *value, u_int32_t maxval);
+	int parse_range(char *p, u_int32_t *from, u_int32_t *to, u_int32_t maxval);
+
+#endif
+
diff --git a/cmm/src/cmm.c b/cmm/src/cmm.c
new file mode 100644
index 0000000..fe5533d
--- /dev/null
+++ b/cmm/src/cmm.c
@@ -0,0 +1,484 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+#include "cmm.h"
+#include "forward_engine.h"
+#include "keytrack.h"
+#include "itf.h"
+
+#include <net/if.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sched.h>
+#include <signal.h>
+#include <stdarg.h>
+#if !defined(__UCLIBC__)
+#include <execinfo.h>
+#endif
+
+struct cmm_global globalConf;
+unsigned int nf_conntrack_max = CONNTRACK_MAX;
+
+struct kernel_ucontext {
+	unsigned long     uc_flags;
+	struct kernel_ucontext  *uc_link;
+	stack_t           uc_stack;
+	struct sigcontext uc_mcontext;
+	sigset_t          uc_sigmask;
+	/* Allow for uc_sigmask growth.  Glibc uses a 1024-bit sigset_t.  */
+	int               __unused[32 - (sizeof (sigset_t) / sizeof (int))];
+	/* Last for extensibility.  Eight byte aligned because some
+           coprocessors require eight byte alignment.  */
+	unsigned long     uc_regspace[128] __attribute__((__aligned__(8)));
+};
+
+static void cmm_crit_err_hdlr(int sig_num, siginfo_t *info, void *ucontext)
+{
+	struct sigcontext *sigcontext;
+#if !defined(__UCLIBC__)
+	void *array[50];
+	char **messages;
+	int size, i;
+#endif
+
+	sigcontext = &((struct kernel_ucontext *)ucontext)->uc_mcontext;
+
+	fprintf(stderr, "\n%s: signal %d (%s), fault address is %p at %p PID %d\n",
+		__func__, sig_num, strsignal(sig_num), info->si_addr, 
+		(void *)sigcontext->arm_pc, getpid());
+
+	fprintf(stderr, "register dump:\nr0:%08lx r1:%08lx r2:%08lx r3:%08lx r4:%08lx r5:%08lx r6:%08lx r7:%08lx\n",
+		sigcontext->arm_r0, sigcontext->arm_r1, sigcontext->arm_r2, sigcontext->arm_r3,
+		sigcontext->arm_r4, sigcontext->arm_r5, sigcontext->arm_r6, sigcontext->arm_r7);
+
+	fprintf(stderr, "r8:%08lx r9:%08lx r10:%08lx fp:%08lx ip:%08lx sp:%08lx lr:%08lx pc:%08lx\n",
+		sigcontext->arm_r8, sigcontext->arm_r9, sigcontext->arm_r10, sigcontext->arm_fp,
+		sigcontext->arm_ip, sigcontext->arm_sp, sigcontext->arm_lr, sigcontext->arm_pc);
+
+	fprintf(stderr, "cpsr:%08lx fault_address:%08lx\n", sigcontext->arm_cpsr, sigcontext->fault_address);
+
+#if !defined(__UCLIBC__)
+	size = backtrace(array, 50);
+
+	/* overwrite sigaction with caller's address */
+	array[1] = (void *)sigcontext->arm_pc;
+
+	messages = backtrace_symbols(array, size);
+
+	if (messages)
+	{
+		for (i = 1; i < size; ++i)
+		{
+			fprintf(stderr, "[bt]: (%d) %s\n", i, messages[i]);
+		}
+
+		free(messages);
+	}
+	else
+	{
+		for (i = 1; i < size; ++i)
+		{
+			fprintf(stderr, "[bt]: (%d) %p\n", i, array[i]);
+		}
+	}
+#endif
+	exit(EXIT_FAILURE);
+}
+
+
+void cmm_print_func(int level, const char *format, ...)
+{
+	va_list args;
+
+	va_start(args, format);
+
+	if (level & DEBUG_CRIT)
+	{
+		if (globalConf.cli.handle)
+			cli_vabufprint(globalConf.cli.handle, (char *)format, args);
+		else
+			vfprintf(stderr, format, args);
+	}
+	else if (level & DEBUG_STDOUT)
+	{
+		if (globalConf.cli.handle)
+			cli_vabufprint(globalConf.cli.handle, (char *)format, args);
+		else
+			vfprintf(stdout, format, args);
+	}
+	else if (globalConf.cli.handle && (level & globalConf.debug_level))
+		cli_vabufprint(globalConf.cli.handle, (char *)format, args);
+
+	if (globalConf.logFile && (level & globalConf.log_level))
+	{
+		pthread_mutex_lock(&globalConf.logMutex);
+		if (!(level & DEBUG_NOTIMESTAMP))
+		{
+			time_t now;
+			struct tm now_tm;
+			char date[24];
+
+			time(&now);
+			localtime_r(&now, &now_tm);
+			strftime(date, 24, "%F %T", &now_tm);
+			fprintf(globalConf.logFile, "%s: ", date);
+		}
+
+		vfprintf(globalConf.logFile, format, args);
+		pthread_mutex_unlock(&globalConf.logMutex);
+	}
+
+	va_end(args);
+}
+
+/*****************************************************************
+ * mac_ntop - converts a mac address in numerical format to presentation format
+ *
+ *
+ *****************************************************************/
+const char *mac_ntop(const void *mac, char *buf, size_t len)
+{
+	snprintf(buf, len, "%02x:%02x:%02x:%02x:%02x:%02x", ((unsigned char *)mac)[0],
+		 					((unsigned char *)mac)[1],
+		 					((unsigned char *)mac)[2],
+		 					((unsigned char *)mac)[3],
+		 					((unsigned char *)mac)[4],
+		 					((unsigned char *)mac)[5]);
+
+	return buf;
+}
+
+/*Print CMM help*/
+void cmmHelp()
+{
+	cmm_print(DEBUG_STDOUT, cmm_help);
+}
+
+/*****************************************************************
+ * cmmVersion()
+ *
+ *      Prints cmm version
+ *  
+ *****************************************************************/
+void cmmVersion()
+{
+	cmm_print(DEBUG_STDOUT, "Cmm version %s\n", CMM_VERSION);
+	cmm_print(DEBUG_STDOUT, "Developped by %s\n", developpers);
+}
+
+/*****************************************************************
+ * cmmIsDaemonRunning()
+ *
+ *      Check if cmm daemon is running. If so, it returns the pid
+ *  
+ *****************************************************************/
+int cmmIsDaemonRunning()
+{
+	FILE*fd;
+	char buf[10];
+
+	fd = fopen(CMM_PID_FILE_PATH, "r");
+	if(fd > 0)
+	{
+		// Read the pid written in the pid file
+		fgets(buf, 10, fd);
+		fclose(fd);
+
+		// Check the daemon is really running
+		if (getpgid(atoi(buf)) != -1)
+			return atoi(buf);
+	}
+
+	// No daemon is running
+	return 0;
+}
+
+/*****************************************************************
+ * cmmCreateDaemonPidFile()
+ *
+ *    Create a pid file.
+ *    This function supposes that no cmm daemon is running and
+ *    then removes the old pid file if there is.
+ *  
+ *****************************************************************/
+int cmmCreateDaemonPidFile()
+{
+	int fp;
+	char buf[10+1+1]; /* int can have up to 10 chars + 1 for sign + 1 for trailing \0 */
+
+	fp = open(CMM_PID_FILE_PATH, O_WRONLY | O_CREAT | O_EXCL);
+	if(fp < 0)
+	{
+		if(errno == EEXIST)
+		{
+			// A file already exists, delete it and create a new one
+			if (remove(CMM_PID_FILE_PATH))
+			{
+				cmm_print(DEBUG_CRIT, "Unable to delete old %s\n", CMM_PID_FILE_PATH);
+				return -1;
+			}
+			// Now the old file is deleted, we can create a new one
+			fp = open(CMM_PID_FILE_PATH, O_WRONLY | O_CREAT | O_EXCL);
+		}
+		else
+		{
+			cmm_print(DEBUG_CRIT, "Error opening %s\n", CMM_PID_FILE_PATH);
+			return -1;
+		}
+	}
+
+	snprintf(buf, sizeof(buf), "%d\n", getpid());
+	write(fp, buf, strlen(buf));
+	close(fp);
+
+	globalConf.cmmPid = getpid();
+
+	return 0;
+}
+
+
+/*****************************************************************
+* sig_term_hdlr
+*
+*
+******************************************************************/
+static void sig_term_hdlr(int signum)
+{
+	cmm_print(DEBUG_INFO, "%s: entered\n", __func__);
+
+	cmm_third_part_exit(globalConf.third_part_data);
+
+	cmmCliExit(&globalConf.cli);
+
+	cmmDaemonExit(&globalConf.daemon);
+
+	cmmCtExit(&globalConf.ct);
+
+	nfct_close(globalConf.nf_conntrack_handle);
+
+	remove(CMM_PID_FILE_PATH);
+
+	cmm_print(DEBUG_INFO, "%s: exiting\n", __func__);
+
+	if (globalConf.logFile)
+		fclose(globalConf.logFile);
+
+	/* Killing ...*/
+	exit(EXIT_SUCCESS);
+}
+
+
+int main (int argc, char ** argv)
+{
+	sigset_t block_mask;
+  	extern char *optarg;
+	extern int optind;
+	char confFilePath[512+1];
+	//struct sched_param schedParams;
+	struct sigaction action;
+	int option;
+
+	// Forward engine programmation is enabled by default
+	globalConf.enable = 1;
+	globalConf.debug_level = DEBUG_ERROR;
+	globalConf.vlan_policy = ALLOW;
+	globalConf.ff_enable = 1;
+#ifdef C2000_DPI
+	globalConf.dpi_enable = 0;
+#endif
+	globalConf.asymff_enable = 0;
+	globalConf.logFile = NULL;
+	globalConf.log_level = 0;
+
+	globalConf.tun_proto = IPPROTO_IPIP; /* Current default handling of TUN interface is an 4o6 tunnel*/
+	globalConf.tun_family = AF_INET6;
+
+#ifdef MUTEX_DEBUG
+	mutexes = 0;
+#endif
+
+	action.sa_sigaction = cmm_crit_err_hdlr;
+	sigemptyset (&action.sa_mask);
+	action.sa_flags = SA_RESTART | SA_SIGINFO;
+
+	if (sigaction(SIGSEGV, &action, NULL) < 0)
+	{
+		fprintf(stderr, "sigaction((%s)) failed, %s\n", strsignal(SIGSEGV), strerror(errno));
+
+		exit(EXIT_FAILURE);
+	}
+
+	if (sigaction(SIGBUS, &action, NULL) < 0)
+	{
+		fprintf(stderr, "sigaction((%s)) failed, %s\n", strsignal(SIGBUS), strerror(errno));
+
+		exit(EXIT_FAILURE);
+	}
+
+	if (sigaction(SIGFPE, &action, NULL) < 0)
+	{
+		fprintf(stderr, "sigaction((%s)) failed, %s\n", strsignal(SIGFPE), strerror(errno));
+
+		exit(EXIT_FAILURE);
+	}
+
+	if (sigaction(SIGILL, &action, NULL) < 0)
+	{
+		fprintf(stderr, "sigaction((%s)) failed, %s\n", strsignal(SIGILL), strerror(errno));
+
+		exit(EXIT_FAILURE);
+	}
+
+	if (sigaction(SIGABRT, &action, NULL) < 0)
+	{
+		fprintf(stderr, "sigaction((%s)) failed, %s\n", strsignal(SIGABRT), strerror(errno));
+
+		exit(EXIT_FAILURE);
+	}
+
+	// Analyse the command line
+	while ((option = getopt(argc, argv, "c:f:n:hv")) != -1)
+	{
+		switch (option)
+		{
+			case 'c':	// Launch cmm as a client communicating with the cmm daemon
+				cmmClient(optarg, argc-optind, &argv[optind]);
+				return 0;
+
+			case 'f':	// Specify configuration file
+				//Get the argument
+				strncpy(confFilePath, optarg, 512);
+				confFilePath[512] = '\0';
+				break;
+
+			case 'n':       // Get the max conntrack connections
+				sscanf(optarg, "%u", &nf_conntrack_max);
+				break;
+
+			case 'h':	// Print help
+				cmmHelp();
+				return 0;
+			case 'v':	// Print version and exit
+				cmmVersion();
+				return 0;
+			default:
+				break;
+		}
+	}
+/*	cmm_print(DEBUG_STDOUT, "nf_conntrack_max %u\n", nf_conntrack_max);*/
+
+	// If cmm daemon is already running, return
+	if (cmmIsDaemonRunning())
+	{
+		cmm_print(DEBUG_CRIT, "cmm daemon is already running\n");
+		goto err0;
+	}
+
+	// Daemonize the application
+	daemon(0, 1);
+
+	//Ensure clean termination
+	action.sa_handler = sig_term_hdlr;
+	sigemptyset(&action.sa_mask);
+	sigaddset(&action.sa_mask, SIGTERM);
+	action.sa_flags = 0;
+
+	if (sigaction(SIGTERM, &action, NULL) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: sigaction() failed %s\n", __func__, strerror(errno));
+		goto err0;
+	}
+	
+	// Need to daemonize before creating a Pid File
+	if (cmmCreateDaemonPidFile())
+		goto err0;
+
+	// Parse the configuration file
+	if (cmmFcParser(strlen(confFilePath) ? confFilePath : CONF_FILE_PATH))
+		goto err1;
+
+	// Change priority of the process (we need to have a highest priority)
+	//memset(&schedParams, 0 , sizeof(schedParams));
+	//schedParams.sched_priority = 99;
+	//sched_setscheduler(0, SCHED_FIFO, &schedParams);
+
+	//Init process does not set stdout on console
+	freopen("/dev/console", "w", stdout);
+
+	sigemptyset(&block_mask);
+	sigaddset(&block_mask, SIGTERM);
+
+	sigprocmask(SIG_BLOCK, &block_mask, NULL);
+
+	// Open a Netfilter socket
+	/* Use of the following handle must be protected by ctMutex */
+	globalConf.nf_conntrack_handle = nfct_open(CONNTRACK, 0);
+	if (!globalConf.nf_conntrack_handle)
+	{
+		cmm_print(DEBUG_CRIT, "%s: nfct_open()failed, %s\n", __func__, strerror(errno));
+		goto err1;
+	}
+
+	if (cmmCtInit(&globalConf.ct) < 0)
+		goto err1a;
+
+	if (cmmDaemonInit(&globalConf.daemon) < 0)
+		goto err2;
+
+	if (cmmCliInit(&globalConf.cli) < 0)
+		goto err3;
+
+	/* If callback support is enabled, then CMM calls 3rd Party initialization function */
+	globalConf.third_part_data = cmm_third_part_init();
+
+	sigprocmask(SIG_UNBLOCK, &block_mask, NULL);
+
+	/* Loop until sigterm is received */
+	while (1)
+		pause();
+
+	cmm_print(DEBUG_INFO, "%s: exiting\n", __func__);
+
+	return 0;
+
+err3:
+	cmmDaemonExit(&globalConf.daemon);
+
+err2:
+	cmmCtExit(&globalConf.ct);
+
+err1a:
+	nfct_close(globalConf.nf_conntrack_handle);
+
+err1:
+	remove(CMM_PID_FILE_PATH);
+
+err0:
+	cmm_print(DEBUG_INFO, "%s: exiting\n", __func__);
+
+	if (globalConf.logFile)
+		fclose(globalConf.logFile);
+
+	exit(EXIT_FAILURE);
+}
+
+
+
diff --git a/cmm/src/cmm.h b/cmm/src/cmm.h
new file mode 100644
index 0000000..e4371fd
--- /dev/null
+++ b/cmm/src/cmm.h
@@ -0,0 +1,271 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __CMM_H__
+#define __CMM_H__
+
+	#define _GNU_SOURCE
+
+	#include <stdio.h>
+	#include <stdlib.h>
+	#include <unistd.h>
+	#include <errno.h>
+	#include <sys/types.h>
+	#include <sys/socket.h>
+	#include <arpa/inet.h>
+	#include <linux/netlink.h>
+	#include <linux/rtnetlink.h>
+	#include <string.h>
+	#include <fcntl.h>
+	#include <pthread.h>
+	#include <limits.h>
+
+	#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
+	#include <libnetfilter_conntrack/libnetfilter_conntrack_tcp.h>
+	#include <libcli.h>
+
+	#include <libfci.h>
+	#include "libcmm.h"
+#ifdef AUTO_BRIDGE
+	#include <auto_bridge.h>
+#endif
+	#define NEW_IPC		1
+
+#ifdef NEW_IPC
+	typedef cmm_handle_t *daemon_handle_t;
+#else
+	typedef int daemon_handle_t;
+#endif
+
+	#include "forward_engine.h"
+	#include "rtnl.h"
+	#include "pppoe.h"
+	#include "conntrack.h"
+	#include "ffcontrol.h"
+	#include "client_daemon.h"
+	#include "module_rx.h"
+	#include "module_qm.h"
+	#include "module_prf.h"
+	#include "module_vlan.h"
+	#include "module_mcast.h"
+	#include "module_macvlan.h"
+	#include "module_mc4.h"
+	#include "module_mc6.h"
+	#include "timeout.h" 
+	#include "module_tunnel.h"
+	#include "module_relay.h"
+	#include "module_stat.h"
+	#include "module_route.h"
+	#include "alt_conf.h"
+	#include "module_expt.h"
+	#include "module_socket.h"
+	#include "module_rtp.h"
+	#include "module_natpt.h"
+	#include "module_pktcap.h"
+	#include "module_icc.h"
+	#include "third_part.h"
+#ifdef WIFI_ENABLE
+	#include "module_wifi.h"
+#endif
+	#include "module_l2tp.h"
+	#include "version.h"
+
+	/***** Defines *****/
+
+//#ifdef COMCERTO_2000
+//	#define IPSEC_SUPPORT_DISABLED
+//#endif
+
+	extern unsigned int nf_conntrack_max ;
+	#define NFNL_SOCK_SIZE 	(256 * nf_conntrack_max) // ( 1024 * nf_conntrack_max / 4)
+
+
+
+	#define	developpers 		"Mindspeed Technologies <www.mindspeed.com>"
+	#define cmm_help 	"Usage : cmm [-c command] [-f configurationfile]-h -v \n" \
+							"-c command \tRun cmm to send a command. Need cmm daemon to be running\n" \
+							"-f conffile\tTell cmm to use the following configuration file. Available in daemon mode only\n" \
+							"-h         \tPrint this help\n" \
+							"-v         \tPrint cmm version\n"
+
+	#define cmm_print(level, format, args...)							\
+		do {											\
+			if (level & (DEBUG_CRIT | DEBUG_STDOUT | globalConf.debug_level | globalConf.log_level))	\
+				cmm_print_func(level, format, ##args);				\
+		} while (0)
+
+	/* DEBUG_{COMMAND,ERROR,WARNING,INFO} can be set by the user to print out debug messages on 
+	 * the user console, or from the config file to log debug messages into a log file.
+	 * DEBUG_STDOUT messages are not logged into a file.
+	 * DEBUG_STDERR messages will be logged into a file if a logfile has been set in the configuration.
+	 * Both DEBUG_STDOUT and DEBUG_STDERR messages are printed out on the console or CLI.
+	 */
+	#define DEBUG_COMMAND		(1 << 0)
+	#define DEBUG_ERROR		(1 << 1)
+	#define DEBUG_WARNING		(1 << 2)	/* This flag is used when we need to print a message about an unexpected behavior*/
+	#define DEBUG_INFO		(1 << 3)
+	#define DEBUG_STDOUT		(1 << 4)	/* Used for messages in reply to user actions (display commands, etc) */
+	#define DEBUG_CRIT		(1 << 5)	/* Equivalent to DEBUG_STDERR */
+	#define DEBUG_STDERR		DEBUG_CRIT 
+	#define DEBUG_NOTIMESTAMP	(1 << 7)
+
+	/* This debug is not controlled via CLI */
+	#define IPSEC_DBG
+
+	//#define MUTEX_DEBUG
+
+	#ifdef MUTEX_DEBUG
+	
+	extern pthread_mutex_t ctMutex;
+	extern pthread_mutex_t rtMutex;
+	extern pthread_mutex_t neighMutex;
+	extern pthread_mutex_t flowMutex;
+	
+	int mutexes;
+	#define __pthread_mutex_lock(mutex)		\
+		({	\
+			if (mutex == &ctMutex) mutexes |= 0x1; \
+			else if (mutex == &rtMutex) mutexes |= 0x10; \
+			else if (mutex == &neighMutex) mutexes |= 0x100; \
+			else if (mutex == &flowMutex) mutexes |= 0x1000; \
+			cmm_print(DEBUG_CRIT, "0x%04x: lock at %s %u\n", mutexes, __func__, __LINE__); \
+			pthread_mutex_lock (mutex);	\
+		})
+	#define __pthread_mutex_unlock(mutex)		\
+		({	\
+			if (mutex == &ctMutex) mutexes &= ~0x1; \
+			else if (mutex == &rtMutex) mutexes &= ~0x10; \
+			else if (mutex == &neighMutex) mutexes &= ~0x100; \
+			else if (mutex == &flowMutex) mutexes &= ~0x1000; \
+			cmm_print(DEBUG_CRIT, "0x%04x: unlock at %s %u\n", mutexes, __func__, __LINE__); \
+			pthread_mutex_unlock (mutex);	\
+		})
+
+	#else
+	#define __pthread_mutex_lock pthread_mutex_lock
+	#define __pthread_mutex_unlock pthread_mutex_unlock
+	#endif
+
+
+        /* This macro is used for PPPoE Auto mode */
+        #define PPPOE_AUTO_ENABLE       0
+
+
+
+	#define CMM_PID_FILE_PATH "/var/run/cmm.pid"
+
+	/* The following define is enabled if 3rd party callback support is required */
+	//#define CMM_THIRD_PART
+	
+	struct cmm_ct {
+		pthread_t pthread;
+
+		FCI_CLIENT *fci_handle;
+		FCI_CLIENT *fci_catch_handle;
+
+		FCI_CLIENT *fci_key_handle;
+		FCI_CLIENT *fci_key_catch_handle;
+
+		struct nfct_handle *handle;
+		struct nfct_handle *catch_handle;
+		struct nfct_handle *get_handle;
+
+		struct rtnl_handle rth_neigh;
+		struct rtnl_handle rth_link;
+		struct rtnl_handle rth_ifaddr;
+		struct rtnl_handle rth_route;
+		struct rtnl_handle rth_rule;
+		struct rtnl_handle rth_abm;
+	};
+
+	struct cmm_daemon {
+		pthread_t pthread;
+		FCI_CLIENT *fci_handle;				/* fci library Handler used by msg daemon thread*/
+		FCI_CLIENT *fci_key_handle;
+		int queueIdRx;
+		int queueIdTx;
+	};
+
+	struct cmm_cli {
+		pthread_t pthread;
+		FCI_CLIENT *fci_handle;
+		daemon_handle_t daemon_handle;
+		int sock;
+		int sock2;
+		struct cli_def *handle;
+	};
+
+	 /***** Global structure *****/
+	struct cmm_global
+	{
+		pid_t cmmPid;
+		FILE *logFile;
+		pthread_mutex_t logMutex;
+
+		int enable;						/*Forward engine can be programmed or not*/
+
+		int ff_enable;						/* Fast-forward enable/disable, all packets go through ACP but all control path is enabled */
+#ifdef C2000_DPI
+		int dpi_enable;						/* DPI enable/disable, CMM pushes connections to FPP normally if disabled */
+#endif
+		int asymff_enable;					/* Asymmetric Fastpath enable/disable*/
+		char debug_level;
+		char log_level;
+		enum _t_vlan_policy {
+		        ALLOW,
+			PROHIBIT,
+		        MANUAL
+		} vlan_policy;
+
+		char tun_family;
+		char tun_proto;
+
+		struct nfct_handle *nf_conntrack_handle;	/* Used to send messages to nf_conntrack -- use must be protected by ctMutex */
+
+		struct cmm_ct ct;
+		struct cmm_daemon daemon;
+		struct cmm_cli cli;
+	
+		int *third_part_data;
+		int auto_bridge;
+	};
+
+	/*
+	 * This structure is used to exchange messages
+	 * between cmm daemon and cmm client
+	 */
+	struct cmm_msg
+	{
+		long mtype; 				// This field is mandatory to use IPC message queues
+		char buffer[CMM_BUF_SIZE];		// A buffer where the data are stored
+	};
+	/*
+	 * Common parser defines/helpers
+	 */
+	#define CMD_BIT(x)  (1 << ((x) & 0xFF))
+	#define TEST_CMD_BIT(y, x) (y & (CMD_BIT(x)))
+
+	extern struct cmm_global globalConf;
+
+	int cmmIsDaemonRunning(void);
+	void cmm_print_func(int level, const char *format, ...);
+
+	#define MAC_ADDRSTRLEN	18
+	const char *mac_ntop(const void *mac, char *buf, size_t len);
+#endif
diff --git a/cmm/src/cmm_asym_ff.c b/cmm/src/cmm_asym_ff.c
new file mode 100644
index 0000000..bba73b9
--- /dev/null
+++ b/cmm/src/cmm_asym_ff.c
@@ -0,0 +1,130 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+#include <signal.h>
+#include <net/if.h>
+#include <sys/time.h>
+
+#include "cmm.h"
+#include "itf.h"
+#include "ffbridge.h"
+#include "cmmd.h"
+
+/*****************************************************************
+* cmmAsymFFEnableShow
+*
+*
+******************************************************************/
+int cmmAsymFFEnableShow(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	if(globalConf.asymff_enable)
+		cli_print(cli, " The Asymmetric Fast forward support is enabled");
+	else
+		cli_print(cli, " The Asymmetric Fast forward support is disabled");
+	return CLI_OK;
+}
+
+int cmmAsymFFProcessClientCmd(u_int8_t *cmd_buf, u_int16_t *res_buf, u_int16_t *res_len)
+{
+        cmmd_asymff_enable_t    *entryCmd = (cmmd_asymff_enable_t*) cmd_buf;
+
+        cmm_print(DEBUG_INFO, "cmmAsymFFProcessClientCmd\n");
+
+        res_buf[0] = CMMD_ERR_OK;
+        *res_len = 2;
+
+        switch (entryCmd->action) {
+                case CMMD_ASYM_FF_ACTION_ENABLE:
+                        cmm_print(DEBUG_INFO, "cmmAsymFFProcessClientCmd- CMMD_ASYM_FF_ACTION_ENABLE\n");
+                        globalConf.asymff_enable = 1;
+                        break;
+
+                case CMMD_ASYM_FF_ACTION_DISABLE:
+                        cmm_print(DEBUG_INFO, "cmmAsymFFProcessClientCmd- CMMD_ASYM_FF_ACTION_DISABLE\n");
+                        globalConf.asymff_enable = 0;
+                        break;
+
+                default:
+                        res_buf[0] = CMMD_ERR_UNKNOWN_ACTION;
+                        break;
+        }
+        return 0;
+}
+
+void cmmAsymFFPrintHelp(int cmd_type)
+{
+        if (cmd_type == ASYMFF_UNKNOWN_CMD || cmd_type == ASYMFF_ENABLE_CMD)
+        {
+            cmm_print(DEBUG_STDOUT, "Usage: set asymff enable \n"
+                                    "       set asymff disable \n");
+        }
+}
+
+int cmmAsymFFSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cmd_type = ASYMFF_UNKNOWN_CMD;
+	int cpt = tabStart;
+	int rc;
+
+	char sndBuffer[256];
+	char rcvBuffer[256];
+	cmmd_asymff_enable_t* entryCmd = (cmmd_asymff_enable_t*) sndBuffer;
+
+	memset(sndBuffer, 0, sizeof(sndBuffer));
+	cmm_print(DEBUG_INFO, "Entered Asymmetric Fast forward Set Process\n");
+
+	if(!keywords[cpt])
+		goto help;
+
+	if( (strcasecmp(keywords[cpt], "enable") == 0) ||
+	    (strcasecmp(keywords[cpt], "disable") == 0) )
+	{
+		cmd_type = ASYMFF_ENABLE_CMD;
+
+		if(strcasecmp(keywords[cpt], "enable") == 0)
+			entryCmd->action = CMMD_ASYM_FF_ACTION_ENABLE;
+		else
+			entryCmd->action = CMMD_ASYM_FF_ACTION_DISABLE;
+	}
+	else
+		goto keyword_error;
+
+	rc = cmmSendToDaemon(daemon_handle, CMMD_ASYM_FF_ENABLE, sndBuffer, sizeof(cmmd_asymff_enable_t), rcvBuffer);
+	if(rc != 2)
+	{
+		if(rc >= 0)
+			cmm_print(DEBUG_STDERR, "Unexpected response size for CMMD_ASYM_FF_ENABLE: %d\n", rc);
+		return -1;
+	}
+	else if (((unsigned short *)rcvBuffer)[0] != CMMD_ERR_OK)
+	{
+		cmm_print(DEBUG_STDERR, "Error %d received for CMMD_ASYM_FF_ENABLE\n", ((unsigned short *)rcvBuffer)[0]);
+		return -1;
+	}
+        
+	return 0;
+
+keyword_error:
+	cmm_print(DEBUG_CRIT, "ERROR: Unknown keyword %s\n", keywords[cpt]);
+
+help:
+	cmmAsymFFPrintHelp(cmd_type);
+	return -1;
+}
+
diff --git a/cmm/src/cmmd.h b/cmm/src/cmmd.h
new file mode 100644
index 0000000..eea3c70
--- /dev/null
+++ b/cmm/src/cmmd.h
@@ -0,0 +1,378 @@
+/*
+ *
+ *  Copyright (C) 2010 Mindspeed Technologies, Inc.
+ *
+ * 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 __CMMD__
+#define __CMMD__
+
+#include <net/if.h>
+#include <fpp.h>
+
+/*--------------------------------- Generic errors ---------------------------*/
+#define CMMD_ERR_OK					FPP_ERR_OK
+#define CMMD_ERR_UNKNOWN_COMMAND			FPP_ERR_UNKNOWN_COMMAND
+#define CMMD_ERR_WRONG_COMMAND_SIZE			FPP_ERR_WRONG_COMMAND_SIZE
+#define CMMD_ERR_WRONG_COMMAND_PARAM			FPP_ERR_WRONG_COMMAND_PARAM
+#define CMMD_ERR_UNKNOWN_ACTION				FPP_ERR_UNKNOWN_ACTION
+#define CMMD_ERR_UNKNOWN				32000
+#define CMMD_ERR_NOT_FOUND				32001
+#define CMMD_ERR_NOT_CONFIGURED				32002
+#define CMMD_ERR_DUPLICATE				32003
+
+/*Actions used in severals commands*/
+#define CMMD_ACTION_REGISTER     FPP_ACTION_REGISTER
+#define CMMD_ACTION_DEREGISTER   FPP_ACTION_DEREGISTER
+#define CMMD_ACTION_KEEP_ALIVE   FPP_ACTION_KEEP_ALIVE
+#define CMMD_ACTION_REMOVED      FPP_ACTION_REMOVED
+#define CMMD_ACTION_UPDATE       FPP_ACTION_UPDATE
+#define CMMD_ACTION_QUERY        FPP_ACTION_QUERY
+#define CMMD_ACTION_QUERY_CONT   FPP_ACTION_QUERY_CONT
+#define CMMD_ACTION_QUERY_LOCAL  FPP_ACTION_QUERY_LOCAL
+
+/*------------------------------------- Sockets ------------------------------*/
+#define CMMD_CMD_SOCKET_OPEN				0x1301
+#define CMMD_CMD_SOCKET_CLOSE				0x1302
+#define CMMD_CMD_SOCKET_SHOW				0x1303
+#define CMMD_CMD_SOCKET_UPDATE				0x1305
+
+#define CMMD_SOCKET_TYPE_LANWAN				0
+#define CMMD_SOCKET_TYPE_ACP				1
+#define CMMD_SOCKET_TYPE_MSP				2
+#define CMMD_SOCKET_TYPE_L2TP				3
+
+#define CMMD_ERR_SOCK_ALREADY_OPEN			FPP_ERR_SOCK_ALREADY_OPEN	
+#define CMMD_ERR_SOCKID_ALREADY_USED			FPP_ERR_SOCKID_ALREADY_USED
+#define CMMD_ERR_SOCK_ALREADY_OPENED_WITH_OTHER_ID	FPP_ERR_SOCK_ALREADY_OPENED_WITH_OTHER_ID
+#define CMMD_ERR_WRONG_SOCKID				FPP_ERR_WRONG_SOCKID
+
+typedef struct cmmd_socket_open_cmd {
+	u_int16_t	id;
+	u_int8_t type;
+	u_int8_t mode;
+	u_int32_t	family;
+	u_int32_t	saddr[4];
+	u_int32_t	daddr[4];
+	u_int16_t	sport;
+	u_int16_t	dport;
+	u_int8_t	proto;
+        u_int8_t	queue;
+	u_int16_t	dscp;
+	u_int32_t	fwmark;
+	u_int16_t	secure;
+	u_int16_t	pad2;
+} __attribute__((__packed__)) cmmd_socket_open_cmd_t;
+
+typedef struct cmmd_socket_update_cmd {
+	u_int16_t	id;
+	u_int16_t	rsvd1;
+	u_int32_t	family;
+	u_int32_t	saddr[4];
+	u_int16_t	sport;
+	u_int8_t	rsvd2;
+	u_int8_t	queue;
+	u_int16_t	dscp;
+	u_int16_t	pad;
+	u_int32_t	fwmark;
+	u_int16_t	secure;
+	u_int16_t	pad2;
+} __attribute__((__packed__)) cmmd_socket_update_cmd_t;
+
+typedef struct cmmd_socket_close_cmd {
+	u_int16_t	id;
+	u_int16_t	pad1;
+} __attribute__((__packed__)) cmmd_socket_close_cmd_t;
+
+typedef struct cmmd_socket_show_cmd {
+	u_int16_t id;
+	u_int16_t dump_all;
+	u_int16_t nb_socket;
+	u_int16_t pad1;
+} __attribute__((__packed__)) cmmd_socket_show_cmd_t;
+
+typedef struct cmmd_socket_show_res {
+	u_int16_t	rc;
+	u_int16_t	pad;
+	u_int16_t	nb_socket;
+	u_int16_t	pad1;
+	struct socket_info {
+		u_int16_t	sock_id;
+		u_int32_t	flags;
+	} sockets[0];
+} __attribute__((__packed__)) cmmd_socket_show_res_t;
+
+/*---------------------------------- Routing ---------------------------------*/
+#define CMMD_CMD_EXTROUTE		0x0D01
+
+#define CMMD_EXTROUTE_ACTION_ADD	0
+#define CMMD_EXTROUTE_ACTION_REMOVE	1
+#define CMMD_EXTROUTE_ACTION_QUERY	2
+#define CMMD_EXTROUTE_ACTION_RESET	3
+                        
+typedef struct cmmd_route_entry {
+	int32_t		action;
+	u_int32_t	prio;
+	u_int32_t	mtu;
+	char		output_device_str[IFNAMSIZ];
+	char		input_device_str[IFNAMSIZ];
+	u_int32_t	dst_addr[2];
+	u_int32_t	src_addr[2];
+	u_int16_t	proto;
+	u_int16_t	dst_port[2];
+	u_int16_t	src_port[2];
+} cmmd_route_entry_t;              
+
+/*-------------------------------------- Conntrack ----------------------------*/
+#define CMMD_CMD_IPV4_CONNTRACK		FPP_CMD_IPV4_CONNTRACK
+#define CMMD_CMD_IPV6_CONNTRACK		FPP_CMD_IPV6_CONNTRACK
+
+#define CMMD_ERR_CT_ENTRY_ALREADY_REGISTERED	FPP_ERR_CT_ENTRY_ALREADY_REGISTERED
+#define CMMD_ERR_CT_ENTRY_NOT_FOUND		FPP_ERR_CT_ENTRY_NOT_FOUND
+
+typedef fpp_ct_cmd_t 		cmmd_ct_cmd_t;
+typedef fpp_ct_ex_cmd_t		cmmd_ct_ex_cmd_t;
+typedef fpp_ct6_cmd_t		cmmd_ct6_cmd_t;
+typedef fpp_ct6_ex_cmd_t	cmmd_ct6_ex_cmd_t;
+
+/*---------------------------------- Fast Forwarding -------------------------*/
+#define CMMD_CMD_IPV4_FF_CONTROL		FPP_CMD_IPV4_FF_CONTROL  
+
+/* Structure representing the command sent to enable/disable fast-forward */
+typedef fpp_ff_ctrl_cmd_t 	cmmd_ff_ctrl_cmd_t;
+ 
+/*---------------------------------- Multicast -------------------------------*/
+// 0x0700 -> 0x07FF : Multicast modules 
+#define CMMD_ERR_MC_ENTRY_NOT_FOUND		FPP_ERR_MC_ENTRY_NOT_FOUND
+#define CMMD_ERR_MC_MAX_LISTENERS                    701
+#define CMMD_ERR_MC_DUP_LISTENER                     702
+#define CMMD_ERR_MC_ENTRY_OVERLAP  		     703 
+#define CMMD_ERR_MC_INVALID_MAC                      704
+#define CMMD_ERR_MC_INTERFACE_NOT_ALLOWED            705
+
+#define CMMD_CMD_MC6_MULTICAST			0x0703
+#define CMMD_CMD_MC6_RESET			0x0704
+#define CMMD_CMD_MC6_MODE               	0x0705
+
+
+#define CMMD_MC6_MAX_LISTENERS_PER_GROUP     	4
+
+#define CMMD_MC6_MODE_BRIDGED			0x0001
+#define CMMD_MC6_MODE_ROUTED         		0x0000
+#define CMMD_MC6_MODE_MASK           		0x0001
+
+typedef struct mc_listener cmmd_mc6_listener_t;
+
+typedef struct cmmd_mc6_entry {
+	u_int16_t	action;
+	u_int8_t	mode : 1, 
+			queue : 5,
+			rsvd : 2 ;
+	u_int8_t	src_mask_len;
+	u_int32_t	src_addr[4];
+	u_int32_t	dst_addr[4];
+	u_int32_t	num_output;
+} __attribute__((__packed__)) cmmd_mc6_entry_t;
+
+// 0x0700 -> 0x07FF : Multicast modules
+#define CMMD_CMD_MC4_MULTICAST			0x0701
+#define CMMD_CMD_MC4_RESET			0x0702
+
+#define CMMD_MC_ACTION_ADD			0
+#define CMMD_MC_ACTION_REMOVE			1
+#define CMMD_MC_ACTION_UPDATE       		2
+#define CMMD_MC_ACTION_REMOVE_LOCAL       	11
+
+#define CMMD_MC4_MODE_BRIDGED     		0x0001
+#define CMMD_MC4_MODE_ROUTED			0x0000
+#define CMMD_MC4_MODE_MASK			0x0001
+
+#define CMMD_MC4_MAX_LISTENERS_PER_GROUP	4
+
+typedef struct mc_listener  cmmd_mc4_listener_t;      
+
+typedef struct cmmd_mc4_entry {
+	u_int16_t	action;
+	u_int8_t	src_mask_len;
+	u_int8_t	mode : 1, 
+			queue : 5,
+			rsvd : 2 ;
+	u_int32_t	src_addr;
+	u_int32_t	dst_addr;
+	u_int32_t	num_output;
+} __attribute__((__packed__)) cmmd_mc4_entry_t;
+
+
+typedef struct mc_listener  cmmd_mc_listener_t;      
+/*----------------------------------- Voice File ---------------------------------*/
+#define CMMD_CMD_VOICE_FILE_LOAD	0x0820
+#define CMMD_CMD_VOICE_FILE_UNLOAD	0x0821
+
+#define CMMD_VOICE_FILE_MAX_NAMESIZE	240
+
+typedef struct cmmd_voice_file_load_cmd {
+	u_int16_t file_id;
+	u_int16_t payload_type;
+	u_int16_t frame_size;
+	char filename[CMMD_VOICE_FILE_MAX_NAMESIZE];
+} __attribute__((__packed__)) cmmd_voice_file_load_cmd_t;
+
+typedef struct cmmd_voice_file_unload_cmd {
+	u_int16_t file_id;
+} __attribute__((__packed__)) cmmd_voice_file_unload_cmd_t;
+
+/*----------------------------------- Tunnel ---------------------------------*/
+#define CMMD_ERR_TNL_ENTRY_NOT_FOUND	FPP_ERR_TNL_ENTRY_NOT_FOUND
+
+/* CMM to FPP API Commands */
+#define CMMD_CMD_TUNNEL_ADD		FPP_CMD_TUNNEL_ADD
+#define CMMD_CMD_TUNNEL_DEL		FPP_CMD_TUNNEL_DEL
+#define CMMD_CMD_TUNNEL_UPDATE		FPP_CMD_TUNNEL_UPDATE
+#define CMMD_CMD_TUNNEL_SEC		FPP_CMD_TUNNEL_SEC
+#define CMMD_CMD_TUNNEL_QUERY		FPP_CMD_TUNNEL_QUERY	
+#define CMMD_CMD_TUNNEL_QUERY_CONT	FPP_CMD_TUNNEL_QUERY_CONT	
+#define CMMD_CMD_TUNNEL_SHOW		0x0B09
+#define CMMD_CMD_TUNNEL_SAMREADY	0x0B0a
+#define CMMD_CMD_TUNNEL_IDCONV_psid	FPP_CMD_TUNNEL_4rd_ID_CONV_psid
+
+/* CMM to Deamon message structure */
+typedef struct cmmd_tunnel {
+	char		name[IFNAMSIZ];    /* Tunnel name */
+        int8_t		ipsec;             /* IPSec ? */
+        int8_t		tunnel_type;       /* Type */
+#ifdef SAM_LEGACY
+	int16_t          sam_enable:1,
+			 tun_mtu:15;
+#endif
+} __attribute__((__packed__)) cmmd_tunnel_t;
+
+/* CMM / FPP API Command */
+typedef fpp_tunnel_create_cmd_t cmmd_tunnel_create_cmd_t; 
+typedef fpp_tunnel_query_cmd_t cmmd_tunnel_query_cmd_t; 
+typedef fpp_tunnel_del_cmd_t	cmmd_tunnel_del_cmd_t;
+typedef fpp_tunnel_sec_cmd_t	cmmd_tunnel_sec_cmd_t; 
+
+/*--------------------------------------- PPoE --------------------------------*/
+#define CMMD_CMD_PPPOE_RELAY_ENTRY			FPP_CMD_PPPOE_RELAY_ENTRY
+#define CMMD_CMD_PPPOE_RELAY_ADD			FPP_CMD_PPPOE_RELAY_ADD
+#define CMMD_CMD_PPPOE_RELAY_REMOVE			FPP_CMD_PPPOE_RELAY_REMOVE
+
+#define CMMD_ERR_PPPOE_ENTRY_ALREADY_REGISTERED		FPP_ERR_PPPOE_ENTRY_ALREADY_REGISTERED	
+#define CMMD_ERR_PPPOE_ENTRY_NOT_FOUND			FPP_ERR_PPPOE_ENTRY_NOT_FOUND
+
+typedef fpp_relay_info_t cmmd_relay_info_t;
+
+/* Structure representing the command sent to add or remove a pppoe session */
+typedef fpp_pppoe_relay_cmd_t cmmd_pppoe_relay_cmd_t;
+
+/*---------------------------------------- VLAN --------------------------------*/
+#define CMMD_CMD_VLAN_ENTRY				FPP_CMD_VLAN_ENTRY	
+#define CMMD_CMD_VLAN_RESET				FPP_CMD_VLAN_RESET	
+
+#define CMMD_ERR_VLAN_ENTRY_ALREADY_REGISTERED		FPP_ERR_VLAN_ENTRY_ALREADY_REGISTERED	
+#define CMMD_ERR_VLAN_ENTRY_NOT_FOUND			FPP_ERR_VLAN_ENTRY_NOT_FOUND
+
+/* Structure describing vlan in query response between client and Daemon */
+typedef struct cmmd_vlan_response {
+	u_int16_t	vlan_id;
+	char 		vlan_ifname[IFNAMSIZ];
+	char		vlan_phy_if_name[IFNAMSIZ];
+} __attribute__((__packed__)) cmmd_vlan_response_t;
+
+typedef fpp_vlan_cmd_t cmmd_vlan_cmd_t; 
+
+/*---------------------------------------- MACVLAN --------------------------------*/
+#define CMMD_CMD_MACVLAN_ENTRY				FPP_CMD_MACVLAN_ENTRY
+#define CMMD_CMD_MACVLAN_RESET				FPP_CMD_MACVLAN_RESET
+
+#define CMMD_ERR_MACVLAN_ENTRY_ALREADY_REGISTERED	FPP_ERR_MACVLAN_ENTRY_ALREADY_REGISTERED
+#define CMMD_ERR_MACVLAN_ENTRY_NOT_FOUND		FPP_ERR_MACVLAN_ENTRY_NOT_FOUND
+
+typedef fpp_macvlan_cmd_t cmmd_macvlan_cmd_t; 
+
+/*----------------DPD---------------------------------------*/
+#define CMMD_CMD_IPSEC_DPDSAQUERYTIMER		0x0a0d
+
+/*-Structure representing the command sent to configure IPsec SA query Timer for DPD */
+typedef struct cmmd_saquery_timer {
+	int32_t		action;
+	u_int32_t	SaQueryTimerVal;
+} cmmd_saquery_timer_t;
+
+#define CMMD_DPDSAQUERY_ACTION_ENABLE		0
+#define CMMD_DPDSAQUERY_ACTION_DISABLE		1
+#define CMMD_DPDSAQUERY_ACTION_SETTIMER		2
+/*-------------------------------------------*/
+
+/*----------------DPI---------------------------------*/
+#ifdef COMCERTO_2000 
+
+#define CMMD_CMD_DPIENABLE	0x1601
+
+/*-Structure representing the command sent to configure DPI enable/disable Flag */
+typedef struct cmmd_dpi_enable {
+	int32_t		action;
+}cmmd_dpi_enable_t;
+
+#define CMMD_DPIFLAG_ACTION_ENABLE		0
+#define CMMD_DPIFLAG_ACTION_DISABLE		1
+
+#endif /*C2000_DPI*/
+/*----------------DPI---------------------------*/
+
+/*-------------Asymmetric fast forward------------------*/
+#define CMMD_ASYM_FF_ENABLE	0x1701
+
+/*-Structure representing the command sent to configure DPI enable/disable Flag */
+typedef struct cmmd_asymff_enable {
+	int32_t		action;
+}cmmd_asymff_enable_t;
+
+#define CMMD_ASYM_FF_ACTION_ENABLE		0
+#define CMMD_ASYM_FF_ACTION_DISABLE		1
+
+/*-------------Asymmetric fast forward-------------------*/
+
+/*----------------------------------- L2TP ---------------------------------*/
+#define CMMD_CMD_L2TP_SESSION		0x1801		
+#define CMMD_CMD_L2TP_SESSION_CREATE		CMMD_CMD_L2TP_SESSION
+#define CMMD_CMD_L2TP_SESSION_DESTROY		0x1802
+
+#define CMMD_L2TP_OPT_LENGTH			0x0001
+#define CMMD_L2TP_OPT_SEQ			0x0002
+
+/* CMM Lib message structure */
+typedef struct cmmd_l2tp_session {
+	char		itf_name[IFNAMSIZ];		/* L2TP/PPP interface name */
+	u_int32_t	family;
+	u_int32_t	local_addr[4];
+	u_int32_t	peer_addr[4];
+	u_int16_t	local_port;
+	u_int16_t	peer_port;
+	u_int16_t	local_tun_id;
+	u_int16_t	peer_tun_id;
+	u_int16_t	local_ses_id;
+	u_int16_t	peer_ses_id;
+	u_int16_t	options;		
+	u_int16_t	dscp;
+	u_int32_t	fwmark;
+        u_int8_t	queue;
+	u_int8_t	rsvd;
+	u_int16_t	rsvd2;
+} __attribute__((__packed__)) cmmd_l2tp_session_t;
+
+#endif
+
diff --git a/cmm/src/conntrack.c b/cmm/src/conntrack.c
new file mode 100644
index 0000000..76557c6
--- /dev/null
+++ b/cmm/src/conntrack.c
@@ -0,0 +1,3317 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+#include <signal.h>
+#include <net/if.h>
+#include <sys/time.h>
+
+#include "cmm.h"
+#include "itf.h"
+#include "ffbridge.h"
+#include "cmmd.h"
+
+struct list_head ct_table[CONNTRACK_HASH_TABLE_SIZE];
+struct list_head ct_table_by_rep[CONNTRACK_HASH_TABLE_SIZE];
+struct list_head ct_table_by_orig_route[2 * ROUTE_HASH_TABLE_SIZE];
+struct list_head ct_table_by_rep_route[2 * ROUTE_HASH_TABLE_SIZE];
+struct list_head ct_table_by_orig_tunnel_route[2 * ROUTE_HASH_TABLE_SIZE];
+struct list_head ct_table_by_rep_tunnel_route[2 * ROUTE_HASH_TABLE_SIZE];
+
+struct conntrack_stats ct_stats;
+
+pthread_mutex_t ctMutex = PTHREAD_MUTEX_INITIALIZER;		/*mutex to prevent race condition on the conntrack table*/
+
+const unsigned char null_mac[ETH_ALEN] = {0, };
+const unsigned int null_ip[4] = {0, };
+
+extern void cmmDPDIPsecSAUpdate(struct cmm_ct *ctx);
+extern int cmmNeighSendSolicit(void);
+
+void * cb_data;
+int cb_status;
+
+/*****************************************************************
+* cmmCtSetTimeout
+*
+*
+******************************************************************/
+static void cmmCtSetPermanent(struct nfct_handle * handler, struct ctTable * ctEntry)
+{
+	char buf[nfct_maxsize()]  __attribute__ ((aligned (4)));
+	struct nf_conntrack *ctTemp = (struct nf_conntrack *)buf;
+	struct nf_conntrack *ct = ctEntry->ct;
+	const unsigned int *Saddr, *Daddr, *SaddrReply, *DaddrReply;
+	unsigned short Sport, Dport, SportReply, DportReply;
+	int family, proto, status;
+	u_int32_t id;
+
+	status = nfct_get_attr_u32(ct, ATTR_STATUS);
+
+	if(((ctEntry->flags & (FPP_PROGRAMMED))
+	&& ((status & IPS_PERMANENT) == 0)))
+	{
+
+		memset(ctTemp, 0, nfct_maxsize());
+
+		family = nfct_get_attr_u8(ct, ATTR_ORIG_L3PROTO);
+		proto = nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO);
+
+		nfct_set_attr_u8(ctTemp, ATTR_ORIG_L3PROTO, family);
+		nfct_set_attr_u8(ctTemp, ATTR_ORIG_L4PROTO, proto);
+
+		nfct_set_attr_u8(ctTemp, ATTR_REPL_L3PROTO, family);
+		nfct_set_attr_u8(ctTemp, ATTR_REPL_L4PROTO, proto);
+
+		if (family == AF_INET)
+		{
+			Saddr = nfct_get_attr(ct, ATTR_ORIG_IPV4_SRC);
+			Daddr = nfct_get_attr(ct, ATTR_ORIG_IPV4_DST);
+			SaddrReply = nfct_get_attr(ct, ATTR_REPL_IPV4_SRC);
+			DaddrReply = nfct_get_attr(ct, ATTR_REPL_IPV4_DST);
+
+			nfct_set_attr(ctTemp, ATTR_ORIG_IPV4_SRC, Saddr);
+			nfct_set_attr(ctTemp, ATTR_ORIG_IPV4_DST, Daddr);
+			nfct_set_attr(ctTemp, ATTR_REPL_IPV4_SRC, SaddrReply);
+			nfct_set_attr(ctTemp, ATTR_REPL_IPV4_DST, DaddrReply);
+		}
+		else
+		{
+			Saddr = nfct_get_attr(ct, ATTR_ORIG_IPV6_SRC);
+			Daddr = nfct_get_attr(ct, ATTR_ORIG_IPV6_DST);
+			SaddrReply = nfct_get_attr(ct, ATTR_REPL_IPV6_SRC);
+			DaddrReply = nfct_get_attr(ct, ATTR_REPL_IPV6_DST);
+
+			nfct_set_attr(ctTemp, ATTR_ORIG_IPV6_SRC, Saddr);
+			nfct_set_attr(ctTemp, ATTR_ORIG_IPV6_DST, Daddr);
+			nfct_set_attr(ctTemp, ATTR_REPL_IPV6_SRC, SaddrReply);
+			nfct_set_attr(ctTemp, ATTR_REPL_IPV6_DST, DaddrReply);
+		}
+
+		Sport = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC);
+		Dport = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST);
+		SportReply = nfct_get_attr_u16(ct, ATTR_REPL_PORT_SRC);
+		DportReply = nfct_get_attr_u16(ct, ATTR_REPL_PORT_DST);
+
+		status |= IPS_PERMANENT;
+		/* Set the current ct to avoid useless re-setting in the same pass */
+		nfct_set_attr_u32(ct, ATTR_STATUS, status);
+		nfct_set_attr_u32(ctTemp, ATTR_STATUS, status);
+
+		nfct_set_attr_u16(ctTemp, ATTR_ORIG_PORT_SRC, Sport);
+		nfct_set_attr_u16(ctTemp, ATTR_ORIG_PORT_DST, Dport);
+		nfct_set_attr_u16(ctTemp, ATTR_REPL_PORT_SRC, SportReply);
+		nfct_set_attr_u16(ctTemp, ATTR_REPL_PORT_DST, DportReply);
+
+		id = nfct_get_attr_u32(ct, ATTR_ID);
+		nfct_set_attr_u32(ctTemp, ATTR_ID, id);
+
+		if (nfct_query(handler, NFCT_Q_UPDATE, (void*)ctTemp) < 0) {
+			if (errno != ENOENT)
+				cmm_print(DEBUG_ERROR, "%s: ATTR_STATUS update, nfct_query(NFCT_Q_UPDATE) %s\n", __func__, strerror(errno));
+		}
+		else
+			cmm_print(DEBUG_INFO, "%s: Ct status set to IPS_PERMANENT\n", __func__);
+	}
+}
+
+/*****************************************************************
+* cmmCtForceUpdate
+*
+* This function will trigger kernel to resend an update for the given
+* entry that needs up-to-date information.
+******************************************************************/
+static void cmmCtForceUpdate(struct nfct_handle * handler, struct ctTable * ctEntry)
+{
+	char buf[nfct_maxsize()]  __attribute__ ((aligned (4)));
+	struct nf_conntrack *ctTemp = (struct nf_conntrack *)buf;
+	struct nf_conntrack *ct = ctEntry->ct;
+	const unsigned int *Saddr, *Daddr, *SaddrReply, *DaddrReply;
+	unsigned short Sport, Dport, SportReply, DportReply;
+	int family, proto;
+
+
+	memset(ctTemp, 0, nfct_maxsize());
+
+	family = nfct_get_attr_u8(ct, ATTR_ORIG_L3PROTO);
+	proto = nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO);
+
+	nfct_set_attr_u8(ctTemp, ATTR_ORIG_L3PROTO, family);
+	nfct_set_attr_u8(ctTemp, ATTR_ORIG_L4PROTO, proto);
+
+	nfct_set_attr_u8(ctTemp, ATTR_REPL_L3PROTO, family);
+	nfct_set_attr_u8(ctTemp, ATTR_REPL_L4PROTO, proto);
+
+	if (family == AF_INET)
+	{
+		Saddr = nfct_get_attr(ct, ATTR_ORIG_IPV4_SRC);
+		Daddr = nfct_get_attr(ct, ATTR_ORIG_IPV4_DST);
+		SaddrReply = nfct_get_attr(ct, ATTR_REPL_IPV4_SRC);
+		DaddrReply = nfct_get_attr(ct, ATTR_REPL_IPV4_DST);
+
+		nfct_set_attr(ctTemp, ATTR_ORIG_IPV4_SRC, Saddr);
+		nfct_set_attr(ctTemp, ATTR_ORIG_IPV4_DST, Daddr);
+		nfct_set_attr(ctTemp, ATTR_REPL_IPV4_SRC, SaddrReply);
+		nfct_set_attr(ctTemp, ATTR_REPL_IPV4_DST, DaddrReply);
+	}
+	else
+	{
+		Saddr = nfct_get_attr(ct, ATTR_ORIG_IPV6_SRC);
+		Daddr = nfct_get_attr(ct, ATTR_ORIG_IPV6_DST);
+		SaddrReply = nfct_get_attr(ct, ATTR_REPL_IPV6_SRC);
+		DaddrReply = nfct_get_attr(ct, ATTR_REPL_IPV6_DST);
+
+		nfct_set_attr(ctTemp, ATTR_ORIG_IPV6_SRC, Saddr);
+		nfct_set_attr(ctTemp, ATTR_ORIG_IPV6_DST, Daddr);
+		nfct_set_attr(ctTemp, ATTR_REPL_IPV6_SRC, SaddrReply);
+		nfct_set_attr(ctTemp, ATTR_REPL_IPV6_DST, DaddrReply);
+	}
+
+	Sport = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC);
+	Dport = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST);
+	SportReply = nfct_get_attr_u16(ct, ATTR_REPL_PORT_SRC);
+	DportReply = nfct_get_attr_u16(ct, ATTR_REPL_PORT_DST);
+
+	nfct_set_attr_u16(ctTemp, ATTR_ORIG_PORT_SRC, Sport);
+	nfct_set_attr_u16(ctTemp, ATTR_ORIG_PORT_DST, Dport);
+	nfct_set_attr_u16(ctTemp, ATTR_REPL_PORT_SRC, SportReply);
+	nfct_set_attr_u16(ctTemp, ATTR_REPL_PORT_DST, DportReply);
+
+	if (nfct_query(handler, NFCT_Q_UPDATE, (void*)ctTemp) < 0) {
+		if (errno != ENOENT)
+			cmm_print(DEBUG_ERROR, "%s: ATTR_STATUS update, nfct_query(NFCT_Q_UPDATE) %s\n", __func__, strerror(errno));
+	}
+}
+
+/*****************************************************************
+* cmmCtNetlinkRemove
+*
+*
+******************************************************************/
+int cmmCtNetlinkRemove(struct nfct_handle * handler, struct nf_conntrack *ct)
+{
+	int rc;
+
+	/*Remove the conntrack*/
+	rc = nfct_query(handler, NFCT_Q_DESTROY, (void*)ct);
+	if (rc < 0) {
+		if (errno != ENOENT)
+			cmm_print(DEBUG_ERROR, "%s: nfct_query(NFCT_Q_DESTROY) %s\n", __func__, strerror(errno));
+
+		return -1;
+	}
+
+	return 0;
+}
+
+/*****************************************************************
+* cmmCtShow
+*
+*
+******************************************************************/
+int cmmCtShow(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	struct ctTable * temp;
+	struct list_head *entry;
+	char buf[1024];
+	int i, cpt = 0, nb_mult_ids = 0;
+	int len;
+	unsigned int timeout = 0, orig_timeout;
+
+	for (i = 0 ; i < CONNTRACK_HASH_TABLE_SIZE; i++)
+	{
+                __pthread_mutex_lock(&ctMutex);
+                __pthread_mutex_lock(&flowMutex);
+
+		for(entry = list_first(&ct_table[i]); entry != &ct_table[i]; entry = list_next(entry))
+		{
+			temp = container_of(entry, struct ctTable, list);
+			cpt++;
+
+			/* Keep track of original timeout */
+			orig_timeout = nfct_get_attr_u32(temp->ct, ATTR_TIMEOUT);
+
+			if (temp->flags & FPP_PROGRAMMED)
+				cmmFeGetTimeout(globalConf.cli.fci_handle, temp, &timeout);
+			else
+				timeout = 0;
+			
+			nfct_set_attr_u32(temp->ct, ATTR_TIMEOUT, timeout);
+
+			len = nfct_snprintf(buf, 1024, temp->ct, NFCT_T_UNKNOWN, NFCT_O_PLAIN, NFCT_OF_SHOW_LAYER3);
+
+			nfct_set_attr_u32(temp->ct, ATTR_TIMEOUT, orig_timeout);
+
+			if (temp->fEntryOrig || temp->fEntryRep)
+			{
+				len += snprintf(buf + len, 1024 - len, " IpSec:");
+				if (temp->fEntryOrig)
+					len += snprintf(buf + len, 1024 - len, " O(sa_nr:%d H0:%04x)", temp->fEntryOrig->sa_nr, temp->fEntryOrig->sa_handle[0]);
+
+				if (temp->fEntryRep)
+					len += snprintf(buf + len, 1024 - len, " R(sa_nr:%d H0:%04x)", temp->fEntryRep->sa_nr, temp->fEntryRep->sa_handle[0]);
+			}
+
+			cli_print(cli, "%s, Flags: %x, n_id: %d", buf, temp->flags, temp->n_id);
+
+			if (temp->n_id > 1)
+				nb_mult_ids++;
+		}
+
+		__pthread_mutex_unlock(&flowMutex);
+		__pthread_mutex_unlock(&ctMutex);
+
+		/* Give a chance to other processes waiting for the lock */
+		if (!(i % 100))
+			sched_yield();
+	}
+	cli_print(cli, "%d connections printed", cpt);
+	cli_print(cli, "%d connections with > 1 ids", nb_mult_ids);
+
+	return CLI_OK;
+}
+
+/*****************************************************************
+* __cmmCtIsInv
+*
+* To be used on already matched conntracks (but that can be inverted)
+******************************************************************/
+static int __cmmCtIsInv(struct nf_conntrack *ct1, struct nf_conntrack *ct2)
+{
+	int family = nfct_get_attr_u8(ct1, ATTR_ORIG_L3PROTO);
+
+	if (family == AF_INET) {
+		if (nfct_get_attr_u32(ct1, ATTR_ORIG_IPV4_SRC) != nfct_get_attr_u32(ct2, ATTR_ORIG_IPV4_SRC))
+			return 1;
+	}
+	else {
+		if (memcmp(nfct_get_attr(ct1, ATTR_ORIG_IPV6_SRC), nfct_get_attr(ct2, ATTR_ORIG_IPV6_SRC), 16))
+			return 1;
+	}
+	return 0;
+}
+/*****************************************************************
+* __cmmCtFindId
+*
+*
+******************************************************************/
+static int __cmmCtFindId(struct ctTable *ctEntry, u_int32_t id)
+{
+	int i;
+
+	for (i = 0; i < MAX_CT_ID; i++) {
+		if (id == ctEntry->ids[i])
+			return 1;
+	}
+	return 0;
+}
+
+/*****************************************************************
+* __cmmCtAddId
+*
+*
+******************************************************************/
+static int __cmmCtAddId(struct ctTable *ctEntry, u_int32_t id)
+{
+	int i;
+
+	for (i = 0; i < MAX_CT_ID; i++) {
+		if (!ctEntry->ids[i]) {
+			ctEntry->ids[i]= id;
+			ctEntry->n_id++;
+			return 0;
+		}
+	}
+	cmm_print(DEBUG_ERROR, "%s: ctEntry id_array is full. This can lead to synchronisation issues with kernel conntrack table\n", __func__);
+	return -1;
+}
+
+/*****************************************************************
+* __cmmCtDelId
+*
+*
+******************************************************************/
+static int __cmmCtDelId(struct ctTable *ctEntry, u_int32_t id)
+{
+	int i;
+
+	for (i = 0; i < MAX_CT_ID; i++) {
+		if (id == ctEntry->ids[i]) {
+			ctEntry->ids[i] = 0;
+			ctEntry->n_id--;
+			return 0;
+		}
+	}
+	return -1;
+}
+
+
+/*****************************************************************
+* __cmmCtAdd
+*
+*
+******************************************************************/
+static struct ctTable *__cmmCtAdd(struct nf_conntrack *ct)
+{
+	struct ctTable *newEntry;
+	int key;
+	const unsigned int *Saddr, *Daddr, *SaddrReply, *DaddrReply;
+
+	//Add the Conntrack to the local table
+	if (ct_stats.current >= CONNTRACK_MAX)
+	{
+		cmm_print(DEBUG_WARNING, "%s: maximum allowed conntracks %d reached\n", __func__, ct_stats.current);
+		goto err0;
+	}
+
+	newEntry = (struct ctTable*) malloc(sizeof(struct ctTable));
+	if (newEntry == NULL)
+	{
+		cmm_print(DEBUG_ERROR, "%s: malloc failed\n", __func__);
+		goto err0;
+	}
+	memset(newEntry, 0, sizeof(struct ctTable));
+
+	newEntry->ct = ct;
+
+	newEntry->family = nfct_get_attr_u8(ct, ATTR_ORIG_L3PROTO);
+
+	__cmmCtAddId(newEntry, nfct_get_attr_u32(ct, ATTR_ID));
+
+	if (newEntry->family == AF_INET)
+	{
+		Saddr = nfct_get_attr(ct, ATTR_ORIG_IPV4_SRC);
+		Daddr = nfct_get_attr(ct, ATTR_ORIG_IPV4_DST);
+		SaddrReply = nfct_get_attr(ct, ATTR_REPL_IPV4_SRC);
+		DaddrReply = nfct_get_attr(ct, ATTR_REPL_IPV4_DST);
+	}
+	else
+	{
+		Saddr = nfct_get_attr(ct, ATTR_ORIG_IPV6_SRC);
+		Daddr = nfct_get_attr(ct, ATTR_ORIG_IPV6_DST);
+		SaddrReply = nfct_get_attr(ct, ATTR_REPL_IPV6_SRC);
+		DaddrReply = nfct_get_attr(ct, ATTR_REPL_IPV6_DST);
+	}
+	
+	//Add the Conntrack to the local table
+	key = HASH_CT(newEntry->family, Saddr,
+			Daddr,
+			nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC),
+			nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST),
+			nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO));
+
+	list_add(&ct_table[key], &newEntry->list);
+
+	//Add the Conntrack to the local by replier table (used for flow cache <-> ct lookup)
+	key = HASH_CT(newEntry->family, SaddrReply,
+			DaddrReply,
+			nfct_get_attr_u16(ct, ATTR_REPL_PORT_SRC),
+			nfct_get_attr_u16(ct, ATTR_REPL_PORT_DST),
+			nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO));
+
+	list_add(&ct_table_by_rep[key], &newEntry->list_by_rep);
+
+	key = HASH_RT(newEntry->family, Saddr, SaddrReply);
+
+	list_add(&ct_table_by_orig_route[key], &newEntry->list_by_orig_route);
+
+	key = HASH_RT(newEntry->family, SaddrReply, Saddr);
+
+	list_add(&ct_table_by_rep_route[key], &newEntry->list_by_rep_route);
+
+	ct_stats.current++;
+
+	newEntry->timeout = 0;
+	newEntry->tlast = -1;
+
+	return newEntry;
+
+err0:
+	return NULL;
+}
+
+/*****************************************************************
+* __cmmCtRemove
+*
+*
+******************************************************************/
+void __cmmCtRemove(struct ctTable *ctEntry)
+{
+	ct_stats.current--;
+
+	list_del(&ctEntry->list);
+	list_del(&ctEntry->list_by_rep);
+
+	list_del(&ctEntry->list_by_orig_route);
+	list_del(&ctEntry->list_by_rep_route);
+
+	nfct_destroy(ctEntry->ct);
+
+	free(ctEntry);
+}
+
+/*****************************************************************
+* __cmmCtFindFromFlow
+*
+*
+******************************************************************/
+struct ctTable *__cmmCtFindFromFlow(int family, unsigned int *saddr, unsigned int *daddr, unsigned short sport, unsigned short dport, unsigned char proto, char *orig)
+{
+	
+	struct ctTable *track_entry;
+	struct list_head *entry;
+	int key, key2;
+	const unsigned int *Saddr, *Daddr, *SaddrReply, *DaddrReply;
+	int ipAddrLen = IPADDRLEN(family);
+
+	key = HASH_CT(family, saddr, daddr, sport, dport, proto);
+	key2 = 0xffffffff;
+
+second_pass_ct:
+
+	entry = list_first(&ct_table[key]);
+
+	while (entry != &ct_table[key])
+	{
+
+		track_entry = container_of(entry, struct ctTable, list);
+
+		if (nfct_get_attr_u8(track_entry->ct, ATTR_ORIG_L3PROTO) != family)
+			goto next_orig;
+
+		if (family == AF_INET)
+		{
+			Saddr = nfct_get_attr(track_entry->ct, ATTR_ORIG_IPV4_SRC);
+			Daddr = nfct_get_attr(track_entry->ct, ATTR_ORIG_IPV4_DST);
+		}
+		else
+		{
+			Saddr = nfct_get_attr(track_entry->ct, ATTR_ORIG_IPV6_SRC);
+			Daddr = nfct_get_attr(track_entry->ct, ATTR_ORIG_IPV6_DST);
+		}
+
+		if (	/*IP addresses*/
+			(!memcmp(Saddr, saddr, ipAddrLen)) &&
+			(!memcmp(Daddr, daddr, ipAddrLen)) &&
+			/*Port*/
+			(nfct_get_attr_u16(track_entry->ct, ATTR_ORIG_PORT_SRC) == sport) &&
+			(nfct_get_attr_u16(track_entry->ct, ATTR_ORIG_PORT_DST) == dport) &&
+			/*Protocol*/
+			(nfct_get_attr_u8(track_entry->ct, ATTR_ORIG_L4PROTO) == proto)
+		)
+		{
+			//Entry found
+			*orig = 1;
+			goto end;
+		}
+
+		if (	/*IP addresses*/
+			(!memcmp(Saddr, daddr, ipAddrLen)) &&
+			(!memcmp(Daddr, saddr, ipAddrLen)) &&
+			/*Port*/
+			(nfct_get_attr_u16(track_entry->ct, ATTR_ORIG_PORT_SRC) == dport) &&
+			(nfct_get_attr_u16(track_entry->ct, ATTR_ORIG_PORT_DST) == sport) &&
+			/*Protocol*/
+			(nfct_get_attr_u8(track_entry->ct, ATTR_ORIG_L4PROTO) == proto)
+		)
+		{
+			//Entry found
+			*orig = 0;
+			goto end;
+		}
+
+	next_orig:
+		entry = list_next(entry);
+	}
+
+	entry = list_first(&ct_table_by_rep[key]);
+
+	while (entry != &ct_table_by_rep[key])
+	{
+
+		track_entry = container_of(entry, struct ctTable, list_by_rep);
+
+		if (nfct_get_attr_u8(track_entry->ct, ATTR_ORIG_L3PROTO) != family)
+			goto next_rep;
+
+		if (family == AF_INET)
+		{
+			SaddrReply = nfct_get_attr(track_entry->ct, ATTR_REPL_IPV4_SRC);
+			DaddrReply = nfct_get_attr(track_entry->ct, ATTR_REPL_IPV4_DST);
+		}
+		else
+		{
+			SaddrReply = nfct_get_attr(track_entry->ct, ATTR_REPL_IPV6_SRC);
+			DaddrReply = nfct_get_attr(track_entry->ct, ATTR_REPL_IPV6_DST);
+		}
+
+		if (	/*IP addresses*/
+			(!memcmp(SaddrReply, saddr, ipAddrLen)) &&
+			(!memcmp(DaddrReply, daddr, ipAddrLen)) &&
+			/*Port*/
+			(nfct_get_attr_u16(track_entry->ct, ATTR_REPL_PORT_SRC) == sport) &&
+			(nfct_get_attr_u16(track_entry->ct, ATTR_REPL_PORT_DST) == dport) &&
+			/*Protocol*/
+			(nfct_get_attr_u8(track_entry->ct, ATTR_ORIG_L4PROTO) == proto)
+		)
+		{
+			//Entry found
+			*orig = 0;
+			goto end;
+		}
+
+		if (	/*IP addresses*/
+			(!memcmp(SaddrReply, daddr, ipAddrLen)) &&
+			(!memcmp(DaddrReply, saddr, ipAddrLen)) &&
+			/*Port*/
+			(nfct_get_attr_u16(track_entry->ct, ATTR_REPL_PORT_SRC) == dport) &&
+			(nfct_get_attr_u16(track_entry->ct, ATTR_REPL_PORT_DST) == sport) &&
+			/*Protocol*/
+			(nfct_get_attr_u8(track_entry->ct, ATTR_ORIG_L4PROTO) == proto)
+		)
+		{
+			//Entry found
+			*orig = 1;
+			goto end;
+		}
+
+	next_rep:
+		entry = list_next(entry);
+	}
+
+	track_entry = NULL;
+
+	if (key2 == 0xffffffff)
+	{
+		// HASH_CT is treating source and dest addr assymetrically.
+		// Need to search second time because conntrack could be registered for opposite direction
+		key2 = HASH_CT(family, daddr, saddr, dport, sport, proto);
+		if (key != key2)
+		{
+			key = key2;
+			goto second_pass_ct;
+		}
+	}
+end:
+
+	return track_entry;
+}
+
+/*****************************************************************
+* cmmCtCompare
+*
+*
+******************************************************************/
+static int cmmCtCompare(struct nf_conntrack *ct1, struct nf_conntrack *ct2)
+{
+	int family;
+
+	if ((family = nfct_get_attr_u8(ct1, ATTR_ORIG_L3PROTO)) != nfct_get_attr_u8(ct2, ATTR_ORIG_L3PROTO))
+		return 0;
+
+	if (family == AF_INET)
+	{
+		if (	/*IP addresses*/
+			nfct_get_attr_u32(ct1, ATTR_ORIG_IPV4_SRC) != nfct_get_attr_u32(ct2, ATTR_ORIG_IPV4_SRC) ||
+			nfct_get_attr_u32(ct1, ATTR_ORIG_IPV4_DST) != nfct_get_attr_u32(ct2, ATTR_ORIG_IPV4_DST) ||
+			/*Reply IP addresses*/
+			nfct_get_attr_u32(ct1, ATTR_REPL_IPV4_SRC) != nfct_get_attr_u32(ct2, ATTR_REPL_IPV4_SRC) ||
+			nfct_get_attr_u32(ct1, ATTR_REPL_IPV4_DST) != nfct_get_attr_u32(ct2, ATTR_REPL_IPV4_DST))
+
+			return 0;
+	}
+	else
+	{
+		if (	/*IP addresses*/
+			memcmp(nfct_get_attr(ct1, ATTR_ORIG_IPV6_SRC), nfct_get_attr(ct2, ATTR_ORIG_IPV6_SRC), 16) ||
+			memcmp(nfct_get_attr(ct1, ATTR_ORIG_IPV6_DST), nfct_get_attr(ct2, ATTR_ORIG_IPV6_DST), 16) ||
+
+			/*Reply IP addresses*/
+			memcmp(nfct_get_attr(ct1, ATTR_REPL_IPV6_SRC), nfct_get_attr(ct2, ATTR_REPL_IPV6_SRC), 16) ||
+			memcmp(nfct_get_attr(ct1, ATTR_REPL_IPV6_DST), nfct_get_attr(ct2, ATTR_REPL_IPV6_DST), 16))
+			return 0;
+	}
+	
+	if(/*Port*/
+		nfct_get_attr_u16(ct1, ATTR_ORIG_PORT_SRC) != nfct_get_attr_u16(ct2, ATTR_ORIG_PORT_SRC) ||
+		nfct_get_attr_u16(ct1, ATTR_ORIG_PORT_DST) != nfct_get_attr_u16(ct2, ATTR_ORIG_PORT_DST) ||
+
+		/*Reply Port*/
+		nfct_get_attr_u16(ct1, ATTR_REPL_PORT_SRC) != nfct_get_attr_u16(ct2, ATTR_REPL_PORT_SRC) ||
+		nfct_get_attr_u16(ct1, ATTR_REPL_PORT_DST) != nfct_get_attr_u16(ct2, ATTR_REPL_PORT_DST) ||
+
+		/*Protocol*/
+		nfct_get_attr_u8(ct1, ATTR_ORIG_L4PROTO) != nfct_get_attr_u8(ct2, ATTR_ORIG_L4PROTO)
+	)
+		return 0;
+
+	return 1;
+}
+
+/*****************************************************************
+* cmmCtCompare
+*
+*
+******************************************************************/
+static int cmmCtCompareInv(struct nf_conntrack *ct1, struct nf_conntrack *ct2)
+{
+	int family;
+
+	if ((family = nfct_get_attr_u8(ct1, ATTR_ORIG_L3PROTO)) != nfct_get_attr_u8(ct2, ATTR_REPL_L3PROTO))
+		return 0;
+
+	if (family == AF_INET)
+	{
+		if (	/*IP addresses*/
+			nfct_get_attr_u32(ct1, ATTR_ORIG_IPV4_SRC) != nfct_get_attr_u32(ct2, ATTR_REPL_IPV4_SRC) ||
+			nfct_get_attr_u32(ct1, ATTR_ORIG_IPV4_DST) != nfct_get_attr_u32(ct2, ATTR_REPL_IPV4_DST) ||
+			/*Reply IP addresses*/
+			nfct_get_attr_u32(ct1, ATTR_REPL_IPV4_SRC) != nfct_get_attr_u32(ct2, ATTR_ORIG_IPV4_SRC) ||
+			nfct_get_attr_u32(ct1, ATTR_REPL_IPV4_DST) != nfct_get_attr_u32(ct2, ATTR_ORIG_IPV4_DST))
+
+			return 0;
+	}
+	else
+	{
+		if (	/*IP addresses*/
+			memcmp(nfct_get_attr(ct1, ATTR_ORIG_IPV6_SRC), nfct_get_attr(ct2, ATTR_REPL_IPV6_SRC), 16) ||
+			memcmp(nfct_get_attr(ct1, ATTR_ORIG_IPV6_DST), nfct_get_attr(ct2, ATTR_REPL_IPV6_DST), 16) ||
+
+			/*Reply IP addresses*/
+			memcmp(nfct_get_attr(ct1, ATTR_REPL_IPV6_SRC), nfct_get_attr(ct2, ATTR_ORIG_IPV6_SRC), 16) ||
+			memcmp(nfct_get_attr(ct1, ATTR_REPL_IPV6_DST), nfct_get_attr(ct2, ATTR_ORIG_IPV6_DST), 16))
+			return 0;
+	}
+
+	if(/*Port*/
+		nfct_get_attr_u16(ct1, ATTR_ORIG_PORT_SRC) != nfct_get_attr_u16(ct2, ATTR_REPL_PORT_SRC) ||
+		nfct_get_attr_u16(ct1, ATTR_ORIG_PORT_DST) != nfct_get_attr_u16(ct2, ATTR_REPL_PORT_DST) ||
+
+		/*Reply Port*/
+		nfct_get_attr_u16(ct1, ATTR_REPL_PORT_SRC) != nfct_get_attr_u16(ct2, ATTR_ORIG_PORT_SRC) ||
+		nfct_get_attr_u16(ct1, ATTR_REPL_PORT_DST) != nfct_get_attr_u16(ct2, ATTR_ORIG_PORT_DST) ||
+
+		/*Protocol*/
+		nfct_get_attr_u8(ct1, ATTR_ORIG_L4PROTO) != nfct_get_attr_u8(ct2, ATTR_REPL_L4PROTO)
+	)
+		return 0;
+
+	return 1;
+}
+/*****************************************************************
+* __cmmCtFind
+*
+*
+******************************************************************/
+struct ctTable *__cmmCtFind(struct nf_conntrack *ctTemp)
+{
+	struct ctTable *ctEntry;
+	struct list_head *entry;
+	int family;
+	int key;
+	const void *dAddr, *sAddr;
+	u_int16_t sport, dport;
+	char saddr_buf[INET6_ADDRSTRLEN], daddr_buf[INET6_ADDRSTRLEN];
+
+	family = nfct_get_attr_u8(ctTemp, ATTR_ORIG_L3PROTO);
+
+	if (family == AF_INET)
+	{
+		sAddr = nfct_get_attr(ctTemp, ATTR_ORIG_IPV4_SRC);
+		dAddr = nfct_get_attr(ctTemp, ATTR_ORIG_IPV4_DST);
+	}
+	else
+	{
+		sAddr = nfct_get_attr(ctTemp, ATTR_ORIG_IPV6_SRC);
+		dAddr = nfct_get_attr(ctTemp, ATTR_ORIG_IPV6_DST);
+	}
+
+	sport = nfct_get_attr_u16(ctTemp, ATTR_ORIG_PORT_SRC);
+	dport = nfct_get_attr_u16(ctTemp, ATTR_ORIG_PORT_DST);
+
+	key = HASH_CT(family, sAddr, dAddr, sport, dport,
+		nfct_get_attr_u8(ctTemp, ATTR_ORIG_L4PROTO));
+
+	entry = list_first(&ct_table[key]);
+
+	while (entry != &ct_table[key])
+	{
+		ctEntry = container_of(entry, struct ctTable, list);
+		if (cmmCtCompare(ctEntry->ct, ctTemp))
+			//Entry found
+			goto found;
+
+		entry = list_next(entry);
+	}
+
+	/* Search for inverted entry */
+	entry = list_first(&ct_table_by_rep[key]);
+
+	while (entry != &ct_table_by_rep[key])
+	{
+		ctEntry = container_of(entry, struct ctTable, list_by_rep);
+		if (cmmCtCompareInv(ctEntry->ct, ctTemp))
+			goto found;
+
+		entry = list_next(entry);
+	}
+
+	ctEntry = NULL;
+
+found:
+	cmm_print(DEBUG_INFO, "%s: conntrack %sfound src:%s dst:%s sport:%d dport:%d\n", __func__,
+			ctEntry == NULL ? "not " : "",
+			inet_ntop(family, sAddr, saddr_buf, INET6_ADDRSTRLEN),
+			inet_ntop(family, dAddr, daddr_buf, INET6_ADDRSTRLEN),
+			ntohs(sport), ntohs(dport));
+
+	return ctEntry;
+}
+
+/*****************************************************************
+* __cmmCtItfRegister
+*
+*
+******************************************************************/
+static int __cmmCtItfRegister(struct RtEntry *route, const char *dir)
+{
+	char ifname[IFNAMSIZ];
+	int rc;
+
+	if (!route->phys_oifindex || (route->flags & CHECK_BRIDGE_PORT))
+	{
+		rc = __itf_is_bridge(route->oifindex);
+		if (rc < 0)
+		{
+			cmm_print(DEBUG_ERROR, "%s: route %s output interface lookup failed\n", __func__, dir);
+			goto err;
+		}
+
+		if (rc)
+		{
+			rc = cmmBrToFF(route);
+			if (rc < 0)
+			{
+				cmm_print(DEBUG_ERROR, "%s: route %s output interface lookup failed\n", __func__, dir);
+				goto err;
+			}
+		}
+		else
+			route->phys_oifindex = route->oifindex;
+
+		route->flags &= ~CHECK_BRIDGE_PORT;
+	}
+
+	rc = __itf_is_programmed(route->phys_oifindex);
+	if (rc <= 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: route %s output interface %s is not programmed in FPP\n", __func__, dir, if_indextoname(route->phys_oifindex, ifname));
+		goto err;
+	}
+
+	return 0;
+
+err:
+	return -1;
+}
+
+/*****************************************************************
+* __cmmNeighRegister
+*
+*
+******************************************************************/
+static int __cmmNeighRegister(struct RtEntry *route, const char *dir)
+{
+	char addr_buf[INET6_ADDRSTRLEN];
+	int rc;
+
+	if ((rc = __itf_is_noarp(route->oifindex)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: itf_is_noarp() failed for %s entry\n", __func__, dir);
+		goto err;
+	}
+
+	if (rc)
+		goto out;
+
+	if (!route->neighEntry)
+	{
+		route->neighEntry = __cmmNeighGet(route->family, route->gwAddr, route->oifindex);
+		if (!route->neighEntry)
+		{
+			cmm_print(DEBUG_ERROR, "%s: arp %s entry add failed\n", __func__, dir);
+			goto err;
+		}
+	}
+
+	if (!(route->neighEntry->state & NUD_VALID))
+	{
+		cmm_print(DEBUG_INFO, "%s: %s unresolved mac address for %s entry\n",
+					__func__, inet_ntop(route->family, route->neighEntry->ipAddr, addr_buf, sizeof(addr_buf)), dir);
+
+		goto err;
+	}
+
+out:
+	return 0;
+
+err:
+	return -1;
+}
+
+
+/*****************************************************************
+* __cmmFPPRouteRegister
+*
+*
+******************************************************************/
+static int __cmmFPPRouteRegister(struct ct_route *rt, int is_floating_tunnel, const char *dir)
+{
+	const unsigned char *dst_mac;
+
+	if (rt->fpp_route)
+		goto out;
+
+	if (rt->route->neighEntry)
+		dst_mac = rt->route->neighEntry->macAddr;
+	else
+		dst_mac = null_mac;
+
+	if (is_floating_tunnel)
+		rt->fpp_route = __cmmFPPRouteGet(rt->route->phys_oifindex, dst_mac, rt->route->mtu, rt->route->dAddr, IPADDRLEN(rt->route->family));
+	else
+		rt->fpp_route = __cmmFPPRouteGet(rt->route->phys_oifindex, dst_mac, rt->route->mtu, NULL, 0);
+
+	if (!rt->fpp_route)
+	{
+		goto err;
+	}
+
+out:
+	return 0;
+
+err:
+	return -1;
+}
+
+/*****************************************************************
+* __cmmRouteRegister
+*
+*
+******************************************************************/
+int __cmmRouteRegister(struct ct_route *rt, struct flow *flow, int is_floating_tunnel, const char *dir)
+{
+	if (!rt->route)
+	{
+		rt->route = __cmmRouteGet(flow);
+		if (!rt->route)
+		{
+			cmm_print(DEBUG_ERROR, "%s: route %s entry add failed\n", __func__, dir);
+			goto err;
+		}
+	}
+
+	if (__cmmNeighRegister(rt->route, dir) < 0)
+	{
+		goto err;
+	}
+
+	if (__cmmCtItfRegister(rt->route, dir) < 0)
+	{
+		goto err;
+	}
+
+	if (__cmmFPPRouteRegister(rt, is_floating_tunnel, dir) < 0)
+	{
+		goto err;
+	}
+
+	return 0;
+
+err:
+	return -1;
+}
+
+/*****************************************************************
+* __cmmCtTunnelRouteRegister
+*
+*
+******************************************************************/
+static int __cmmCtTunnelRouteRegister(struct ct_route *rt, struct ct_route *tunnel_rt, unsigned int Daddr4o6, 
+								unsigned int Dport4o6, const char *dir)
+{
+	struct interface *itf;
+        unsigned int sAddr[4], dAddr[4];
+
+	struct flow flow;
+
+
+        memset(sAddr , 0 , sizeof(sAddr));
+        memset(dAddr , 0 , sizeof(dAddr));
+
+	itf = __itf_get(rt->route->oifindex);
+	if (!itf)
+		goto err0;
+
+	if (!__itf_is_tunnel(itf))
+		goto out;
+
+	if(itf->tunnel_family == AF_INET)
+	{
+		if (!____itf_is_floating_sit_tunnel(itf))
+			goto out;
+
+		sAddr[0] = itf->tunnel_parm4.iph.saddr;
+
+		dAddr[0] = tunnel_get_ipv4_dst(rt->route, itf);
+		if (!dAddr[0])
+			goto err0;
+	}
+	else if(itf->tunnel_family == AF_INET6)
+	{
+		if (!____itf_is_4o6_tunnel(itf))
+			goto out;
+		memcpy(sAddr, itf->tunnel_parm6.laddr.s6_addr, 16);
+
+		if(getTunnel4rdAddress(itf, dAddr, Daddr4o6,Dport4o6) < 0)
+			goto err0;
+
+		cmm_print(DEBUG_ERROR, "%s: V6 Tunnel :s :%x:%x:%x:%x - d:%x:%x:%x:%x\n", __func__, sAddr[0],sAddr[1],sAddr[2],sAddr[3],dAddr[0],dAddr[1],dAddr[2],dAddr[3]);
+
+	}
+	else
+		goto out;
+
+	flow.family = itf->tunnel_family;
+	flow.sAddr = &sAddr[0];
+	flow.dAddr = &dAddr[0];
+	flow.iifindex = 0;
+	flow.fwmark = 0;
+
+	if (__cmmRouteRegister(tunnel_rt, &flow, 1, dir) < 0)
+		goto err0;
+
+out:
+	__itf_put(itf);
+
+	return 0;
+
+err0:
+	__itf_put(itf);
+
+	return -1;
+}
+
+/*****************************************************************
+* __cmmCheckFPPRouteIdUpdate
+*
+*
+******************************************************************/
+void __cmmCheckFPPRouteIdUpdate(struct ct_route *rt, int *flags)
+{
+	if (rt->fpp_route)
+	{
+		if (rt->fpp_route_id != rt->fpp_route->id)
+		{
+			*flags |= FPP_NEEDS_UPDATE;
+			rt->fpp_route_id = rt->fpp_route->id;
+		}
+	}
+	else if (rt->fpp_route_id)
+	{
+		*flags |= FPP_NEEDS_UPDATE;
+		rt->fpp_route_id = 0;
+	}
+}
+
+/*****************************************************************
+* ____cmmCtRegister
+*
+*
+******************************************************************/
+int ____cmmCtRegister(FCI_CLIENT *fci_handle, struct ctTable *ctEntry)
+{
+	struct nf_conntrack *ct = ctEntry->ct;
+	int dir = ctEntry->dir;
+	const unsigned int *dAddrOrig, *dAddrRepl, *sAddrOrig, *sAddrRepl;
+	unsigned short dPortOrig, dPortRepl, sPortOrig, sPortRepl;
+	struct flow flow;
+	unsigned char proto;
+	void *tmp;
+	int key;
+	int rc;
+	int iif;
+	struct interface *itf,*out_itf;
+	struct RtEntry *route;
+
+	proto = nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO);
+
+	if (ctEntry->family == AF_INET)
+	{
+		sAddrOrig = nfct_get_attr(ct, ATTR_ORIG_IPV4_SRC);
+		sAddrRepl = nfct_get_attr(ct, ATTR_REPL_IPV4_SRC);
+		dAddrOrig = nfct_get_attr(ct, ATTR_ORIG_IPV4_DST);
+		dAddrRepl = nfct_get_attr(ct, ATTR_REPL_IPV4_DST);
+	}
+	else
+	{
+		sAddrOrig = nfct_get_attr(ct, ATTR_ORIG_IPV6_SRC);
+		sAddrRepl = nfct_get_attr(ct, ATTR_REPL_IPV6_SRC);
+		dAddrOrig = nfct_get_attr(ct, ATTR_ORIG_IPV6_DST);
+		dAddrRepl = nfct_get_attr(ct, ATTR_REPL_IPV6_DST);
+	}
+
+	sPortOrig = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC);
+	sPortRepl = nfct_get_attr_u16(ct, ATTR_REPL_PORT_SRC);
+	dPortOrig = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST);
+	dPortRepl = nfct_get_attr_u16(ct, ATTR_REPL_PORT_DST);
+
+	if (dir & ORIGINATOR)
+	{
+		/* Check if conntrack is between two fpp interfaces */
+		if (!__itf_is_programmed(nfct_get_attr_u32(ct, ATTR_ORIG_COMCERTO_FP_IIF)))
+		{
+			dir &= ~ORIGINATOR;
+			goto replier;
+		}
+		
+		// Is this CT secure ?
+		if (!ctEntry->fEntryOrig)
+			ctEntry->fEntryOrig = __cmmFlowGet(ctEntry->family, sAddrOrig, dAddrOrig, sPortOrig, dPortOrig, proto);
+		if (!ctEntry->fEntryOrig)
+			ctEntry->fEntryOrig = __cmmFlowGet(ctEntry->family, dAddrRepl, sAddrRepl, dPortRepl, sPortRepl, proto);
+
+		flow.family = ctEntry->family;
+		flow.sAddr = sAddrOrig;
+		flow.dAddr = sAddrRepl;
+		flow.iifindex = nfct_get_attr_u32(ct, ATTR_ORIG_COMCERTO_FP_IFINDEX);
+		flow.fwmark = nfct_get_attr_u32(ct, ATTR_ORIG_COMCERTO_FP_MARK);
+
+		if (__cmmRouteRegister(&ctEntry->orig, &flow, 0, "originator") < 0)
+		{
+			dir &= ~ORIGINATOR;
+			goto replier;
+		}
+
+		if(ctEntry->dir_filter & ORIGINATOR) {
+			/*check if inbound interface is LAN and outbound interface WLAN and vice-versa if so forward normally*/
+			itf = __itf_find(iif = nfct_get_attr_u32(ct, ATTR_ORIG_COMCERTO_FP_IIF));
+			route = ctEntry->orig.route;
+			out_itf = __itf_find(route->oifindex);
+			if( !(__itf_is_wifi(out_itf) && (!is_wan_port_ifindex(iif))) &&
+				!((!is_wan_port_ifindex(route->oifindex)) && __itf_is_wifi(itf))) {
+				dir &= ~ORIGINATOR;
+				goto replier;
+			}
+		}
+		tmp = ctEntry->orig_tunnel.route;
+
+		rc = __cmmCtTunnelRouteRegister(&ctEntry->orig, &ctEntry->orig_tunnel,dAddrOrig[0], dPortOrig, "originator tunnel");
+
+		if (ctEntry->orig_tunnel.route && !tmp)
+		{
+			key = HASH_RT(ctEntry->orig_tunnel.route->family, ctEntry->orig_tunnel.route->sAddr, ctEntry->orig_tunnel.route->dAddr);
+			list_add(&ct_table_by_orig_tunnel_route[key], &ctEntry->list_by_orig_tunnel_route);
+			ctEntry->flags |= FPP_NEEDS_UPDATE;
+		}
+
+		if (rc < 0)
+		{
+			dir &= ~ORIGINATOR;
+			goto replier;
+		}
+	}
+
+replier:
+	if (dir & REPLIER)
+	{
+		/* Check if conntrack is between two fpp interfaces */
+		if (!__itf_is_programmed(nfct_get_attr_u32(ct, ATTR_REPL_COMCERTO_FP_IIF)))
+		{
+			dir &= ~REPLIER;
+			goto program;
+		}
+
+		// Is this CT secure ?
+		if (!ctEntry->fEntryRep)
+			ctEntry->fEntryRep = __cmmFlowGet(ctEntry->family, sAddrRepl, dAddrRepl, sPortRepl, dPortRepl, proto);
+		if (!ctEntry->fEntryRep)
+			ctEntry->fEntryRep = __cmmFlowGet(ctEntry->family, dAddrOrig, sAddrOrig, dPortOrig, sPortOrig, proto);
+
+		flow.family = ctEntry->family;
+		flow.sAddr = sAddrRepl;
+		flow.dAddr = sAddrOrig;
+		flow.iifindex = nfct_get_attr_u32(ct, ATTR_REPL_COMCERTO_FP_IFINDEX);
+		flow.fwmark = nfct_get_attr_u32(ct, ATTR_REPL_COMCERTO_FP_MARK);
+
+		if (__cmmRouteRegister(&ctEntry->rep, &flow, 0, "replier") < 0)
+		{
+			dir &= ~REPLIER;
+			goto program;
+		}
+
+		tmp = ctEntry->rep_tunnel.route;
+
+		rc = __cmmCtTunnelRouteRegister(&ctEntry->rep, &ctEntry->rep_tunnel, dAddrRepl[0], dPortRepl, "replier tunnel");
+
+		if (ctEntry->rep_tunnel.route && !tmp)
+		{
+			key = HASH_RT(ctEntry->rep_tunnel.route->family, ctEntry->rep_tunnel.route->sAddr, ctEntry->rep_tunnel.route->dAddr);
+			list_add(&ct_table_by_rep_tunnel_route[key], &ctEntry->list_by_rep_tunnel_route);
+			ctEntry->flags |= FPP_NEEDS_UPDATE;
+		}
+
+		if (rc < 0)
+		{
+			dir &= ~REPLIER;
+			goto program;
+		}
+	}
+
+program:
+	if (dir & ORIGINATOR)
+	{
+		rc = cmmFeRouteUpdate(fci_handle, ADD | UPDATE, ctEntry->orig.fpp_route);
+		if (rc < 0)
+		{
+			dir &= ~ORIGINATOR;
+			goto program_replier;
+		}
+
+		if (ctEntry->orig_tunnel.fpp_route)
+		{
+			rc = cmmFeRouteUpdate(fci_handle, ADD | UPDATE, ctEntry->orig_tunnel.fpp_route);
+			if (rc < 0)
+			{
+				dir &= ~ORIGINATOR;
+				goto program_replier;
+			}
+		}
+	}
+
+program_replier:
+
+	if (dir & REPLIER)
+	{
+		rc = cmmFeRouteUpdate(fci_handle, ADD | UPDATE, ctEntry->rep.fpp_route);
+		if (rc < 0)
+		{
+			dir &= ~REPLIER;
+			goto program_ct;
+		}
+
+		if (ctEntry->rep_tunnel.fpp_route)
+		{
+			rc = cmmFeRouteUpdate(fci_handle, ADD | UPDATE, ctEntry->rep_tunnel.fpp_route);
+			if (rc < 0)
+			{
+				dir &= ~REPLIER;
+				goto program_ct;
+			}
+		}
+	}
+
+program_ct:
+	if (ctEntry->fpp_dir != dir)
+	{
+		ctEntry->flags |= FPP_NEEDS_UPDATE;
+		ctEntry->fpp_dir = dir;
+	}
+
+	__cmmCheckFPPRouteIdUpdate(&ctEntry->orig, &ctEntry->flags);
+	__cmmCheckFPPRouteIdUpdate(&ctEntry->orig_tunnel, &ctEntry->flags);
+	__cmmCheckFPPRouteIdUpdate(&ctEntry->rep, &ctEntry->flags);
+	__cmmCheckFPPRouteIdUpdate(&ctEntry->rep_tunnel, &ctEntry->flags);
+
+	cmm_third_part_update(ctEntry, dir);
+
+	if (dir)
+		rc = cmmFeCtUpdate(fci_handle, ADD | UPDATE, ctEntry);
+	else
+		rc = cmmFeCtUpdate(fci_handle, UPDATE, ctEntry);
+
+	if (rc == 0)
+	{
+		/* Use of globalConf.nf_conntrack_handle must be protected by ctMutex */
+		cmmCtSetPermanent(globalConf.nf_conntrack_handle, ctEntry);
+		cmm_print(DEBUG_INFO, "%s: CtAdd Success\n", __func__);
+		goto out;
+	}
+
+	cmm_print(DEBUG_ERROR, "%s: CtAdd failed\n", __func__);
+
+	return -1;
+
+out:
+	return 0;
+}
+
+/*****************************************************************
+* __cmmCtUpdateWithRoute
+*
+*
+******************************************************************/
+void __cmmCtUpdateWithRoute(FCI_CLIENT *fci_handle, struct RtEntry *route)
+{
+	struct ctTable *ctEntry;
+	struct list_head *entry;
+	struct fpp_rt *fpp_route;
+	int key;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	key = HASH_RT(route->family, route->sAddr, route->dAddr);
+
+	entry = list_first(&ct_table_by_orig_route[key]);
+	while (entry != &ct_table_by_orig_route[key])
+	{
+		ctEntry = container_of(entry, struct ctTable, list_by_orig_route);
+		entry = list_next(entry);
+		if (ctEntry->orig.route == route)
+		{
+			fpp_route = ctEntry->orig.fpp_route;
+			ctEntry->orig.fpp_route = NULL;
+
+			____cmmCtRegister(fci_handle, ctEntry);
+
+			__cmmFPPRouteDeregister(fci_handle, fpp_route, "originator");
+		}
+	}
+
+	entry = list_first(&ct_table_by_rep_route[key]);
+	while (entry != &ct_table_by_rep_route[key])
+	{
+		ctEntry = container_of(entry, struct ctTable, list_by_rep_route);
+		entry = list_next(entry);
+		if (ctEntry->rep.route == route)
+		{
+			fpp_route = ctEntry->rep.fpp_route;
+			ctEntry->rep.fpp_route = NULL;
+
+			____cmmCtRegister(fci_handle, ctEntry);
+
+			__cmmFPPRouteDeregister(fci_handle, fpp_route, "replier");
+		}
+	}
+
+	entry = list_first(&ct_table_by_orig_tunnel_route[key]);
+	while (entry != &ct_table_by_orig_tunnel_route[key])
+	{
+		ctEntry = container_of(entry, struct ctTable, list_by_orig_tunnel_route);
+		entry = list_next(entry);
+		if (ctEntry->orig_tunnel.route == route)
+		{
+			fpp_route = ctEntry->orig_tunnel.fpp_route;
+			ctEntry->orig_tunnel.fpp_route = NULL;
+
+			____cmmCtRegister(fci_handle, ctEntry);
+
+			__cmmFPPRouteDeregister(fci_handle, fpp_route, "originator tunnel");
+		}
+        }
+
+	entry = list_first(&ct_table_by_rep_tunnel_route[key]);
+	while (entry != &ct_table_by_rep_tunnel_route[key])
+	{
+		ctEntry = container_of(entry, struct ctTable, list_by_rep_tunnel_route);
+                entry = list_next(entry);
+
+		if (ctEntry->rep_tunnel.route == route)
+		{
+			fpp_route = ctEntry->rep_tunnel.fpp_route;
+			ctEntry->rep_tunnel.fpp_route = NULL;
+
+			____cmmCtRegister(fci_handle, ctEntry);
+
+			__cmmFPPRouteDeregister(fci_handle, fpp_route, "replier tunnel");
+		}
+	}
+}
+
+/*****************************************************************
+* __cmmCtRegister
+*
+*
+******************************************************************/
+static int __cmmCtRegister(FCI_CLIENT *fci_handle, struct nfct_handle *handle, struct nf_conntrack *ct, struct ctTable *ctEntry, int dir)
+{
+	struct FlowEntry *fEntryOrig, *fEntryRep;
+	struct RtEntry *rtEntryOrig = NULL;
+	struct RtEntry *rtEntryRep = NULL;
+	const unsigned int *dAddrOrig, *dAddrRepl, *sAddrOrig, *sAddrRepl;
+	unsigned short dPortOrig, dPortRepl, sPortOrig, sPortRepl;
+	int family;
+	unsigned char proto;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	family = nfct_get_attr_u8(ct, ATTR_ORIG_L3PROTO);
+	proto = nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO);
+
+	if (family == AF_INET)
+	{
+		sAddrOrig = nfct_get_attr(ct, ATTR_ORIG_IPV4_SRC);
+		sAddrRepl = nfct_get_attr(ct, ATTR_REPL_IPV4_SRC);
+		dAddrOrig = nfct_get_attr(ct, ATTR_ORIG_IPV4_DST);
+		dAddrRepl = nfct_get_attr(ct, ATTR_REPL_IPV4_DST);
+	}
+	else
+	{
+		sAddrOrig = nfct_get_attr(ct, ATTR_ORIG_IPV6_SRC);
+		sAddrRepl = nfct_get_attr(ct, ATTR_REPL_IPV6_SRC);
+		dAddrOrig = nfct_get_attr(ct, ATTR_ORIG_IPV6_DST);
+		dAddrRepl = nfct_get_attr(ct, ATTR_REPL_IPV6_DST);
+	}
+
+	sPortOrig = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC);
+	sPortRepl = nfct_get_attr_u16(ct, ATTR_REPL_PORT_SRC);
+	dPortOrig = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST);
+	dPortRepl = nfct_get_attr_u16(ct, ATTR_REPL_PORT_DST);
+
+	__pthread_mutex_lock(&rtMutex);
+
+	if (!ctEntry)
+	{
+		if (!cmmFcIsConntrackAllowed(fci_handle, ct, &rtEntryOrig))
+		{
+			cmm_print(DEBUG_INFO, "%s: conntrack not allowed\n", __func__);
+
+/*                      // A socket could also use this flow, so don't delete it as yet.
+                        // Wait for garbage collector to handle this. 
+			__pthread_mutex_lock(&flowMutex);
+
+			if ((fEntryRep = __cmmFlowGet(family, sAddrRepl, dAddrRepl, sPortRepl, dPortRepl, proto)))
+				__cmmFlowPut(fEntryRep);
+			if ((fEntryOrig = __cmmFlowGet(family, sAddrOrig, dAddrOrig, sPortOrig, dPortOrig, proto)))
+				__cmmFlowPut(fEntryOrig);
+			if ((fEntryRep = __cmmFlowGet(family, dAddrOrig, sAddrOrig, dPortOrig, sPortOrig, proto)))
+				__cmmFlowPut(fEntryRep);
+			if ((fEntryOrig = __cmmFlowGet(family, dAddrRepl, sAddrRepl, dPortRepl, sPortRepl, proto)))
+				__cmmFlowPut(fEntryOrig);
+
+			__pthread_mutex_unlock(&flowMutex);
+*/
+
+			goto fail0;
+		}
+
+		if (family == AF_INET)
+		{
+			struct RtEntry *rtEntryPolicy;
+
+			rtEntryPolicy = cmmPolicyRouting(sAddrOrig[0], sAddrRepl[0], proto, sPortOrig, sPortRepl);
+			if (rtEntryPolicy)
+			{
+				if (rtEntryOrig)
+					____cmmRouteDeregister(rtEntryOrig, "originator");
+
+				rtEntryOrig = rtEntryPolicy;
+			}
+
+			rtEntryPolicy = cmmPolicyRouting(sAddrRepl[0], sAddrOrig[0], proto, sPortRepl, sPortOrig);
+			if (rtEntryPolicy)
+			{
+				if (rtEntryRep)
+					____cmmRouteDeregister(rtEntryRep, "replier");
+
+				rtEntryRep = rtEntryPolicy;
+			}
+		}
+
+		ctEntry = __cmmCtAdd(ct);
+		if (!ctEntry)
+		{
+			cmm_print(DEBUG_ERROR, "%s: conntrack add failed\n", __func__);
+			goto fail0;
+		}
+
+		ct_stats.created++;
+
+		if (globalConf.asymff_enable) {
+			if(cmmFcIsConntrackAsymFastForwarded(ct))
+				ctEntry->dir_filter = ORIGINATOR;
+		}
+
+		if (rtEntryOrig)
+			ctEntry->orig.route = rtEntryOrig;
+
+		if (rtEntryRep)
+			ctEntry->rep.route = rtEntryRep;
+	}
+
+	ctEntry->dir = dir;
+
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+
+	____cmmCtRegister(fci_handle, ctEntry);
+
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+
+	/* since we keep the conntrack in the local cache don't return NFCT_CB_CONTINUE */
+	return NFCT_CB_STOLEN;
+
+fail0:
+	if (rtEntryOrig)
+		____cmmRouteDeregister(rtEntryOrig, "originator");
+
+	if (rtEntryRep)
+		____cmmRouteDeregister(rtEntryRep, "replier");
+
+	__pthread_mutex_unlock(&rtMutex);
+
+	return NFCT_CB_CONTINUE;
+}
+
+/*****************************************************************
+* __cmmCtUpdate
+*
+*
+******************************************************************/
+static void __cmmCtUpdate(struct nf_conntrack *ct, struct nfct_handle *handle, struct ctTable *ctEntry)
+{
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	nfct_destroy(ctEntry->ct);
+	ctEntry->ct = ct;
+	cmmCtSetPermanent(handle, ctEntry);
+}
+
+/*****************************************************************
+* __cmmFPPRouteDeregister
+*
+*
+******************************************************************/
+void __cmmFPPRouteDeregister(FCI_CLIENT *fci_handle, struct fpp_rt *fpp_route, const char *dir)
+{
+	int rc = 0;
+
+	if (!fpp_route)
+		return;
+
+	cmm_print(DEBUG_INFO, "%s: removing %s route entry\n", __func__, dir);
+
+	if (fpp_route->count == 1)
+	{
+		rc = cmmFeRouteUpdate(fci_handle, REMOVE, fpp_route);
+	}
+
+	/* In case of a deregister error don't free the route entry, we still need to track the fpp state */
+	if (rc < 0)
+		fpp_route->count--;
+	else
+		__cmmFPPRoutePut(fpp_route);
+}
+
+/*****************************************************************
+* ____cmmRouteDeregister
+*
+*
+******************************************************************/
+void ____cmmRouteDeregister(struct RtEntry *route, const char *dir)
+{
+	cmm_print(DEBUG_INFO, "%s: removing %s route entry\n", __func__, dir);
+
+	if (route->count == 1)
+	{
+		//Try to remove arp entries
+		if (route->neighEntry)
+		{
+			__cmmNeighPut(route->neighEntry);
+			route->neighEntry = NULL;
+		}
+		else
+		{
+			cmm_print(DEBUG_WARNING, "%s: %s ARP/Neighbor entry not found\n", __func__, dir);
+		}
+	}
+
+	__cmmRoutePut(route);
+}
+
+
+/*****************************************************************
+* __cmmRouteDeregister
+*
+*
+******************************************************************/
+void __cmmRouteDeregister(FCI_CLIENT *fci_handle, struct ct_route *rt, const char *dir)
+{
+	if (rt->fpp_route)
+	{
+		__cmmFPPRouteDeregister(fci_handle, rt->fpp_route, dir);
+		rt->fpp_route = NULL;
+	}
+
+	if (rt->route)
+	{
+		____cmmRouteDeregister(rt->route, dir);
+		rt->route = NULL;
+	}
+	else
+	{
+		cmm_print(DEBUG_WARNING, "%s: %s route entry not found\n", __func__, dir);
+	}
+}
+
+/*****************************************************************
+* ____cmmCtDeregister
+*
+*
+******************************************************************/
+void ____cmmCtDeregister(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, struct ctTable *ctEntry)
+{
+	int rc;
+
+	rc = cmmFeCtUpdate(fci_handle, REMOVE, ctEntry);
+
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+
+	//Try to remove route entries
+	__cmmRouteDeregister(fci_handle, &ctEntry->rep, "replier");
+	__cmmRouteDeregister(fci_handle, &ctEntry->orig, "originator");
+
+	if (ctEntry->rep_tunnel.route)
+	{
+		__cmmRouteDeregister(fci_handle, &ctEntry->rep_tunnel, "replier tunnel");
+		list_del(&ctEntry->list_by_rep_tunnel_route);
+	}
+
+	if (ctEntry->orig_tunnel.route)
+	{
+		__cmmRouteDeregister(fci_handle, &ctEntry->orig_tunnel, "originator tunnel");
+		list_del(&ctEntry->list_by_orig_tunnel_route);
+	}
+
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+
+	__pthread_mutex_lock(&flowMutex);
+
+	// Flow cache entry remove
+	if (ctEntry->fEntryOrig)
+		if (!cmmFlowKeyEngineRemove(fci_key_handle, ctEntry->fEntryOrig))
+		{
+			__cmmFlowPut(ctEntry->fEntryOrig);
+
+			ctEntry->fEntryOrig = NULL;
+		}
+
+	if (ctEntry->fEntryRep)
+		if (!cmmFlowKeyEngineRemove(fci_key_handle, ctEntry->fEntryRep))
+		{
+			__cmmFlowPut(ctEntry->fEntryRep);
+
+			ctEntry->fEntryRep = NULL;
+		}
+
+	__pthread_mutex_unlock(&flowMutex);
+
+	if (!rc)
+		__cmmCtRemove(ctEntry);
+	else
+		cmm_print(DEBUG_ERROR, "%s: DeRegister failed\n", __func__);
+}
+
+/*****************************************************************
+* __cmmCtDeregister
+*
+*
+******************************************************************/
+static void __cmmCtDeregister(struct cmm_ct *ctx, struct nf_conntrack *ct)
+{
+	struct ctTable *ctEntry;
+	u_int32_t id1, id2;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	ctEntry = __cmmCtFind(ct);
+	if (!ctEntry) {
+		cmm_print(DEBUG_INFO, "%s: conntrack entry not found\n", __func__);
+		goto out;
+	}
+
+	/* Make sure we're destroying the correct ctEntry (bz46186) */
+	id1 = nfct_get_attr_u32(ct, ATTR_ID);
+	id2 = nfct_get_attr_u32(ctEntry->ct, ATTR_ID);
+
+	if (id1 != 0 && id2 != 0 && id1 != id2)
+	{
+		cmm_print(DEBUG_WARNING, "%s: ID mismatch (%d, %d)\n", __func__, id1, id2);
+		goto out;
+	}
+	ct_stats.destroyed++;
+	____cmmCtDeregister(ctx->fci_handle, ctx->fci_key_handle, ctEntry);
+
+out:
+	return;
+}
+
+static const char *conntrack_event_type(enum nf_conntrack_msg_type type)
+{
+	if (type & NFCT_T_UPDATE)
+		return "UPDATE";
+
+	if (type & NFCT_T_DESTROY)
+		return "DESTROY";
+
+	if (type & NFCT_T_NEW)
+		return "NEW";
+
+	return "unsupported type";
+}
+
+static const char *conntrack_status(u_int32_t status)
+{
+	if (status & IPS_ASSURED)
+		return "ASSURED";
+
+	if ((status & (IPS_CONFIRMED | IPS_SEEN_REPLY)) == IPS_CONFIRMED)
+		return "CONFIRMED";
+
+	if ((status & (IPS_CONFIRMED | IPS_SEEN_REPLY)) == (IPS_CONFIRMED | IPS_SEEN_REPLY))
+		return "CONFIRMED/SEEN_REPLY";
+
+	return "unsupported status";
+}
+
+static const char *conntrack_tcp_state(u_int8_t state)
+{
+	static const char *tcp_state[] = {
+		[TCP_CONNTRACK_NONE] = "NONE",
+		[TCP_CONNTRACK_SYN_SENT] = "SYN_SENT",
+		[TCP_CONNTRACK_SYN_RECV] = "SYN_RECV",
+		[TCP_CONNTRACK_ESTABLISHED] = "ESTABLISHED",
+		[TCP_CONNTRACK_FIN_WAIT] = "FIN_WAIT",
+		[TCP_CONNTRACK_CLOSE_WAIT] = "CLOSE_WAIT",
+		[TCP_CONNTRACK_LAST_ACK] = "LAST_ACK",
+		[TCP_CONNTRACK_TIME_WAIT] = "TIME_WAIT",
+		[TCP_CONNTRACK_CLOSE] = "CLOSE",
+		[TCP_CONNTRACK_LISTEN] = "LISTEN",
+		[TCP_CONNTRACK_SYN_SENT2] = "SYN_SENT2",
+		[TCP_CONNTRACK_MAX] = "MAX"
+	};
+
+	if (state >= TCP_CONNTRACK_MAX)
+		return "unknown state";
+
+	return tcp_state[state];
+}
+
+static int cmmCtCheckCtCb(enum nf_conntrack_msg_type type,
+	      struct nf_conntrack *ct,
+	      void *data)
+{
+	struct nf_conntrack *ct_local = (struct nf_conntrack *) cb_data;
+
+	cb_status = 0;
+
+	if((nfct_get_attr_u32(ct, ATTR_ID) != nfct_get_attr_u32(ct_local, ATTR_ID))
+	|| __cmmCtIsInv(ct, ct_local))
+		cb_status = -1;
+
+	return NFCT_CB_CONTINUE;
+}
+
+static int cmmCheckUpdateEvent(struct nfct_handle *handle, struct nf_conntrack *ct)
+{
+	int rc = 0;
+
+	cb_data = ct;
+
+	if (nfct_query(handle, NFCT_Q_GET, (void*)ct) < 0) {
+		if (errno == ENOENT) {
+			rc = -1;
+			goto exit;
+		}
+		else
+			cmm_print(DEBUG_ERROR, "%s: nfct_query(NFCT_Q_GET) %s %d\n", __func__, strerror(errno), errno);
+	}
+	else if (cb_status < 0)
+		rc = -1;
+
+exit:
+	return rc;
+}
+
+static int cmmCheckEvent(struct cmm_ct *ctx, struct nf_conntrack *ct, struct ctTable **ctEntry, enum nf_conntrack_msg_type type, u_int32_t id)
+{
+	/* First pass on entries not already tracked in CMM */
+	switch (type) {
+		case NFCT_T_UPDATE:
+			/* Racy update event, need to check if entry
+			 * does really exist
+			 */
+			if (!*ctEntry || !__cmmCtFindId(*ctEntry, id))
+				if (cmmCheckUpdateEvent(ctx->get_handle, ct) < 0)
+					return -1;
+
+			break;
+
+		case NFCT_T_DESTROY:
+			if (!*ctEntry)
+				return -1;
+
+			break;
+
+		default:
+			break;
+	}
+
+	/* Second pass on tracked entries */
+	if (*ctEntry)
+		switch (type) {
+			case NFCT_T_NEW:
+				/* Do not process a new event
+				 * which arrives after an update
+				 */
+				if (*ctEntry && __cmmCtFindId(*ctEntry, id))
+					return -1;
+
+			case NFCT_T_UPDATE:
+				if (!__cmmCtFindId(*ctEntry, id))
+					__cmmCtAddId(*ctEntry, id);
+
+				/* Do not process multiple ids entries */
+				if ((*ctEntry)->n_id > 1)
+					return -1;
+
+				break;
+
+			case NFCT_T_DESTROY:
+				/* If after __cmmCtDelId
+				 * n_id > 1 : keep the conntrack but do not unregister it, need to wait.
+				 *            Still in the middle of an out-of-sync period
+				 * n_id = 1 : coming back from an out-of-sync period, ask kernel for an update
+				 *            but still destroy the current entry as its state is not in sync anymore
+				 * n_id = 0 : regular case, deregister
+				 */
+				if (!__cmmCtDelId(*ctEntry, id)) {
+					if ((*ctEntry)->n_id > 1) {
+						return -1;
+					}
+					else if (((*ctEntry)->n_id) == 1)
+						cmmCtForceUpdate(ctx->handle, *ctEntry);
+				}
+				else
+					return -1;
+
+				break;
+
+			default:
+				break;
+		}
+	/* Success, event will be processed */
+	return 0;
+}
+
+/*****************************************************************
+* __cmmCtCatch()
+*
+* 	This function is called by libnetfilter_conntrack library
+* 	when an event occurs on conntrack table
+*
+******************************************************************/
+static int __cmmCtCatch(struct cmm_ct *ctx, enum nf_conntrack_msg_type type, struct nf_conntrack *ct)
+{
+	u_int8_t l4proto;
+	u_int8_t l3proto;
+	u_int8_t state;
+	int rc = NFCT_CB_CONTINUE;
+	u_int32_t status;
+	struct ctTable *ctEntry = NULL;
+	u_int32_t id;
+
+	// If Forward Engine programmation is forbidden, don't do anything
+	if (globalConf.enable == 0)
+		goto exit;
+
+#ifdef C2000_DPI
+	status = nfct_get_attr_u32(ct, ATTR_STATUS);
+	if ((globalConf.dpi_enable) && ((status & IPS_DPI_ALLOWED) != IPS_DPI_ALLOWED))
+	{
+		goto exit;
+	}
+#endif
+
+	l3proto = nfct_get_attr_u8(ct, ATTR_ORIG_L3PROTO);
+
+	if ((l3proto != AF_INET6) && (l3proto != AF_INET))
+	{
+		cmm_print(DEBUG_INFO, "%s: unsupported L3 Proto: %#x\n", __func__, l3proto);
+		goto exit;
+	}
+
+	// In case of TCP we should check that the connection is established
+	l4proto = nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO);
+	id = nfct_get_attr_u32(ct, ATTR_ID);
+
+	if (!id)
+		cmm_print(DEBUG_ERROR, "%s: Conntrack event with NULL id\n", __func__);
+
+	if ((l4proto == IPPROTO_UDP) || (l4proto == IPPROTO_IPIP))
+	{
+		ctEntry = __cmmCtFind(ct);
+
+		if (cmmCheckEvent(ctx, ct, &ctEntry, type, id) < 0)
+			goto exit;
+
+		switch (type) {
+		case NFCT_T_DESTROY:
+			cmm_print(DEBUG_INFO, "%s: proto %d connection %s(%#x)\n", __func__, l4proto, conntrack_event_type(type), type);
+
+			if (ctEntry) {
+				ct_stats.destroyed++;
+				____cmmCtDeregister(ctx->fci_handle, ctx->fci_key_handle, ctEntry);
+			}
+			break;
+
+		case NFCT_T_NEW:
+		case NFCT_T_UPDATE:
+
+			status = nfct_get_attr_u32(ct, ATTR_STATUS);
+
+			if (ctEntry) {
+				__cmmCtUpdate(ct, ctx->handle, ctEntry);
+				rc = NFCT_CB_STOLEN;
+			}
+
+			cmm_print(DEBUG_INFO, "%s: proto %d connection %s(%#x) %s(%#x)\n", __func__,
+					l4proto, conntrack_event_type(type), type,
+					conntrack_status(status), status);
+
+			if (l4proto == IPPROTO_UDP) {
+				if (status & IPS_ASSURED) {
+					rc = __cmmCtRegister(ctx->fci_handle, ctx->handle, ct, ctEntry, ORIGINATOR | REPLIER);
+				}
+				else if (status & IPS_CONFIRMED) {
+					rc = __cmmCtRegister(ctx->fci_handle, ctx->handle, ct, ctEntry, ORIGINATOR);
+				}
+				else {
+					goto exit;
+				}
+			}
+			else if (l4proto == IPPROTO_IPIP) {
+				if ((status & (IPS_CONFIRMED | IPS_SEEN_REPLY)) == IPS_CONFIRMED) {
+					rc = __cmmCtRegister(ctx->fci_handle, ctx->handle, ct, ctEntry, ORIGINATOR);
+				}
+				/* Actually IPIP connections will never reach ASSURED state, so both directions are
+				 * programmed when packets have been seen in opposite direction */
+				else if ((status & (IPS_CONFIRMED | IPS_SEEN_REPLY)) == (IPS_CONFIRMED | IPS_SEEN_REPLY)) {
+					rc = __cmmCtRegister(ctx->fci_handle, ctx->handle, ct, ctEntry, ORIGINATOR | REPLIER);
+				}
+				else {
+					goto exit;
+				}
+			}
+
+			break;
+
+		default:
+			cmm_print(DEBUG_INFO, "%s: proto %d connection %s(%#x)\n", __func__,
+					l4proto, conntrack_event_type(type), type);
+
+			break;
+		}
+	}
+	else if (l4proto == IPPROTO_TCP)
+	{
+		switch (type) {
+		case NFCT_T_DESTROY:
+			cmm_print(DEBUG_INFO, "%s: TCP connection %s(%#x)\n", __func__, conntrack_event_type(type), type);
+			__cmmCtDeregister(ctx, ct);
+			break;
+
+		case NFCT_T_NEW:
+		case NFCT_T_UPDATE:
+			status = nfct_get_attr_u32(ct, ATTR_STATUS);
+
+			ctEntry = __cmmCtFind(ct);
+
+			if (ctEntry) {
+				__cmmCtUpdate(ct, ctx->handle, ctEntry);
+				rc = NFCT_CB_STOLEN;
+			}
+
+			if (nfct_attr_is_set(ct, ATTR_TCP_STATE))
+			{
+				state = nfct_get_attr_u8(ct, ATTR_TCP_STATE);
+
+				cmm_print(DEBUG_INFO, "%s: TCP connection %s(%#x) %s(%#x) %s(%#x)\n", __func__,
+							conntrack_event_type(type), type,
+							conntrack_status(status), status,
+							conntrack_tcp_state(state), state);
+
+				if (state == TCP_CONNTRACK_ESTABLISHED)
+					rc = __cmmCtRegister(ctx->fci_handle, ctx->handle, ct, ctEntry, ORIGINATOR | REPLIER);
+				else
+					if (ctEntry)
+					{
+						ct_stats.destroyed++;
+						____cmmCtDeregister(ctx->fci_handle, ctx->fci_key_handle, ctEntry);
+					}
+			}
+			else
+			{
+				cmm_print(DEBUG_INFO, "%s: TCP connection %s(%#x) %s(%#x) missing state attribute\n", __func__,
+							conntrack_event_type(type), type,
+							conntrack_status(status), status);
+				goto exit;
+			}
+
+			break;
+
+		default:
+			cmm_print(DEBUG_INFO, "%s: TCP connection %s(%#x)\n", __func__,
+				conntrack_event_type(type), type);
+
+			break;
+		}
+	}
+
+exit:
+	return rc;
+}
+
+static int count = 0;
+
+/*****************************************************************
+* cmmCtCatch()
+*
+* 	This function is called by libnetfilter_conntrack library
+* 	when an event occurs on conntrack table
+*
+******************************************************************/
+static int cmmCtCatch(enum nf_conntrack_msg_type type, struct nf_conntrack *ct, void *data)
+{
+	struct cmm_ct *ctx = data;
+	int rc;
+
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&ctMutex);
+
+	rc = __cmmCtCatch(ctx, type, ct);
+
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	count++;
+
+	return rc;
+}
+
+
+/*****************************************************************
+* file_write
+*
+*
+******************************************************************/
+static int file_write(const char *filename, const void *buf, int size)
+{
+	int fd;
+
+	if ((fd = open(filename, O_WRONLY)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: open(%s) failed, %s\n", __func__, filename, strerror(errno));
+		goto err0;
+	}
+
+	if (write(fd, buf, size) != size)
+	{
+		cmm_print(DEBUG_ERROR, "%s: write() failed, %s\n", __func__, strerror(errno));
+		goto err1;
+	}
+
+	close(fd);
+
+	return 0;
+
+err1:
+	close(fd);
+
+err0:
+	return -1;
+}
+
+/*****************************************************************
+* cmmCtKernelModuleInit
+*
+*
+******************************************************************/
+static int cmmCtKernelModuleInit()
+{
+	cmm_print(DEBUG_INFO, "%s:\n", __func__);
+
+	return file_write(TCP_BE_LIBERAL_PATH, "1", 1);
+}
+
+/*****************************************************************
+* cmmCtKernelModuleUnInit
+*
+*
+******************************************************************/
+static void cmmCtKernelModuleUnInit()
+{
+	cmm_print(DEBUG_INFO, "%s:\n", __func__);
+
+	file_write(TCP_BE_LIBERAL_PATH, "0", 1);
+}
+#ifdef APP_SOLICIT
+/*****************************************************************
+* cmmNeighborKernelModuleInit
+* 
+*
+******************************************************************/
+static int cmmRtnlKernelModuleInit()
+{
+	cmm_print(DEBUG_INFO, "%s:\n", __func__);
+
+	/*Prepare the neighbor code to be in a good configuration*/
+	if (file_write(APP_SOLICIT_IPV4_PATH, "1", 1) < 0)
+	{
+		goto err0;
+	}
+
+	if (file_write(APP_SOLICIT_IPV4_WAN_PATH, "1", 1) < 0)
+	{
+		goto err1;
+	}
+
+	if (file_write(APP_SOLICIT_IPV4_LAN_PATH, "1", 1) < 0)
+	{
+		goto err2;
+	}
+
+	if (file_write(APP_SOLICIT_IPV6_PATH, "1", 1) < 0)
+	{
+		goto err3;
+	}
+
+	if (file_write(APP_SOLICIT_IPV6_WAN_PATH, "1", 1) < 0)
+	{
+		goto err4;
+	}
+
+	if (file_write(APP_SOLICIT_IPV6_LAN_PATH, "1", 1) < 0)
+	{
+		goto err5;
+	}
+
+	return 0;
+
+err5:
+	file_write(APP_SOLICIT_IPV6_WAN_PATH, "0", 1);
+
+err4:
+	file_write(APP_SOLICIT_IPV6_PATH, "0", 1);
+
+err3:
+	file_write(APP_SOLICIT_IPV4_LAN_PATH, "0", 1);
+
+err2:
+	file_write(APP_SOLICIT_IPV4_WAN_PATH, "0", 1);
+
+err1:
+	file_write(APP_SOLICIT_IPV4_PATH, "0", 1);
+
+err0:
+	return -1;
+}
+
+/*****************************************************************
+* cmmNeighborKernelModuleUnInit
+* 
+*
+******************************************************************/
+static void cmmRtnlKernelModuleUnInit()
+{
+	cmm_print(DEBUG_INFO, "%s:\n", __func__);
+
+	file_write(APP_SOLICIT_IPV4_PATH, "0", 1);
+
+	file_write(APP_SOLICIT_IPV4_WAN_PATH, "0", 1);
+
+	file_write(APP_SOLICIT_IPV4_LAN_PATH, "0", 1);
+
+	file_write(APP_SOLICIT_IPV6_PATH, "0", 1);
+
+	file_write(APP_SOLICIT_IPV6_WAN_PATH, "0", 1);
+
+	file_write(APP_SOLICIT_IPV6_LAN_PATH, "0", 1);
+}
+#endif
+
+
+
+
+/*****************************************************************
+* cmmCtResync
+*
+*
+******************************************************************/
+static int cmmCtResync(struct cmm_ct *ctx)
+{
+	struct ctTable *ctEntry;
+	struct list_head *entry, *next;
+	int family;
+	int i;
+	int queried = 0;
+	int destroyed = 0;
+	int len, read = 0;
+	int mult_ids_dest = 0;
+	int entry_exist = 0;
+	unsigned char buf[64 * 1024];
+
+	cmm_print(DEBUG_ERROR, "%s: start %d\n", __func__, ct_stats.current);
+
+	/* Flush all state events in the netlink socket */
+	while (read < 2 * NFNL_SOCK_SIZE)
+	{
+		len = nfnl_recv(nfct_nfnlh(ctx->catch_handle), buf, 64 * 1024);
+		if (len <= 0)
+		{
+			/* Buffer is empty, exit */
+			if (errno == EAGAIN)
+				break;
+
+			cmm_print(DEBUG_ERROR, "%s: nfnl_recv() %s\n", __func__, strerror(errno));
+
+			/* Lost events again, try to re-resync later */
+			if (errno == ENOBUFS)
+				goto err;
+
+			continue;
+		}
+
+		read += len;
+	}
+
+	cmm_print(DEBUG_ERROR, "%s: flushed %d bytes\n", __func__, read);
+
+	__pthread_mutex_lock(&ctMutex);
+
+
+	/* Go through all connections and determine which no longer exist in the kernel, then remove them */
+	for (i = 0; i < CONNTRACK_HASH_TABLE_SIZE; i++)
+	{
+		for (entry = list_first(&ct_table[i]); next = list_next(entry), entry != &ct_table[i]; entry = next)
+		{
+			ctEntry = container_of(entry, struct ctTable, list);
+
+			queried++;
+
+			if (ctEntry->n_id > 1) {
+				mult_ids_dest++;
+				goto destroy;
+			}
+
+			cb_data = ctEntry->ct;
+
+			if (nfct_query(ctx->get_handle, NFCT_Q_GET, (void*)ctEntry->ct) < 0) {
+				if (errno != ENOENT)
+					cmm_print(DEBUG_ERROR, "%s: nfct_query(NFCT_Q_GET) %s\n", __func__, strerror(errno));
+				else
+					goto destroy;
+
+			}
+			else if (cb_status < 0) {
+destroy:
+				destroyed++;
+				ct_stats.destroyed++;
+				____cmmCtDeregister(ctx->fci_handle, ctx->fci_key_handle, ctEntry);
+			}
+		}
+
+	}
+
+	cmm_print(DEBUG_ERROR, "%s: end %d %d %d %d %d\n", __func__, ct_stats.current, queried, destroyed, mult_ids_dest, entry_exist);
+
+	__pthread_mutex_unlock(&ctMutex);
+
+	/* Now dump all existing conntracks */
+	family = AF_UNSPEC;
+	if (nfct_query(ctx->catch_handle, NFCT_Q_DUMP, (void *)&family) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: nfct_query(NFCT_Q_DUMP) %s\n", __func__, strerror(errno));
+		goto err;
+	}
+
+	return 0;
+
+err:
+	cmm_print(DEBUG_ERROR, "%s: end %d %d %d\n", __func__, ct_stats.current, queried, destroyed);
+	return -1;
+}
+
+sig_atomic_t timer_expired = 0;
+
+static void sig_alarm_hdlr(int signum)
+{
+	timer_expired = 1;
+}
+
+/*****************************************************************
+* cmmCtThread
+*
+* Function that initializes Conntrack event catching
+*
+******************************************************************/
+static void *cmmCtThread(void *data)
+{
+	struct cmm_ct *ctx = data;
+	fd_set set;
+	int fd_ct, fd_fci;
+#if !defined(IPSEC_SUPPORT_DISABLED)
+	int fd_key;
+#endif
+	int fd_neigh, fd_link, fd_ifaddr, fd_route, fd_rule, fd_abm;
+	struct timeval timeout;
+	struct itimerval itimer;
+	struct sigaction action;
+	int need_resync = 0;
+	int rc;
+
+	cmm_print(DEBUG_INFO, "%s: pid %d\n", __func__, getpid());
+
+#if !defined(IPSEC_SUPPORT_DISABLED)
+	fd_key = fci_fd(ctx->fci_key_catch_handle);
+#endif
+	fd_fci = fci_fd(ctx->fci_catch_handle);
+	fd_ct = nfct_fd(ctx->catch_handle);
+
+	/* Dump all conntracks */
+	cmmCtResync(ctx);
+
+	action.sa_handler = sig_alarm_hdlr;
+	sigemptyset(&action.sa_mask);
+	action.sa_flags = 0;
+
+	if (sigaction(SIGALRM, &action, NULL) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: sigaction() failed %s\n", __func__, strerror(errno));
+		goto out;
+	}
+
+	/* Set periodic timer, every one second */
+	itimer.it_value.tv_sec = 1;
+	itimer.it_value.tv_usec = 0;
+	itimer.it_interval.tv_sec = 1;
+	itimer.it_interval.tv_usec = 0;
+
+	if (setitimer(ITIMER_REAL, &itimer, NULL) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: setitimer() failed %s\n", __func__, strerror(errno));
+		goto out;
+	}
+
+	fd_neigh = cmm_rtnl_fd(&ctx->rth_neigh);
+	fd_link = cmm_rtnl_fd(&ctx->rth_link);
+	fd_ifaddr = cmm_rtnl_fd(&ctx->rth_ifaddr);
+	fd_route = cmm_rtnl_fd(&ctx->rth_route);
+	fd_rule = cmm_rtnl_fd(&ctx->rth_rule);
+	fd_abm= cmm_rtnl_fd(&ctx->rth_abm);
+
+	while (1)
+	{
+		if (timer_expired)
+		{
+#if PPPOE_AUTO_ENABLE
+                        cmmPPPoEAutoKeepAlive();
+#endif
+
+			cmmDPDIPsecSAUpdate(ctx);
+
+			/* Resync if needed and system is idle */
+			if (need_resync && !count)
+			{
+				if (!cmmCtResync(ctx))
+					need_resync = 0;
+			}
+
+			cmmNeighSendSolicit();
+
+			count = 0;
+			timer_expired = 0;
+		}
+
+		FD_ZERO (&set);
+		FD_SET (fd_ct, &set);
+#if !defined(IPSEC_SUPPORT_DISABLED)
+		FD_SET (fd_key, &set);
+#endif
+		FD_SET (fd_fci, &set);
+		FD_SET (fd_neigh, &set);
+		FD_SET (fd_link, &set);
+		FD_SET (fd_ifaddr, &set);
+		FD_SET (fd_route, &set);
+		FD_SET (fd_rule, &set);
+
+		if(globalConf.auto_bridge)
+			FD_SET (fd_abm, &set);
+
+		timeout.tv_sec = 1;
+		timeout.tv_usec = 0;
+
+		rc = select(FD_SETSIZE, &set, NULL, NULL, &timeout);
+		if (rc < 0)
+		{
+			if (errno == EINTR)
+				continue;
+
+			cmm_print(DEBUG_ERROR, "%s: select() failed %s\n", __func__, strerror(errno));
+
+			goto out;
+		}
+
+#if !defined(IPSEC_SUPPORT_DISABLED)
+		if (FD_ISSET(fd_key, &set))
+		{
+			rc = fci_catch(ctx->fci_key_catch_handle);
+			if (rc < 0)
+			{
+				if (errno != EAGAIN)
+				{
+					cmm_print(DEBUG_ERROR, "%s: fci_catch() failed %s\n", __func__, strerror(errno));
+				}
+			}
+		}
+#endif
+		if (FD_ISSET(fd_ct, &set))
+		{
+			rc = nfct_catch(ctx->catch_handle);
+			if (rc < 0)
+			{
+				if (errno != EAGAIN)
+				{
+					cmm_print(DEBUG_ERROR, "%s: nfct_catch() %s\n", __func__, strerror(errno));
+
+					if (errno == ENOBUFS)
+					{
+						/* At this point we lost some conntrack events,
+						   try to resync later when system is idle */
+						need_resync = 1;
+					}
+				}
+			}
+		}
+
+		if (FD_ISSET(fd_fci, &set))
+		{
+			rc = fci_catch(ctx->fci_catch_handle);
+			if (rc < 0)
+			{
+				if (errno != EAGAIN)
+				{
+					cmm_print(DEBUG_ERROR, "%s: fci_catch() failed %s\n", __func__, strerror(errno));
+				}
+			}
+		}
+
+		if (FD_ISSET(fd_neigh, &set))
+		{
+			rc = cmm_rtnl_listen(&ctx->rth_neigh, cmmRtnlNeigh, ctx);
+			if (rc < 0)
+			{
+				if (errno != EAGAIN)
+				{
+					cmm_print(DEBUG_ERROR, "%s: cmm_rtnl_listen() failed %s\n", __func__, strerror(errno));
+
+					if (errno == ENOBUFS)
+					{
+						/* If the above function exits, there was some error, try to dump all ARP/Neighbor entries in case an event was lost */
+						cmm_rtnl_neigh_dump_request(&ctx->rth_neigh, AF_INET);
+
+						cmm_rtnl_neigh_dump_request(&ctx->rth_neigh, AF_INET6);
+					}
+
+				}
+			}
+		}
+
+		if (FD_ISSET(fd_link, &set))
+		{
+			rc = cmm_rtnl_listen(&ctx->rth_link, cmmRtnlLink, &itf_table);
+			if (rc < 0)
+			{
+				if (errno != EAGAIN)
+				{
+					cmm_print(DEBUG_ERROR, "%s: cmm_rtnl_listen() failed %s\n", __func__, strerror(errno));
+				}
+			}
+		}
+
+		if (FD_ISSET(fd_ifaddr, &set))
+		{
+			rc = cmm_rtnl_listen(&ctx->rth_ifaddr, cmmRtnlIfAddr, &itf_table);
+			if (rc < 0)
+			{
+				if (errno != EAGAIN)
+				{
+					cmm_print(DEBUG_ERROR, "%s: cmm_rtnl_listen() failed %s\n", __func__, strerror(errno));
+				}
+			}
+		}
+
+		if (FD_ISSET(fd_route, &set))
+		{
+			rc = cmm_rtnl_listen(&ctx->rth_route, cmmRtnlRoute, ctx);
+			if (rc < 0)
+			{
+				if (errno != EAGAIN)
+				{
+					cmm_print(DEBUG_ERROR, "%s: cmm_rtnl_listen() failed %s\n", __func__, strerror(errno));
+				}
+			}
+		}
+
+		if (FD_ISSET(fd_rule, &set))
+		{
+			rc = cmm_rtnl_listen(&ctx->rth_rule, cmmRtnlRule, ctx);
+			if (rc < 0)
+			{
+				if (errno != EAGAIN)
+				{
+					cmm_print(DEBUG_ERROR, "%s: cmm_rtnl_listen() failed %s\n", __func__, strerror(errno));
+				}
+			}
+		}
+		if(globalConf.auto_bridge){
+			if (FD_ISSET(fd_abm, &set))
+			{
+				rc = cmm_rtnl_listen(&ctx->rth_abm, cmm_l2flow_netlink_rcv, ctx);
+				if (rc < 0)
+				{
+					if (errno != EAGAIN)
+					{
+						cmm_print(DEBUG_ERROR, "%s: cmm_rtnl_listen() failed %s\n", __func__, strerror(errno));
+					}
+				}
+			}
+		}
+
+
+
+	}
+
+out:
+	cmm_print(DEBUG_INFO, "%s: exiting\n", __func__);
+
+	kill (0, SIGTERM);
+	pthread_exit(NULL);
+
+	return NULL;
+}
+
+int cmmCtInit(struct cmm_ct *ctx)
+{
+	int fd;
+	int i;
+	int size;
+	socklen_t socklen = sizeof(size);
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	for (i = 0; i < CONNTRACK_HASH_TABLE_SIZE; i++)
+	{
+		list_head_init(&ct_table[i]);
+		list_head_init(&ct_table_by_rep[i]);
+	}
+
+	for (i = 0; i < FLOW_HASH_TABLE_SIZE; i++)
+		list_head_init(&flow_table[i]);
+
+	for (i = 0; i < 2 * NEIGHBOR_HASH_TABLE_SIZE; i++)
+	{
+		list_head_init(&rt_table_by_gw_ip[i]);
+		list_head_init(&neigh_table[i]);
+	}
+
+	list_head_init(&neigh_state_table);
+
+	for (i = 0; i < NEIGHBOR_HASH_TABLE_SIZE; i++)
+		list_head_init(&neigh_table_by_mac[i]);
+
+	for (i = 0; i < ROUTE_HASH_TABLE_SIZE; i++)
+		list_head_init(&fpp_rt_table[i]);
+
+	for (i = 0; i < 2 * ROUTE_HASH_TABLE_SIZE; i++)
+	{
+		list_head_init(&rt_table[i]);
+		list_head_init(&ct_table_by_orig_route[i]);
+		list_head_init(&ct_table_by_rep_route[i]);
+		list_head_init(&ct_table_by_orig_tunnel_route[i]);
+		list_head_init(&ct_table_by_rep_tunnel_route[i]);
+	}
+
+	for (i = 0; i < HASH_SOCKET_SIZE ; i++) {
+		list_head_init(&socket_table[i]);
+		list_head_init(&socket_table_by_addr[i]);
+	}
+
+	for (i = 0; i < MC_NUM_HASH_ENTRIES ; i++)
+		list_head_init(&mc_table[i]);
+
+	for (i = 0; i < L2FLOW_HASH_TABLE_SIZE; i++)
+		list_head_init(&l2flow_table[i]);
+
+	memset(&ct_stats, 0, sizeof(struct conntrack_stats));
+
+	if (cmmCtKernelModuleInit() < 0)
+	{
+		goto err0;
+	}
+#ifdef APP_SOLICIT
+	if (cmmRtnlKernelModuleInit() < 0)
+	{
+		goto err1;
+	}
+#endif
+	ctx->fci_catch_handle = fci_open(FCILIB_FF_TYPE, NL_FF_GROUP);
+	if (!ctx->fci_catch_handle)
+	{
+		cmm_print(DEBUG_CRIT, "%s: fci_open() failed, %s\n", __func__, strerror(errno));
+		goto err2;
+	}
+
+	ctx->fci_handle = fci_open(FCILIB_FF_TYPE, 0);
+	if (!ctx->fci_handle)
+	{
+		cmm_print(DEBUG_CRIT, "%s: fci_open() failed, %s\n", __func__, strerror(errno));
+		goto err3;
+	}
+
+#if !defined(IPSEC_SUPPORT_DISABLED)
+	ctx->fci_key_catch_handle = fci_open(FCILIB_KEY_TYPE, NL_KEY_ALL_GROUP);
+	if (!ctx->fci_key_catch_handle)
+	{
+		cmm_print(DEBUG_CRIT, "%s: fci_open() failed, %s\n", __func__, strerror(errno));
+		goto err4;
+	}
+
+	ctx->fci_key_handle = fci_open(FCILIB_KEY_TYPE, 0);
+	if (!ctx->fci_key_handle)
+	{
+		cmm_print(DEBUG_CRIT, "%s: fci_open() failed, %s\n", __func__, strerror(errno));
+		goto err5;
+	}
+#endif
+
+	// Open a Conntrack socket
+	ctx->catch_handle = nfct_open(CONNTRACK, NFCT_ALL_CT_GROUPS);
+	if (!ctx->catch_handle)
+	{
+		cmm_print(DEBUG_CRIT, "%s: nfct_open() failed, %s\n", __func__, strerror(errno));
+		goto err6;
+	}
+
+	// Open a Netfilter socket
+	ctx->handle = nfct_open(CONNTRACK, 0);
+	if (!ctx->handle)
+	{
+		cmm_print(DEBUG_CRIT, "%s: nfct_open()failed, %s\n", __func__, strerror(errno));
+		goto err7;
+	}
+
+	// Open a Netfilter socket
+	ctx->get_handle = nfct_open(CONNTRACK, 0);
+	if (!ctx->get_handle)
+	{
+		cmm_print(DEBUG_CRIT, "%s: nfct_open()failed, %s\n", __func__, strerror(errno));
+		goto err8;
+	}
+
+	/* Open a Netlink socket and register to the Multicast groups*/
+	if (cmm_rtnl_open(&ctx->rth_neigh, RTMGRP_NEIGH) < 0)
+	{
+		cmm_print(DEBUG_STDERR, "%s: cmm_rtnl_open(NEIGHBOR) failed\n", __func__);
+		goto err9;
+	}
+
+	if (cmm_rtnl_open(&ctx->rth_link, RTMGRP_LINK) < 0)
+	{
+		cmm_print(DEBUG_STDERR, "%s: cmm_rtnl_open(LINK) failed\n", __func__);
+		goto err10;
+	}
+
+	if (cmm_rtnl_open(&ctx->rth_ifaddr, RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR) < 0)
+	{
+		cmm_print(DEBUG_STDERR, "%s: cmm_rtnl_open(IFADDR) failed\n", __func__);
+		goto err11;
+	}
+
+	if (cmm_rtnl_open(&ctx->rth_route, RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE) < 0)
+	{
+		cmm_print(DEBUG_STDERR, "%s: cmm_rtnl_open(ROUTE) failed\n", __func__);
+		goto err12;
+	}
+
+	if (cmm_rtnl_open(&ctx->rth_rule, RTMGRP_IPV4_RULE) < 0)
+	{
+		cmm_print(DEBUG_STDERR, "%s: cmm_rtnl_open(RULE) failed\n", __func__);
+		goto err13;
+	}
+
+	if(cmmBridgeInit(ctx))
+		goto err14;
+	
+	fd = fci_fd(ctx->fci_catch_handle);
+
+	if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: fcntl(%d) failed %s\n", __func__, fd, strerror(errno));
+		goto err14;
+	}
+
+#if !defined(IPSEC_SUPPORT_DISABLED)
+	fd = fci_fd(ctx->fci_key_catch_handle);
+
+	if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: fcntl(%d) failed %s\n", __func__, fd, strerror(errno));
+		goto err14;
+	}
+#endif
+
+	if (nfnl_set_nonblocking_mode((struct nfnl_handle *)nfct_nfnlh(ctx->catch_handle)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: nfnl_set_nonblocking_mode() failed %s\n", __func__, strerror(errno));
+		goto err14;
+	}
+
+	if (cmm_rtnl_set_nonblocking_mode(&ctx->rth_neigh) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: cmm_rtnl_set_nonblocking_mode(NEIGHBOR) failed\n", __func__);
+		goto err14;
+	}
+
+	if (cmm_rtnl_set_nonblocking_mode(&ctx->rth_link) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: cmm_rtnl_set_nonblocking_mode(LINK) failed\n", __func__);
+		goto err14;
+	}
+
+	if (cmm_rtnl_set_nonblocking_mode(&ctx->rth_ifaddr) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: cmm_rtnl_set_nonblocking_mode(IFADDR) failed\n", __func__);
+		goto err13;
+	}
+
+	if (cmm_rtnl_set_nonblocking_mode(&ctx->rth_route) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: cmm_rtnl_set_nonblocking_mode(ROUTE) failed\n", __func__);
+		goto err14;
+	}
+
+	if (cmm_rtnl_set_nonblocking_mode(&ctx->rth_rule) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: cmm_rtnl_set_nonblocking_mode(RULE) failed\n", __func__);
+		goto err14;
+	}
+	if(globalConf.auto_bridge)
+		if (cmm_rtnl_set_nonblocking_mode(&ctx->rth_abm) < 0)
+		{
+			cmm_print(DEBUG_ERROR, "%s: cmm_rtnl_set_nonblocking_mode(abm) failed\n", __func__);
+			goto err14;
+		}
+
+	// Change socket size to avoid losing messages
+	nfnl_rcvbufsiz((struct nfnl_handle *)nfct_nfnlh(ctx->catch_handle), NFNL_SOCK_SIZE);
+
+#ifdef ROUTER
+	nfnl_rcvbufsiz((struct nfnl_handle *)nfct_nfnlh(ctx->handle), 128 * 1024);
+#endif
+
+	nfnl_set_rcv_buffer_size((struct nfnl_handle *)nfct_nfnlh(ctx->catch_handle), 64 * 1024);
+
+	nfnl_unset_sequence_tracking((struct nfnl_handle *)nfct_nfnlh(ctx->catch_handle));
+
+	cmm_rtnl_rcvbufsiz(&ctx->rth_neigh, 1024 * 1024);
+	
+	cmm_rtnl_rcvbufsiz(&ctx->rth_link, 512 * 1024);
+
+	
+	fd = fci_fd(ctx->fci_catch_handle);
+	size = NFNL_SOCK_SIZE;
+	if(setsockopt(fd, SOL_SOCKET, SO_RCVBUFFORCE, &size, socklen) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: setsockopt(socket %d) failed %s\n", __func__, fd, strerror(errno));
+		goto err14;
+	}
+
+	fci_register_cb(ctx->fci_catch_handle, cmmFeCatch);
+#if !defined(IPSEC_SUPPORT_DISABLED)
+	fci_register_cb(ctx->fci_key_catch_handle, cmmKeyCatch);
+#endif
+	nfct_callback_register(ctx->catch_handle, NFCT_T_ALL, cmmCtCatch, ctx);
+	nfct_callback_register(ctx->get_handle, NFCT_T_ALL, cmmCtCheckCtCb, NULL);
+
+	for (i = 0; i < GEM_PORTS; i++) {
+		if (itf_name_update(ctx->fci_handle, &port_table[i]) < 0)
+			goto err14;
+	}
+
+	if (itf_table_init(&itf_table) < 0)
+		goto err14;
+
+	// Reset the Forward Engine
+	cmmFeReset(ctx->fci_handle);
+
+	if (pthread_create(&ctx->pthread, NULL, cmmCtThread, ctx) < 0)
+	{
+		cmm_print(DEBUG_CRIT, "%s: pthread_create() failed, %s\n", __func__, strerror(errno));
+		goto err14;
+	}
+
+	return 0;
+
+err14:
+	cmm_rtnl_close(&ctx->rth_rule);
+
+err13:
+	cmm_rtnl_close(&ctx->rth_route);
+
+err12:
+	cmm_rtnl_close(&ctx->rth_ifaddr);
+
+err11:
+	cmm_rtnl_close(&ctx->rth_link);
+
+err10:
+	cmm_rtnl_close(&ctx->rth_neigh);
+
+err9:
+	nfct_close(ctx->get_handle);
+
+err8:
+	nfct_close(ctx->handle);
+
+err7:
+	nfct_close(ctx->catch_handle);
+
+err6:
+#if !defined(IPSEC_SUPPORT_DISABLED)
+	fci_close(ctx->fci_key_handle);
+
+err5:
+	fci_close(ctx->fci_key_catch_handle);
+
+err4:
+#endif
+	fci_close(ctx->fci_handle);
+
+err3:
+	fci_close(ctx->fci_catch_handle);
+
+err2:
+#ifdef APP_SOLICIT
+	cmmRtnlKernelModuleUnInit();
+err1:
+#endif
+
+	cmmCtKernelModuleUnInit();
+
+err0:
+	return -1;
+}
+
+void cmmCtExit(struct cmm_ct *ctx)
+{
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+#if defined(__UCLIBC__)
+	/* workaround uclibc pthread_cancel() bug, force thread to exit */
+#if !defined(IPSEC_SUPPORT_DISABLED)
+	fci_close(ctx->fci_key_catch_handle);
+#endif
+#else
+	pthread_cancel(ctx->pthread);
+#endif
+
+	pthread_join(ctx->pthread, NULL);
+
+	cmm_rtnl_close(&ctx->rth_rule);
+
+	cmm_rtnl_close(&ctx->rth_route);
+
+	cmm_rtnl_close(&ctx->rth_ifaddr);
+
+	cmm_rtnl_close(&ctx->rth_link);
+
+	cmm_rtnl_close(&ctx->rth_neigh);
+
+	nfct_close(ctx->handle);
+
+	nfct_close(ctx->catch_handle);
+
+#if !defined(IPSEC_SUPPORT_DISABLED)
+	fci_close(ctx->fci_key_handle);
+
+#if !defined(__UCLIBC__)
+	fci_close(ctx->fci_key_catch_handle);
+#endif
+#endif
+	fci_close(ctx->fci_handle);
+
+	fci_close(ctx->fci_catch_handle);
+
+#ifdef APP_SOLICIT
+	cmmRtnlKernelModuleUnInit();
+#endif
+	cmmCtKernelModuleUnInit();
+
+	cmm_print(DEBUG_INFO, "%s: exiting\n", __func__);
+}
+
+/*****************************************************************
+* cmmCtChangeProcess4
+*
+*
+******************************************************************/
+int cmmCtChangeProcess4(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	unsigned int tmp;
+	int cpt = tabStart;
+	cmmd_ct_ex_cmd_t ctCmd;
+	char rcvBuffer[256];
+
+	memset(&ctCmd, 0, sizeof(ctCmd));
+
+	// orig srcIP
+	if (!keywords[cpt])
+		goto help;
+	if (inet_pton(AF_INET, keywords[cpt], &ctCmd.saddr) != 1)
+		goto help;
+
+	// orig destIP
+	if (!keywords[++cpt])
+		goto help;
+	if (inet_pton(AF_INET, keywords[cpt], &ctCmd.daddr) != 1)
+		goto help;
+
+	// orig srcPort
+	if (!keywords[++cpt])
+		goto help;
+	tmp = strtoul(keywords[cpt], NULL, 0);
+	if (tmp > 0xFFFF)
+		goto help;
+	ctCmd.sport = htons(tmp);
+
+	// orig destPort
+	if (!keywords[++cpt])
+		goto help;
+	tmp = strtoul(keywords[cpt], NULL, 0);
+	if (tmp > 0xFFFF)
+		goto help;
+	ctCmd.dport = htons(tmp);
+
+	// reply srcIP
+	if (!keywords[++cpt])
+		goto help;
+	if (inet_pton(AF_INET, keywords[cpt], &ctCmd.saddr_reply) != 1)
+		goto help;
+
+	// reply destIP
+	if (!keywords[++cpt])
+		goto help;
+	if (inet_pton(AF_INET, keywords[cpt], &ctCmd.daddr_reply) != 1)
+		goto help;
+
+	// reply srcPort
+	if (!keywords[++cpt])
+		goto help;
+	tmp = strtoul(keywords[cpt], NULL, 0);
+	if (tmp > 0xFFFF)
+		goto help;
+	ctCmd.sport_reply = htons(tmp);
+
+	// reply destPort
+	if (!keywords[++cpt])
+		goto help;
+	tmp = strtoul(keywords[cpt], NULL, 0);
+	if (tmp > 0xFFFF)
+		goto help;
+	ctCmd.dport_reply = htons(tmp);
+
+	// protocol
+	if (!keywords[++cpt])
+		goto help;
+	tmp = strtoul(keywords[cpt], NULL, 0);
+	if (tmp > 0xFFFF)
+		goto help;
+	ctCmd.protocol = tmp;
+
+	// mark
+	if (!keywords[++cpt])
+		goto help;
+	tmp = strtoul(keywords[cpt], NULL, 0);
+	ctCmd.fwmark = tmp;
+
+	if (keywords[++cpt])
+		goto help;
+
+	ctCmd.action = CMMD_ACTION_UPDATE;
+	if (cmmSendToDaemon(daemon_handle, CMMD_CMD_IPV4_CONNTRACK, &ctCmd, sizeof(ctCmd), &rcvBuffer) == 2)
+	{
+		if (((unsigned short *)rcvBuffer)[0] != 0)
+			cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_IPV4_CONNTRACK, ACTION_UPDATE\n", ((unsigned short *)rcvBuffer)[0]);
+	}
+
+	return 0;
+
+help:
+	cmm_print(DEBUG_STDOUT, "Usage: ipv4 update {orig-srcIPaddr} {orig-destIPaddr} {orig-srcPort} {orig-destPort} {reply-srcIPaddr} {reply-destIPaddr} {reply-srcPort} {reply-destPort} {protocol} {mark}\n");
+	return -1;
+}
+
+/*****************************************************************
+* cmmCtChangeProcess6
+*
+*
+******************************************************************/
+int cmmCtChangeProcess6(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	unsigned int tmp;
+	int cpt = tabStart;
+	cmmd_ct6_ex_cmd_t ctCmd;
+	char rcvBuffer[256];
+
+	memset(&ctCmd, 0, sizeof(ctCmd));
+
+	// orig srcIP
+	if (!keywords[cpt])
+		goto help;
+	if (inet_pton(AF_INET6, keywords[cpt], &ctCmd.saddr) != 1)
+		goto help;
+
+	// orig destIP
+	if (!keywords[++cpt])
+		goto help;
+	if (inet_pton(AF_INET6, keywords[cpt], &ctCmd.daddr) != 1)
+		goto help;
+
+	// orig srcPort
+	if (!keywords[++cpt])
+		goto help;
+	tmp = strtoul(keywords[cpt], NULL, 0);
+	if (tmp > 0xFFFF)
+		goto help;
+	ctCmd.sport = htons(tmp);
+
+	// orig destPort
+	if (!keywords[++cpt])
+		goto help;
+	tmp = strtoul(keywords[cpt], NULL, 0);
+	if (tmp > 0xFFFF)
+		goto help;
+	ctCmd.dport = htons(tmp);
+
+	// reply srcIP
+	if (!keywords[++cpt])
+		goto help;
+	if (inet_pton(AF_INET6, keywords[cpt], &ctCmd.saddr_reply) != 1)
+		goto help;
+
+	// reply destIP
+	if (!keywords[++cpt])
+		goto help;
+	if (inet_pton(AF_INET6, keywords[cpt], &ctCmd.daddr_reply) != 1)
+		goto help;
+
+	// reply srcPort
+	if (!keywords[++cpt])
+		goto help;
+	tmp = strtoul(keywords[cpt], NULL, 0);
+	if (tmp > 0xFFFF)
+		goto help;
+	ctCmd.sport_reply = htons(tmp);
+
+	// reply destPort
+	if (!keywords[++cpt])
+		goto help;
+	tmp = strtoul(keywords[cpt], NULL, 0);
+	if (tmp > 0xFFFF)
+		goto help;
+	ctCmd.dport_reply = htons(tmp);
+
+	// protocol
+	if (!keywords[++cpt])
+		goto help;
+	tmp = strtoul(keywords[cpt], NULL, 0);
+	if (tmp > 0xFFFF)
+		goto help;
+	ctCmd.protocol = tmp;
+
+	// mark
+	if (!keywords[++cpt])
+		goto help;
+	tmp = strtoul(keywords[cpt], NULL, 0);
+	ctCmd.fwmark = tmp;
+
+	if (keywords[++cpt])
+		goto help;
+
+	ctCmd.action = CMMD_ACTION_UPDATE;
+	if (cmmSendToDaemon(daemon_handle, CMMD_CMD_IPV6_CONNTRACK, &ctCmd, sizeof(ctCmd), &rcvBuffer) == 2)
+	{
+		if (((unsigned short *)rcvBuffer)[0] != 0)
+			cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_IPV6_CONNTRACK, ACTION_UPDATE\n", ((unsigned short *)rcvBuffer)[0]);
+	}
+
+	return 0;
+
+help:
+	cmm_print(DEBUG_STDOUT, "Usage: ipv6 update {orig-srcIPaddr} {orig-destIPaddr} {orig-srcPort} {orig-destPort} {reply-srcIPaddr} {reply-destIPaddr} {reply-srcPort} {reply-destPort} {protocol} {mark}\n");
+	return -1;
+}
+
+/*****************************************************************
+* cmmCtChange
+* For now only supports mark change
+*
+******************************************************************/
+static int cmmCtChange(FCI_CLIENT *fci_handle, int function_code, u_int8_t *cmd_buf, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	struct nf_conntrack *ctTemp;
+	struct ctTable *ctEntry;
+	unsigned int fwmark;
+	int rc = 0;
+
+	ctTemp = nfct_new();
+	if (!ctTemp)
+	{
+		cmm_print(DEBUG_ERROR, "%s: nfct_new() failed - %s\n", __func__, strerror(errno));
+		rc = -1;
+		goto out0;
+	}
+	
+	if (function_code == CMMD_CMD_IPV4_CONNTRACK)
+	{
+		cmmd_ct_ex_cmd_t *cmd = (cmmd_ct_ex_cmd_t*) cmd_buf;
+
+		nfct_set_attr_u8(ctTemp, ATTR_ORIG_L4PROTO, cmd->protocol);
+		nfct_set_attr_u8(ctTemp, ATTR_ORIG_L3PROTO, AF_INET);
+		nfct_set_attr_u32(ctTemp, ATTR_ORIG_IPV4_SRC, cmd->saddr);
+		nfct_set_attr_u32(ctTemp, ATTR_ORIG_IPV4_DST, cmd->daddr);
+		nfct_set_attr_u32(ctTemp, ATTR_REPL_IPV4_SRC, cmd->saddr_reply);
+		nfct_set_attr_u32(ctTemp, ATTR_REPL_IPV4_DST, cmd->daddr_reply);
+
+		nfct_set_attr_u16(ctTemp, ATTR_ORIG_PORT_SRC, cmd->sport);
+		nfct_set_attr_u16(ctTemp, ATTR_ORIG_PORT_DST, cmd->dport);
+		nfct_set_attr_u16(ctTemp, ATTR_REPL_PORT_SRC, cmd->sport_reply);
+		nfct_set_attr_u16(ctTemp, ATTR_REPL_PORT_DST, cmd->dport_reply);
+		fwmark = cmd->fwmark;
+	}
+	else if (function_code == CMMD_CMD_IPV6_CONNTRACK)
+	{
+		fpp_ct6_ex_cmd_t *cmd = (fpp_ct6_ex_cmd_t *) cmd_buf;
+
+		nfct_set_attr_u8(ctTemp, ATTR_ORIG_L4PROTO, cmd->protocol);
+		nfct_set_attr_u8(ctTemp, ATTR_ORIG_L3PROTO, AF_INET6);
+		nfct_set_attr(ctTemp, ATTR_ORIG_IPV6_SRC, &cmd->saddr[0]);
+		nfct_set_attr(ctTemp, ATTR_ORIG_IPV6_DST, &cmd->daddr[0]);
+
+		nfct_set_attr(ctTemp, ATTR_REPL_IPV6_SRC, &cmd->saddr_reply[0]);
+		nfct_set_attr(ctTemp, ATTR_REPL_IPV6_DST, &cmd->daddr_reply[0]);
+
+		nfct_set_attr_u16(ctTemp, ATTR_ORIG_PORT_SRC, cmd->sport);
+		nfct_set_attr_u16(ctTemp, ATTR_ORIG_PORT_DST, cmd->dport);
+		nfct_set_attr_u16(ctTemp, ATTR_REPL_PORT_SRC, cmd->sport_reply);
+		nfct_set_attr_u16(ctTemp, ATTR_REPL_PORT_DST, cmd->dport_reply);
+		fwmark = cmd->fwmark;
+	}
+	else
+	{/* Function code not valid */
+		cmm_print(DEBUG_ERROR, "%s: Function code %x is not valid\n", __func__, function_code);
+		res_buf[0] = CMMD_ERR_UNKNOWN_COMMAND;
+		*res_len = 2;
+		goto out1;
+	}
+
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&ctMutex);
+	
+	if (!(ctEntry = __cmmCtFind(ctTemp)))
+	{
+		cmm_print(DEBUG_WARNING, "%s: conntrack not found\n", __func__);
+		res_buf[0] = CMMD_ERR_NOT_FOUND;
+		*res_len = 2;
+		goto out2;
+	}
+
+	ctEntry->flags |= FPP_NEEDS_UPDATE;
+	nfct_set_attr_u32(ctEntry->ct, ATTR_MARK, fwmark);
+
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+
+	rc = ____cmmCtRegister(fci_handle, ctEntry);
+	if (rc == 0)
+	{
+		res_buf[0] = CMMD_ERR_OK;
+		*res_len = 2;
+	}
+
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+
+out2:
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+out1:
+	free(ctTemp);
+
+out0:
+	return rc;
+}
+
+int cmmCtHandle(FCI_CLIENT *fci_handle, int function_code, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	u_int16_t action = ((u_int16_t *)cmd_buf)[0];
+	int rc;
+
+	switch (action)
+	{
+	case CMMD_ACTION_UPDATE:
+		rc = cmmCtChange(fci_handle, function_code, cmd_buf, res_buf, res_len);
+		break;
+
+	case CMMD_ACTION_QUERY:
+	case CMMD_ACTION_QUERY_CONT:
+		rc = fci_cmd(fci_handle, function_code, (u_int16_t*)cmd_buf, cmd_len, res_buf, res_len);
+		break;
+
+	default:
+		res_buf[0] = CMMD_ERR_UNKNOWN_ACTION;
+		*res_len = 2;
+		rc = 0;
+		break;
+	}
+
+	return rc;
+}
+
+#ifdef C2000_DPI
+/*****************************************************************
+* cmmDPIEnableShow
+*
+*
+******************************************************************/
+int cmmDPIEnableShow(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	if(globalConf.dpi_enable)
+		cli_print(cli, " The DPI flag is enabled");
+	else
+		cli_print(cli, " The DPI flag is disabled");
+	return CLI_OK;
+}
+
+int cmmDPIFlagProcessClientCmd(u_int8_t *cmd_buf, u_int16_t *res_buf, u_int16_t *res_len)
+{
+        cmmd_dpi_enable_t    *entryCmd = (cmmd_dpi_enable_t*) cmd_buf;
+
+        cmm_print(DEBUG_INFO, "cmmDPIFlagProcessClientCmd\n");
+
+        res_buf[0] = CMMD_ERR_OK;
+        *res_len = 2;
+
+        switch (entryCmd->action) {
+                case CMMD_DPIFLAG_ACTION_ENABLE:
+                        cmm_print(DEBUG_INFO, "cmmDPIFlagProcessClientCmd- CMMD_DPIFLAG_ACTION_ENABLE\n");
+                        globalConf.dpi_enable = 1;
+                        break;
+
+                case CMMD_DPIFLAG_ACTION_DISABLE:
+                        cmm_print(DEBUG_INFO, "cmmDPIFlagProcessClientCmd- CMMD_DPIFLAG_ACTION_DISABLE\n");
+                        globalConf.dpi_enable = 0;
+                        break;
+
+                default:
+                        res_buf[0] = CMMD_ERR_UNKNOWN_ACTION;
+                        break;
+        }
+        return 0;
+}
+
+void cmmDPIFlagPrintHelp(int cmd_type)
+{
+        if (cmd_type == DPI_UNKNOWN_CMD || cmd_type == DPI_ENABLE_CMD)
+        {
+            cmm_print(DEBUG_STDOUT, "Usage: set dpi enable \n"
+                                    "       set dpi disable \n");
+        }
+}
+
+int cmmDPIFlagSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cmd_type = DPI_UNKNOWN_CMD;
+	int cpt = tabStart;
+	int rc;
+
+	char sndBuffer[256];
+	char rcvBuffer[256];
+	cmmd_dpi_enable_t* entryCmd = (cmmd_dpi_enable_t*) sndBuffer;
+
+	memset(sndBuffer, 0, sizeof(sndBuffer));
+	cmm_print(DEBUG_INFO, "Entered DPI Flag Set Process\n");
+
+	if(!keywords[cpt])
+		goto help;
+
+	if( (strcasecmp(keywords[cpt], "enable") == 0) ||
+	    (strcasecmp(keywords[cpt], "disable") == 0) )
+	{
+		cmd_type = DPI_ENABLE_CMD;
+
+		if(strcasecmp(keywords[cpt], "enable") == 0)
+			entryCmd->action = CMMD_DPIFLAG_ACTION_ENABLE;
+		else
+			entryCmd->action = CMMD_DPIFLAG_ACTION_DISABLE;
+	}
+	else
+		goto keyword_error;
+
+	rc = cmmSendToDaemon(daemon_handle, CMMD_CMD_DPIENABLE, sndBuffer, sizeof(cmmd_dpi_enable_t), rcvBuffer);
+	if(rc != 2)
+	{
+		if(rc >= 0)
+			cmm_print(DEBUG_STDERR, "Unexpected response size for CMD_DPIENABLE: %d\n", rc);
+		return -1;
+	}
+	else if (((unsigned short *)rcvBuffer)[0] != CMMD_ERR_OK)
+	{
+		cmm_print(DEBUG_STDERR, "Error %d received for CMDD_DPIENABLE\n", ((unsigned short *)rcvBuffer)[0]);
+		return -1;
+	}
+        
+	return 0;
+
+keyword_error:
+	cmm_print(DEBUG_CRIT, "ERROR: Unknown keyword %s\n", keywords[cpt]);
+
+help:
+	cmmDPIFlagPrintHelp(cmd_type);
+	return -1;
+}
+#endif /*C2000_DPI*/
+
diff --git a/cmm/src/conntrack.h b/cmm/src/conntrack.h
new file mode 100644
index 0000000..c67f3b1
--- /dev/null
+++ b/cmm/src/conntrack.h
@@ -0,0 +1,182 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __CONNTRACK_H__
+#define __CONNTRACK_H__
+
+	#include <stdio.h>
+	#include <errno.h>
+	#include <stdlib.h>
+	#include "cmm.h"
+	#include "jhash.h"
+	#include "list.h"
+	#include "neighbor_resolution.h"
+	#include "route_cache.h"
+
+	#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
+
+	/******************************
+	 * Structures
+	 *
+	 ******************************/
+	#define MAX_CT_ID 8
+
+	struct ctTable
+	{
+		struct list_head list;
+
+		struct list_head list_by_rep;
+
+		struct list_head list_by_orig_route;
+
+		struct list_head list_by_rep_route;
+
+		struct list_head list_by_orig_tunnel_route;
+
+		struct list_head list_by_rep_tunnel_route;
+
+		struct nf_conntrack * ct;
+
+		struct ct_route		orig;
+		struct FlowEntry	*fEntryOrig;
+
+		struct ct_route		rep;
+		struct FlowEntry	*fEntryRep;
+
+		struct ct_route		orig_tunnel;
+
+		struct ct_route		rep_tunnel;
+		
+                int timeout;
+		time_t tlast;
+
+		int family;
+
+		int dir;
+
+		int fpp_dir;
+
+		int flags;
+
+		int dir_filter;
+
+		u_int32_t ids[MAX_CT_ID];
+
+		int n_id;
+	};
+
+	struct conntrack_stats
+	{
+		int current;
+		unsigned long long created;
+		unsigned long long removed;
+		unsigned long long destroyed;
+	};
+
+	/******************************
+	 * Defines
+	 *
+	 ******************************/
+
+	#define CONNTRACK_HASH_TABLE_SIZE 16384			/* must be power of 2 */
+
+	#define CT_KERNEL_TIMEOUT_PERMANENT          1000
+
+	#define CONNTRACK_MAX		32768		/* hard limit on the number of conntracks allowed in cmm,
+							   used to avoid consuming too much memory. Should be higher
+							   than the maximum kernel conntracks configured through
+							   "/proc/sys/net/nf_conntrack_max" */
+
+	#define TCP_BE_LIBERAL_PATH "/proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal"
+	
+	#define ORIGINATOR	(1 << 0)
+	#define REPLIER		(1 << 1)
+
+	extern struct list_head ct_table[CONNTRACK_HASH_TABLE_SIZE];
+	extern struct list_head ct_table_by_rep[CONNTRACK_HASH_TABLE_SIZE];
+	extern struct list_head ct_table_by_orig_route[2 * ROUTE_HASH_TABLE_SIZE];
+	extern struct list_head ct_table_by_rep_route[2 * ROUTE_HASH_TABLE_SIZE];
+	extern struct list_head ct_table_by_orig_tunnel_route[2 * ROUTE_HASH_TABLE_SIZE];
+	extern struct list_head ct_table_by_rep_tunnel_route[2 * ROUTE_HASH_TABLE_SIZE];
+	
+	extern pthread_mutex_t ctMutex;
+
+	extern struct conntrack_stats ct_stats;
+
+	struct cmm_ct;
+
+	int cmmCtInit(struct cmm_ct *ctx);
+	void cmmCtExit(struct cmm_ct *ctx);
+	int __cmmRouteRegister(struct ct_route *rt, struct flow *flow, int is_floating_tunnel, const char *dir);
+	int ____cmmCtRegister(FCI_CLIENT *fci_handle, struct ctTable *ctEntry);
+	void __cmmCtUpdateWithRoute(FCI_CLIENT *fci_handle, struct RtEntry *route);
+	int cmmCtNetlinkRemove(struct nfct_handle * handler, struct nf_conntrack *ct);
+	int cmmCtHandle(FCI_CLIENT *fci_handle, int function_code, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len);
+
+	int cmmCtShow(struct cli_def * cli, char *command, char *argv[], int argc);
+	int cmmFlowLocalShow(struct cli_def * cli, char *command, char *argv[], int argc);
+
+	struct ctTable *__cmmCtFind(struct nf_conntrack *ctTemp);
+	void __cmmNeighDeregister(FCI_CLIENT *fci_handle, struct NeighborEntry *neigh, const char *dir);
+	void __cmmRouteDeregister(FCI_CLIENT *fci_handle, struct ct_route *rt, const char *dir);
+	void ____cmmRouteDeregister(struct RtEntry *route, const char *dir);
+	void __cmmFPPRouteDeregister(FCI_CLIENT *fci_handle, struct fpp_rt *fpp_route, const char *dir);
+	void __cmmCheckFPPRouteIdUpdate(struct ct_route *rt, int *flags);
+	void __cmmCtRemove(struct ctTable *ctEntry);
+	void ____cmmCtDeregister(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, struct ctTable *ctEntry);
+	struct ctTable *__cmmCtFindFromFlow(int family, unsigned int *saddr, unsigned int *daddr, unsigned short sport, unsigned short dport, unsigned char proto, char *orig);
+
+/*Hash calculation*/
+static __inline u_int32_t HASH_CT(int family, const u_int32_t *Saddr, const u_int32_t *Daddr, u_int16_t Sport, u_int16_t Dport, u_int16_t Proto)
+{
+	unsigned int a, b;
+
+	if (family == AF_INET)
+	{
+		a = jhash((void *)Saddr, 4, (Proto << 16) | Proto);
+		b = jhash((void *)Daddr, 4, (Sport << 16) | Dport);
+	}
+	else
+	{
+        	a = jhash((void *)Saddr, 16, (Proto << 16) | Proto);
+        	b = jhash((void *)Daddr, 16, (Sport << 16) | Dport);
+	}
+
+	return jhash_2words(a, b, 0x48375934) % CONNTRACK_HASH_TABLE_SIZE;
+}
+
+#ifdef COMCERTO_2000 
+
+#define IPS_DPI_ALLOWED_BIT	14
+#define IPS_DPI_ALLOWED		(1 << IPS_DPI_ALLOWED_BIT)
+
+#define DPI_UNKNOWN_CMD     0
+#define DPI_ENABLE_CMD      1
+int cmmDPIFlagSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+int cmmDPIEnableShow(struct cli_def * cli, char *command, char *argv[], int argc);
+int cmmDPIFlagProcessClientCmd(u_int8_t *cmd_buf, u_int16_t *res_buf, u_int16_t *res_len);
+
+#endif /*C2000_DPI*/
+
+#define ASYMFF_UNKNOWN_CMD     0
+#define ASYMFF_ENABLE_CMD      1
+int cmmAsymFFSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+int cmmAsymFFEnableShow(struct cli_def * cli, char *command, char *argv[], int argc);
+int cmmAsymFFProcessClientCmd(u_int8_t *cmd_buf, u_int16_t *res_buf, u_int16_t *res_len);
+#endif
+
diff --git a/cmm/src/ffbridge.c b/cmm/src/ffbridge.c
new file mode 100644
index 0000000..bd0b653
--- /dev/null
+++ b/cmm/src/ffbridge.c
@@ -0,0 +1,280 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+#include "cmm.h"
+#include "ffbridge.h"
+#include "itf.h"
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <sys/socket.h>
+#include <string.h>
+#include <ctype.h>
+
+static void __cmmGetBridgePorts(int fd, struct interface *bridge)
+{
+	unsigned long args[4] = {BRCTL_GET_PORT_LIST, (unsigned long)bridge->ifindices, MAX_PORTS, 0};
+	struct ifreq ifr;
+	int max_ports;
+
+	memset(bridge->ifindices, 0, MAX_PORTS * sizeof(int));
+	if (____itf_get_name(bridge, ifr.ifr_name, sizeof(ifr.ifr_name)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: ____itf_get_name(%d) failed\n", __func__, __LINE__, bridge->ifindex);
+
+		goto out;
+	}
+
+	ifr.ifr_data = (char *) &args;
+
+	if ((max_ports = ioctl(fd, SIOCDEVPRIVATE, &ifr)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: ioctl() %s\n", __func__, __LINE__, strerror(errno));
+		goto out;
+	}
+out:
+	return;
+}
+
+void __cmmGetBridges(int fd)
+{
+	int ifindices[MAX_BRIDGES];
+	unsigned long args[3] = {BRCTL_GET_BRIDGES, (unsigned long)ifindices, MAX_BRIDGES};
+	struct interface *itf;
+	char ifname[IFNAMSIZ];
+	int ifindex;
+	int num, i;
+
+	num = ioctl(fd, SIOCGIFBR, args);
+	if (num < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: ioctl() %s\n", __func__, __LINE__, strerror(errno));
+
+		goto out;
+	}
+
+	for (i = 0; i < num; i++)
+	{
+		ifindex = ifindices[i];
+
+		itf = __itf_find(ifindex);
+		if (!itf)
+			continue;
+
+		itf->itf_flags |= ITF_BRIDGE;
+
+		__cmmGetBridgePorts(fd, itf);
+
+		cmm_print(DEBUG_INFO, "%s::%d: %s is a bridge\n", __func__, __LINE__, if_indextoname(itf->ifindex, ifname));
+	}
+
+out:
+	return;
+}
+
+static void cmmBrgetAllMacPort(int br_ifindex)
+{
+	struct __fdb_entry fe[CHUNK];
+	int i, n;
+	unsigned long args[4];
+	struct ifreq ifr;
+	int retries;
+	int fd;
+
+	cmm_print(DEBUG_INFO, "%s(%d)\n", __func__, br_ifindex);
+
+	if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: socket() %s\n", __func__, __LINE__, strerror(errno));
+		goto err;
+	}
+
+	args[0] = BRCTL_GET_FDB_ENTRIES;
+	args[1] = (unsigned long) fe;
+	args[2] = CHUNK;
+	args[3] = 0;
+
+	if (__itf_get_name(br_ifindex, ifr.ifr_name, sizeof(ifr.ifr_name)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: __itf_get_name(%d) failed\n", __func__, __LINE__, br_ifindex);
+
+		goto err;
+	}
+
+	ifr.ifr_data = (char *) args;
+
+	while (1) {
+		retries = 0;
+
+	retry:
+		n = ioctl(fd, SIOCDEVPRIVATE, &ifr);
+		/* table can change during ioctl processing */
+		if (n < 0)
+		{
+			if (errno == EAGAIN)
+			{
+				if (++retries < 10)
+					goto retry;
+				else
+					goto close;
+			}
+
+			cmm_print(DEBUG_ERROR, "%s::%d: ioctl() %s\n", __func__, __LINE__, strerror(errno));
+			goto close;
+
+		} else if (n == 0)
+			goto close;
+
+		for (i = 0; i < n; i++) {
+			if (fe[i].is_local)
+				continue;
+
+			__cmmNeighUpdateAllMacs(br_ifindex, fe[i].mac_addr, fe[i].port_no);
+		}
+
+		args[3] += n;
+	}
+
+close:
+	close(fd);
+
+err:
+	return;
+}
+
+
+int cmmBrToFF(struct RtEntry *route)
+{
+	int ifindex;
+	char brname[IFNAMSIZ], ifname[IFNAMSIZ];
+
+	if (!route->neighEntry)
+	{
+		cmm_print(DEBUG_ERROR, "%s: neighbor entry not set in route\n", __func__);
+		goto err;
+	}
+
+	/* FIXME Update also if more than N seconds have passed since last update */
+	if (route->neighEntry->port < 0)
+		cmmBrgetAllMacPort(route->oifindex);
+
+	if (route->neighEntry->port < 0)
+		goto err;
+
+	ifindex = __itf_get_from_bridge_port(route->oifindex, route->neighEntry->port);
+	if (ifindex <= 0)
+		goto err;
+
+	if (route->phys_oifindex != ifindex)
+	{
+		route->phys_oifindex = ifindex;
+	}
+
+	cmm_print(DEBUG_INFO, "%s::%d: if:%s br:%s port:%d mac:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
+			__func__, __LINE__,
+			if_indextoname(route->phys_oifindex, ifname),
+			if_indextoname(route->oifindex, brname),
+			route->neighEntry->port,
+			route->neighEntry->macAddr[0], route->neighEntry->macAddr[1],
+			route->neighEntry->macAddr[2], route->neighEntry->macAddr[3],
+			route->neighEntry->macAddr[4], route->neighEntry->macAddr[5]);
+
+	return 0;
+
+err:
+	return -1;
+}
+
+
+/* This function gets the physical port information from the bridge_port */
+int cmmBrGetPhysItf(int br_ifindex, unsigned char *fdb_mac)
+{
+	struct __fdb_entry fe[CHUNK];
+	int i, n;
+	unsigned long args[4];
+	struct ifreq ifr;
+	int retries;
+	int fd, phys_ifindex = -1;
+
+	cmm_print(DEBUG_INFO, "%s(%d)\n", __func__, br_ifindex);
+
+	if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: socket() %s\n", __func__, __LINE__, strerror(errno));
+		goto err;
+	}
+
+	args[0] = BRCTL_GET_FDB_ENTRIES;
+	args[1] = (unsigned long) fe;
+	args[2] = CHUNK;
+	args[3] = 0;
+
+	if (__itf_get_name(br_ifindex, ifr.ifr_name, sizeof(ifr.ifr_name)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: __itf_get_name(%d) failed\n", __func__, __LINE__, br_ifindex);
+
+		goto err;
+	}
+
+	ifr.ifr_data = (char *) args;
+
+	while (1) {
+		retries = 0;
+
+	retry:
+		n = ioctl(fd, SIOCDEVPRIVATE, &ifr);
+		/* table can change during ioctl processing */
+		if (n < 0)
+		{
+			if (errno == EAGAIN)
+			{
+				if (++retries < 10)
+					goto retry;
+				else
+					goto close;
+			}
+
+			cmm_print(DEBUG_ERROR, "%s::%d: ioctl() %s\n", __func__, __LINE__, strerror(errno));
+			goto close;
+
+		} else if (n == 0)
+			goto close;
+
+		for (i = 0; i < n; i++) {
+			if (fe[i].is_local)
+				continue;
+
+			if (memcmp(fdb_mac, fe[i].mac_addr, 6) == 0)
+			{
+				cmm_print(DEBUG_INFO, "%s(%d) Found mac\n", __func__, fe[i].port_no);
+				phys_ifindex = __itf_get_from_bridge_port(br_ifindex, fe[i].port_no);
+				goto close;
+			}
+		}
+
+		args[3] += n;
+	}
+
+close:
+	close(fd);
+
+err:
+	return (phys_ifindex);
+}
+
+
diff --git a/cmm/src/ffbridge.h b/cmm/src/ffbridge.h
new file mode 100644
index 0000000..7576691
--- /dev/null
+++ b/cmm/src/ffbridge.h
@@ -0,0 +1,42 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __FFBRIDGE_H__
+#define __FFBRIDGE_H__
+
+	#include "cmm.h"
+	#include <linux/if_bridge.h>
+
+	/* Macros */
+	#define CHUNK	256
+
+	/* Structures */
+	struct fdb_entry
+	{
+		u_int8_t mac_addr[ETH_ALEN];
+		u_int16_t port_no;
+		unsigned char is_local;
+	};
+
+	/* Functions */
+	void __cmmGetBridges(int fd);
+	int cmmBrToFF(struct RtEntry *route);
+	int cmmBrGetPhysItf(int br_ifindex, unsigned char* fdb_mac);
+
+#endif
diff --git a/cmm/src/ffcontrol.c b/cmm/src/ffcontrol.c
new file mode 100644
index 0000000..37bf8f4
--- /dev/null
+++ b/cmm/src/ffcontrol.c
@@ -0,0 +1,2641 @@
+ /*
+  * ffcontrol.c: Fast Forward Control
+  *
+  *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+  *
+  * 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
+  */
+
+#include "cmm.h"
+
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <sys/socket.h>
+#include <string.h>
+#include <signal.h>
+#include <ctype.h>
+
+#include <bits/sockaddr.h>
+#include <asm/types.h>
+#include <linux/netlink.h>
+#include <linux/rtnetlink.h>
+
+#include "ffbridge.h"
+#include "pppoe.h"
+#include "cmmd.h"
+#include "fpp.h"
+
+struct denyRuleList * denyRules = NULL;
+struct asymFFRuleList * asymFFRules = NULL;
+#ifdef WIFI_ENABLE
+struct wifi_ff_entry glbl_wifi_ff_ifs[MAX_WIFI_FF_IFS];
+#endif
+
+/*****************************************************************
+* cmmFcIsLocal()
+*
+*
+******************************************************************/
+static int cmmFcIsLocal(FCI_CLIENT *fci_handle, struct nf_conntrack *ct, struct flow *flow_orig, struct RtEntry **rtEntryOrig)
+{
+	char saddr_buf[INET6_ADDRSTRLEN], daddr_buf[INET6_ADDRSTRLEN];
+	int iif;
+
+	/* Filter local->outside connections, iif = 0 because packets doesn't go through pre-routing hook */
+	iif = nfct_get_attr_u32(ct, ATTR_ORIG_COMCERTO_FP_IIF);
+	if (!iif)
+		goto local;
+
+	/* Filter local->local connections */
+	if (iif == LO_IFINDEX)
+		goto local;
+
+	if (!*rtEntryOrig)
+	{
+		*rtEntryOrig = __cmmRouteGet(flow_orig);
+		if (!*rtEntryOrig)
+			goto local;
+	}
+
+	if ((*rtEntryOrig)->type != RTN_UNICAST)
+		goto local;
+
+	return 0;
+
+local:
+	if (*rtEntryOrig)
+	{
+		____cmmRouteDeregister(*rtEntryOrig, "originator");
+		*rtEntryOrig = NULL;
+	}
+
+	cmm_print(DEBUG_WARNING, "%s: conntrack local dst:%s src:%s\n", __func__,
+			inet_ntop(flow_orig->family, flow_orig->sAddr, saddr_buf, INET6_ADDRSTRLEN),
+			inet_ntop(flow_orig->family, flow_orig->dAddr, daddr_buf, INET6_ADDRSTRLEN));
+
+	return 1;
+}
+
+/*****************************************************************
+* cmmIsConntrack4Allowed()
+*
+*
+******************************************************************/
+#define MULTICAST(x)    (((x) & htonl(0xf0000000)) == htonl(0xe0000000))
+int cmmFcIsConntrack4Allowed(FCI_CLIENT *fci_handle, struct nf_conntrack *ct, struct RtEntry **rtEntryOrig)
+{
+	struct denyRuleList * temp;
+	denyRule_t	tempRule;
+	unsigned int sAddr, dAddr;
+	struct flow flow_orig;
+	char saddr_buf[INET_ADDRSTRLEN], raddr_buf[INET_ADDRSTRLEN];
+
+	sAddr = nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_SRC);
+	dAddr = nfct_get_attr_u32(ct, ATTR_REPL_IPV4_SRC);
+
+	 /* Multicast connections are not forwarded */
+	 if (MULTICAST(dAddr)) {
+		cmm_print(DEBUG_WARNING, "%s: conntrack multicast dst:%s:%x src:%s:%x\n", __func__,
+		     inet_ntop(AF_INET, &sAddr, saddr_buf, sizeof(saddr_buf)),sAddr,
+		     inet_ntop(AF_INET, &dAddr, raddr_buf, sizeof(raddr_buf)),dAddr);
+		goto refused;
+	}
+
+	flow_orig.family = AF_INET;
+	flow_orig.sAddr = &sAddr;
+	flow_orig.dAddr = &dAddr;
+	flow_orig.iifindex = nfct_get_attr_u32(ct, ATTR_ORIG_COMCERTO_FP_IFINDEX);
+	flow_orig.fwmark = nfct_get_attr_u32(ct, ATTR_ORIG_COMCERTO_FP_MARK);
+
+	if (cmmFcIsLocal(fci_handle, ct, &flow_orig, rtEntryOrig)) {
+		cmm_print(DEBUG_INFO, "%s: local connection refused\n", __func__);
+		goto refused;
+	}
+	
+	/*Go through each rule to see if it is allowed*/
+	for(temp = denyRules ; temp != NULL ; temp = temp->next)
+	{	
+		for(tempRule = temp->rule ; tempRule != NULL ; tempRule = tempRule->next)
+		{		
+			unsigned int temp = 0;
+#if __BYTE_ORDER == __BIG_ENDIAN
+			unsigned int temp_shift = tempRule->value;
+#endif
+
+			const void *ret = nfct_get_attr(ct, tempRule->type);
+			if(ret == NULL) { //If ret==NULL it means we are not able to get the informations we need from the conntrack, check next rule (default is accept)
+				cmm_print(DEBUG_ERROR, "%s: can't get infos from conntrack, connection refused\n", __func__); 	
+				break;
+			}
+			
+			memcpy(&temp, ret, tempRule->width);
+			temp &= tempRule->mask;
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+			// bytes shift only in case of short type and big endian
+			if ( tempRule->width == 2) {
+                                temp_shift = tempRule->value << 16;
+                        }
+#endif
+			
+			
+#if __BYTE_ORDER == __BIG_ENDIAN
+			cmm_print(DEBUG_INFO, "%s: ct attr %x - rule value %x rule mask %x rule width %x\n", __func__, temp, temp_shift, tempRule->mask, tempRule->width);
+			if (memcmp(&temp, &temp_shift, tempRule->width)) {
+#else
+			cmm_print(DEBUG_INFO, "%s: ct attr %x - rule value %x rule mask %x rule width %x\n", __func__, temp, tempRule->value, tempRule->mask, tempRule->width);
+			if (memcmp(&temp, &tempRule->value, tempRule->width)) {
+#endif
+				cmm_print(DEBUG_INFO, "%s: rule does not match\n", __func__); 
+				break;
+			} else {
+				cmm_print(DEBUG_INFO, "%s: rule's attribute matched, check next one(s)\n", __func__);
+			}
+		}
+
+		/*
+		 * We reach the end of the list meaning all the values matched
+		 * So the conntrack is not allowed to be FastForwarded
+		 */
+		if(tempRule == NULL)
+		{
+				cmm_print(DEBUG_INFO, "%s: conntrack refused by rules\n", __func__);
+				goto refused;
+		}
+		
+		cmm_print(DEBUG_INFO, "%s: check next deny rule\n", __func__);
+	}
+
+	cmm_print(DEBUG_INFO, "%s: conntrack accepted\n", __func__);
+
+	return 1;
+
+refused:
+	return 0;
+}
+
+/*****************************************************************
+* cmmIsConntrack6Allowed()
+*
+*
+******************************************************************/
+int cmmFcIsConntrack6Allowed(FCI_CLIENT *fci_handle, struct nf_conntrack * ct, struct RtEntry **rtEntryOrig)
+{
+	struct denyRuleList * temp;
+	denyRule_t	tempRule;
+	struct flow flow_orig;
+	const unsigned int *Saddr, *SaddrReply;
+
+	/*Local connections are not Fast Forwarded*/
+	Saddr = nfct_get_attr(ct, ATTR_ORIG_IPV6_SRC);
+	SaddrReply = nfct_get_attr(ct, ATTR_REPL_IPV6_SRC);
+
+	if ((SaddrReply[0] & ntohl(0xff000000)) == ntohl(0xff000000))
+	{
+		goto refused;
+	}
+
+	flow_orig.family = AF_INET6;
+	flow_orig.sAddr = Saddr;
+	flow_orig.dAddr = SaddrReply;
+	flow_orig.iifindex = nfct_get_attr_u32(ct, ATTR_ORIG_COMCERTO_FP_IFINDEX);
+	flow_orig.fwmark = nfct_get_attr_u32(ct, ATTR_ORIG_COMCERTO_FP_MARK);
+
+	if (cmmFcIsLocal(fci_handle, ct, &flow_orig, rtEntryOrig)) {
+		cmm_print(DEBUG_INFO, "%s: local connection refused\n", __func__);
+		goto refused;
+	}
+
+	/*Go through each rule to see if it is allowed*/
+	for(temp = denyRules ; temp != NULL ; temp = temp->next)
+	{
+		for(tempRule = temp->rule ; tempRule != NULL ; tempRule = tempRule->next)
+		{
+			unsigned int temp = 0;
+#if __BYTE_ORDER == __BIG_ENDIAN
+			unsigned int temp_shift = tempRule->value;
+#endif
+            struct in6_addr *valueIpV6Ret, valueIpV6Tmp ;
+		
+            
+            if ((tempRule->type == ATTR_ORIG_IPV6_SRC )|| (tempRule->type == ATTR_ORIG_IPV6_DST )
+                || (tempRule->type == ATTR_REPL_IPV6_SRC ) || (tempRule->type == ATTR_REPL_IPV6_DST )) {
+
+			    valueIpV6Ret = (struct in6_addr *)nfct_get_attr(ct, tempRule->type);
+			    if(valueIpV6Ret == NULL)	{//If ret==NULL it means we are not able to get the informations we need from the conntrack, check next rule (default is accept)
+				    cmm_print(DEBUG_ERROR, "%s: can't get infos from conntrack, jumps to next rule\n", __func__); 	
+				    break;
+			    }
+
+			    if(16 != tempRule->width)	{//width of IPv6 address should be of 16 bytes
+				    cmm_print(DEBUG_ERROR, "%s: Incorrect width in the rule,  jumps to next rule\n", __func__); 	
+				    break;
+			    }
+
+			    memcpy(&valueIpV6Tmp.s6_addr[0], &valueIpV6Ret->s6_addr[0], tempRule->width);
+			    
+			    if (memcmp(&valueIpV6Tmp.s6_addr[0], &tempRule->valueIpV6.s6_addr[0], tempRule->width)) {
+				    cmm_print(DEBUG_INFO, "%s: rule does not match\n", __func__); 
+				    break;
+			    } else {
+				    cmm_print(DEBUG_INFO, "%s: rule's attribute matched, check next one(s)\n", __func__);
+			    }
+            } 
+            else {
+			const void *ret = nfct_get_attr(ct, tempRule->type);
+			if(ret == NULL)	{//If ret==NULL it means we are not able to get the informations we need from the conntrack, check next rule (default is accept)
+				cmm_print(DEBUG_ERROR, "%s: can't get infos from conntrack, jumps to next rule\n", __func__); 	
+				break;
+			}
+
+			memcpy(&temp, ret, tempRule->width);
+			temp &= tempRule->mask; 
+#if __BYTE_ORDER == __BIG_ENDIAN
+			// bytes shift only in case of short type and big endian
+			if ( tempRule->width == 2) {
+                                temp_shift = tempRule->value << 16;
+                        }
+#endif
+			
+#if __BYTE_ORDER == __BIG_ENDIAN
+			cmm_print(DEBUG_INFO, "%s: ct attr %x - rule value %x rule mask %x rule width %x\n", __func__, temp, temp_shift, tempRule->mask, tempRule->width);
+			if (memcmp(&temp, &temp_shift, tempRule->width)) {
+#else
+			cmm_print(DEBUG_INFO, "%s: ct attr %x - rule value %x rule mask %x rule width %x\n", __func__, temp, tempRule->value, tempRule->mask, tempRule->width);
+			if (memcmp(&temp, &tempRule->value, tempRule->width)) {
+#endif
+				cmm_print(DEBUG_INFO, "%s: rule does not match\n", __func__); 
+				break;
+			} else {
+				cmm_print(DEBUG_INFO, "%s: rule's attribute matched, check next one(s)\n", __func__);
+			}
+		}
+		}
+
+		/*
+		 * We reach the end of the list meaning all the values matched
+		 * So the conntrack is not allowed to be FastForwarded
+		 */
+		if(tempRule == NULL)
+		{
+				cmm_print(DEBUG_INFO, "%s: conntrack refused by rules\n", __func__);
+				goto refused;
+		}
+		
+		cmm_print(DEBUG_INFO, "%s: check next deny rule\n", __func__);
+	}
+
+	cmm_print(DEBUG_INFO, "%s: conntrack accepted\n", __func__);
+
+	return 1;
+
+refused:
+	return 0;
+}
+
+/*****************************************************************
+* cmmFcStop
+*
+*
+******************************************************************/
+int cmmFcStop(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	cli_print(cli, "Killing cmm ...\n");
+
+	kill(0, SIGTERM);
+
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmFcActivate
+*
+*
+******************************************************************/
+int cmmFcActivate(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	int val;
+	int family;
+
+	if (argc < 1)
+		goto usage;
+
+	//Check if it is a digit. atoi() returns 0 if not digit
+	if(! isdigit(*argv[0]))
+		goto usage;
+
+	val = atoi(argv[0]);
+	if (globalConf.enable != val)
+	{
+		if (val == 0)
+		{
+			/*Reset Forward Engine*/
+			cmmFeReset(globalConf.cli.fci_handle);
+			globalConf.enable = val;
+		}
+		else if (val == 1)
+		{
+			/*Reset Forward Engine*/
+			cmmFeReset(globalConf.cli.fci_handle);
+			globalConf.enable = val;
+		
+			/*Get already existing ipv4 conntrack*/
+			family = AF_INET;
+			if (nfct_query(globalConf.ct.catch_handle, NFCT_Q_DUMP, (void *) &family) < 0)
+				cmm_print(DEBUG_ERROR, "%s: nfct_query(NFCT_Q_DUMP) %s\n", __func__, strerror(errno));
+
+			/*Get already existing ipv6 conntrack*/
+			family = AF_INET6;
+			if (nfct_query(globalConf.ct.catch_handle, NFCT_Q_DUMP, (void *) &family) < 0)
+				cmm_print(DEBUG_ERROR, "%s: nfct_query(NFCT_Q_DUMP) %s\n", __func__, strerror(errno));
+		}
+		else
+			goto usage;
+	}
+
+	return CLI_OK;
+
+usage:
+	cli_print(cli, "Usage: activate <0 1>");
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmFcDesactivate
+*
+*
+******************************************************************/
+int cmmFcActivateShow(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	cli_print(cli, "%d", globalConf.enable);
+
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmFcDesactivate
+*
+*
+******************************************************************/
+int cmmFcDebug(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	int val;
+	int flag = 0;
+
+	if (argc < 2)
+		goto usage;
+
+	if (strncmp(argv[0], "command", strlen(argv[0])) == 0)
+		flag = DEBUG_COMMAND;
+	else if (strncmp(argv[0], "error", strlen(argv[0])) == 0)
+		flag = DEBUG_ERROR;
+	else if (strncmp(argv[0], "warning", strlen(argv[0])) == 0)
+		flag = DEBUG_WARNING;
+	else if (strncmp(argv[0], "info", strlen(argv[0])) == 0)
+		flag = DEBUG_INFO;
+	else
+		goto usage;
+
+	//Check if it is a digit. atoi() returns 0 if not digit
+	if(! isdigit(*argv[1]))
+		goto usage;
+
+	val = atoi(argv[1]);
+	if (val == 0)
+		globalConf.debug_level &= ~flag;
+	else if (val == 1)
+		globalConf.debug_level |= flag;
+	else
+		goto usage;
+
+	return CLI_OK;
+
+usage:
+	cli_print(cli, "Usage: set debug <command error warning info> <0 1>");
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmFcDebugShow
+*
+*
+******************************************************************/
+int cmmFcDebugShow(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	cli_print(cli, "command:\t%s", (globalConf.debug_level & DEBUG_COMMAND) ? "printed": "not printed");
+	cli_print(cli, "error:  \t%s", (globalConf.debug_level & DEBUG_ERROR) ? "printed": "not printed");
+	cli_print(cli, "warning:\t%s", (globalConf.debug_level & DEBUG_WARNING) ? "printed": "not printed");
+	cli_print(cli, "info:   \t%s", (globalConf.debug_level & DEBUG_INFO) ? "printed": "not printed");
+
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmFcAsymFFRuleAddAtrribut()
+*
+*
+******************************************************************/
+asymFFRule_t cmmFcAsymFFRuleAddAttribut(asymFFRule_t rule, int attributType, int attributValue, char *attrStrValue, int attributWidth, int mask)
+{
+	asymFFRule_t temp;
+
+	temp = (asymFFRule_t) malloc(sizeof(asymFFRule));
+	if (temp ==NULL)
+		return rule;
+
+	temp->next = rule;
+	temp->type = attributType;
+	temp->value = attributValue;
+	strcpy(temp->strValue,attrStrValue);
+	temp->width = attributWidth;
+	temp->mask = mask;
+
+	return temp;
+}
+
+/*****************************************************************
+* cmmFcAsymFFListAddRule()
+*
+*
+******************************************************************/
+struct asymFFRuleList * cmmFcAsymFFListAddRule(struct asymFFRuleList *list, char * ruleName, asymFFRule_t rule)
+{
+	struct asymFFRuleList * temp;
+
+	temp = (struct asymFFRuleList *) malloc(sizeof(struct asymFFRuleList));
+	if (temp == NULL)
+		return list;
+
+	temp->next = list;
+	temp->rule = rule;
+	strncpy(temp->name, ruleName, sizeof(temp->name));
+
+	return temp;
+}
+
+/*****************************************************************
+* cmmFcAsymFFRulesShow()
+*
+*	Print rules on CLI
+******************************************************************/
+int cmmFcAsymFFRulesShow(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	struct asymFFRuleList *rulesList;
+	struct asymFFRule *rule;
+
+	for(rulesList = asymFFRules ; rulesList != NULL ; rulesList = rulesList->next)
+	{
+		cli_print(cli, "\n%s:", rulesList->name);
+		for(rule = rulesList->rule ; rule != NULL ; rule = rule->next)
+		{
+			switch(rule->type)
+			{
+				case ATTR_ORIG_PORT_SRC:
+					cli_print(cli, "\t%s: %d mask %x", ATTR_ORIG_PORT_SRC_STR, ntohs(rule->value), rule->mask);
+					break;
+
+				case ATTR_ORIG_PORT_DST:
+					cli_print(cli, "\t%s: %d mask %x", ATTR_ORIG_PORT_DST_STR, ntohs(rule->value), rule->mask);
+					break;
+
+				case ATTR_ORIG_L4PROTO:
+					if (rule->value == IPPROTO_TCP)
+						cli_print(cli, "\t%s: tcp (%d)  mask %x", ATTR_PROTO_STR, rule->value, rule->mask);
+					else if (rule->value == IPPROTO_UDP)
+						cli_print(cli, "\t%s: udp (%d)  mask %x", ATTR_PROTO_STR, rule->value, rule->mask);
+					else if (rule->value == IPPROTO_IPIP)
+						cli_print(cli, "\t%s: ipip (%d)  mask %x", ATTR_PROTO_STR, rule->value, rule->mask);
+					else
+						cli_print(cli, "\t%s: unknown (%d) mask %x", ATTR_PROTO_STR, rule->value, rule->mask);
+					break;
+
+				case ATTR_L3PROTO:
+					if (rule->value == AF_INET)
+						cli_print(cli, "\t%s: ipv4 (%d)  mask %x", ATTR_L3_PROTO_STR, rule->value, rule->mask);
+					else if (rule->value == AF_INET6)
+						cli_print(cli, "\t%s: ipv6 (%d)  mask %x", ATTR_L3_PROTO_STR, rule->value, rule->mask);
+
+					break;
+				case ATTR_ORIG_COMCERTO_FP_IIF:
+					 cli_print(cli, "\tinterface: %s", rule->strValue);
+					break;
+				default:
+					cli_print(cli, "\tERROR");
+			}
+		}
+	}
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmFcIsConntrackAsymFastForwarded()
+*
+*
+******************************************************************/
+int cmmFcIsConntrackAsymFastForwarded(struct nf_conntrack *ct)
+{
+	struct asymFFRuleList * temp;
+	asymFFRule_t	tempRule;
+	int iif;
+        struct interface *itf;
+
+	/*Go through each rule to see if it is allowed*/
+	for(temp = asymFFRules ; temp != NULL ; temp = temp->next)
+	{
+		for(tempRule = temp->rule ; tempRule != NULL ; tempRule = tempRule->next)
+		{
+			unsigned int temp = 0;
+#if __BYTE_ORDER == __BIG_ENDIAN
+			unsigned int temp_shift = tempRule->value;
+#endif
+
+			const void *ret = nfct_get_attr(ct, tempRule->type);
+			if(ret == NULL) { //If ret==NULL it means we are not able to get the informations we need from the conntrack, check next rule (default is accept)
+				cmm_print(DEBUG_ERROR, "%s: can't get infos from conntrack, connection refused\n", __func__);
+				break;
+			}
+
+			if(tempRule->type == ATTR_ORIG_COMCERTO_FP_IIF)
+			{
+				memcpy(&iif, ret, tempRule->width);
+				itf = __itf_find(iif);
+				if (!itf) {
+					cmm_print(DEBUG_ERROR, "%s: can't get inteface details from conntrack\n", __func__);
+					goto out;
+				}
+				if(!strcmp(itf->ifname,tempRule->strValue)) {
+					cmm_print(DEBUG_INFO, "%s: interface attribute matched, check next atribute\n", __func__);
+				}
+				else {
+					cmm_print(DEBUG_INFO, "%s: rule does not match\n", __func__); 
+					break;
+				}
+			}
+			else {
+				memcpy(&temp, ret, tempRule->width);
+				temp &= tempRule->mask;
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+				// bytes shift only in case of short type and big endian
+				if ( tempRule->width == 2) {
+                        	        temp_shift = tempRule->value << 16;
+                        	}
+#endif
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+				cmm_print(DEBUG_INFO, "%s: ct attr %x - rule value %x rule mask %x rule width %x\n", __func__, temp, temp_shift, tempRule->mask, tempRule->width);
+				if (memcmp(&temp, &temp_shift, tempRule->width)) {
+#else
+				cmm_print(DEBUG_INFO, "%s: ct attr %x - rule value %x rule mask %x rule width %x\n", __func__, temp, tempRule->value, tempRule->mask, tempRule->width);
+				if (memcmp(&temp, &tempRule->value, tempRule->width)) {
+#endif
+					cmm_print(DEBUG_INFO, "%s: rule does not match\n", __func__); 
+					break;
+				} else {
+					cmm_print(DEBUG_INFO, "%s: rule's attribute matched, check next one(s)\n", __func__);
+				}
+			}
+		}
+
+		/*
+		 * We reach the end of the list meaning all the values matched
+		 * So the conntrack should be asymmetrically FastForwarded
+		 */
+		if(tempRule == NULL)
+		{
+				cmm_print(DEBUG_INFO, "%s: conntrack should be asym forwarded as per rules\n", __func__);
+				goto asym_forward;
+		}
+
+		cmm_print(DEBUG_INFO, "%s: check next Asym Fastpath rule\n", __func__);
+	}
+
+	//cmm_print(DEBUG_INFO, "%s: conntrack accepted\n", __func__);
+out:
+	return 0;
+
+asym_forward:
+	return 1;
+}
+
+
+/*****************************************************************
+* cmmFcRuleAddAtrribut()
+*
+*
+******************************************************************/
+denyRule_t cmmFcRuleAddAttribut(denyRule_t rule, int attributType, int attributValue, int attributWidth, int mask, const u_int8_t *attrValIpV6)
+{
+	denyRule_t temp;
+
+	if ( (attributWidth == 16) && (attrValIpV6 == NULL) )
+		return rule;
+
+
+	temp = (denyRule_t) malloc(sizeof(denyRule));
+	if (temp ==NULL)
+		return rule;
+
+	temp->next = rule;
+	temp->type = attributType;
+	temp->value = attributValue;
+	temp->width = attributWidth;
+	temp->mask = mask;
+
+	if (attributWidth == 16)
+		memcpy(&temp->valueIpV6.s6_addr[0], attrValIpV6, attributWidth) ;
+
+	return temp;
+}
+
+/*****************************************************************
+* cmmFcListAddRule()
+*
+*
+******************************************************************/
+struct denyRuleList * cmmFcListAddRule(struct denyRuleList *list, char * ruleName, denyRule_t rule)
+{
+	struct denyRuleList * temp;
+
+	temp = (struct denyRuleList *) malloc(sizeof(struct denyRuleList));
+	if (temp == NULL)
+		return list;
+
+	temp->next = list;
+	temp->rule = rule;
+	strncpy(temp->name, ruleName, sizeof(temp->name));
+
+	return temp;
+}
+
+/*****************************************************************
+* cmmFcRulesShow()
+*
+*		Print rules on CLI
+******************************************************************/
+int cmmFcRulesShow(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	struct denyRuleList *rulesList;
+	struct denyRule *rule;
+	char *ipv4Address;
+        struct in_addr tmp;
+	char ipv6Address[INET6_ADDRSTRLEN];
+	
+
+	for(rulesList = denyRules ; rulesList != NULL ; rulesList = rulesList->next)
+	{
+		cli_print(cli, "\n%s:", rulesList->name);
+		for(rule = rulesList->rule ; rule != NULL ; rule = rule->next)
+		{
+			switch(rule->type)
+			{
+				case ATTR_ORIG_PORT_SRC:
+					cli_print(cli, "\t%s: %d mask %x", ATTR_ORIG_PORT_SRC_STR, ntohs(rule->value), rule->mask);
+					break;
+
+				case ATTR_ORIG_PORT_DST:
+					cli_print(cli, "\t%s: %d mask %x", ATTR_ORIG_PORT_DST_STR, ntohs(rule->value), rule->mask);
+					break;
+
+				case ATTR_REPL_PORT_SRC:
+					cli_print(cli, "\t%s: %d mask %x", ATTR_REPL_PORT_SRC_STR, ntohs(rule->value), rule->mask);
+					break;
+
+				case ATTR_REPL_PORT_DST:
+					cli_print(cli, "\t%s: %d mask %x", ATTR_REPL_PORT_DST_STR, ntohs(rule->value), rule->mask);
+					break;
+
+				case ATTR_MARK:
+					cli_print(cli, "\t%s: %d mask %x", ATTR_MARK_STR, rule->value, rule->mask);
+					break;
+
+				case ATTR_ORIG_IPV4_SRC:
+                                        tmp.s_addr = (unsigned int)rule->value ;
+					ipv4Address = inet_ntoa(tmp) ;
+					if (ipv4Address == NULL){
+							cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing rule IPv4 address");
+							break;
+						}
+					cli_print(cli, "\t%s: %s mask %x", ATTR_ORIG_IPV4_SRC_STR, ipv4Address, rule->mask);
+					break;
+
+				case ATTR_ORIG_IPV4_DST:
+                                        tmp.s_addr = (unsigned int)rule->value ;
+					ipv4Address = inet_ntoa(tmp) ;
+					if (ipv4Address == NULL){
+							cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing rule IPv4 address");
+							break;
+						}
+					cli_print(cli, "\t%s: %s mask %x", ATTR_ORIG_IPV4_DST_STR, ipv4Address, rule->mask);
+					break;
+
+				case ATTR_REPL_IPV4_SRC:
+                                        tmp.s_addr = (unsigned int)rule->value ;
+					ipv4Address = inet_ntoa(tmp) ;
+					if (ipv4Address == NULL){
+							cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing rule IPv4 address");
+							break;
+						}
+					cli_print(cli, "\t%s: %s mask %x", ATTR_REPL_IPV4_SRC_STR, ipv4Address, rule->mask);
+					break;
+
+				case ATTR_REPL_IPV4_DST:
+                                        tmp.s_addr = (unsigned int)rule->value ;
+					ipv4Address = inet_ntoa(tmp) ;
+					if (ipv4Address == NULL){
+							cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing rule IPv4 address");
+							break;
+						}
+					cli_print(cli, "\t%s: %s mask %x", ATTR_REPL_IPV4_DST_STR, ipv4Address, rule->mask);
+					break;
+
+				case ATTR_ORIG_IPV6_SRC:
+					if (! inet_ntop(AF_INET6, ((struct in6_addr *)&(rule->valueIpV6)), ipv6Address, INET6_ADDRSTRLEN)){
+							cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing rule IPv4 address");
+							break;
+						}
+					cli_print(cli, "\t%s: %s mask %x", ATTR_ORIG_IPV6_SRC_STR, ipv6Address, rule->mask);
+					break;
+
+				case ATTR_ORIG_IPV6_DST:
+					if (! inet_ntop(AF_INET6, ((struct in6_addr *)&(rule->valueIpV6)), ipv6Address, INET6_ADDRSTRLEN)){
+							cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing rule IPv4 address");
+							break;
+						} 
+					cli_print(cli, "\t%s: %s mask %x", ATTR_ORIG_IPV4_DST_STR, ipv6Address, rule->mask);
+					break;
+
+				case ATTR_REPL_IPV6_SRC:
+					if (! inet_ntop(AF_INET6, ((struct in6_addr *)&(rule->valueIpV6)), ipv6Address, INET6_ADDRSTRLEN)){
+							cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing rule IPv4 address");
+							break;
+						}
+					cli_print(cli, "\t%s: %s mask %x", ATTR_REPL_IPV4_SRC_STR, ipv6Address, rule->mask);
+					break;
+
+				case ATTR_REPL_IPV6_DST:
+					if (! inet_ntop(AF_INET6, ((struct in6_addr *)&(rule->valueIpV6)), ipv6Address, INET6_ADDRSTRLEN)){
+							cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing rule IPv4 address");
+							break;
+						}
+					cli_print(cli, "\t%s: %s mask %x", ATTR_REPL_IPV4_DST_STR, ipv6Address, rule->mask);
+			break;
+
+				case ATTR_ORIG_L4PROTO:
+				case ATTR_REPL_L4PROTO: 	
+					if (rule->value == IPPROTO_TCP)
+						cli_print(cli, "\t%s: tcp (%d)  mask %x", ATTR_PROTO_STR, rule->value, rule->mask);
+					else if (rule->value == IPPROTO_UDP)
+						cli_print(cli, "\t%s: udp (%d)  mask %x", ATTR_PROTO_STR, rule->value, rule->mask);
+					else if (rule->value == IPPROTO_IPIP)
+						cli_print(cli, "\t%s: ipip (%d)  mask %x", ATTR_PROTO_STR, rule->value, rule->mask);
+					else 
+						cli_print(cli, "\t%s: unknown (%d) mask %x", ATTR_PROTO_STR, rule->value, rule->mask);
+					
+				case ATTR_L3PROTO:
+					if (rule->value == AF_INET)
+						cli_print(cli, "\t%s: ipv4 (%d)  mask %x", ATTR_L3_PROTO_STR, rule->value, rule->mask);
+					else if (rule->value == AF_INET6)
+						cli_print(cli, "\t%s: ipv6 (%d)  mask %x", ATTR_L3_PROTO_STR, rule->value, rule->mask);
+
+					break;
+				default:
+					cli_print(cli, "\tERROR");
+			}
+		}
+	}
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmFcParser()
+*
+*           Returns 0 if the parser succeed
+*
+******************************************************************/
+int cmmFcParser(char *confFilePath)
+{
+	FILE * fp;
+	char buf[150], buf1[30], buf2[30], buf3[50], buf4[30], buf5[30], tempName[30], tempName1[30];
+	denyRule_t rule = NULL;
+	denyRule_t copy_rule = NULL;
+	denyRule_t head_rule = NULL;
+	asymFFRule_t aff_rule = NULL;
+        int asymff_config = 0;
+	char attrSValue[IFNAMSIZ+1]={0};
+	int check_port_is_last_option = 0;
+	int check_ipv4_is_last_option = 0;
+	int check_ipv6_is_last_option = 0;
+	int vlan_config = 0, log_config = 0, tun_config = 0;
+	unsigned int attrType, attrValue, ret = 0, number;
+	u_int8_t *attrValueV6 = NULL ;
+	int attrWidth;
+	unsigned int mask;
+#ifdef WIFI_ENABLE
+	struct wifi_ff_entry *wifi_if = NULL;
+	int ii;
+        int wifi_config = 0;
+#endif
+
+	fp = fopen(confFilePath , "r");
+	if(fp == NULL)
+	{
+		cmm_print(DEBUG_CRIT, "cmmFcParser: Error opening %s\n", confFilePath);
+		return -1;
+	}
+
+#ifdef WIFI_ENABLE
+	memset( glbl_wifi_ff_ifs, 0, sizeof(struct wifi_ff_entry) * MAX_WIFI_FF_IFS );	
+#endif
+
+	tempName[0] = '\0';
+	tempName1[0] = '\0';
+	while(fgets(buf, sizeof(buf), fp))
+	{
+		number = sscanf(buf, "%29s%29s%49s%29s%29s", buf1, buf2, buf3, buf4, buf5); /* leave 1 byte for '\0' */
+		
+		// Check if it is a comment line
+		if (buf1[0] == '#')
+			continue;
+
+		if (number == -1)
+			continue;
+
+		else if (number == 2) 
+		{
+			if((strcasecmp(buf1, "config") == 0) && (strcasecmp(buf2, "vlan") == 0))
+			{
+				vlan_config = 1;
+				log_config = 0;
+#ifdef WIFI_ENABLE
+				wifi_config = 0;
+#endif
+				asymff_config = 0;
+				tun_config = 0;
+				check_port_is_last_option = 1;
+				continue;
+			}
+			if((strcasecmp(buf1, "config") == 0) && (strcasecmp(buf2, "logging") == 0))
+			{
+				log_config = 1;
+				vlan_config = 0;
+#ifdef WIFI_ENABLE
+				wifi_config = 0;
+#endif
+				asymff_config = 0;
+				tun_config = 0;
+				check_port_is_last_option = 0;
+				continue;
+			}
+#ifdef WIFI_ENABLE
+			if((strcasecmp(buf1, "config") == 0) && (strcasecmp(buf2, "wifi_fastforward") == 0))
+                        {
+                                log_config = 0;
+                                vlan_config = 0;
+#ifdef WIFI_ENABLE
+                                wifi_config = 1;
+#endif
+				asymff_config = 0;
+				tun_config = 0;
+                                check_port_is_last_option = 0;
+
+				/* Get Free WiFi fastforward entry */
+				for( ii = 0; ii < MAX_WIFI_FF_IFS; ii++ )
+				{
+					if (!glbl_wifi_ff_ifs[ii].used)
+					{	
+						wifi_if = &glbl_wifi_ff_ifs[ii]; 
+						glbl_wifi_ff_ifs[ii].used = 1;
+						glbl_wifi_ff_ifs[ii].vapid = ii;
+						break;
+					}
+				}
+				
+				if( ii == MAX_WIFI_FF_IFS )
+					wifi_if = NULL;
+				cmm_print(DEBUG_ERROR, "cmmFcParser: WiFi interface parsed \n");
+
+                                continue;
+                        }
+#endif
+
+			if((strcasecmp(buf1, "config") == 0) && (strcasecmp(buf2, "tun") == 0))
+			{
+				log_config = 0;
+				vlan_config = 0;
+#ifdef WIFI_ENABLE
+				wifi_config = 0;
+#endif
+				tun_config = 1;
+				check_port_is_last_option = 0;
+				continue;
+				
+			}
+			
+			goto fail_parsing;
+		}
+		else if ((number != 3) && (number != 5))
+		{
+		fail_parsing:
+			cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\n Number of parameter per line must be 3\n");
+			ret = -1;
+			break;
+		}
+		else
+		{
+			// Scan options
+			if ((strcasecmp(buf1, "config") == 0) && (strcasecmp(buf2, "fastforward") == 0))
+			{
+				if(rule && strlen(tempName))
+					denyRules = cmmFcListAddRule(denyRules, tempName, rule);
+
+				strncpy(tempName, buf3, 20);
+				rule = NULL;
+				check_port_is_last_option = 0;
+				vlan_config = 0;
+				log_config = 0;
+#ifdef WIFI_ENABLE
+				wifi_config = 0;
+#endif
+				asymff_config = 0;
+			}
+			else if ((strcasecmp(buf1, "config") == 0) && (strcasecmp(buf2, "asym_fastforward") == 0))
+			{
+				if(aff_rule && strlen(tempName1))
+					asymFFRules = cmmFcAsymFFListAddRule(asymFFRules, tempName1, aff_rule);
+
+				strncpy(tempName1, buf3, 20);
+				aff_rule = NULL;
+				check_port_is_last_option = 0;
+				vlan_config = 0;
+				log_config = 0;
+#ifdef WIFI_ENABLE
+				wifi_config = 0;
+#endif
+				asymff_config = 1;
+			}
+			else if(strcasecmp(buf1, "option") == 0)
+			{
+				if (vlan_config)
+				{
+				  if (strcasecmp(buf2, "policy") == 0) 
+				  {
+				    if (strcasecmp(buf3,"allow") == 0)
+				    {
+				      	globalConf.vlan_policy = ALLOW;
+					continue;
+				    }
+				    if  (strcasecmp(buf3,"prohibit") == 0)
+				    {
+				      	globalConf.vlan_policy = PROHIBIT;
+					continue;
+				    }
+				    if  (strcasecmp(buf3,"manual") == 0)
+				    {
+				      	globalConf.vlan_policy = MANUAL;
+					continue;
+				    }
+				  } 
+				  cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nLine: \"%s\"\n", buf);
+					ret = -1;
+					break;				
+                }
+				else if (check_port_is_last_option) {
+					cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\noption \"port\" must be in last position in options list\n");
+					ret = -1;
+					break;
+				}
+
+				if (log_config)
+				{
+					if (strcasecmp(buf2, "file") == 0) 
+					{
+						globalConf.logFile = fopen(buf3 , "a");
+						if (globalConf.logFile)
+						{
+							globalConf.log_level |= DEBUG_STDERR;
+							pthread_mutex_init(&globalConf.logMutex, NULL);
+							setlinebuf(globalConf.logFile);
+						}
+						else
+							cmm_print(DEBUG_CRIT, "cmmFcParser: Opening logfile %s returned error %s.\n", buf3, strerror(errno));
+						continue;
+					}
+					else if (strcasecmp(buf2, "command") == 0) 
+					{
+						if (atoi(buf3) == 1)
+							globalConf.log_level |= DEBUG_COMMAND;
+						continue;
+					}
+					else if (strcasecmp(buf2, "error") == 0) 
+					{
+						if (atoi(buf3) == 1)
+							globalConf.log_level |= DEBUG_ERROR;
+						continue;
+					}
+					else if (strcasecmp(buf2, "warning") == 0) 
+					{
+						if (atoi(buf3) == 1)
+							globalConf.log_level |= DEBUG_WARNING;
+						continue;
+					}
+					else if (strcasecmp(buf2, "info") == 0) 
+					{
+						if (atoi(buf3) == 1)
+							globalConf.log_level |= DEBUG_INFO;
+						continue;
+					}
+					cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nUnknown attribut name: %s\n", buf2);
+					ret = -1;
+					break;
+				}
+
+				if(tun_config)
+				{
+					if(strcasecmp(buf2, "proto") == 0)
+					{
+						if(strcasecmp(buf3, "IPIP") == 0)
+						{
+							globalConf.tun_proto = IPPROTO_IPIP;
+							globalConf.tun_family = AF_INET6;
+							continue;
+						}
+						break;
+					}
+					break;
+				}
+
+				
+#ifdef WIFI_ENABLE
+				if(wifi_config)
+				{
+					if (strcasecmp(buf2, "ifname") == 0)
+                                        {
+                                                if (wifi_if)
+                                                {
+                                                        strcpy(wifi_if->ifname, buf3);
+                                                }
+						cmm_print(DEBUG_ERROR, "cmmFcParser: WiFi name: %s \n", wifi_if->ifname);
+
+                                                continue;
+                                        }
+					else if (strcasecmp(buf2, "direct_path_rx") == 0)
+					{
+						if (wifi_if)
+							wifi_if->direct_path_rx = atoi(buf3);
+
+						continue;
+					}
+
+					cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nUnknown attribut name: %s\n", buf2);
+					ret = -1;
+					break;
+				}	
+#endif
+				if(asymff_config)
+				{
+					if(strcmp(buf2, "orig_src_port") == 0)
+					{
+						attrType = ATTR_ORIG_PORT_SRC;
+						attrValue = atoi(buf3);
+						attrSValue[0] = '\0';
+						attrWidth = sizeof(unsigned short);
+						if ((attrValue < 1) || (attrValue> 65535))
+						{
+							cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribute value: %s\n", buf3);
+							ret = -1;
+							break;
+						}
+						attrValue = ntohs(attrValue);
+
+						mask = 0x0000FFFF;
+
+						aff_rule = cmmFcAsymFFRuleAddAttribut(aff_rule, attrType, attrValue, attrSValue, attrWidth, mask);
+					}
+					else if(strcmp(buf2, "orig_dst_port") == 0)
+					{
+						attrType = ATTR_ORIG_PORT_DST;
+						attrValue = atoi(buf3);
+						attrSValue[0] = '\0';
+						attrWidth = sizeof(unsigned short);
+						if ((attrValue < 1) || (attrValue> 65535))
+						{
+							cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribute value: %s\n", buf3);
+							ret = -1;
+							break;
+						}
+						attrValue = ntohs(attrValue);
+						mask = 0x0000FFFF;
+
+						aff_rule = cmmFcAsymFFRuleAddAttribut(aff_rule, attrType, attrValue, attrSValue, attrWidth, mask);
+					}
+					else if(strcmp(buf2, "l3proto") == 0)
+					{
+						if(strcmp(buf3, "ipv4") == 0) {
+						 	attrValue = AF_INET /*ETH_P_IP*/;
+							attrSValue[0] = '\0';
+							attrType = ATTR_L3PROTO;
+							attrWidth = sizeof(unsigned char);
+							mask = 0x000000FF;
+					 	}
+						else if(strcmp(buf3, "ipv6") == 0) {
+						 	attrValue = AF_INET6 /*ETH_P_IPV6*/;
+							attrSValue[0] = '\0';
+							attrType = ATTR_L3PROTO;
+							attrWidth = sizeof(unsigned char);
+							mask = 0x000000FF;
+					 	}
+						else {
+					 		cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribute value: %s\n", buf3);
+							ret = -1;
+							break;
+					 	}
+						aff_rule = cmmFcAsymFFRuleAddAttribut(aff_rule, attrType, attrValue, attrSValue, attrWidth, mask);
+					}
+					else if(strcmp(buf2, "l4proto") == 0)
+					{
+						if(strcmp(buf3, "tcp") == 0) {
+						 	attrValue = IPPROTO_TCP;
+							attrSValue[0] = '\0';
+							attrType = ATTR_ORIG_L4PROTO;
+							attrWidth = sizeof(unsigned char);
+							mask = 0x000000FF;
+					 	}
+						else if(strcmp(buf3, "udp") == 0) {
+						 	attrValue = IPPROTO_UDP;
+							attrSValue[0] = '\0';
+							attrType = ATTR_ORIG_L4PROTO;
+							attrWidth = sizeof(unsigned char);
+							mask = 0x000000FF;
+					 	}
+						else {
+					 		cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribute value: %s\n", buf3);
+							ret = -1;
+							break;
+					 	}
+						aff_rule = cmmFcAsymFFRuleAddAttribut(aff_rule, attrType, attrValue, attrSValue, attrWidth, mask);
+					}
+					else if (strcasecmp(buf2, "interface") == 0)
+                                        {
+						attrValue = 0;
+						strcpy(attrSValue,buf3);
+						attrType = ATTR_ORIG_COMCERTO_FP_IIF;
+						attrWidth = sizeof(int);
+						mask = 0x000000FF;
+						aff_rule = cmmFcAsymFFRuleAddAttribut(aff_rule, attrType, attrValue, attrSValue, attrWidth, mask);
+                                        }
+					continue;
+				}
+
+				
+				if (check_ipv4_is_last_option) {
+					cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\noption \"ip_v4_addr\" must be in last position in options list\n");
+					ret = -1;
+					break;
+				}
+
+				if (check_ipv6_is_last_option) {
+					cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\noption \"ip_v6_addr\" must be in last position in options list\n");
+					ret = -1;
+					break;
+				}
+
+				// Scan options
+				if(strcmp(buf2, "orig_src_port") == 0)
+				{
+					attrType = ATTR_ORIG_PORT_SRC;
+					attrValue = atoi(buf3);
+					attrWidth = sizeof(unsigned short);
+					if ((attrValue < 1) || (attrValue> 65535))
+					{
+						cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribut value: %s\n", buf3);
+						ret = -1;
+						break;
+					}
+					attrValue = ntohs(attrValue);
+					
+					mask = 0x0000FFFF;
+
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+					
+			
+				}
+				else if(strcmp(buf2, "orig_dst_port") == 0)
+				{
+					attrType = ATTR_ORIG_PORT_DST;
+					attrValue = atoi(buf3);
+					attrWidth = sizeof(unsigned short);
+					if ((attrValue < 1) || (attrValue> 65535))
+					{
+						cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribut value: %s\n", buf3);
+						ret = -1;
+						break;
+					}
+					attrValue = ntohs(attrValue);
+					mask = 0x0000FFFF;
+
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+				}
+				else if(strcmp(buf2, "repl_src_port") == 0)
+				{
+					attrType = ATTR_REPL_PORT_SRC;
+					attrValue = atoi(buf3);
+					attrWidth = sizeof(unsigned short);
+					if ((attrValue < 1) || (attrValue> 65535))
+					{
+						cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribut value: %s\n", buf3);
+						ret = -1;
+						break;
+					}
+					attrValue = ntohs(attrValue);
+					mask = 0x0000FFFF;
+					
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+				}
+				else if(strcmp(buf2, "repl_dst_port") == 0)
+				{
+					attrType = ATTR_REPL_PORT_DST;
+					attrValue = atoi(buf3);
+					attrWidth = sizeof(unsigned short);
+					if ((attrValue < 1) || (attrValue> 65535))
+					{
+						cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribut value: %s\n", buf3);
+						ret = -1;
+						break;
+					}
+					attrValue = ntohs(attrValue);
+					mask = 0x0000FFFF;
+
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+				}
+				else if(strcmp(buf2, "mark") == 0)
+				{
+					attrType = ATTR_MARK;
+					attrValue = atoi(buf3);
+					attrWidth = sizeof(unsigned int);
+					if(strcmp(buf4, "mask") == 0)
+						mask = atoi(buf5);
+					else
+					{
+						mask = 0xFFFFFFFF;
+					}
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+				}
+				else if(strcmp(buf2, "proto") == 0)
+				{					
+					
+					 if(strcmp(buf3, "tcp") == 0) {
+					 	attrValue = IPPROTO_TCP;
+
+						attrType = ATTR_ORIG_L4PROTO; 
+						attrWidth = sizeof(unsigned char);
+						mask = 0x000000FF;
+					 	}
+					 else if(strcmp(buf3, "udp") == 0) {
+					 	attrValue = IPPROTO_UDP;
+
+						attrType = ATTR_ORIG_L4PROTO; 
+						attrWidth = sizeof(unsigned char);
+						mask = 0x000000FF;
+					 	}
+					 else if(strcmp(buf3, "ipv4") == 0) {
+					 	attrValue = AF_INET /*ETH_P_IP*/;
+
+						attrType = ATTR_L3PROTO; 
+						attrWidth = sizeof(unsigned char);
+						mask = 0x000000FF;
+					 	}
+					 else if(strcmp(buf3, "ipv6") == 0) {
+					 	attrValue = AF_INET6 /*ETH_P_IPV6*/;
+
+						attrType = ATTR_L3PROTO; 
+						attrWidth = sizeof(unsigned char);
+						mask = 0x000000FF;
+					 	}
+					 else {
+					 	cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribut value: %s\n", buf3);
+						ret = -1;
+						break;
+					 }
+					/*attrType = ATTR_ORIG_L4PROTO; 
+					attrWidth = sizeof(unsigned char);
+					mask = 0x000000FF;*/
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);	
+				}
+
+				else if(strcmp(buf2, "port") == 0)
+				{
+					attrValue = atoi(buf3);
+					attrWidth = sizeof(unsigned short);
+					if ((attrValue < 1) || (attrValue> 65535))
+					{
+						cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribut value: %s\n", buf3);
+						ret = -1;
+						break;
+					}
+					attrValue = ntohs(attrValue);
+					head_rule = rule;	
+					// Port option. It is like 4 differents rules
+					attrType = ATTR_ORIG_PORT_SRC;
+					mask = 0x0000FFFF;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+					denyRules = cmmFcListAddRule(denyRules, tempName, rule);
+
+					copy_rule = head_rule;
+					rule = NULL;
+					while(copy_rule) {
+						rule = cmmFcRuleAddAttribut(rule, copy_rule->type, copy_rule->value, copy_rule->width, copy_rule->mask, NULL);
+						copy_rule = copy_rule->next;
+					}	
+					attrType = ATTR_ORIG_PORT_DST;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+					denyRules = cmmFcListAddRule(denyRules, tempName, rule);
+
+					copy_rule = head_rule;
+					rule = NULL;
+					while(copy_rule) {
+						rule = cmmFcRuleAddAttribut(rule, copy_rule->type, copy_rule->value, copy_rule->width, copy_rule->mask, NULL);
+						copy_rule = copy_rule->next;
+					}	
+					attrType = ATTR_REPL_PORT_SRC;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+					denyRules = cmmFcListAddRule(denyRules, tempName, rule);
+
+					// The last one will be added to the list later
+					copy_rule = head_rule;
+					rule = NULL;
+					while(copy_rule) {
+						rule = cmmFcRuleAddAttribut(rule, copy_rule->type, copy_rule->value, copy_rule->width, copy_rule->mask, NULL);
+						copy_rule = copy_rule->next;
+					}	
+					attrType = ATTR_REPL_PORT_DST;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+
+					check_port_is_last_option = 1;
+				}
+				else if(strcmp(buf2, "orig_src_ipv4") == 0)
+				{
+					struct in_addr addr;
+
+					if (!inet_aton(buf3, &addr))
+					{
+						cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribut value IP Address: %s\n", buf3);
+						ret = -1;
+						break;
+					}
+					attrValue = addr.s_addr;
+
+					attrWidth = sizeof(unsigned int);
+					attrType = ATTR_ORIG_IPV4_SRC;
+					mask = 0xFFFFFFFF;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+				}
+				else if(strcmp(buf2, "orig_dst_ipv4") == 0)
+				{
+					struct in_addr addr;
+
+					if (!inet_aton(buf3, &addr))
+					{
+						cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribut value IP Address: %s\n", buf3);
+						ret = -1;
+						break;
+					}
+					attrValue = addr.s_addr;
+
+					attrWidth = sizeof(unsigned int);
+					attrType = ATTR_ORIG_IPV4_DST;
+					mask = 0xFFFFFFFF;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+				}
+				else if(strcmp(buf2, "reply_src_ipv4") == 0)
+				{
+					struct in_addr addr;
+
+					if (!inet_aton(buf3, &addr))
+					{
+						cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribut value IP Address: %s\n", buf3);
+						ret = -1;
+						break;
+					}
+					attrValue = addr.s_addr;
+
+					attrWidth = sizeof(unsigned int);
+					attrType = ATTR_REPL_IPV4_SRC;
+					mask = 0xFFFFFFFF;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+				}
+				else if(strcmp(buf2, "reply_dst_ipv4") == 0)
+				{
+
+					struct in_addr addr;
+
+					if (!inet_aton(buf3, &addr))
+					{
+						cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribut value IP Address: %s\n", buf3);
+						ret = -1;
+						break;
+					}
+					attrValue = addr.s_addr;
+
+					attrWidth = sizeof(unsigned int);
+					attrType = ATTR_REPL_IPV4_DST;
+					mask = 0xFFFFFFFF;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+				}
+				else if(strcmp(buf2, "ip_v4_addr") == 0)
+				{
+					struct in_addr addr;
+
+					if (!inet_aton(buf3, &addr))
+					{
+						cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribut value IP Address: %s\n", buf3);
+						ret = -1;
+						break;
+					}
+					attrValue = addr.s_addr;
+					attrWidth = sizeof(unsigned int);
+					mask = 0xFFFFFFFF;
+                                        
+                    // this option is like 4 differents rules
+                    head_rule = rule;
+
+					attrType = ATTR_ORIG_IPV4_SRC;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+					denyRules = cmmFcListAddRule(denyRules, tempName, rule);
+
+					copy_rule = head_rule;
+					rule = NULL;
+					while(copy_rule) {
+						rule = cmmFcRuleAddAttribut(rule, copy_rule->type, copy_rule->value, copy_rule->width, copy_rule->mask, NULL);
+						copy_rule = copy_rule->next;
+					}	
+					attrType = ATTR_ORIG_IPV4_DST;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+					denyRules = cmmFcListAddRule(denyRules, tempName, rule);
+
+					copy_rule = head_rule;
+					rule = NULL;
+					while(copy_rule) {
+						rule = cmmFcRuleAddAttribut(rule, copy_rule->type, copy_rule->value, copy_rule->width, copy_rule->mask, NULL);
+						copy_rule = copy_rule->next;
+					}	
+					attrType = ATTR_REPL_IPV4_SRC;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+					denyRules = cmmFcListAddRule(denyRules, tempName, rule);
+
+					copy_rule = head_rule;
+					rule = NULL;
+					while(copy_rule) {
+						rule = cmmFcRuleAddAttribut(rule, copy_rule->type, copy_rule->value, copy_rule->width, copy_rule->mask, NULL);
+						copy_rule = copy_rule->next;
+					}	
+					attrType = ATTR_REPL_IPV4_DST;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+					// The last one will be added to the list later
+                     
+					check_ipv4_is_last_option = 1;
+				}
+				else if(strcmp(buf2, "orig_src_ipv6") == 0)
+				{
+					struct in6_addr addr;
+
+					if (!inet_pton(AF_INET6, buf3, &addr))
+					{
+						cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribut value IP Address: %s\n", buf3);
+						ret = -1;
+						break;
+					}
+					attrValueV6 = addr.s6_addr;
+					attrValue = 0;
+
+					attrWidth = 16;
+					attrType = ATTR_ORIG_IPV6_SRC;
+					mask = 0xFFFFFFFF;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+				}
+				else if(strcmp(buf2, "orig_dst_ipv6") == 0)
+				{
+					struct in6_addr addr;
+
+					if (!inet_pton(AF_INET6, buf3, &addr))
+					{
+						cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribut value IP Address: %s\n", buf3);
+						ret = -1;
+						break;
+					}
+					attrValueV6 = addr.s6_addr;
+					attrValue = 0;
+
+					attrWidth = 16;
+					attrType = ATTR_ORIG_IPV6_DST;
+					mask = 0xFFFFFFFF;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+				}
+				else if(strcmp(buf2, "reply_src_ipv6") == 0)
+				{
+					struct in6_addr addr;
+
+					if (!inet_pton(AF_INET6, buf3, &addr))
+					{
+						cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribut value IP Address: %s\n", buf3);
+						ret = -1;
+						break;
+					}
+					attrValueV6 = addr.s6_addr;
+					attrValue = 0;
+
+					attrWidth = 16;
+					attrType = ATTR_REPL_IPV6_SRC;
+					mask = 0xFFFFFFFF;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+				}
+				else if(strcmp(buf2, "reply_dst_ipv6") == 0)
+				{
+					struct in6_addr addr;
+
+					if (!inet_pton(AF_INET6, buf3, &addr))
+					{
+						cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribut value IP Address: %s\n", buf3);
+						ret = -1;
+						break;
+					}
+					attrValueV6 = addr.s6_addr;
+					attrValue = 0;
+
+					attrWidth = 16;
+					attrType = ATTR_REPL_IPV6_DST;
+					mask = 0xFFFFFFFF;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+				}  
+				else if(strcmp(buf2, "ip_v6_addr") == 0)
+				{
+					struct in6_addr addr;
+
+					if (!inet_pton(AF_INET6, buf3, &addr))
+					{
+						cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nBad attribut value IP Address: %s\n", buf3);
+						ret = -1;
+						break;
+					}
+					attrValueV6 = addr.s6_addr;
+					attrValue = 0;
+					attrWidth = 16;
+					mask = 0xFFFFFFFF;
+
+                    // this option is like 4 differents rules
+                    head_rule = rule;
+
+					attrType = ATTR_ORIG_IPV6_SRC;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+					denyRules = cmmFcListAddRule(denyRules, tempName, rule);
+
+					copy_rule = head_rule;
+					rule = NULL;
+					while(copy_rule) {
+						rule = cmmFcRuleAddAttribut(rule, copy_rule->type, copy_rule->value, copy_rule->width, copy_rule->mask, NULL);
+						copy_rule = copy_rule->next;
+					}	
+					attrType = ATTR_ORIG_IPV6_DST;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+					denyRules = cmmFcListAddRule(denyRules, tempName, rule);
+
+					copy_rule = head_rule;
+					rule = NULL;
+					while(copy_rule) {
+						rule = cmmFcRuleAddAttribut(rule, copy_rule->type, copy_rule->value, copy_rule->width, copy_rule->mask, NULL);
+						copy_rule = copy_rule->next;
+					}	
+					attrType = ATTR_REPL_IPV6_SRC;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+					denyRules = cmmFcListAddRule(denyRules, tempName, rule);
+
+					copy_rule = head_rule;
+					rule = NULL;
+					while(copy_rule) {
+						rule = cmmFcRuleAddAttribut(rule, copy_rule->type, copy_rule->value, copy_rule->width, copy_rule->mask, NULL);
+						copy_rule = copy_rule->next;
+					}	
+					attrType = ATTR_REPL_IPV6_DST;
+					rule = cmmFcRuleAddAttribut(rule, attrType, attrValue, attrWidth, mask, attrValueV6);
+					// The last one will be added to the list later
+                    
+					check_ipv6_is_last_option = 1;
+				}  
+				else
+				{
+					cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\nUnknown attribut name: %s\n", buf2);
+					ret = -1;
+					break;
+				}
+			}
+			else
+			{
+				cmm_print(DEBUG_CRIT, "cmmFcParser: Error parsing configuration file.\n The string is %s\nThe expected string is: config fastforward <rule_name> or option <attribut_name> <attribut_value>\n", buf);
+				// TODO: Some memory to free when we enter in that case
+				ret = -1;
+				break;
+			}
+		}
+	}
+	if(aff_rule && strlen(tempName1))
+		asymFFRules = cmmFcAsymFFListAddRule(asymFFRules, tempName1, aff_rule);
+
+	if(rule && strlen(tempName))
+		denyRules = cmmFcListAddRule(denyRules, tempName, rule);
+
+	fclose(fp);
+	return ret;
+}
+
+/*****************************************************************
+* cmmRxCmd
+*
+*
+******************************************************************/
+static int cmmRxCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call RX process function*/
+  cmmRxSetProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmStatCmd
+*
+*
+******************************************************************/
+static int cmmStatCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call RX process function*/
+  cmmStatSetProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmm4rdIdConvCmd
+*
+*
+******************************************************************/
+static int cmm4rdIdConvCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call tunnel 4rd id conversion set process function*/
+  cmm4rdIdConvSetProcess(argv, 0, argc, globalConf.cli.daemon_handle);
+
+       return CLI_OK;
+}
+
+
+/*****************************************************************
+* cmmDPDSaQueryCmd
+*
+*
+******************************************************************/
+static int cmmDPDSaQueryCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call RX process function*/
+  cmmDPDSaQuerySetProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+
+#ifdef C2000_DPI
+/*****************************************************************
+* cmmDPIEnableCmd
+*
+*
+******************************************************************/
+static int cmmDPIEnableCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call RX process function*/
+  cmmDPIFlagSetProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+#endif
+
+/*****************************************************************
+* cmmAsymFFEnableCmd
+*
+*
+******************************************************************/
+static int cmmAsymFFEnableCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call RX process function*/
+  cmmAsymFFSetProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmShowRxCmd
+*
+*
+******************************************************************/
+static int cmmShowRxCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call RX process function*/
+  cmmRxShowProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmShowStatCmd
+*
+*
+******************************************************************/
+static int cmmShowStatCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call Stat process function*/
+  cmmStatShowProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+
+
+/*****************************************************************
+* cmmQueryRxCmd
+*
+*
+******************************************************************/
+static int cmmQueryRxCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call RX process function*/
+  cmmRxQueryProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+
+
+/*****************************************************************
+* cmmQueryRtCmd
+*
+*
+******************************************************************/
+static int cmmQueryRtCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call RX process function*/
+  cmmRtQueryProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmQueryCtCmd
+*
+*
+******************************************************************/
+static int cmmQueryCtCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call RX process function*/
+  cmmCtQueryProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmQueryMacVlanCmd
+*
+*
+******************************************************************/
+static int cmmQueryMacVlanCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call MacVlan process function*/
+  cmmMacVlanQueryProcess(argv, 0, globalConf.cli.daemon_handle);
+
+   return CLI_OK;
+}
+
+/*****************************************************************
+ * * cmmQueryV6CtCmd
+ * *
+ * *
+ * ******************************************************************/
+static int cmmQueryV6CtCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call RX process function*/
+  cmmCt6QueryProcess(argv, 0, globalConf.cli.daemon_handle);
+
+  return CLI_OK;
+}
+
+
+
+/*****************************************************************
+* cmmQueryPPPoECmd
+*
+*
+******************************************************************/
+static int cmmQueryPPPoECmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call PPPoE process function*/
+  cmmPPPoEQueryProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+
+
+/*****************************************************************
+ * * cmmQueryVlanCmd
+ * *
+ * *
+ * ******************************************************************/
+static int cmmQueryVlanCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call Vlan process function*/
+  cmmVlanQuery(argv, 0, globalConf.cli.daemon_handle);
+
+        return CLI_OK;
+}
+
+/*****************************************************************
+ *  * * cmmQueryMc4Cmd
+ *   * *
+ *    * *
+ *     * ******************************************************************/
+static int cmmQueryMc4Cmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call Multicast IPV4 process function*/
+   cmmMc4QueryProcess(argv, 0, globalConf.cli.daemon_handle);
+
+   return CLI_OK;
+}
+
+/*****************************************************************
+ *  *  * * cmmQueryMc6Cmd
+ *   *   * *
+ *    *    * *
+ *     *     * ******************************************************************/
+static int cmmQueryMc6Cmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call Multicast IPV4 process function*/
+   cmmMc6QueryProcess(argv, 0, globalConf.cli.daemon_handle);
+
+   return CLI_OK;
+}
+
+
+/*****************************************************************
+ *  *  *  * * cmmQueryQmCmd
+ *   *   *   * *
+ *    *    *    * *
+ *     *     *     * ******************************************************************/
+static int cmmQueryQmCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call Multicast IPV4 process function*/
+   cmmQmQueryProcess(argv, 0, globalConf.cli.daemon_handle);
+
+   return CLI_OK;
+}
+
+
+/*****************************************************************
+ *  *  *  *  * * cmmQueryQmCmd
+ *   *   *   *   * *
+ *    *    *    *    * *
+ *     *     *     *     * ******************************************************************/
+static int cmmQmExptRateQueryCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call Multicast IPV4 process function*/
+   cmmQmExptRateQueryProcess(argv, 0, globalConf.cli.daemon_handle);
+
+   return CLI_OK;
+}
+
+/*****************************************************************
+ *  * * cmmSaQueryCmd
+ *   * *
+ *    * *
+ *     * ******************************************************************/
+static int cmmSaQueryCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call Sa Query process function*/
+  cmmSAQueryProcess(argv, 0, globalConf.cli.daemon_handle);
+
+        return CLI_OK;
+}
+
+
+
+/*****************************************************************
+* cmmQueryNatptCmd
+*
+*
+******************************************************************/
+static int cmmQueryNatptCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	/*Call NATPT process function*/
+	cmmNATPTQueryProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+#ifdef AUTO_BRIDGE
+/*****************************************************************
+* cmmQueryL2FlowCmd
+*
+*
+******************************************************************/
+static int cmmQueryL2FlowCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	/*Call L2Flow query function*/
+	cmmL2FlowQueryProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+#endif
+/*****************************************************************
+* cmmQosCmds
+*
+*
+******************************************************************/
+static int cmmQmCmds(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	/*Call QM process function*/
+	cmmQmSetProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmMc4Cmd
+*
+*
+******************************************************************/
+static int cmmMc4Cmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call RX process function*/
+  cmmMc4SetProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+/*****************************************************************
+* cmmMc6Cmd
+*
+*
+******************************************************************/
+static int cmmMc6Cmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call RX process function*/
+  cmmMc6SetProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmMspMem
+*
+*
+******************************************************************/
+static int cmmMspMem(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call Memory DIsplay function */
+	prfMspMS( globalConf.cli.daemon_handle,argc, argv);
+
+	return CLI_OK;
+}
+/*****************************************************************
+* cmmMspMem
+*
+*
+******************************************************************/
+static int cmmMspMemW(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call Memory DIsplay function */
+	prfMspMSW( globalConf.cli.daemon_handle,argc, argv);
+
+	return CLI_OK;
+}
+/*****************************************************************
+* cmmMspMem
+******************************************************************/
+static int cmmMspCT(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+  /*Call Memory DIsplay function */
+	prfMspCT(globalConf.cli.daemon_handle,argc, argv );
+	return CLI_OK;
+}
+
+/*
+** Performance mesaurement and tracing 
+*/
+/* Busy CPU */
+static int cmmPTBusyCPU(struct cli_def * cli, char *command, char *argv[], int argc) {
+	prfPTBusyCPU( globalConf.cli.daemon_handle,argc, argv);
+	return CLI_OK;
+}
+/* Tracing/profiling */
+static int cmmPTsetmask(struct cli_def * cli, char *command, char *argv[], int argc) {
+	prfPTsetmask( globalConf.cli.daemon_handle, argc, argv);
+	return CLI_OK;
+}
+static int cmmPTstart(struct cli_def * cli, char *command, char *argv[], int argc) {
+	prfPTstart(globalConf.cli.daemon_handle, argc, argv);
+	return CLI_OK;
+}
+static int cmmPTswitch(struct cli_def * cli, char *command, char *argv[], int argc) {
+	prfPTswitch(globalConf.cli.daemon_handle, argc,argv);
+	return CLI_OK;
+}
+
+static int cmmPTshow(struct cli_def * cli, char *command, char *argv[], int argc) {
+	prfPTshow(globalConf.cli.daemon_handle, argc,argv);
+	return CLI_OK;
+}
+
+static int cmmPTstatus(struct cli_def * cli, char *command, char *argv[], int argc) {
+	prfStatus(globalConf.cli.daemon_handle,argc, argv);
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmVlan commands
+*
+*
+******************************************************************/
+static int cmmVlanCliAdd(struct cli_def *cli, char *command, char *argv[], int argc)
+{
+	/*Call vlan process function*/
+  	vlanAddProcess(globalConf.cli.daemon_handle, argc, argv);
+	return CLI_OK;
+}
+
+static int cmmVlanCliDelete(struct cli_def *cli, char *command, char *argv[], int argc)
+{
+	/*Call vlan process function*/
+  	vlanDeleteProcess(globalConf.cli.daemon_handle, argc, argv);
+
+	return CLI_OK;
+}
+
+
+/*****************************************************************
+* cmmPktCap commands
+*
+*
+******************************************************************/
+static int cmmPktCapSlice(struct cli_def *cli, char *command, char *argv[], int argc)
+{
+	
+  	PktCapSliceProcess(globalConf.cli.daemon_handle, argc, argv);
+	return CLI_OK;
+}
+
+static int cmmPktCapStat(struct cli_def *cli, char *command, char *argv[], int argc)
+{
+  	PktCapStatProcess(globalConf.cli.daemon_handle, argc, argv);
+	return CLI_OK;
+}
+
+
+static int cmmPktCapFilter(struct cli_def *cli, char *command, char *argv[], int argc)
+{
+  	PktCapFilterProcess(globalConf.cli.daemon_handle, argc, argv);
+	return CLI_OK;
+}
+
+
+static int cmmPktCapQuery(struct cli_def *cli, char *command, char *argv[], int argc)
+{
+  	PktCapQueryProcess(cli , globalConf.cli.daemon_handle);
+	return CLI_OK;
+}
+
+
+/*****************************************************************
+* cmmIcc commands
+*
+*
+******************************************************************/
+static int cmmIccReset(struct cli_def *cli, char *command, char *argv[], int argc)
+{
+	
+  	IccReset(globalConf.cli.daemon_handle, argc, argv);
+	return CLI_OK;
+}
+
+static int cmmIccThreshold(struct cli_def *cli, char *command, char *argv[], int argc)
+{
+  	IccThreshold(globalConf.cli.daemon_handle, argc, argv);
+	return CLI_OK;
+}
+
+
+static int cmmIccAdd(struct cli_def *cli, char *command, char *argv[], int argc)
+{
+  	IccAdd(globalConf.cli.daemon_handle, argc, argv);
+	return CLI_OK;
+}
+
+
+static int cmmIccDelete(struct cli_def *cli, char *command, char *argv[], int argc)
+{
+  	IccDelete(globalConf.cli.daemon_handle, argc, argv);
+	return CLI_OK;
+}
+
+
+static int cmmIccQuery(struct cli_def *cli, char *command, char *argv[], int argc)
+{
+  	IccQuery(globalConf.cli.daemon_handle, argc, argv);
+	return CLI_OK;
+}
+
+
+static int cmmQueryTnlCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	cmmTnlQueryProcess(argv, 0, globalConf.cli.daemon_handle);
+
+        return CLI_OK;
+}
+
+
+
+/*****************************************************************
+* cmmSetTimeoutCLI
+******************************************************************/
+static int cmmSetTimeoutCLI(struct cli_def * cli, char *command, char *argv[], int argc) 
+{
+	timeoutSet(globalConf.cli.daemon_handle, argv, argc);
+	return CLI_OK; 
+}
+
+static int cmmSetRouteCLI(struct cli_def * cli, char *command, char *argv[], int argc) 
+{
+	cmmRouteSetProcess(argv, 0, globalConf.cli.daemon_handle);
+	return CLI_OK; 
+}
+
+static int cmmFFControlCmd(struct cli_def * cli, char *command, char *argv[], int argc) 
+{
+	cmmFFControlProcess(argv, 0, globalConf.cli.daemon_handle);
+	return CLI_OK;
+}
+
+static int cmmIpv4Cmd(struct cli_def * cli, char *command, char *argv[], int argc) 
+{
+	cmmCtChangeProcess4(argv, 0, globalConf.cli.daemon_handle);
+	return CLI_OK;
+}
+
+static int cmmIpv6Cmd(struct cli_def * cli, char *command, char *argv[], int argc) 
+{
+	cmmCtChangeProcess6(argv, 0, globalConf.cli.daemon_handle);
+	return CLI_OK;
+}
+
+int cmmFFControlProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	cmmd_ff_ctrl_cmd_t cmd;
+	char rcvBuffer[256];
+	char enable;
+	int rc;
+
+	if(!keywords[cpt])
+		goto usage;
+
+	if(strcasecmp(keywords[cpt], "enable") == 0)
+		enable = 1;
+	else if (strcasecmp(keywords[cpt], "disable") == 0)
+		enable = 0;
+	else
+		goto usage;
+
+	cmd.enable = enable;
+
+	// Send message to forward engine
+	cmm_print(DEBUG_COMMAND, "Send CMD_CMMTD_IPV4_FF_CONTROL cmd to daemon len=%d\n",sizeof(cmmd_ff_ctrl_cmd_t));
+	rc = cmmSendToDaemon(daemon_handle, CMMD_CMD_IPV4_FF_CONTROL, (unsigned short *) &cmd, sizeof(cmmd_ff_ctrl_cmd_t), rcvBuffer);
+	if (rc != 2) /* we expect 2 bytes in response */
+	{
+		cmm_print(DEBUG_STDERR, "CMD_CMMTD_IPV4_FF_CONTROL unexpected response length %d\n", rc);
+		return -1;
+	}
+	else if ((((u_int16_t*)rcvBuffer)[0]) != CMMD_ERR_OK)
+	{
+		cmm_print(DEBUG_STDERR, "Error %d received from CMM Deamon for CMD_CMMTD_IPV4_FF_CONTROL\n", ((u_int16_t*)rcvBuffer)[0]);
+		return -1;
+	}
+
+	return 0;
+usage:
+	cmm_print(DEBUG_ERROR, "Usage: set ff <enable disable>\n");
+	return -1;
+}
+
+int cmmIPsecSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	fpp_ipsec_cmd_t cmd;
+	char rcvBuffer[256];
+	char enable;
+
+	if(!keywords[cpt])
+		goto usage;
+
+	else if(strcasecmp(keywords[cpt], "pre-frag") == 0)
+	{
+		if(!keywords[++cpt])
+			goto usage;
+
+		if(strcasecmp(keywords[cpt], "enable") == 0)
+			enable = 1;
+		else if (strcasecmp(keywords[cpt], "disable") == 0)
+			enable = 0;
+		else
+			goto usage;
+
+		cmd.pre_frag_en = enable;
+
+		// Send message to forward engine
+		cmm_print(DEBUG_COMMAND, "Send CMD_IPSEC_FRAG_CFG cmd to daemon len=%d\n",sizeof(fpp_ipsec_cmd_t));
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_IPSEC_FRAG_CFG, (unsigned short *) &cmd, sizeof(fpp_ipsec_cmd_t), rcvBuffer) == 4)
+		{
+			if ( ((unsigned short *)rcvBuffer)[0] != 0) {
+				cmm_print(DEBUG_STDERR, "Error %d while sending message to daemon\n", ((unsigned short *)rcvBuffer)[0]);
+				return ((unsigned short *)rcvBuffer)[0];
+			}
+		}
+		return 0;
+	}
+usage:
+	cmm_print(DEBUG_ERROR, "Usage: set ipsec pre-frag <enable disable>\n");
+	return -1;
+}
+
+int cmmExptCmd(struct cli_def * cli, char *command, char *argv[], int argc) 
+{
+  	/*Call exception path process function*/
+ 	cmmExptSetProcess(argv, 0, globalConf.cli.daemon_handle);
+	return CLI_OK;
+}
+
+int cmmRtpCmd(struct cli_def * cli, char *command, char *argv[], int argc) 
+{
+  	/*Call RTP process function*/
+ 	cmmRTPSetProcess(argv, 0, globalConf.cli.daemon_handle);
+	return CLI_OK;
+}
+
+int cmmSocketCmd(struct cli_def * cli, char *command, char *argv[], int argc) 
+{
+  	/*Call Socket process function*/
+ 	cmmSocketSetProcess(argv, 0, globalConf.cli.daemon_handle);
+	return CLI_OK;
+}
+
+int cmmNatptCmd(struct cli_def * cli, char *command, char *argv[], int argc) 
+{
+  	/*Call NAT-PT process function*/
+ 	cmmNATPTSetProcess(argv, 0, globalConf.cli.daemon_handle);
+	return CLI_OK;
+}
+
+int cmmAltConfCmd(struct cli_def * cli, char *command, char *argv[], int argc) 
+{
+  	/*Call AltConf process function*/
+ 	cmmAltConfClient(argc, argv, 0, globalConf.cli.daemon_handle);
+	return CLI_OK;
+}
+
+static void cliCallback(struct cli_def *cliHandle, char *format)
+{
+	if (format[0] && cliHandle->client)
+		fprintf(cliHandle->client, "%s\r\n", format);
+}
+
+/*****************************************************************
+* cmmBridgeControlCmd
+*
+*
+******************************************************************/
+static int cmmBridgeControlCmd(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	/*Call L2Flow query function*/
+	cmmBridgeControlProcess(argv, 0, globalConf.cli.daemon_handle);
+
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmCliThread()
+*
+*
+*
+******************************************************************/
+static void *cmmCliThread(void *data)
+{
+	struct cmm_cli *ctx = data;
+
+	cmm_print(DEBUG_INFO, "%s: pid %d\n", __func__, getpid());
+
+	while (1)
+	{
+		ctx->sock2 = accept(ctx->sock, NULL, 0);
+		if (ctx->sock2 < 0)
+		{
+			cmm_print(DEBUG_ERROR, "%s: accept() %s\n", __func__, strerror(errno));
+			break;
+		}
+
+		cli_loop(ctx->handle, ctx->sock2);
+		cmm_print(DEBUG_INFO, "%s: cli_loop exiting\n", __func__);
+
+		close(ctx->sock2);
+	}
+
+	cmm_print(DEBUG_INFO, "%s: exiting\n", __func__);
+
+	kill (0, SIGTERM);
+	pthread_exit(NULL);
+
+	return NULL;
+}
+
+
+/*****************************************************************
+* cmmCliInit()
+*
+*
+*
+******************************************************************/
+int cmmCliInit(struct cmm_cli *ctx)
+{
+	struct sockaddr_in serveraddr;
+	struct cli_command *c;
+	int on;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	ctx->fci_handle = fci_open(FCILIB_FF_TYPE, 0);
+	if (!ctx->fci_handle)
+	{
+		cmm_print(DEBUG_ERROR, "%s: fci_open() failed, %s\n", __func__, strerror(errno));
+		goto err0;
+	}
+
+#ifdef NEW_IPC
+	ctx->daemon_handle = cmm_open();
+	if (!ctx->daemon_handle)
+	{
+		cmm_print(DEBUG_ERROR, "%s: cmm_open() failed, %s\n", __func__, strerror(errno));
+		goto err1;
+	}
+#else
+	ctx->daemon_handle = globalConf.cmmPid;
+#endif
+	ctx->handle = cli_init();
+	if (!ctx->handle)
+	{
+		cmm_print(DEBUG_ERROR, "%s: cli_init() failed\n", __func__);
+		goto err2;
+	}
+
+	cli_set_hostname(ctx->handle, "cmm");
+	cli_set_banner(ctx->handle, "Welcome to the Fast Forward Contrack module monitor CLI");
+	cli_print_callback(ctx->handle, cliCallback);
+
+	cli_allow_user(ctx->handle, "admin", "admin");
+
+	c = cli_register_command(ctx->handle, NULL, "show", NULL, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "");
+	if (c)
+	{
+		cli_register_command(ctx->handle, c, "connections", cmmCtShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the table of fast forwarded connections");
+		cli_register_command(ctx->handle, c, "fpp_route", cmmFPPRtShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the fpp route entries used by the fast forwarded connections");
+		cli_register_command(ctx->handle, c, "route", cmmRtShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the route entries used by the fast forwarded connections");
+		cli_register_command(ctx->handle, c, "neighbor", cmmNeighShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the neighbor entries used by the fast forwarded connections");
+		cli_register_command(ctx->handle, c, "rules", cmmFcRulesShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the table of non fast forwardable connections");
+		cli_register_command(ctx->handle, c, "debug_level", cmmFcDebugShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the debug level");
+		cli_register_command(ctx->handle, c, "activate", cmmFcActivateShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show if cmm is activated or not");
+		cli_register_command(ctx->handle, c, "pppoe", cmmPPPoELocalShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the pppoe entries used by the fast forwarded connections");
+		cli_register_command(ctx->handle, c, "vlan", cmmVlanLocalShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the vlan entries programmmed");
+		cli_register_command(ctx->handle, c, "macvlan", cmmMacVlanLocalShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the macvlan entries programmmed");
+		cli_register_command(ctx->handle, c, "rx", cmmShowRxCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show ICC, Bridge status");
+		cli_register_command(ctx->handle, c, "stat", cmmShowStatCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show Statistics");
+		cli_register_command(ctx->handle, c, "sa_query_timer", cmmSaQueryTimerShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the DPD SA query timer configuration");
+		cli_register_command(ctx->handle, c, "sec-connections", cmmFlowLocalShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the local table of secure connections");
+		cli_register_command(ctx->handle, c, "relay", cmmRelayLocalShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show pppoe relay entries used by  the fast forwarded connections");
+		cli_register_command(ctx->handle, c, "mc6", cmmMc6Show, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the table of V6 multicat listeners");
+		cli_register_command(ctx->handle, c, "mc4", cmmMc4Show, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the table of V4 multicat listeners");
+#ifdef C2000_DPI
+		cli_register_command(ctx->handle, c, "dpi", cmmDPIEnableShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the DPI flag status");
+#endif
+		cli_register_command(ctx->handle, c, "asym_fastforward", cmmAsymFFEnableShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the Asymmetric fast forward status");
+		cli_register_command(ctx->handle, c, "asym_ff_rules", cmmFcAsymFFRulesShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the table of asymmetric fast forwardable connections");
+	}
+
+        c = cli_register_command(ctx->handle, NULL, "query", NULL, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "");
+	if (c)
+	{
+	        cli_register_command(ctx->handle, c, "pppoe", cmmQueryPPPoECmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Query PPPoE entries on FPP");
+        	cli_register_command(ctx->handle, c, "rx", cmmQueryRxCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Query Bridge entries on FPP");
+	        cli_register_command(ctx->handle, c, "route", cmmQueryRtCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Query Route entries on FPP");
+        	cli_register_command(ctx->handle, c, "connections", cmmQueryCtCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Query Connection entries on FPP");
+	        cli_register_command(ctx->handle, c, "macvlan", cmmQueryMacVlanCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Query Macvlan interfaces on FPP");
+	        cli_register_command(ctx->handle, c, "v6connections", cmmQueryV6CtCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Query IPV6Connection entries on FPP");
+	        cli_register_command(ctx->handle, c, "vlan", cmmQueryVlanCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Query VLAN entries on FPP");
+	        cli_register_command(ctx->handle, c, "mc4", cmmQueryMc4Cmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Query Multicast IPV4 entries on FPP");
+	        cli_register_command(ctx->handle, c, "mc6", cmmQueryMc6Cmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Query Multicast IPV6 entries on FPP");
+        	cli_register_command(ctx->handle, c, "qm", cmmQueryQmCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Query QOS configuration on FPP");
+	        cli_register_command(ctx->handle, c, "qmexptrate", cmmQmExptRateQueryCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Query Exception rate configured on FPP");
+        	cli_register_command(ctx->handle, c, "sa", cmmSaQueryCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Query for SA details");
+        	cli_register_command(ctx->handle, c, "natpt", cmmQueryNatptCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Query NAT-PT connections");
+		cli_register_command(ctx->handle, c, "pktcapture", cmmPktCapQuery, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Query packet capture config parameters");
+		cli_register_command(ctx->handle, c, "tunnels",cmmQueryTnlCmd , PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Query tunnel parameters");
+#ifdef AUTO_BRIDGE
+		cli_register_command(ctx->handle, c, "l2flows", cmmQueryL2FlowCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Query L2Flows entries on FPP");
+#endif
+	}
+
+	//	cli_register_command(ctx->handle, pshow, "eth_icc", cmmEthIccShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the pppoe entries used by the fast forwarded connections");
+	c = cli_register_command(ctx->handle, NULL, "set", NULL, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "");
+	if (c)
+	{
+		cli_register_command(ctx->handle, c, "activate", cmmFcActivate, PRIVILEGE_PRIVILEGED, MODE_EXEC, "Activate or desactivate fast forwarding");
+		cli_register_command(ctx->handle, c, "debug", cmmFcDebug, PRIVILEGE_PRIVILEGED, MODE_EXEC, "Debug level");
+		cli_register_command(ctx->handle, c, "rx", cmmRxCmd, PRIVILEGE_PRIVILEGED, MODE_EXEC, "Manage RX module (ICC, Bridge ...)");
+		cli_register_command(ctx->handle, c, "qm", cmmQmCmds, PRIVILEGE_PRIVILEGED, MODE_EXEC, "Manage QM module (QOS, Rate Limiting ...)");
+		cli_register_command(ctx->handle, c, "mc6", cmmMc6Cmd, PRIVILEGE_PRIVILEGED, MODE_EXEC, "Manage MC6 module (IpV6 multicast)");
+		cli_register_command(ctx->handle, c, "mc4", cmmMc4Cmd, PRIVILEGE_PRIVILEGED, MODE_EXEC, "Manage MC4 module (IPv4 multicast)");
+		cli_register_command(ctx->handle, c, "timeout", cmmSetTimeoutCLI, PRIVILEGE_PRIVILEGED, MODE_EXEC, "Set UDP/TCP/IPIP timeout value in FPP");
+		cli_register_command(ctx->handle, c, "route", cmmSetRouteCLI, PRIVILEGE_PRIVILEGED, MODE_EXEC, "Set Extended Route");
+		cli_register_command(ctx->handle, c, "ff", cmmFFControlCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Enable or disable fast forward");
+		cli_register_command(ctx->handle, c, "stat", cmmStatCmd, PRIVILEGE_PRIVILEGED, MODE_EXEC, "Manage Statistics (PPPoE, Bridge ...)");
+		cli_register_command(ctx->handle, c, "expt_queue", cmmExptCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Manage Exception Path Queuing");
+		cli_register_command(ctx->handle, c, "socket", cmmSocketCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Manage Socket module");
+		cli_register_command(ctx->handle, c, "rtp", cmmRtpCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Manage RTP-relay module");
+		cli_register_command(ctx->handle, c, "natpt", cmmNatptCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Manage NAT-PT module");
+		cli_register_command(ctx->handle, c, "sa_query_timer", cmmDPDSaQueryCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Enable or disable SA query timer");
+		cli_register_command(ctx->handle, c, "config", cmmAltConfCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Manage Alternate Configuration module");
+		cli_register_command(ctx->handle, c, "bridge", cmmBridgeControlCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Manage automatic bridging");
+#ifdef C2000_DPI
+		cli_register_command(ctx->handle, c, "dpi", cmmDPIEnableCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Enable or disable Global DPI flag");
+#endif
+		cli_register_command(ctx->handle, c, "asym_fastforward", cmmAsymFFEnableCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Enable or disable Asymmetric Fast forward");
+		cli_register_command(ctx->handle, c, "4rd-id-conversion", cmm4rdIdConvCmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Enable or disable 4rd Ipv4  header ID conversion");
+	}
+
+	c = cli_register_command(ctx->handle, NULL, "ipv4", cmmIpv4Cmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "");
+	if (c)
+		cli_register_command(ctx->handle, c, "update", cmmIpv4Cmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Update IPv4 Connection");
+
+	c = cli_register_command(ctx->handle, NULL, "ipv6", cmmIpv6Cmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "");
+	if (c)
+		cli_register_command(ctx->handle, c, "update", cmmIpv6Cmd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Update IPv6 Connection");
+
+	cli_register_command(ctx->handle, NULL, "stop", cmmFcStop, PRIVILEGE_PRIVILEGED, MODE_EXEC, "Kill cmm");
+
+	c = cli_register_command(ctx->handle, NULL, "prf",NULL, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "");
+	if (c)
+	{
+		cli_register_command(ctx->handle, c, "busycpu",cmmPTBusyCPU, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Measure available CPU cycles");
+		cli_register_command(ctx->handle, c, "status", cmmPTstatus, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show status of profiling/CPU measurement");
+		c = cli_register_command(ctx->handle, c, "trace", NULL, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "");
+		if (c)
+		{
+			cli_register_command(ctx->handle, c, "setmask", cmmPTsetmask, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Set module mask");
+			cli_register_command(ctx->handle, c, "start", cmmPTstart, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Start trace");
+			cli_register_command(ctx->handle, c, "switch", cmmPTswitch, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Stop or switch trace and show inactive trace");
+			cli_register_command(ctx->handle, c, "showtrace", cmmPTshow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show inactive trace");
+		}
+	}
+
+	c = cli_register_command(ctx->handle, NULL, "mspmem",NULL, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "");
+	if (c)
+	{
+		cli_register_command(ctx->handle, c, "ct", cmmMspCT, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show the table of fast forwarded connections");
+		cli_register_command(ctx->handle, c, "bytes", cmmMspMem, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show msp memory in host order");
+		cli_register_command(ctx->handle, c, "words", cmmMspMemW, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show msp memory in network order");
+	}
+
+	c = cli_register_command(ctx->handle, NULL, "vlan",NULL, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "");
+	if (c)
+	{
+		cli_register_command(ctx->handle, c, "add", cmmVlanCliAdd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Register vlan entry with fpp");
+		cli_register_command(ctx->handle, c, "delete", cmmVlanCliDelete, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Deregister vlan with fpp");
+		cli_register_command(ctx->handle, c, "show", cmmVlanLocalShow, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Deregister vlan with fpp");
+	}
+
+	c = cli_register_command(ctx->handle, NULL, "pktcapture", NULL, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "");
+	if (c)
+	{
+		cli_register_command(ctx->handle, c, "slice", cmmPktCapSlice, PRIVILEGE_UNPRIVILEGED, MODE_EXEC,
+								"Register packet capture size with fpp");
+		cli_register_command(ctx->handle, c, "status", cmmPktCapStat, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, 
+								"Enable/disable packet capture on LAN/WAN with fpp");
+		cli_register_command(ctx->handle, c, "filter", cmmPktCapFilter, PRIVILEGE_UNPRIVILEGED, MODE_EXEC,
+								 "Register first-level-filter string for LAN/WAN with fpp");
+	}
+
+	c = cli_register_command(ctx->handle, NULL, "icc", NULL, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "");
+	if (c)
+	{
+		cli_register_command(ctx->handle, c, "reset", cmmIccReset, PRIVILEGE_UNPRIVILEGED, MODE_EXEC,
+								"Reset ICC");
+		cli_register_command(ctx->handle, c, "threshold", cmmIccThreshold, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, 
+								"Set ICC threshold values");
+		cli_register_command(ctx->handle, c, "add", cmmIccAdd, PRIVILEGE_UNPRIVILEGED, MODE_EXEC,
+								 "Add ICC table entry");
+		cli_register_command(ctx->handle, c, "delete", cmmIccDelete, PRIVILEGE_UNPRIVILEGED, MODE_EXEC,
+								 "Delete ICC table entry");
+		cli_register_command(ctx->handle, c, "query", cmmIccQuery, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, 
+								"Query ICC table values");
+	}
+
+
+	ctx->sock = socket(AF_INET, SOCK_STREAM, 0);
+	if (ctx->sock < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: socket() %s\n", __func__, strerror(errno));
+		goto err3;
+	}
+
+	on = 1;
+	setsockopt(ctx->sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
+
+	memset(&serveraddr, 0, sizeof(serveraddr));
+	serveraddr.sin_family = AF_INET;
+	serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
+	serveraddr.sin_port = htons(2103);
+	if (bind(ctx->sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: bind() %s\n", __func__, strerror(errno));
+		goto err4;
+	}
+
+	if (listen(ctx->sock, 1) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: listen() %s\n", __func__, strerror(errno));
+		goto err4;
+	}
+
+	if (pthread_create(&ctx->pthread, NULL, cmmCliThread, ctx) < 0)
+	{
+		cmm_print(DEBUG_CRIT, "%s: pthread_create() failed, %s\n", __func__, strerror(errno));
+		goto err4;
+	}
+
+	return 0;
+
+err4:
+	close(ctx->sock);
+
+err3:
+	cli_done(ctx->handle);
+
+err2:
+#ifdef NEW_IPC
+	cmm_close(ctx->daemon_handle);
+
+err1:
+#endif
+	fci_close(ctx->fci_handle);
+
+err0:
+	return -1;
+}
+
+
+void cmmCliExit(struct cmm_cli *ctx)
+{
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+#if defined(__UCLIBC__)
+	/* workaround uclibc pthread_cancel() bug, force thread to exit */
+	close(ctx->sock);
+	close(ctx->sock2);
+#endif
+	pthread_cancel(ctx->pthread);
+
+	pthread_join(ctx->pthread, NULL);
+
+#if !defined(__UCLIBC__)
+	close(ctx->sock);
+	close(ctx->sock2);
+#endif
+
+	cli_done(ctx->handle);
+	ctx->handle = 0;
+
+#ifdef NEW_IPC
+	cmm_close(ctx->daemon_handle);
+#endif
+
+	fci_close(ctx->fci_handle);
+
+	cmm_print(DEBUG_INFO, "%s: exiting\n", __func__);
+}
diff --git a/cmm/src/ffcontrol.h b/cmm/src/ffcontrol.h
new file mode 100644
index 0000000..f6b4cbb
--- /dev/null
+++ b/cmm/src/ffcontrol.h
@@ -0,0 +1,110 @@
+/*
+ * ffcontrol.c: Fast Forward Control
+ *
+ *	Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __FFCONTROL_H__
+#define __FFCONTROL_H__
+
+	#define CONF_FILE_PATH	"/etc/config/fastforward"
+
+
+	#define ATTR_ORIG_PORT_SRC_STR "orig_src_port"
+	#define ATTR_ORIG_PORT_DST_STR "orig_dst_port"
+	#define ATTR_REPL_PORT_SRC_STR "repl_src_port"
+	#define ATTR_REPL_PORT_DST_STR "repl_dst_port"
+	#define ATTR_ORIG_IPV4_SRC_STR "orig_src_ipv4"
+	#define ATTR_ORIG_IPV4_DST_STR "orig_dst_ipv4"
+	#define ATTR_REPL_IPV4_SRC_STR "repl_src_ipv4"
+	#define ATTR_REPL_IPV4_DST_STR "repl_dst_ipv4"
+	#define ATTR_ORIG_IPV6_SRC_STR "orig_src_ipv6"
+	#define ATTR_ORIG_IPV6_DST_STR "orig_dst_ipv6"
+	#define ATTR_REPL_IPV6_SRC_STR "repl_src_ipv6"
+	#define ATTR_REPL_IPV6_DST_STR "repl_dst_ipv6"
+	#define ATTR_MARK_STR "mark"
+	#define ATTR_PROTO_STR "proto"
+	#define ATTR_L3_PROTO_STR "l3 proto"
+
+
+	typedef struct denyRule {
+		struct denyRule * next;
+
+		int type;					/*Netfilter attribut*/
+		int value;					/*Value of the attribut*/
+		int width;			/* 8, 16, 32 bits */
+		int mask;
+		struct in6_addr valueIpV6 ;
+	} *denyRule_t, denyRule;
+
+ 	struct denyRuleList {
+		struct denyRuleList * next;
+		char name[20];
+		denyRule_t rule;
+	};
+
+	struct cmm_cli;
+
+	typedef struct asymFFRule {
+		struct asymFFRule * next;
+
+		int type;			/*Netfilter attribut*/
+		int value;			/*Value of the attribut*/
+		char strValue[16];		/*Value of the non-numerical atribute*/
+		int width;			/* 8, 16, 32 bits */
+		int mask;
+	} *asymFFRule_t, asymFFRule;
+
+	struct asymFFRuleList {
+		struct asymFFRuleList * next;
+		char name[20];
+		asymFFRule_t rule;
+	};
+
+	int cmmFcIsConntrackAsymFastForwarded(struct nf_conntrack *ct);
+	int cmmFcIsConntrack4Allowed(FCI_CLIENT *fci_handle, struct nf_conntrack *ct, struct RtEntry **rtEntryOrig);
+	int cmmFcIsConntrack6Allowed(FCI_CLIENT *fci_handle, struct nf_conntrack * ct, struct RtEntry **rtEntryOrig);
+
+	int cmmFcParser(char *confFilePath);
+	int cmmCliInit(struct cmm_cli *ctx);
+	void cmmCliExit(struct cmm_cli *ctx);
+
+	int cmmFFControlProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+	int cmmIPsecSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+
+static inline int cmmFcIsConntrackAllowed(FCI_CLIENT *fci_handle, struct nf_conntrack *ct, struct RtEntry **rtEntryOrig)
+{
+	if (nfct_get_attr_u8(ct, ATTR_ORIG_L3PROTO) == AF_INET)
+		return cmmFcIsConntrack4Allowed(fci_handle, ct, rtEntryOrig);
+	else
+		return cmmFcIsConntrack6Allowed(fci_handle, ct, rtEntryOrig);
+}
+
+#ifdef WIFI_ENABLE
+#define MAX_WIFI_FF_IFS 8	
+
+struct wifi_ff_entry
+{
+	char   ifname[IFNAMSIZ];
+	unsigned char   macaddr[6];
+	unsigned short  used;
+	unsigned int    vapid;
+	unsigned int    direct_path_rx;
+	struct interface *wifi_ff_if;
+};
+#endif
+
+#endif
diff --git a/cmm/src/forward_engine.c b/cmm/src/forward_engine.c
new file mode 100644
index 0000000..9af8fde
--- /dev/null
+++ b/cmm/src/forward_engine.c
@@ -0,0 +1,1360 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+#include <signal.h>
+#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
+#include <libnetfilter_conntrack/libnetfilter_conntrack_tcp.h>
+#include <net/if.h>
+
+#include "cmm.h"
+#include "itf.h"
+#include "ffbridge.h"
+#include "fpp.h"
+#include "cmmd.h"
+#include "fpp_private.h"
+
+#define CTCMD_FLAGS_ORIG_DISABLED	(1 << 0)
+#define CTCMD_FLAGS_REP_DISABLED	(1 << 1)
+#define CTCMD_FLAGS_PERMANENT		(1 << 2)
+
+/* CtExCommand  FORMAT bitfield DEFINES*/
+#define CT_SECURE               (1 << 0)
+#define CT_ORIG_TUNNEL_SIT      (1 << 1)
+#define CT_REPL_TUNNEL_SIT      (1 << 2)
+#define CT_ORIG_TUNNEL_4o6     CT_ORIG_TUNNEL_SIT
+#define CT_REPL_TUNNEL_4o6     CT_REPL_TUNNEL_SIT
+
+
+/*****************************************************************
+* cmmFeReset
+*
+*
+******************************************************************/
+void cmmFeReset(FCI_CLIENT *fci_handle)
+{
+	int i;
+	struct ctTable *ctEntry;
+	struct FlowEntry *FlowEntry;
+	struct RtEntry *rtEntry;
+	struct NeighborEntry *neigh;
+	struct socket *socket;
+	struct list_head *entry;
+
+	cmm_print(DEBUG_ERROR, "%s: start\n", __func__);
+
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&ctMutex);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+	__pthread_mutex_lock(&socket_lock);
+	__pthread_mutex_lock(&brMutex);
+
+	// Send message to forward engine
+	cmm_print(DEBUG_COMMAND, "Send CMD_IPV4_RESET\n");
+	if (fci_write(fci_handle, FPP_CMD_IPV4_RESET, 0, NULL))
+	{
+		cmm_print(DEBUG_ERROR, "Error while trying to reset IPv4 forward Engine\n");
+		goto unlock;
+	}
+
+	cmm_print(DEBUG_COMMAND, "Send CMD_IPV6_RESET\n");
+	if (fci_write(fci_handle, FPP_CMD_IPV6_RESET, 0, NULL))
+	{
+		cmm_print(DEBUG_ERROR, "Error while trying to reset IPv6 forward Engine\n");
+		goto unlock;
+	}
+
+	for (i = 0; i < CONNTRACK_HASH_TABLE_SIZE; i++)
+	{
+		while(!list_empty(&ct_table[i]))
+		{
+			entry = list_first(&ct_table[i]);
+			ctEntry = container_of(entry, struct ctTable, list);
+
+			__cmmCtRemove(ctEntry);
+		}
+	}
+
+	for (i = 0; i < FLOW_HASH_TABLE_SIZE; i++)
+	{
+		while (!list_empty(&flow_table[i]))
+		{
+			entry = list_first(&flow_table[i]);
+			FlowEntry = container_of(entry, struct FlowEntry, list);
+			__cmmFlowRemove(FlowEntry);
+		}
+	}
+
+	for (i = 0; i < 2 * ROUTE_HASH_TABLE_SIZE; i++)
+	{
+		while (!list_empty(&rt_table[i]))
+		{
+			entry = list_first(&rt_table[i]);
+			rtEntry = container_of(entry, struct RtEntry, list);
+			__cmmRouteRemove(rtEntry);
+		}
+	}
+
+	for (i = 0; i < 2 * NEIGHBOR_HASH_TABLE_SIZE; i++)
+	{
+		while (!list_empty(&neigh_table[i]))
+		{
+			entry = list_first(&neigh_table[i]);
+			neigh = container_of(entry, struct NeighborEntry, list);
+			__cmmNeighRemove(neigh);
+		}
+	}
+
+	for (i = 0; i < HASH_SOCKET_SIZE; i++)
+	{
+		while (!list_empty(&socket_table[i]))
+		{
+			entry = list_first(&socket_table[i]);
+			socket = container_of(entry, struct socket, list);
+			socket_remove(socket);
+		}
+	}
+#ifdef AUTO_BRIDGE
+	 __cmm_l2flow_reset(fci_handle);
+#endif
+
+unlock:
+	__pthread_mutex_unlock(&brMutex);
+	__pthread_mutex_unlock(&socket_lock);
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	cmm_print(DEBUG_ERROR, "%s: end\n", __func__);
+}
+#ifdef AUTO_BRIDGE
+static void cmmFeL2FlowChange(struct cmm_ct *ctx, fpp_l2_bridge_flow_entry_cmd_t* cmd, int len)
+{
+	struct l2flow l2flow_tmp;
+
+	memset(&l2flow_tmp, 0 , sizeof(l2flow_tmp));
+	memcpy(l2flow_tmp.saddr, cmd->srcaddr, ETH_ALEN);
+	memcpy(l2flow_tmp.daddr, cmd->destaddr, ETH_ALEN);
+	l2flow_tmp.ethertype = cmd->ethertype;
+	l2flow_tmp.vlan_tag =cmd->vlan_tag;
+	l2flow_tmp.session_id = cmd->session_id;
+	l2flow_tmp.l3.proto = cmd->proto;
+	memcpy(l2flow_tmp.l3.saddr.all, cmd->saddr, 16);
+	memcpy(l2flow_tmp.l3.daddr.all, cmd->daddr, 16);
+	l2flow_tmp.l4.sport = cmd->sport;
+	l2flow_tmp.l4.dport = cmd->dport;
+		
+	__pthread_mutex_lock(&brMutex);
+	__cmm_l2flow_deregister(ctx->fci_handle, &l2flow_tmp);
+	__pthread_mutex_unlock(&brMutex);
+
+}
+
+int cmmFeL2FlowUpdate(FCI_CLIENT* fci_handler, int request, struct l2flowTable *l2flow_entry)
+{
+	int action;
+	short ret;
+	fpp_l2_bridge_flow_entry_cmd_t cmd;
+	memset(&cmd, 0, sizeof(cmd));
+
+	switch (request)
+	{
+	default:
+	case (ADD | UPDATE):
+		if ((l2flow_entry->flags & (FPP_PROGRAMMED | FPP_NEEDS_UPDATE)) == FPP_PROGRAMMED)
+			goto out;
+
+		if ((l2flow_entry->flags & (FPP_PROGRAMMED | FPP_NEEDS_UPDATE)) == (FPP_PROGRAMMED | FPP_NEEDS_UPDATE))
+		{
+			action = FPP_ACTION_UPDATE;
+		}
+		else
+		{
+			action = FPP_ACTION_REGISTER;
+		}
+
+		break;
+
+	case UPDATE:
+		if (!((l2flow_entry->flags & FPP_PROGRAMMED) && (l2flow_entry->flags & FPP_NEEDS_UPDATE)))
+			goto out;
+
+		action = FPP_ACTION_UPDATE;
+
+		break;
+
+	case REMOVE:
+		if (!(l2flow_entry->flags & FPP_PROGRAMMED))
+			goto out;
+
+		action = FPP_ACTION_DEREGISTER;
+
+		break;
+	}
+	
+	if (action != FPP_ACTION_DEREGISTER)
+	{
+		if (__itf_get_name(l2flow_entry->idev_ifi, cmd.input_name, sizeof(cmd.input_name)) < 0)
+		{
+			cmm_print(DEBUG_ERROR, "%s: __itf_get_name(%d) failed\n", __func__, l2flow_entry->idev_ifi);
+
+			goto err;
+		}
+		if (__itf_get_name(l2flow_entry->odev_ifi, cmd.output_name, sizeof(cmd.output_name)) < 0)
+		{
+			cmm_print(DEBUG_ERROR, "%s: __itf_get_name(%d) failed\n", __func__, l2flow_entry->odev_ifi);
+
+			goto err;
+		}
+	}
+	cmd.action = action;
+	memcpy(cmd.destaddr, l2flow_entry->l2flow.daddr, ETH_ALEN);
+	memcpy(cmd.srcaddr, l2flow_entry->l2flow.saddr, ETH_ALEN);
+	cmd.ethertype = l2flow_entry->l2flow.ethertype;
+	cmd.vlan_tag = l2flow_entry->l2flow.vlan_tag;
+	cmd.session_id = l2flow_entry->l2flow.session_id;
+	cmd.proto = l2flow_entry->l2flow.l3.proto;
+	memcpy(cmd.saddr, l2flow_entry->l2flow.l3.saddr.all, 16);
+	memcpy(cmd.daddr, l2flow_entry->l2flow.l3.daddr.all, 16);
+	cmd.sport = l2flow_entry->l2flow.l4.sport;
+	cmd.dport = l2flow_entry->l2flow.l4.dport;
+	cmd.mark = l2flow_entry->mark;
+
+	cmm_print(DEBUG_INFO, "PROTO %d\n", cmd.proto);
+
+	switch (action)
+	{
+	case FPP_ACTION_REGISTER:
+		// Send message to forward engine
+		cmm_print(DEBUG_COMMAND, "Send FPP_CMD_RX_L2FLOW_ENTRY, ACTION_REGISTER\n");
+
+		ret = fci_write(fci_handler, FPP_CMD_RX_L2FLOW_ENTRY, sizeof(fpp_l2_bridge_flow_entry_cmd_t), (unsigned short *) &cmd);
+
+		if ((ret == FPP_ERR_OK) || (ret == FPP_ERR_BRIDGE_ENTRY_ALREADY_EXISTS)){
+			l2flow_entry->flags |= FPP_PROGRAMMED;
+			l2flow_entry->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else	{
+			cmm_print(DEBUG_ERROR, "Error %d while sending FPP_CMD_RX_L2FLOW_ENTRY, ACTION_REGISTER\n", ret);
+			goto err;
+		}
+		break;
+
+	case FPP_ACTION_UPDATE:
+		// Send message to forward engine
+		cmm_print(DEBUG_COMMAND, "Send FPP_CMD_RX_L2FLOW_ENTRY, ACTION_REGISTER\n");
+
+		ret = fci_write(fci_handler, FPP_CMD_RX_L2FLOW_ENTRY, sizeof(fpp_l2_bridge_flow_entry_cmd_t), (unsigned short *) &cmd);
+
+		if (ret == FPP_ERR_OK){
+			l2flow_entry->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else	{
+			cmm_print(DEBUG_ERROR, "Error %d while sending FPP_CMD_RX_L2FLOW_ENTRY, ACTION_UPDATE\n", ret);
+			goto err;
+		}
+		break;
+
+	case FPP_ACTION_DEREGISTER:
+		// Send message to forward engine
+		cmm_print(DEBUG_COMMAND, "Send FPP_CMD_RX_L2FLOW_ENTRY, ACTION_DEREGISTER\n");
+
+		ret = fci_write(fci_handler, FPP_CMD_RX_L2FLOW_ENTRY, sizeof(fpp_l2_bridge_flow_entry_cmd_t), (unsigned short *) &cmd);
+
+		if ((ret == FPP_ERR_OK) || (ret == FPP_ERR_BRIDGE_ENTRY_NOT_FOUND)){
+			l2flow_entry->flags &= ~FPP_PROGRAMMED;
+		}
+		else	{
+			cmm_print(DEBUG_ERROR, "Error %d while sending FPP_CMD_RX_L2FLOW_ENTRY, ACTION_DEREGISTER\n", ret);
+			goto err;
+		}
+		break;
+	default:
+		break;
+	}
+out:
+	return 0;
+err:
+	return -1;
+}
+
+#endif
+/*****************************************************************
+* cmmFeCtUpdate4
+*
+*
+******************************************************************/
+int cmmFeCtUpdate4(FCI_CLIENT *fci_handler, int action, struct ctTable *ctEntry)
+{
+	fpp_ct_ex_cmd_t cmd;
+	int cmd_size = sizeof(fpp_ct_cmd_t);
+	short ret;
+	char saddr_buf[INET_ADDRSTRLEN], daddr_buf[INET_ADDRSTRLEN];
+
+
+	memset(&cmd, 0, sizeof(cmd));
+	cmd.action = action;
+	cmd.protocol = nfct_get_attr_u8(ctEntry->ct, ATTR_ORIG_L4PROTO);
+
+	cmd.saddr = nfct_get_attr_u32(ctEntry->ct, ATTR_ORIG_IPV4_SRC);
+	cmd.daddr = nfct_get_attr_u32(ctEntry->ct, ATTR_ORIG_IPV4_DST);
+	cmd.saddr_reply = nfct_get_attr_u32(ctEntry->ct, ATTR_REPL_IPV4_SRC);
+	cmd.daddr_reply = nfct_get_attr_u32(ctEntry->ct, ATTR_REPL_IPV4_DST);
+
+	cmd.sport = nfct_get_attr_u16(ctEntry->ct, ATTR_ORIG_PORT_SRC);
+	cmd.dport = nfct_get_attr_u16(ctEntry->ct, ATTR_ORIG_PORT_DST);
+	cmd.sport_reply = nfct_get_attr_u16(ctEntry->ct, ATTR_REPL_PORT_SRC);
+	cmd.dport_reply = nfct_get_attr_u16(ctEntry->ct, ATTR_REPL_PORT_DST);
+	cmd.fwmark = nfct_get_attr_u32(ctEntry->ct, ATTR_MARK);
+
+	if (!(ctEntry->fpp_dir & ORIGINATOR))
+		cmd.flags |= CTCMD_FLAGS_ORIG_DISABLED;
+
+	if (!(ctEntry->fpp_dir & REPLIER))
+		cmd.flags |= CTCMD_FLAGS_REP_DISABLED;
+
+	cmm_print(DEBUG_INFO, "%s: protocol=%d, fwmark=0x%x\n", __func__, cmd.protocol, cmd.fwmark);
+	cmm_print(DEBUG_INFO, "  Saddr=%s, Daddr=%s, Sport=%d, Dport=%d\n",
+		  inet_ntop(AF_INET, &cmd.saddr, saddr_buf, sizeof(saddr_buf)),
+			    inet_ntop(AF_INET, &cmd.daddr, daddr_buf, sizeof(daddr_buf)),
+				      ntohs(cmd.sport), ntohs(cmd.dport));
+
+	cmm_print(DEBUG_INFO, "  SaddrReply=%s, DaddrReply=%s, SportReply=%d, DportReply=%d\n",
+		  inet_ntop(AF_INET, &cmd.saddr_reply, saddr_buf, sizeof(saddr_buf)),
+			    inet_ntop(AF_INET, &cmd.daddr_reply, daddr_buf, sizeof(daddr_buf)),
+				      ntohs(cmd.sport_reply), ntohs(cmd.dport_reply));
+
+	if (action != FPP_ACTION_DEREGISTER)
+	{
+		/**
+		 * We must check to see if the queue and DSCP marking parameters were applied to the
+		 * correct direction.  When the connection was established, we assume that the orig
+		 * direction is upstream (output port = WAN).  If this is not true, then we must swap
+		 * the queue and DSCP marking parameters with the twin connection.
+		 */
+
+		if ( (cmd.fwmark & 0x80000000) &&
+			(((ctEntry->fpp_dir & ORIGINATOR) &&
+			(is_wan_port_ifindex(nfct_get_attr_u32(ctEntry->ct, ATTR_ORIG_COMCERTO_FP_IIF)) &&
+			!is_wan_port_ifindex(ctEntry->orig.route->oifindex))) ||
+		     	((ctEntry->fpp_dir & REPLIER) &&
+			(!is_wan_port_ifindex(nfct_get_attr_u32(ctEntry->ct, ATTR_REPL_COMCERTO_FP_IIF)) &&
+			is_wan_port_ifindex(ctEntry->rep.route->oifindex))))
+			)
+		{
+			unsigned int fwmark_lo, fwmark_hi;
+			fwmark_lo = cmd.fwmark & 0xFFFF;
+			fwmark_hi = (cmd.fwmark >> 16) & 0xFFFF;
+			cmd.fwmark = ((fwmark_hi & 0x7fff) | (fwmark_lo & 0x8000)) | ((fwmark_lo & 0x7fff) << 16) | 0x80000000;
+		}
+
+		if (ctEntry->fEntryOrig)
+		{
+			cmd.format |= CT_SECURE;
+			cmd.sa_nr = ctEntry->fEntryOrig->sa_nr;
+			memcpy(cmd.sa_handle, ctEntry->fEntryOrig->sa_handle, ctEntry->fEntryOrig->sa_nr * sizeof(unsigned short));
+		}
+
+		if (ctEntry->fEntryRep)
+		{
+			cmd.format |= CT_SECURE;
+			cmd.sa_reply_nr = ctEntry->fEntryRep->sa_nr;
+			memcpy(cmd.sa_reply_handle, ctEntry->fEntryRep->sa_handle, ctEntry->fEntryRep->sa_nr * sizeof(unsigned short));
+		}
+
+		if (cmd.format & CT_SECURE)
+		{
+			cmm_print(DEBUG_INFO, "IPv4 conntrack secure Orig SAh(%d): %x Repl SAh(%d): %x\n",
+					cmd.sa_nr, cmd.sa_handle[0], cmd.sa_reply_nr, cmd.sa_reply_handle[0]);
+
+			cmd_size = sizeof(fpp_ct_ex_cmd_t);
+		}
+
+
+		if (ctEntry->orig_tunnel.fpp_route)
+		{
+			cmd.format |= CT_ORIG_TUNNEL_4o6;
+			cmd.tunnel_route_id = ctEntry->orig_tunnel.fpp_route_id;
+		}
+
+		if (ctEntry->rep_tunnel.fpp_route)
+		{
+			cmd.format |= CT_REPL_TUNNEL_4o6;
+			cmd.tunnel_route_id_reply = ctEntry->rep_tunnel.fpp_route_id;
+
+		}
+
+		if (cmd.format & (CT_ORIG_TUNNEL_4o6 | CT_REPL_TUNNEL_4o6)) 
+			cmd_size = sizeof(fpp_ct_ex_cmd_t);
+
+
+		cmd.route_id = ctEntry->orig.fpp_route_id;
+		cmd.route_id_reply = ctEntry->rep.fpp_route_id;
+	}
+
+	switch (action)
+	{
+	case FPP_ACTION_REGISTER:
+
+		// Send message to forward engine
+		cmm_print(DEBUG_COMMAND, "Send CMD_IPV4_CONNTRACK ACTION_REGISTER\n");
+
+		ret = fci_write(fci_handler, FPP_CMD_IPV4_CONNTRACK, cmd_size, (unsigned short *) &cmd);
+
+		if ((ret == FPP_ERR_OK) || (ret == FPP_ERR_CT_ENTRY_ALREADY_REGISTERED))
+		{
+			if (ctEntry->fEntryOrig)
+			{
+				ctEntry->fEntryOrig->flags |= FPP_PROGRAMMED;
+				ctEntry->fEntryOrig->flags &= ~FPP_NEEDS_UPDATE;
+			}
+
+			if (ctEntry->fEntryRep)
+			{
+				ctEntry->fEntryRep->flags |= FPP_PROGRAMMED;
+				ctEntry->fEntryRep->flags &= ~FPP_NEEDS_UPDATE;
+			}
+
+			ctEntry->flags |= FPP_PROGRAMMED;
+			ctEntry->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "Error %d while sending CMD_IPV4_CONNTRACK, ACTION_REGISTER\n", ret);
+			goto err;
+		}
+
+		break;
+
+	case FPP_ACTION_UPDATE:
+		cmm_print(DEBUG_COMMAND, "Send CMD_IPV4_CONNTRACK ACTION_UPDATE\n");
+
+		ret = fci_write(fci_handler, FPP_CMD_IPV4_CONNTRACK, cmd_size, (unsigned short *) &cmd);
+		if (ret == FPP_ERR_OK)
+		{
+			if (ctEntry->fEntryOrig)
+				ctEntry->fEntryOrig->flags &= ~FPP_NEEDS_UPDATE;
+
+			if (ctEntry->fEntryRep)
+				ctEntry->fEntryRep->flags &= ~FPP_NEEDS_UPDATE;
+
+			ctEntry->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "Error %d while sending CMD_IPV4_CONNTRACK, ACTION_UPDATE\n", ret);
+			goto err;
+		}
+
+		break;
+
+	case FPP_ACTION_DEREGISTER:
+	default:
+		// Send message to forward engine
+		cmm_print(DEBUG_COMMAND, "Send CMD_IPV4_CONNTRACK ACTION_DEREGISTER\n");
+
+		ret = fci_write(fci_handler, FPP_CMD_IPV4_CONNTRACK, sizeof(fpp_ct_cmd_t), (unsigned short *) &cmd);
+		if ((ret == FPP_ERR_OK) || (ret == FPP_ERR_CT_ENTRY_NOT_FOUND))
+		{
+			if (ctEntry->fEntryOrig)
+				ctEntry->fEntryOrig->flags &= ~FPP_PROGRAMMED;
+
+			if (ctEntry->fEntryRep)
+				ctEntry->fEntryRep->flags &= ~FPP_PROGRAMMED;
+
+			ctEntry->flags &= ~FPP_PROGRAMMED;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "Error %d while sending CMD_IPV4_CONNTRACK, ACTION_DEREGISTER\n", ret);
+			goto err;
+		}
+
+		break;
+	}
+
+	return 0;
+
+err:
+	return -1;
+}
+
+/*****************************************************************
+* cmmFeCtUpdate6
+*
+*
+******************************************************************/
+int cmmFeCtUpdate6(FCI_CLIENT *fci_handler, int action, struct ctTable *ctEntry)
+{
+	fpp_ct6_ex_cmd_t cmd;
+	int cmd_size = sizeof(fpp_ct6_cmd_t);
+	short ret;
+	char buf[INET6_ADDRSTRLEN], buf1[INET6_ADDRSTRLEN];
+
+	memset(&cmd, 0, sizeof(cmd));
+	cmd.action = action;
+	cmd.protocol = nfct_get_attr_u8(ctEntry->ct, ATTR_ORIG_L4PROTO);
+
+	memcpy(cmd.saddr, nfct_get_attr(ctEntry->ct, ATTR_ORIG_IPV6_SRC), 16);
+	memcpy(cmd.daddr, nfct_get_attr(ctEntry->ct, ATTR_ORIG_IPV6_DST), 16);
+	memcpy(cmd.saddr_reply, nfct_get_attr(ctEntry->ct, ATTR_REPL_IPV6_SRC), 16);
+	memcpy(cmd.daddr_reply, nfct_get_attr(ctEntry->ct, ATTR_REPL_IPV6_DST), 16);
+
+	cmd.sport = nfct_get_attr_u16(ctEntry->ct, ATTR_ORIG_PORT_SRC);
+	cmd.dport = nfct_get_attr_u16(ctEntry->ct, ATTR_ORIG_PORT_DST);
+	cmd.sport_reply = nfct_get_attr_u16(ctEntry->ct, ATTR_REPL_PORT_SRC);
+	cmd.dport_reply = nfct_get_attr_u16(ctEntry->ct, ATTR_REPL_PORT_DST);
+	cmd.fwmark = nfct_get_attr_u32(ctEntry->ct, ATTR_MARK);
+
+	cmd.route_id = ctEntry->orig.fpp_route_id;
+	cmd.route_id_reply = ctEntry->rep.fpp_route_id;
+
+	if (!(ctEntry->fpp_dir & ORIGINATOR))
+		cmd.flags |= CTCMD_FLAGS_ORIG_DISABLED;
+
+	if (!(ctEntry->fpp_dir & REPLIER))
+		cmd.flags |= CTCMD_FLAGS_REP_DISABLED;
+
+	cmm_print(DEBUG_INFO, "%s: protocol=%d, fwmark=0x%x\n", __func__, cmd.protocol, cmd.fwmark);
+	cmm_print(DEBUG_INFO, "  Saddr=%s, Daddr=%s, Sport=%d, Dport=%d\n",
+		  inet_ntop(AF_INET6, &cmd.saddr, buf, sizeof(buf)),
+			    inet_ntop(AF_INET6, &cmd.daddr, buf1, sizeof(buf1)),
+				      ntohs(cmd.sport), ntohs(cmd.dport));
+	cmm_print(DEBUG_INFO, "  SaddrReply=%s, DaddrReply=%s, SportReply=%d, DportReply=%d\n",
+		  inet_ntop(AF_INET6, &cmd.saddr_reply, buf, sizeof(buf)),
+			    inet_ntop(AF_INET6, &cmd.daddr_reply, buf1, sizeof(buf1)),
+				      ntohs(cmd.sport_reply), ntohs(cmd.dport_reply));
+
+	if (action != FPP_ACTION_DEREGISTER)
+	{
+		/**
+		 * We must check to see if the queue and DSCP marking parameters were applied to the
+		 * correct direction.  When the connection was established, we assume that the orig
+		 * direction is upstream (output port = WAN).  If this is not true, then we must swap
+		 * the queue and DSCP marking parameters with the twin connection.
+		 */
+
+		if ( (cmd.fwmark & 0x80000000) &&
+			(((ctEntry->fpp_dir & ORIGINATOR) &&
+			(is_wan_port_ifindex(nfct_get_attr_u32(ctEntry->ct, ATTR_ORIG_COMCERTO_FP_IIF)) &&
+			!is_wan_port_ifindex(ctEntry->orig.route->oifindex))) ||
+		     	((ctEntry->fpp_dir & REPLIER) &&
+			(!is_wan_port_ifindex(nfct_get_attr_u32(ctEntry->ct, ATTR_REPL_COMCERTO_FP_IIF)) &&
+			is_wan_port_ifindex(ctEntry->rep.route->oifindex))))
+			)
+		{
+			unsigned int fwmark_lo, fwmark_hi;
+			fwmark_lo = cmd.fwmark & 0xFFFF;
+			fwmark_hi = (cmd.fwmark >> 16) & 0xFFFF;
+			cmd.fwmark = ((fwmark_hi & 0x7fff) | (fwmark_lo & 0x8000)) | ((fwmark_lo & 0x7fff) << 16) | 0x80000000;
+		}
+
+		if (ctEntry->fEntryOrig) {
+			cmd.format |= CT_SECURE;
+			cmd.sa_nr = ctEntry->fEntryOrig->sa_nr;
+			memcpy(cmd.sa_handle, ctEntry->fEntryOrig->sa_handle, ctEntry->fEntryOrig->sa_nr * sizeof(unsigned short));
+		}
+
+		if (ctEntry->fEntryRep) {
+			cmd.format |= CT_SECURE;
+			cmd.sa_reply_nr = ctEntry->fEntryRep->sa_nr;
+			memcpy(cmd.sa_reply_handle, ctEntry->fEntryRep->sa_handle, ctEntry->fEntryRep->sa_nr * sizeof(unsigned short));
+		}
+
+		if (cmd.format & CT_SECURE) {
+			cmm_print(DEBUG_INFO, "IPv6 conntrack secure Orig SAh(%d): %x Repl SAh(%d): %x\n",
+					cmd.sa_nr, cmd.sa_handle[0], cmd.sa_reply_nr, cmd.sa_reply_handle[0]);
+
+			cmd_size = sizeof(fpp_ct6_ex_cmd_t);
+		}
+
+		if (ctEntry->orig_tunnel.fpp_route)
+		{
+			cmd.format |= CT_ORIG_TUNNEL_SIT;
+			cmd.tunnel_route_id = ctEntry->orig_tunnel.fpp_route_id;
+		}
+
+		if (ctEntry->rep_tunnel.fpp_route)
+		{
+			cmd.format |= CT_REPL_TUNNEL_SIT;
+			cmd.tunnel_route_id_reply = ctEntry->rep_tunnel.fpp_route_id;
+		}
+
+		if (cmd.format & (CT_ORIG_TUNNEL_SIT | CT_REPL_TUNNEL_SIT)) {
+			cmm_print(DEBUG_INFO, "IPv6 tunnel route id orig(%x) repl(%x)\n",
+						cmd.tunnel_route_id,
+						cmd.tunnel_route_id_reply);
+
+			cmd_size = sizeof(fpp_ct6_ex_cmd_t);
+		}
+	}
+
+	switch (action)
+	{
+	case FPP_ACTION_REGISTER:
+
+		// Send message to forward engine
+		cmm_print(DEBUG_COMMAND, "Send CMD_IPV6_CONNTRACK ACTION_REGISTER\n");
+
+		ret = fci_write(fci_handler, FPP_CMD_IPV6_CONNTRACK, cmd_size, (unsigned short *) &cmd);
+
+		if ((ret == FPP_ERR_OK) || (ret == FPP_ERR_CT_ENTRY_ALREADY_REGISTERED))
+		{
+			if (ctEntry->fEntryOrig)
+			{
+				ctEntry->fEntryOrig->flags |= FPP_PROGRAMMED;
+				ctEntry->fEntryOrig->flags &= ~FPP_NEEDS_UPDATE;
+			}
+
+			if (ctEntry->fEntryRep)
+			{
+				ctEntry->fEntryRep->flags |= FPP_PROGRAMMED;
+				ctEntry->fEntryRep->flags &= ~FPP_NEEDS_UPDATE;
+			}
+
+			ctEntry->flags |= FPP_PROGRAMMED;
+			ctEntry->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "Error %d while sending CMD_IPV6_CONNTRACK, ACTION_REGISTER\n", ret);
+			goto err;
+		}
+
+		break;
+
+	case FPP_ACTION_UPDATE:
+		cmm_print(DEBUG_COMMAND, "Send CMD_IPV6_CONNTRACK ACTION_UPDATE\n");
+
+		ret = fci_write(fci_handler, FPP_CMD_IPV6_CONNTRACK, cmd_size, (unsigned short *) &cmd);
+		if (ret == FPP_ERR_OK)
+		{
+			if (ctEntry->fEntryOrig)
+				ctEntry->fEntryOrig->flags &= ~FPP_NEEDS_UPDATE;
+
+			if (ctEntry->fEntryRep)
+				ctEntry->fEntryRep->flags &= ~FPP_NEEDS_UPDATE;
+
+			ctEntry->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "Error %d while sending CMD_IPV6_CONNTRACK, ACTION_UPDATE\n", ret);
+			goto err;
+		}
+
+		break;
+
+	case FPP_ACTION_DEREGISTER:
+	default:
+		// Send message to forward engine
+		cmm_print(DEBUG_COMMAND, "Send CMD_IPV6_CONNTRACK ACTION_DEREGISTER\n");
+		ret = fci_write(fci_handler, FPP_CMD_IPV6_CONNTRACK, sizeof(fpp_ct6_cmd_t), (unsigned short *) &cmd);
+		if ((ret == FPP_ERR_OK) || (ret == FPP_ERR_CT_ENTRY_NOT_FOUND))
+		{
+			if (ctEntry->fEntryOrig)
+				ctEntry->fEntryOrig->flags &= ~FPP_PROGRAMMED;
+
+			if (ctEntry->fEntryRep)
+				ctEntry->fEntryRep->flags &= ~FPP_PROGRAMMED;
+
+			ctEntry->flags &= ~FPP_PROGRAMMED;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "Error %d while sending CMD_IPV6_CONNTRACK, ACTION_DEREGISTER\n", ret);
+			goto err;
+		}
+
+		break;
+	}
+
+	return 0;
+
+err:
+	return -1;
+}
+
+
+/*****************************************************************
+* cmmFeCtChange4
+*
+*
+******************************************************************/
+static void cmmFeCtChange4(struct cmm_ct *ctx, fpp_ct_cmd_t* cmd, int len)
+{
+	struct nf_conntrack *ctTemp;
+	struct ctTable *ctEntry;
+
+	if (len < sizeof(fpp_ct_cmd_t))
+	{
+		cmm_print(DEBUG_ERROR, "%s: wrong length(%d) CMD_IPV4_CONNTRACK_CHANGE\n", __func__, len);
+		return;
+	}
+
+	ctTemp = nfct_new();
+	nfct_set_attr_u8(ctTemp, ATTR_ORIG_L4PROTO, cmd->protocol);
+	nfct_set_attr_u8(ctTemp, ATTR_ORIG_L3PROTO, AF_INET);
+	nfct_set_attr_u32(ctTemp, ATTR_ORIG_IPV4_SRC, cmd->saddr);
+	nfct_set_attr_u32(ctTemp, ATTR_ORIG_IPV4_DST, cmd->daddr);
+	nfct_set_attr_u32(ctTemp, ATTR_REPL_IPV4_SRC, cmd->saddr_reply);
+	nfct_set_attr_u32(ctTemp, ATTR_REPL_IPV4_DST, cmd->daddr_reply);
+
+	nfct_set_attr_u16(ctTemp, ATTR_ORIG_PORT_SRC, cmd->sport);
+	nfct_set_attr_u16(ctTemp, ATTR_ORIG_PORT_DST, cmd->dport);
+	nfct_set_attr_u16(ctTemp, ATTR_REPL_PORT_SRC, cmd->sport_reply);
+	nfct_set_attr_u16(ctTemp, ATTR_REPL_PORT_DST, cmd->dport_reply);
+
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&ctMutex);
+
+	switch (cmd->action)
+	{
+	case FPP_ACTION_REMOVED:
+
+		// We have to remove the conntrack in the conntrack table
+		if (!(ctEntry = __cmmCtFind(ctTemp)))
+		{
+			cmm_print(DEBUG_WARNING, "%s: conntrack not found\n", __func__);
+			goto end;
+		}
+
+		cmm_print(DEBUG_COMMAND, "%s: CMD_IPV4_CONNTRACK_CHANGE, ACTION_REMOVED\n", __func__);
+
+		ctEntry->flags &= ~FPP_PROGRAMMED;
+
+		cmmCtNetlinkRemove(ctx->handle, ctEntry->ct);
+		ct_stats.removed++;
+		____cmmCtDeregister(ctx->fci_handle, ctx->fci_key_handle, ctEntry);
+
+		break;
+
+	case FPP_ACTION_TCP_FIN:
+
+		// We have to remove the conntrack in the conntrack table
+		if (!(ctEntry = __cmmCtFind(ctTemp)))
+		{
+			cmm_print(DEBUG_WARNING, "%s: conntrack not found\n", __func__);
+			goto end;
+		}
+
+		cmm_print(DEBUG_COMMAND, "%s: CMD_IPV4_CONNTRACK_CHANGE, ACTION_TCP_FIN\n", __func__);
+
+		ctEntry->flags &= ~FPP_PROGRAMMED;
+
+		break;
+
+	default:
+		cmm_print(DEBUG_ERROR, "%s: unsupported action(%d) for CMD_IPV4_CONNTRACK_CHANGE\n", __func__, cmd->action);
+		break;
+	}
+
+end:
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	nfct_destroy(ctTemp);
+}
+
+/*****************************************************************
+* cmmFeCtChange6
+*
+*
+******************************************************************/
+static void cmmFeCtChange6(struct cmm_ct *ctx, fpp_ct6_cmd_t* cmd, int len)
+{
+	struct nf_conntrack *ctTemp;
+	struct ctTable *ctEntry;
+
+	if (len < sizeof(fpp_ct6_cmd_t))
+	{
+		cmm_print(DEBUG_ERROR, "%s: wrong length(%d) CMD_IPV6_CONNTRACK_CHANGE\n", __func__, len);
+		return;
+	}
+
+	ctTemp = nfct_new();
+	nfct_set_attr_u8(ctTemp, ATTR_ORIG_L4PROTO, cmd->protocol);
+	nfct_set_attr_u8(ctTemp, ATTR_ORIG_L3PROTO, AF_INET6);
+	nfct_set_attr(ctTemp, ATTR_ORIG_IPV6_SRC, &cmd->saddr[0]);
+	nfct_set_attr(ctTemp, ATTR_ORIG_IPV6_DST, &cmd->daddr[0]);
+
+	nfct_set_attr(ctTemp, ATTR_REPL_IPV6_SRC, &cmd->saddr_reply[0]);
+	nfct_set_attr(ctTemp, ATTR_REPL_IPV6_DST, &cmd->daddr_reply[0]);
+
+	nfct_set_attr_u16(ctTemp, ATTR_ORIG_PORT_SRC, cmd->sport);
+	nfct_set_attr_u16(ctTemp, ATTR_ORIG_PORT_DST, cmd->dport);
+	nfct_set_attr_u16(ctTemp, ATTR_REPL_PORT_SRC, cmd->sport_reply);
+	nfct_set_attr_u16(ctTemp, ATTR_REPL_PORT_DST, cmd->dport_reply);
+
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&ctMutex);
+
+	switch(cmd->action)
+	{
+	case FPP_ACTION_REMOVED:
+		// We have to remove the conntrack in the local table and also the one in the conntrack table
+
+		if (!(ctEntry = __cmmCtFind(ctTemp)))
+		{
+			cmm_print(DEBUG_WARNING, "%s: conntrack not found\n", __func__);
+			goto end;
+		}
+
+		cmm_print(DEBUG_COMMAND, "%s: CMD_IPV6_CONNTRACK_CHANGE, ACTION_REMOVED\n", __func__);
+
+		ctEntry->flags &= ~FPP_PROGRAMMED;
+
+		cmmCtNetlinkRemove(ctx->handle, ctEntry->ct);
+		ct_stats.removed++;
+		____cmmCtDeregister(ctx->fci_handle, ctx->fci_key_handle, ctEntry);
+
+		break;
+
+	case FPP_ACTION_TCP_FIN:
+
+		// We have to remove the conntrack in the conntrack table
+		if (!(ctEntry = __cmmCtFind(ctTemp)))
+		{
+			cmm_print(DEBUG_WARNING, "%s: conntrack not found\n", __func__);
+			goto end;
+		}
+
+		cmm_print(DEBUG_COMMAND, "%s: CMD_IPV6_CONNTRACK_CHANGE, ACTION_TCP_FIN\n", __func__);
+
+		ctEntry->flags &= ~FPP_PROGRAMMED;
+
+		break;
+
+	default:
+		cmm_print(DEBUG_ERROR, "%s: unsupported action(%d) for CMD_IPV6_CONNTRACK_CHANGE\n", __func__, cmd->action);
+		break;
+	}
+
+end:
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	nfct_destroy(ctTemp);
+}
+
+
+/*****************************************************************
+* __cmmFeRouteUpdate
+*
+*
+******************************************************************/
+int __cmmFeRouteUpdate(FCI_CLIENT* fci_handler, int action, struct fpp_rt *fpp_route)
+{
+	fpp_rt_cmd_t cmd;
+	short ret;
+
+	memset(&cmd, 0, sizeof(cmd));
+
+	cmd.action = action;
+	cmd.id = fpp_route->id;
+
+	if (action != FPP_ACTION_DEREGISTER)
+	{
+		memcpy(&cmd.dst_mac, fpp_route->dst_mac, 6);
+
+		if (fpp_route->dst_addr_len) {
+			if(fpp_route->dst_addr_len == 4 ) /* IPv4 Address Size */
+				cmd.flags |= FPP_IP_ROUTE_6o4;
+			else if(fpp_route->dst_addr_len == 16) /* IPv6 Address Size */
+				cmd.flags |= FPP_IP_ROUTE_4o6;
+			memcpy(&cmd.dst_addr, fpp_route->dst_addr, fpp_route->dst_addr_len);
+		}
+
+		if (__itf_get_name(fpp_route->oifindex, cmd.output_device, sizeof(cmd.output_device)) < 0)
+		{
+			cmm_print(DEBUG_ERROR, "%s: __itf_get_name(%d) failed\n", __func__, fpp_route->oifindex);
+
+			goto err;
+		}
+
+		cmd.mtu = fpp_route->mtu;
+	}
+
+	switch (action)
+	{
+	case FPP_ACTION_REGISTER:
+		cmm_print(DEBUG_COMMAND, "Send CMD_IP_ROUTE ACTION_REGISTER\n");
+
+		ret = fci_write(fci_handler, FPP_CMD_IP_ROUTE, sizeof(fpp_rt_cmd_t), (unsigned short *)&cmd);
+		if ((ret == FPP_ERR_OK) || (ret == FPP_ERR_RT_ENTRY_ALREADY_REGISTERED))
+		{
+			fpp_route->flags |= FPP_PROGRAMMED;
+			fpp_route->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "Error %d while sending CMD_IP_ROUTE, ACTION_REGISTER\n", ret);
+			goto err;
+		}
+
+		break;
+
+	case FPP_ACTION_UPDATE:
+		cmm_print(DEBUG_COMMAND, "Send CMD_IP_ROUTE ACTION_UPDATE\n");
+
+		ret = fci_write(fci_handler, FPP_CMD_IP_ROUTE, sizeof(fpp_rt_cmd_t), (unsigned short *)&cmd);
+		if (ret == FPP_ERR_OK)
+		{
+			fpp_route->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "Error %d while sending CMD_IP_ROUTE, ACTION_UPDATE\n", ret);
+		
+			goto err;
+		}
+
+		break;
+
+	case FPP_ACTION_DEREGISTER:
+	default:
+		cmm_print(DEBUG_COMMAND, "Send CMD_IP_ROUTE ACTION_DEREGISTER\n");
+
+		ret = fci_write(fci_handler, FPP_CMD_IP_ROUTE, sizeof(fpp_rt_cmd_t), (unsigned short *)&cmd);
+		if ((ret == FPP_ERR_OK) || (ret == FPP_ERR_RT_ENTRY_NOT_FOUND))
+		{
+			fpp_route->flags &= ~FPP_PROGRAMMED;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "Error %d while sending CMD_IP_ROUTE, ACTION_DEREGISTER\n", ret);
+			goto err;
+		}
+
+		break;
+	}
+
+	return 0;
+
+err:
+	return -1;
+}
+
+
+
+/*****************************************************************
+* cmmRtQueryProcess
+*
+*
+******************************************************************/
+int cmmRtQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int rcvBytes;
+	char rcvBuffer[256];
+	short rc;
+	int count = 0;
+	char dmac[MAC_ADDRSTRLEN];
+	fpp_rt_cmd_t *rtCmd = (fpp_rt_cmd_t *)rcvBuffer;
+
+	rtCmd->action = FPP_ACTION_QUERY;
+	rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_IP_ROUTE, rtCmd, sizeof(fpp_rt_cmd_t), rcvBuffer);
+	if (rcvBytes < sizeof(fpp_rt_cmd_t) + sizeof(unsigned short)) {
+
+		rc = (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer);
+
+		if (rc == FPP_ERR_UNKNOWN_ACTION) {
+			cmm_print(DEBUG_STDERR, "ERROR: FPP_CMD_IP_ROUTE does not support ACTION_QUERY\n");
+		} else if (rc == FPP_ERR_RT_ENTRY_NOT_FOUND) {
+			cmm_print(DEBUG_STDERR, "ERROR: FPP IP ROUTE table empty\n");
+		} else {
+			cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%d\n", rc);
+		}
+
+		return CLI_OK;
+        }
+
+	cmm_print(DEBUG_STDOUT, "IP ROUTE:\n");
+
+	do {
+		rtCmd->output_device[11] = '\0';
+
+		cmm_print(DEBUG_STDOUT, "%04d: Id: %x, Interface: %s, DST Mac: %s, Mtu: %d\n",
+			count,
+			rtCmd->id,
+			rtCmd->output_device,
+			mac_ntop(rtCmd->dst_mac, dmac, sizeof(dmac)),
+			rtCmd->mtu);
+
+		count++;
+
+		rtCmd->action = FPP_ACTION_QUERY_CONT;
+
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_IP_ROUTE, rtCmd, sizeof(fpp_rt_cmd_t), rcvBuffer);
+
+	} while (rcvBytes >= sizeof(fpp_rt_cmd_t) + sizeof(unsigned short));
+
+	cmm_print(DEBUG_STDOUT, "Total FPP Route Entries: %d\n", count);
+        
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmCtQueryProcess
+*
+*
+******************************************************************/
+int cmmCtQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+        int rcvBytes = 0;
+        char rcvBuffer[256];
+	char output_buf[256];
+        short rc;
+        int count = 0,i,len =0;
+        cmmd_ct_ex_cmd_t *ctCmd = (cmmd_ct_ex_cmd_t *)rcvBuffer;
+        struct nf_conntrack *ctTemp;
+	char saddr_buf[INET_ADDRSTRLEN], daddr_buf[INET_ADDRSTRLEN];
+       
+        ctCmd->action = CMMD_ACTION_QUERY;
+	ctCmd->format = 0;
+	ctCmd->sa_nr  = 0;
+  	ctCmd->sa_reply_nr = 0;
+        rcvBytes = cmmSendToDaemon(daemon_handle, CMMD_CMD_IPV4_CONNTRACK, ctCmd, sizeof(cmmd_ct_ex_cmd_t), rcvBuffer);
+        if (rcvBytes < sizeof(cmmd_ct_ex_cmd_t) + sizeof(unsigned short)) {
+            rc = (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer);
+            if (rc == FPP_ERR_UNKNOWN_ACTION) {
+                cmm_print(DEBUG_STDERR, "ERROR: FPP CMM_IPV4_CONNTRACK does not support ACTION_QUERY\n");
+            } else if (rc == FPP_ERR_CT_ENTRY_NOT_FOUND) {
+                cmm_print(DEBUG_STDERR, "ERROR: FPP IPV4 CONNTRACK table empty\n");
+            } else {
+                cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%d\n", rc);
+            }
+            return CLI_OK;
+        }
+        ctTemp = nfct_new();
+        cmm_print(DEBUG_STDOUT, "IPv4 Connections:\n");
+        do {
+            nfct_set_attr_u8(ctTemp, ATTR_ORIG_L4PROTO, ctCmd->protocol);
+
+            nfct_set_attr_u32(ctTemp, ATTR_ORIG_IPV4_SRC, ctCmd->saddr);
+            nfct_set_attr_u32(ctTemp, ATTR_ORIG_IPV4_DST, ctCmd->daddr);
+
+            nfct_set_attr_u32(ctTemp, ATTR_REPL_IPV4_SRC, ctCmd->saddr_reply);
+            nfct_set_attr_u32(ctTemp, ATTR_REPL_IPV4_DST, ctCmd->daddr_reply);
+
+            nfct_set_attr_u16(ctTemp, ATTR_ORIG_PORT_SRC, ctCmd->sport);
+            nfct_set_attr_u16(ctTemp, ATTR_ORIG_PORT_DST, ctCmd->dport);
+            nfct_set_attr_u16(ctTemp, ATTR_REPL_PORT_SRC, ctCmd->sport_reply);
+            nfct_set_attr_u16(ctTemp, ATTR_REPL_PORT_DST, ctCmd->dport_reply);
+            nfct_set_attr_u32(ctTemp, ATTR_MARK, ctCmd->fwmark);
+
+            //nfct_snprintf(buf, 500, ctTemp, NFCT_T_UNKNOWN, NFCT_O_PLAIN, NFCT_OF_SHOW_LAYER3);
+            //cmm_print(DEBUG_STDOUT, "%04d: %s\n", count, buf);
+            cmm_print(DEBUG_STDOUT, "%04d: protocol=%d, fwmark=0x%x\n", count, ctCmd->protocol, ctCmd->fwmark);
+            cmm_print(DEBUG_STDOUT, "  Init:  Saddr=%s, Daddr=%s, Sport=%d, Dport=%d\n",
+                      inet_ntop(AF_INET, &ctCmd->saddr, saddr_buf, sizeof(saddr_buf)),
+                      inet_ntop(AF_INET, &ctCmd->daddr, daddr_buf, sizeof(daddr_buf)),
+                      ntohs(ctCmd->sport), ntohs(ctCmd->dport));
+            cmm_print(DEBUG_STDOUT, "  Reply: Saddr=%s, Daddr=%s, Sport=%d, Dport=%d\n",
+                      inet_ntop(AF_INET, &ctCmd->saddr_reply, saddr_buf, sizeof(saddr_buf)),
+                      inet_ntop(AF_INET, &ctCmd->daddr_reply, daddr_buf, sizeof(daddr_buf)),
+                      ntohs(ctCmd->sport_reply), ntohs(ctCmd->dport_reply));
+            
+            if (ctCmd->format)
+	    {
+		len += snprintf(output_buf+len,256-len, "IPSEC(Init:sa_nr=%d HO:",
+							ctCmd->sa_nr);
+                for (i =0; i< ctCmd->sa_nr;i++)
+		    len += snprintf(output_buf+len ,256-len, "%x:",  ctCmd->sa_handle[i]);
+		len +=  snprintf(output_buf+len,256-len,") ");
+		len += snprintf(output_buf+len, 256-len,"(Reply:sa_nr=%d HO:",
+						ctCmd->sa_reply_nr);
+                for (i =0; i< ctCmd->sa_reply_nr;i++)
+		    len += snprintf(output_buf+len ,256-len,"%x:", 
+						ctCmd->sa_reply_handle[i]);
+		len +=  snprintf(output_buf+len,256-len,") ");
+	        cmm_print(DEBUG_STDOUT,"%s",output_buf);
+	        len = 0;	
+	    }
+
+            count++;
+            ctCmd->action = CMMD_ACTION_QUERY_CONT;
+	    ctCmd->format = 0;
+	    ctCmd->sa_nr  = 0;
+  	    ctCmd->sa_reply_nr = 0;
+            rcvBytes = cmmSendToDaemon(daemon_handle, CMMD_CMD_IPV4_CONNTRACK, ctCmd, sizeof(cmmd_ct_ex_cmd_t), rcvBuffer);
+        } while (rcvBytes >= sizeof(cmmd_ct_ex_cmd_t) + sizeof(unsigned short));
+        cmm_print(DEBUG_STDOUT, "Total Connection Entries: %d\n", count);
+
+        nfct_destroy(ctTemp);
+        return CLI_OK;
+}
+
+/*****************************************************************
+ * * cmmCt6QueryProcess
+ * *
+ * *
+ * ******************************************************************/
+int cmmCt6QueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+        int rcvBytes = 0;
+        char rcvBuffer[256];
+        char output_buf[256];
+        short rc;
+        int count = 0,len=0;
+        cmmd_ct6_ex_cmd_t *ctCmd = (cmmd_ct6_ex_cmd_t *)rcvBuffer;
+        struct nf_conntrack *ctTemp;
+        char saddr_buf[INET6_ADDRSTRLEN], daddr_buf[INET6_ADDRSTRLEN];
+
+        ctCmd->action = CMMD_ACTION_QUERY;
+	ctCmd->format = 0;
+        ctCmd->sa_nr  = 0;
+        ctCmd->sa_reply_nr = 0;
+
+        rcvBytes = cmmSendToDaemon(daemon_handle, CMMD_CMD_IPV6_CONNTRACK, ctCmd, 
+                                           sizeof(cmmd_ct6_ex_cmd_t), rcvBuffer);
+        if (rcvBytes < sizeof(cmmd_ct6_ex_cmd_t) + sizeof(unsigned short)) {
+            rc = (rcvBytes < sizeof(unsigned short) ) ? 0 : 
+                                                 *((unsigned short *) rcvBuffer);
+            if (rc == CMMD_ERR_UNKNOWN_ACTION) {
+                cmm_print(DEBUG_STDERR, 
+                  "ERROR: FPP CMM_IPV6_CONNTRACK does not support ACTION_QUERY\n");
+            } else if (rc == FPP_ERR_CT_ENTRY_NOT_FOUND) {
+                cmm_print(DEBUG_STDERR, "ERROR: FPP IPV6 CONNTRACK table empty\n");
+            } else {
+                cmm_print(DEBUG_STDERR, 
+                         "ERROR: Unexpected result returned from FPP rc:%d\n", rc);
+            }
+            return CLI_OK;
+        }
+        ctTemp = nfct_new();
+        cmm_print(DEBUG_STDOUT, "IPv6 Connections:\n");
+        do {
+            nfct_set_attr_u8(ctTemp, ATTR_ORIG_L4PROTO, ctCmd->protocol);
+
+            nfct_set_attr(ctTemp, ATTR_ORIG_IPV6_SRC, &ctCmd->saddr[0]);
+            nfct_set_attr(ctTemp, ATTR_ORIG_IPV6_DST, &ctCmd->daddr[0]);
+
+            nfct_set_attr(ctTemp, ATTR_REPL_IPV6_SRC, &ctCmd->saddr_reply[0]);
+            nfct_set_attr(ctTemp, ATTR_REPL_IPV6_DST, &ctCmd->daddr_reply[0]);
+
+            nfct_set_attr_u16(ctTemp, ATTR_ORIG_PORT_SRC, ctCmd->sport);
+            nfct_set_attr_u16(ctTemp, ATTR_ORIG_PORT_DST, ctCmd->dport);
+            nfct_set_attr_u16(ctTemp, ATTR_REPL_PORT_SRC, ctCmd->sport_reply);
+            nfct_set_attr_u16(ctTemp, ATTR_REPL_PORT_DST, ctCmd->dport_reply);
+            nfct_set_attr_u32(ctTemp, ATTR_MARK, ctCmd->fwmark);
+
+            
+            cmm_print(DEBUG_STDOUT, "%04d: protocol=%d, fwmark=0x%x\n", 
+                                            count, ctCmd->protocol, ctCmd->fwmark);
+            cmm_print(DEBUG_STDOUT, "  Init:  Saddr=%s, Daddr=%s, Sport=%d, Dport=%d\n",
+                      inet_ntop(AF_INET6, &ctCmd->saddr, saddr_buf, sizeof(saddr_buf)),
+                      inet_ntop(AF_INET6, &ctCmd->daddr, daddr_buf, sizeof(daddr_buf)),
+                      ntohs(ctCmd->sport), ntohs(ctCmd->dport));
+            cmm_print(DEBUG_STDOUT, "  Reply: Saddr=%s, Daddr=%s, Sport=%d, Dport=%d\n",
+                     inet_ntop(AF_INET6, &ctCmd->saddr_reply, saddr_buf, sizeof(saddr_buf)),
+                     inet_ntop(AF_INET6, &ctCmd->daddr_reply, daddr_buf, sizeof(daddr_buf)),
+                     ntohs(ctCmd->sport_reply), ntohs(ctCmd->dport_reply));
+
+	    if (ctCmd->format & CT_SECURE)
+            {
+		int i;
+                len += snprintf(output_buf+len, 256-len,"IPSEC(Init:sa_nr=%d HO:",ctCmd->sa_nr);
+                for (i =0; i< ctCmd->sa_nr;i++)
+                    len += snprintf(output_buf+len ,256-len,"%x:", ctCmd->sa_handle[i]);
+		len +=  snprintf(output_buf+len,256-len,") ");
+                len += snprintf(output_buf+len,256-len," (Reply: sa_nr=%d HO:",
+					ctCmd->sa_reply_nr);
+                for (i =0; i< ctCmd->sa_reply_nr;i++)
+                    len += snprintf(output_buf+len,256-len,"%x:", 
+						ctCmd->sa_reply_handle[i]);
+		len +=  snprintf(output_buf+len,256-len,") ");
+	        cmm_print(DEBUG_STDOUT,output_buf);
+	        len = 0;	
+            }
+            count++;
+            ctCmd->action = CMMD_ACTION_QUERY_CONT;
+	    ctCmd->format = 0;
+            ctCmd->sa_nr  = 0;
+            ctCmd->sa_reply_nr = 0;
+            rcvBytes = cmmSendToDaemon(daemon_handle, CMMD_CMD_IPV6_CONNTRACK, ctCmd, 
+                                                 sizeof(cmmd_ct6_ex_cmd_t), rcvBuffer);
+	 } while (rcvBytes >= sizeof(cmmd_ct6_ex_cmd_t) + sizeof(unsigned short));
+        cmm_print(DEBUG_STDOUT, "Total Connection Entries: %d\n", count);
+
+        nfct_destroy(ctTemp);
+        return CLI_OK;
+}
+#ifdef AUTO_BRIDGE
+/*****************************************************************
+* cmmCtQueryProcess
+*
+*
+******************************************************************/
+int cmmL2FlowQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int rcvBytes = 0;
+	char rcvBuffer[256];
+	short rc;
+	int count = 0;
+	fpp_l2_bridge_flow_entry_cmd_t*cmd = (fpp_l2_bridge_flow_entry_cmd_t *)rcvBuffer;
+       
+	cmd->action = FPP_ACTION_QUERY;
+	
+	rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_RX_L2FLOW_ENTRY, cmd, sizeof(fpp_l2_bridge_flow_entry_cmd_t), rcvBuffer);
+	if (rcvBytes < sizeof(fpp_l2_bridge_flow_entry_cmd_t) + sizeof(unsigned short)) {
+		rc = (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer);
+		if (rc == FPP_ERR_UNKNOWN_ACTION) {
+			cmm_print(DEBUG_STDERR, "ERROR: FPP_CMD_RX_L2FLOW_ENTRY does not support ACTION_QUERY\n");
+		} else if (rc == FPP_ERR_BRIDGE_ENTRY_NOT_FOUND) {
+			cmm_print(DEBUG_STDERR, "ERROR: FPP L2flow table empty\n");
+		} else {
+			cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%d\n", rc);
+		}
+		return CLI_OK;
+	}
+
+        cmm_print(DEBUG_STDOUT, "L2 flows:\n");
+        do {
+		struct l2flow l2flow_tmp;
+		
+		memset(&l2flow_tmp, 0 , sizeof(l2flow_tmp));
+		memcpy(l2flow_tmp.saddr, cmd->srcaddr, ETH_ALEN);
+		memcpy(l2flow_tmp.daddr, cmd->destaddr, ETH_ALEN);
+		l2flow_tmp.ethertype = cmd->ethertype;
+		l2flow_tmp.vlan_tag =cmd->vlan_tag;
+		l2flow_tmp.session_id = cmd->session_id;
+		l2flow_tmp.l3.proto = cmd->proto;
+		memcpy(l2flow_tmp.l3.saddr.all, cmd->saddr, 16);
+		memcpy(l2flow_tmp.l3.daddr.all, cmd->daddr, 16);
+		l2flow_tmp.l4.sport = cmd->sport;
+		l2flow_tmp.l4.dport = cmd->dport;
+		
+		cmm_l2flow_print(DEBUG_STDOUT, &l2flow_tmp, 0);
+		cmm_print(DEBUG_STDOUT, "Input itf=%s ", cmd->input_name);
+		cmm_print(DEBUG_STDOUT, "Output itf=%s ", cmd->output_name);
+		cmm_print(DEBUG_STDOUT, "Timeout=%d s \n", cmd->timeout);
+
+		count++;
+		cmd->action = FPP_ACTION_QUERY_CONT;
+
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_RX_L2FLOW_ENTRY, cmd, sizeof(fpp_l2_bridge_flow_entry_cmd_t), rcvBuffer);
+	} while (rcvBytes >= sizeof(cmmd_ct_ex_cmd_t) + sizeof(unsigned short));
+	cmm_print(DEBUG_STDOUT, "Total Flow Entries: %d\n", count);
+
+	return CLI_OK;
+}
+#endif
+int cmmFeFFControl(FCI_CLIENT* fci_handler, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	fpp_ff_ctrl_cmd_t * cmd = (fpp_ff_ctrl_cmd_t *) cmd_buf;
+	int ret = 0;
+
+	res_buf[0] = CMMD_ERR_OK;
+	*res_len = 2;
+
+	if(cmd->enable)
+	{
+		if(!globalConf.ff_enable)
+		{
+			cmd->enable = 1;
+
+			// Send message to forward engine
+			cmm_print(DEBUG_COMMAND, "Send CMD_IPV4_FF_CONTROL cmd len=%d\n",sizeof(fpp_ff_ctrl_cmd_t));
+			ret = fci_cmd(fci_handler, FPP_CMD_IPV4_FF_CONTROL, (unsigned short *) cmd, sizeof(fpp_ff_ctrl_cmd_t), res_buf, res_len);
+			if (ret !=0 || res_buf[0] != FPP_ERR_OK)
+			{
+				if (ret != 0)
+					cmm_print(DEBUG_ERROR, "Error '%s' while trying to enable fast-forward\n", strerror(errno));
+				else
+					cmm_print(DEBUG_ERROR, "Error %d while trying to enable fast-forward\n", res_buf[0]);
+			}
+			else
+			{
+				globalConf.ff_enable = 1;
+				//zzz cmmSetTimeoutGlobal(globalConf.nfCtUpdateHandler, GLOBAL_SET_TIMEOUT_VALUE, FF_CT_TIMEOUT);
+				cmm_print(DEBUG_ERROR, "Fast-forward is enabled\n");
+			}
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "Fast-forward is already enabled\n");
+		}
+	}
+	else
+	{
+		if(globalConf.ff_enable)
+		{
+			cmd->enable = 0;
+
+			// Send message to forward engine
+			cmm_print(DEBUG_COMMAND, "Send CMD_IPV4_FF_CONTROL cmd len=%d\n",sizeof(fpp_ff_ctrl_cmd_t));
+			ret = fci_cmd(fci_handler, FPP_CMD_IPV4_FF_CONTROL, (unsigned short *) cmd, sizeof(fpp_ff_ctrl_cmd_t), res_buf, res_len);
+			if (ret !=0 || res_buf[0] != FPP_ERR_OK)
+			{
+				if (ret != 0)
+					cmm_print(DEBUG_ERROR, "Error '%s' while trying to enable fast-forward\n", strerror(errno));
+				else
+					cmm_print(DEBUG_ERROR, "Error %d while trying to enable fast-forward\n", res_buf[0]);
+			}
+			else
+			{
+				globalConf.ff_enable = 0;
+				//zzz cmmSetTimeoutGlobal(globalConf.nfCtUpdateHandler, GLOBAL_SET_TIMEOUT_LINUX, 0);
+				cmm_print(DEBUG_ERROR, "Fast-forward is disabled\n");
+			}
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "Fast-forward is already disabled\n");
+		}
+	}
+
+	return ret;
+}
+/*****************************************************************
+* cmmFeCatch
+*
+*
+******************************************************************/
+int cmmFeCatch(unsigned short fcode, unsigned short len, unsigned short *payload)
+{
+	switch (fcode)
+	{
+	case FPP_CMD_IPV4_CONNTRACK_CHANGE:
+		cmmFeCtChange4(&globalConf.ct, (fpp_ct_cmd_t*)payload, len);
+		break;
+
+	case FPP_CMD_IPV6_CONNTRACK_CHANGE:
+		cmmFeCtChange6(&globalConf.ct, (fpp_ct6_cmd_t*)payload, len);
+		break;
+
+	case FPP_CMD_IPSEC_SA_NOTIFY:
+		cmm_print(DEBUG_COMMAND, "CMD_IPSEC_SA_NOTIFY\n");
+		cmmIPSectoKeyEngine(globalConf.ct.fci_key_handle, fcode, len, payload);
+		break;
+#ifdef AUTO_BRIDGE
+	case FPP_CMD_RX_L2FLOW_ENTRY:
+		cmmFeL2FlowChange(&globalConf.ct, (fpp_l2_bridge_flow_entry_cmd_t*)payload, len);
+		break;
+#endif
+	default:
+		cmm_print(DEBUG_ERROR, "%s: Unknow command(%x) received\n", __func__, fcode);
+		break;
+	}
+
+	return FCI_CB_CONTINUE;
+}
+
diff --git a/cmm/src/forward_engine.h b/cmm/src/forward_engine.h
new file mode 100644
index 0000000..ba57c9c
--- /dev/null
+++ b/cmm/src/forward_engine.h
@@ -0,0 +1,147 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __FORWARD_ENGINE__
+#define __FORWARD_ENGINE__
+
+#include "keytrack.h"
+#include "conntrack.h"
+#include "jhash.h"
+#include "neighbor_resolution.h"
+#include "route_cache.h"
+#include "fpp.h"
+#include "fpp_private.h"
+#include "module_rx.h"
+
+	void cmmFeReset(FCI_CLIENT* fci_handle);
+
+	/* IPv4 */
+	int cmmFeCtUpdate4(FCI_CLIENT *fci_handle, int action, struct ctTable *ctEntry);
+
+	int __cmmFeRouteUpdate(FCI_CLIENT* fci_handle, int action, struct fpp_rt *route);
+
+	/* IPv6 */
+	int cmmFeCtUpdate6(FCI_CLIENT *fci_handle, int action, struct ctTable *ctEntry);
+
+        int cmmCt6QueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+	int cmmSAQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+	int cmmCtQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+	int cmmL2FlowQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+
+	int cmmFeCatch(unsigned short fcode, unsigned short len, unsigned short *payload);
+
+	/* command processors */
+	int cmmCtChangeProcess4(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+	int cmmCtChangeProcess6(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+
+	int cmmRtQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+
+	int cmmFeFFControl(FCI_CLIENT* fci_handle, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len);
+	int cmmFeL2FlowUpdate(FCI_CLIENT* fci_handler, int request, struct l2flowTable *l2flow);
+
+static inline int cmmFeRouteUpdate(FCI_CLIENT* fci_handle, int request, struct fpp_rt *fpp_route)
+{
+	int action;
+
+	switch (request)
+	{
+	default:
+	case (ADD | UPDATE):
+		if ((fpp_route->flags & (FPP_PROGRAMMED | FPP_NEEDS_UPDATE)) == FPP_PROGRAMMED)
+			goto out;
+
+		if ((fpp_route->flags & (FPP_PROGRAMMED | FPP_NEEDS_UPDATE)) == (FPP_PROGRAMMED | FPP_NEEDS_UPDATE))
+		{
+			action = FPP_ACTION_UPDATE;
+		}
+		else
+		{
+			action = FPP_ACTION_REGISTER;
+		}
+
+		break;
+
+	case UPDATE:
+		if (!((fpp_route->flags & FPP_PROGRAMMED) && (fpp_route->flags & FPP_NEEDS_UPDATE)))
+			goto out;
+
+		action = FPP_ACTION_UPDATE;
+
+		break;
+
+	case REMOVE:
+		if (!(fpp_route->flags & FPP_PROGRAMMED))
+			goto out;
+
+		action = FPP_ACTION_DEREGISTER;
+
+		break;
+	}
+
+	return __cmmFeRouteUpdate(fci_handle, action, fpp_route);
+
+out:
+	return 0;
+}
+
+
+static inline int cmmFeCtUpdate(FCI_CLIENT *fci_handle, int request, struct ctTable *ctEntry)
+{
+	int action;
+
+	switch (request) {
+	default:
+	case (ADD | UPDATE):
+		if (!(ctEntry->flags & FPP_PROGRAMMED))
+			action = FPP_ACTION_REGISTER;
+		else if (ctEntry->flags & FPP_NEEDS_UPDATE)
+			action = FPP_ACTION_UPDATE;
+		else if (ctEntry->fEntryOrig && (!(ctEntry->fEntryOrig->flags & FPP_PROGRAMMED) || (ctEntry->fEntryOrig->flags & FPP_NEEDS_UPDATE)))
+			action = FPP_ACTION_UPDATE;
+		else if (ctEntry->fEntryRep && (!(ctEntry->fEntryRep->flags & FPP_PROGRAMMED) || (ctEntry->fEntryRep->flags & FPP_NEEDS_UPDATE)))
+			action = FPP_ACTION_UPDATE;
+		else
+			goto out;
+
+		break;
+
+	case UPDATE:
+		if (!((ctEntry->flags & FPP_PROGRAMMED) && (ctEntry->flags & FPP_NEEDS_UPDATE)))
+			goto out;
+
+		action = FPP_ACTION_UPDATE;
+		break;
+
+	case REMOVE:
+		if (!(ctEntry->flags & FPP_PROGRAMMED))
+			goto out;
+
+		action = FPP_ACTION_DEREGISTER;
+		break;
+	}
+
+	if (ctEntry->family == AF_INET)
+		return cmmFeCtUpdate4(fci_handle, action, ctEntry);
+	else
+		return cmmFeCtUpdate6(fci_handle, action, ctEntry);
+
+out:
+	return 0;
+}
+
+#endif
diff --git a/cmm/src/fpp.h b/cmm/src/fpp.h
new file mode 100644
index 0000000..9fa3a39
--- /dev/null
+++ b/cmm/src/fpp.h
@@ -0,0 +1,1488 @@
+/*
+ *
+ *  Copyright (C) 2010 Mindspeed Technologies, Inc.
+ *
+ * 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 __FPP__
+#define __FPP__
+
+#include <pcap-bpf.h>
+#include <pcap.h>
+/*--------------------------------------- General ---------------------------*/
+/* Errors */
+#define FPP_ERR_OK                                      0
+#define FPP_ERR_UNKNOWN_COMMAND                         1
+#define FPP_ERR_WRONG_COMMAND_SIZE			2
+#define FPP_ERR_WRONG_COMMAND_PARAM			3
+#define FPP_ERR_UNKNOWN_ACTION                          4
+#define FPP_ERR_SA_ENTRY_NOT_FOUND                      909
+
+/*Actions used in severals commands*/
+#define FPP_ACTION_REGISTER     0
+#define FPP_ACTION_DEREGISTER   1
+#define FPP_ACTION_KEEP_ALIVE   2
+#define FPP_ACTION_REMOVED      3
+#define FPP_ACTION_UPDATE       4
+#define FPP_ACTION_QUERY        6
+#define FPP_ACTION_QUERY_CONT   7
+#define FPP_ACTION_QUERY_LOCAL  8
+#define FPP_ACTION_TCP_FIN      9
+
+/*----------------------------------Tunnels-----------------------------------*/
+#define FPP_ERR_TNL_ALREADY_CREATED			1004	
+
+/*------------------------------------- Sockets ------------------------------*/
+#define FPP_ERR_SOCK_ALREADY_OPEN			1200
+#define FPP_ERR_SOCKID_ALREADY_USED			1201
+#define FPP_ERR_SOCK_ALREADY_OPENED_WITH_OTHER_ID	1202
+#define FPP_ERR_TOO_MANY_SOCKET_OPEN			1203
+#define FPP_ERR_SOCKID_UNKNOWN				1204
+#define FPP_ERR_SOCK_ALREADY_IN_USE			1206
+#define FPP_ERR_RTP_CALLID_IN_USE 			1207
+#define FPP_ERR_RTP_UNKNOWN_CALL 			1208
+#define FPP_ERR_WRONG_SOCKID 				1209
+#define FPP_ERR_RTP_SPECIAL_PKT_LEN 			1210
+#define FPP_ERR_RTP_CALL_TABLE_FULL 			1211
+#define FPP_ERR_WRONG_SOCK_FAMILY 			1212
+#define FPP_ERR_WRONG_SOCK_PROTO 			1213
+#define FPP_ERR_WRONG_SOCK_TYPE 			1214
+
+
+typedef struct fpp_socket4_open_cmd {
+	u_int16_t id;
+	u_int8_t type;
+	u_int8_t mode;
+	u_int32_t saddr;
+	u_int32_t daddr;
+	u_int16_t sport;
+	u_int16_t dport;
+	u_int8_t proto;
+	u_int8_t queue;
+	u_int16_t dscp;
+	u_int32_t route_id;
+#ifdef COMCERTO_2000
+        u_int16_t secure;
+        u_int16_t sa_nr_rx;
+        u_int16_t sa_handle_rx[4];
+        u_int16_t sa_nr_tx;
+        u_int16_t sa_handle_tx[4];
+	u_int16_t pad;
+#endif
+} __attribute__((__packed__)) fpp_socket4_open_cmd_t;
+
+typedef struct fpp_socket4_update_cmd {
+	u_int16_t id;
+	u_int16_t rsvd1;
+	u_int32_t saddr;
+	u_int16_t sport;
+	u_int8_t rsvd2;
+	u_int8_t queue;
+	u_int16_t dscp;
+	u_int16_t pad;
+	u_int32_t route_id;
+#ifdef COMCERTO_2000
+        u_int16_t secure;
+        u_int16_t sa_nr_rx;
+        u_int16_t sa_handle_rx[4];
+        u_int16_t sa_nr_tx;
+        u_int16_t sa_handle_tx[4];
+	u_int16_t pad2;
+#endif
+} __attribute__((__packed__)) fpp_socket4_update_cmd_t;
+
+typedef struct fpp_socket4_close_cmd {
+	u_int16_t id;
+	u_int16_t pad1;
+} __attribute__((__packed__)) fpp_socket4_close_cmd_t;
+
+typedef struct fpp_socket6_open_cmd {
+	u_int16_t id;
+	u_int8_t type;
+	u_int8_t mode;
+	u_int32_t saddr[4];
+	u_int32_t daddr[4];
+	u_int16_t sport;
+	u_int16_t dport;
+	u_int8_t proto;
+	u_int8_t queue;
+	u_int16_t dscp;
+	u_int32_t route_id;
+#ifdef COMCERTO_2000
+        u_int16_t secure;
+        u_int16_t sa_nr_rx;
+        u_int16_t sa_handle_rx[4];
+        u_int16_t sa_nr_tx;
+        u_int16_t sa_handle_tx[4];
+	u_int16_t pad;
+#endif
+} __attribute__((__packed__)) fpp_socket6_open_cmd_t;
+
+typedef struct fpp_socket6_update_cmd {
+	u_int16_t id;
+	u_int16_t rsvd1;
+	u_int32_t saddr[4];
+	u_int16_t sport;
+	u_int8_t rsvd2;
+	u_int8_t queue;
+	u_int16_t dscp;
+	u_int16_t pad;
+	u_int32_t route_id;
+#ifdef COMCERTO_2000
+        u_int16_t secure;
+        u_int16_t sa_nr_rx;
+        u_int16_t sa_handle_rx[4];
+        u_int16_t sa_nr_tx;
+        u_int16_t sa_handle_tx[4];
+	u_int16_t pad2;
+#endif
+} __attribute__((__packed__)) fpp_socket6_update_cmd_t;
+
+typedef struct fpp_socket6_close_cmd {
+	u_int16_t id;
+	u_int16_t pad1;
+} __attribute__((__packed__)) fpp_socket6_close_cmd_t;
+
+/*------------------------------------- Tunnel -------------------------------*/
+#define FPP_ERR_TNL_ENTRY_NOT_FOUND                     1001
+
+/*------------------------------------- Protocols ----------------------------*/
+typedef enum fpp_proto {
+        FPP_PROTO_IPV4 = 0,
+        FPP_PROTO_IPV6,
+        FPP_PROTO_PPPOE,
+        FPP_PROTO_MC4,
+        FPP_PROTO_MC6
+} fpp_proto_t;
+
+/*------------------------------------- Multicast ----------------------------*/
+#define FPP_ERR_MC_ENTRY_NOT_FOUND			700
+
+/*------------------------------------ Conntrack -----------------------------*/
+#define FPP_ERR_CT_ENTRY_ALREADY_REGISTERED		100
+#define FPP_ERR_CT_ENTRY_NOT_FOUND			101
+
+#define FPP_CMD_IPV4_CONNTRACK				0x0314
+#define FPP_CMD_IPV6_CONNTRACK          		0x0414
+
+/*Structure representing the command sent to add or remove a Conntrack*/
+typedef struct fpp_ct_cmd {
+	u_int16_t action;                       /*Action to perform*/
+	u_int16_t rsvd0;
+	u_int32_t saddr;                        /*Source IP address*/
+	u_int32_t daddr;                        /*Destination IP address*/
+	u_int16_t sport;                        /*Source Port*/
+	u_int16_t dport;                        /*Destination Port*/
+	u_int32_t saddr_reply;
+	u_int32_t daddr_reply;
+	u_int16_t sport_reply;
+	u_int16_t dport_reply;
+	u_int16_t protocol;                     /*TCP, UDP ...*/
+	u_int16_t flags;
+	u_int32_t fwmark;
+	u_int32_t route_id;
+	u_int32_t route_id_reply;
+} __attribute__((__packed__)) fpp_ct_cmd_t;
+
+/*Structure representing the command sent to add or remove a Conntrack when extentions (IPsec SA) is available*/
+typedef struct fpp_ct_ex_cmd {
+	u_int16_t action;                       /*Action to perform*/
+	u_int16_t format;                       /* bit 0 : indicates if SA info are present in command */
+                                                /* bit 1 : indicates if orig Route info is present in command  */
+                                                /* bit 2 : indicates if repl Route info is present in command  */
+	u_int32_t saddr;                        /*Source IP address*/
+	u_int32_t daddr;                        /*Destination IP address*/
+	u_int16_t sport;                        /*Source Port*/
+	u_int16_t dport;                        /*Destination Port*/
+	u_int32_t saddr_reply;
+	u_int32_t daddr_reply;
+	u_int16_t sport_reply;
+	u_int16_t dport_reply;
+	u_int16_t protocol;             /*TCP, UDP ...*/
+	u_int16_t flags;
+	u_int32_t fwmark;
+	u_int32_t route_id;
+	u_int32_t route_id_reply;
+        // optional security parameters
+        u_int16_t sa_nr;
+        u_int16_t sa_handle[4];
+        u_int16_t sa_reply_nr;
+        u_int16_t sa_reply_handle[4];
+	u_int32_t tunnel_route_id;
+	u_int32_t tunnel_route_id_reply;
+} __attribute__((__packed__)) fpp_ct_ex_cmd_t;
+
+typedef struct fpp_ct6_cmd {
+	u_int16_t action;                       /*Action to perform*/
+	u_int16_t rsvd1;
+	u_int32_t saddr[4];                     /*Source IP address*/
+	u_int32_t daddr[4];                     /*Destination IP address*/
+	u_int16_t sport;                        /*Source Port*/
+	u_int16_t dport;                        /*Destination Port*/
+	u_int32_t saddr_reply[4];
+	u_int32_t daddr_reply[4];
+	u_int16_t sport_reply;
+	u_int16_t dport_reply;
+	u_int16_t protocol;                     /*TCP, UDP ...*/
+	u_int16_t flags;
+	u_int32_t fwmark;
+	u_int32_t route_id;
+	u_int32_t route_id_reply;
+} __attribute__((__packed__)) fpp_ct6_cmd_t;
+
+typedef struct fpp_ct6_ex_cmd {
+	u_int16_t action;                       /*Action to perform*/
+	u_int16_t format;                       /* indicates if SA info are present in command */
+	u_int32_t saddr[4];                     /*Source IP address*/
+	u_int32_t daddr[4];                     /*Destination IP address*/
+	u_int16_t sport;                        /*Source Port*/
+	u_int16_t dport;                        /*Destination Port*/
+	u_int32_t saddr_reply[4];
+	u_int32_t daddr_reply[4];
+	u_int16_t sport_reply;
+	u_int16_t dport_reply;
+	u_int16_t protocol;                     /*TCP, UDP ...*/
+	u_int16_t flags;
+	u_int32_t fwmark;
+	u_int32_t route_id;
+	u_int32_t route_id_reply;
+	u_int16_t sa_nr;
+	u_int16_t sa_handle[4];
+	u_int16_t sa_reply_nr;
+	u_int16_t sa_reply_handle[4];
+	u_int32_t tunnel_route_id;
+	u_int32_t tunnel_route_id_reply;
+} __attribute__((__packed__)) fpp_ct6_ex_cmd_t;
+
+/*--------------------------------------- IP ---------------------------------*/ 
+#define FPP_ERR_RT_ENTRY_ALREADY_REGISTERED		200
+#define FPP_ERR_RT_ENTRY_NOT_FOUND			201
+
+#define FPP_CMD_IP_ROUTE			0x0313
+#define FPP_CMD_IPV4_RESET			0x0316
+#define FPP_CMD_IP_ROUTE_CHANGE			0x0318
+
+#define FPP_CMD_IPV6_RESET				0x0416
+
+/*Structure representing the command sent to add or remove a Route*/
+typedef struct fpp_rt_cmd {
+	u_int16_t action;			/*Action to perform*/
+	u_int16_t mtu;
+	u_int8_t dst_mac[6];
+	char	  output_device[12];		/* Define on which interface the packets are routing to*/
+	u_int16_t pad;
+	u_int32_t id;
+	u_int32_t flags;
+	u_int32_t dst_addr[4];
+} __attribute__((__packed__)) fpp_rt_cmd_t;
+
+#define FPP_IP_ROUTE_6o4	(1<<0)
+#define FPP_IP_ROUTE_4o6	(1<<1)
+
+/* Structure representing the command sent to enable/disable Ipsec pre-fragmentation */
+typedef struct fpp_ipsec_cmd {
+	u_int16_t pre_frag_en;		
+	u_int16_t rsvd;
+} __attribute__((__packed__)) fpp_ipsec_cmd_t;
+
+/* ----------------------------------- RTP ----------------------------------*/
+#define FPP_ERR_RTP_STATS_MAX_ENTRIES			1230
+#define FPP_ERR_RTP_STATS_STREAMID_ALREADY_USED	1231
+#define FPP_ERR_RTP_STATS_STREAMID_UNKNOWN		1232
+#define FPP_ERR_RTP_STATS_DUPLICATED			1233
+#define FPP_ERR_RTP_STATS_WRONG_DTMF_PT			1234
+#define FPP_ERR_RTP_STATS_WRONG_TYPE			1235
+
+
+#define FPP_CMD_RTP_OPEN		0x0801
+#define FPP_CMD_RTP_UPDATE		0x0802
+#define FPP_CMD_RTP_TAKEOVER	0x0803
+#define FPP_CMD_RTP_CONTROL		0x0804
+#define FPP_CMD_RTP_SPECTX_PLD	0x0805
+#define FPP_CMD_RTP_SPECTX_CTRL	0x0806
+#define FPP_CMD_RTCP_QUERY		0x0807
+#define FPP_CMD_RTP_CLOSE		0x0808
+
+#define FPP_RTP_TAKEOVER_MODE_TSINCR_FREQ	1
+#define FPP_RTP_TAKEOVER_MODE_SSRC			2
+
+#define FPP_MAX_SPTX_STRING_SIZE	160
+
+typedef struct fpp_rtp_open_cmd {
+	u_int16_t	call_id;
+	u_int16_t	socket_a;
+	u_int16_t	socket_b;
+	u_int16_t	rsvd;
+} __attribute__((__packed__)) fpp_rtp_open_cmd_t;
+
+typedef struct fpp_rtp_close_cmd {
+	u_int16_t	call_id;
+	u_int16_t	rsvd;
+} __attribute__((__packed__)) fpp_rtp_close_cmd_t;
+
+typedef struct fpp_rtp_takeover_cmd {
+	u_int16_t	call_id;
+	u_int16_t	socket;
+	u_int16_t	mode;
+	u_int16_t	seq_number_base;
+	u_int32_t	ssrc;
+	u_int32_t	ts_base;
+	u_int32_t	ts_incr;
+} __attribute__((__packed__)) fpp_rtp_takeover_cmd_t;
+
+typedef struct fpp_rtp_ctrl_cmd {
+	u_int16_t	call_id;
+	u_int16_t	control_dir;
+} __attribute__((__packed__)) fpp_rtp_ctrl_cmd_t;
+
+#define FPP_RTP_SPEC_TX_START       0
+#define FPP_RTP_SPEC_TX_RESPONSE    1
+#define FPP_RTP_SPEC_TX_STOP        2
+
+typedef struct fpp_rtp_spec_tx_ctrl_cmd {
+        u_int16_t	call_id;
+        u_int16_t	type;
+} __attribute__((__packed__)) fpp_rtp_spec_tx_ctrl_cmd_t;
+
+typedef struct fpp_rtp_spec_tx_payload_cmd {
+        u_int16_t	call_id;
+        u_int16_t	payload_id;
+        u_int16_t	payload_length;
+        u_int16_t	payload[80];
+} __attribute__((__packed__)) fpp_rtp_spec_tx_payload_cmd_t;
+
+typedef struct fpp_rtcp_query_cmd {
+	u_int16_t	socket_id;
+	u_int16_t       flags;
+} __attribute__((__packed__)) fpp_rtcp_query_cmd_t;
+
+typedef struct fpp_rtcp_query_res {
+	u_int32_t	prev_reception_period;
+	u_int32_t	last_reception_period;
+	u_int32_t	num_tx_pkts;
+	u_int32_t	num_rx_pkts;
+	u_int32_t	last_rx_seq;
+	u_int32_t	last_rx_timestamp;
+	u_int8_t	rtp_header[12];
+	u_int32_t	num_rx_dup;
+	u_int32_t	num_rx_since_rtcp;
+	u_int32_t	num_tx_bytes;
+	u_int32_t	min_jitter;
+	u_int32_t	max_jitter;
+	u_int32_t	average_jitter;
+	u_int32_t	num_rx_lost_pkts;
+	u_int32_t	min_reception_period;
+	u_int32_t	max_reception_period;
+	u_int32_t	average_reception_period;
+	u_int32_t	num_malformed_pkts;
+	u_int32_t	num_expected_pkts;
+	u_int32_t	num_late_pkts;
+	u_int16_t	sport;
+	u_int16_t	dport;
+	u_int32_t	num_cumulative_rx_lost_pkts;
+	u_int32_t	ssrc_overwrite_value;
+} __attribute__((__packed__)) fpp_rtcp_query_res_t;
+
+/*-------------------------------- RTP QoS Measurement-----------------------*/
+#define	FPP_CMD_RTP_STATS_ENABLE		0x0810
+#define	FPP_CMD_RTP_STATS_DISABLE		0x0811
+#define	FPP_CMD_RTP_STATS_QUERY			0x0812
+#define	FPP_CMD_RTP_STATS_DTMF_PT		0x0813
+
+#define FPP_RTPSTATS_TYPE_IP4		0
+#define FPP_RTPSTATS_TYPE_IP6		1
+#define FPP_RTPSTATS_TYPE_MC4		2
+#define FPP_RTPSTATS_TYPE_MC6		3
+#define FPP_RTPSTATS_TYPE_RLY		4
+#define FPP_RTPSTATS_TYPE_RLY6		5
+
+typedef struct fpp_rtp_stat_enable_cmd {
+	u_int16_t stream_id;
+	u_int16_t stream_type;
+	u_int32_t saddr[4];
+	u_int32_t daddr[4];
+	u_int16_t sport;
+	u_int16_t dport;
+	u_int16_t proto;
+	u_int16_t mode;
+} __attribute__((__packed__)) fpp_rtp_stat_enable_cmd_t;
+
+typedef struct fpp_rtp_stat_disable_cmd {
+	u_int16_t stream_id;
+} __attribute__((__packed__)) fpp_rtp_stat_disable_cmd_t;
+
+typedef struct  fpp_rtp_stat_dtmf_pt_cmd {
+	u_int16_t pt; /* 2 payload types coded on 8bits */
+} __attribute__((__packed__)) fpp_rtp_stat_dtmf_pt_cmd_t;
+
+
+/*-------------------------------- Voice Buffer-----------------------*/
+#define FPP_CMD_VOICE_BUFFER_LOAD	0x0820
+#define FPP_CMD_VOICE_BUFFER_UNLOAD	0x0821
+#define FPP_CMD_VOICE_BUFFER_START	0x0822
+#define FPP_CMD_VOICE_BUFFER_STOP	0x0823
+#define FPP_CMD_VOICE_BUFFER_RESET	0x0824
+
+#define FPP_VOICE_BUFFER_SCATTER_MAX	48
+
+typedef struct fpp_voice_buffer_load_cmd {
+	u_int16_t buffer_id;
+	u_int16_t payload_type;
+	u_int16_t frame_size;
+	u_int16_t entries;
+	u_int32_t data_len;
+	u_int8_t page_order[FPP_VOICE_BUFFER_SCATTER_MAX];
+	u_int32_t addr[FPP_VOICE_BUFFER_SCATTER_MAX];
+} __attribute__((__packed__)) fpp_voice_buffer_load_cmd_t;
+
+typedef struct fpp_voice_buffer_unload_cmd {
+	u_int16_t buffer_id;
+} __attribute__((__packed__)) fpp_voice_buffer_unload_cmd_t;
+
+typedef struct fpp_voice_buffer_start_cmd {
+	u_int16_t socket_id;
+	u_int16_t buffer_id;
+	u_int16_t seq_number_base;
+	u_int16_t padding;
+	u_int32_t ssrc;
+	u_int32_t timestamp_base;
+} __attribute__((__packed__)) fpp_voice_buffer_start_cmd_t;
+
+typedef struct fpp_voice_buffer_stop_cmd {
+        u_int16_t socket_id;
+} __attribute__((__packed__)) fpp_voice_buffer_stop_cmd_t;
+/*-------------------------------- Exceptions -------------------------------*/
+#define FPP_CMD_EXPT_QUEUE_DSCP             0x0C01
+#define FPP_CMD_EXPT_QUEUE_CONTROL          0x0C02
+#define FPP_CMD_EXPT_QUEUE_RESET            0x0C03
+
+#define FPP_EXPT_Q0 0
+#define FPP_EXPT_Q1 1
+#define FPP_EXPT_Q2 2
+#define FPP_EXPT_Q3 3
+#define FPP_EXPT_MAX_QUEUE	FPP_EXPT_Q3
+
+#define FPP_EXPT_MAX_DSCP   63
+
+typedef struct fpp_expt_queue_dscp_cmd {
+	u_int16_t	queue;
+	u_int16_t	num_dscp;
+	u_int8_t	dscp[FPP_EXPT_MAX_DSCP];
+	u_int8_t	pad;
+} __attribute__((__packed__)) fpp_expt_queue_dscp_cmd_t;
+
+typedef struct fpp_expt_queue_control_cmd {
+	u_int16_t	queue;
+	u_int16_t	pad;
+} __attribute__((__packed__)) fpp_expt_queue_control_cmd_t;
+
+/*--------------------------------------------- QM ---------------------------*/
+// 0x0200 -> 0x02FF : QM module
+#define FPP_CMD_QM_QOSENABLE		0x0201
+#define FPP_CMD_QM_QOSALG		0x0202
+#define FPP_CMD_QM_NHIGH		0x0203
+#define FPP_CMD_QM_MAX_TXDEPTH		0x0204
+#define FPP_CMD_QM_MAX_QDEPTH		0x0205
+#define FPP_CMD_QM_MAX_WEIGHT		0x0206
+#define FPP_CMD_QM_RATE_LIMIT		0x0207
+#define FPP_CMD_QM_EXPT_RATE		0x020c
+#define FPP_CMD_QM_QUERY		0x020d
+#define FPP_CMD_QM_QUERY_EXPT_RATE	0x020e
+                
+#define FPP_CMD_QM_RESET		0x0210 
+#define FPP_CMD_QM_SHAPER_CFG		0x0211 
+#define FPP_CMD_QM_SCHED_CFG		0x0212 
+#define FPP_CMD_QM_DSCP_MAP		0x0213 
+#define FPP_CMD_QM_QUEUE_QOSENABLE    0x0214
+
+#define FPP_MAX_DSCP        		63
+#define FPP_NUM_DSCP        		64
+
+#ifdef COMCERTO_2000
+#define FPP_NUM_QUEUES 			16
+#define	FPP_PORT_SHAPER_NUM		0xffff
+#else
+#define FPP_NUM_QUEUES 			32
+#endif
+#define FPP_NUM_SHAPERS			8
+#define FPP_NUM_SCHEDULERS		8
+
+#define FPP_EXPT_TYPE_ETH   0x0
+#define FPP_EXPT_TYPE_WIFI  0x1
+#define FPP_EXPT_TYPE_ARP   0x2
+#define FPP_EXPT_TYPE_PCAP  0x3
+
+typedef struct fpp_qm_qos_enable_cmd {
+	u_int16_t	interface;
+	u_int16_t	enable;
+} __attribute__((__packed__)) fpp_qm_qos_enable_cmd_t;              
+
+typedef struct fpp_qm_queue_qos_enable_cmd {
+	u_int16_t interface;
+	u_int16_t enable_flag;
+	u_int32_t queue_qosenable_mask; // Bit mask of queues on which Qos is enabled
+} __attribute__((__packed__)) fpp_qm_queue_qos_enable_cmd_t;
+
+
+typedef struct fpp_qm_qos_alg_cmd {
+	u_int16_t 	interface;
+        u_int16_t	scheduler;
+} __attribute__((__packed__)) fpp_qm_qos_alg_cmd_t;
+                
+typedef struct fpp_qm_nhigh_cmd {
+        u_int16_t	interface;
+        u_int16_t	number_high_queues;
+} __attribute__((__packed__)) fpp_qm_nhigh_cmd_t;
+
+typedef struct fpp_qm_max_txdepth_cmd_t {
+        u_int16_t	interface;
+        u_int16_t	max_bytes;
+} __attribute__((__packed__)) fpp_qm_max_txdepth_cmd_t;
+
+typedef struct fpp_qm_max_qdepth_cmd {
+        u_int16_t	interface;
+        u_int16_t	qtxdepth[FPP_NUM_QUEUES];
+} __attribute__((__packed__)) fpp_qm_max_qdepth_cmd_t;
+
+typedef struct fpp_qm_max_weight_cmd {
+        u_int16_t	interface;
+        u_int16_t	qxweight[FPP_NUM_QUEUES];
+} __attribute__((__packed__)) fpp_qm_max_weight_cmd_t;
+
+typedef struct fpp_qm_rate_limit_cmd {
+        u_int16_t	interface;
+        u_int16_t	enable;
+        u_int32_t	queues;
+        u_int32_t	rate;
+        u_int32_t	bucket_size;
+} __attribute__((__packed__)) fpp_qm_rate_limit_cmd_t;
+
+typedef struct fpp_qm_expt_rate_cmd {
+        u_int16_t	if_type;
+        u_int16_t	pkts_per_msec;
+} __attribute__((__packed__)) fpp_qm_expt_rate_cmd_t;
+
+typedef struct fpp_qm_query_rl
+{
+        u_int16_t	action;
+        u_int16_t	mask;
+        u_int32_t	aggregate_bandwidth;
+        u_int32_t	bucketsize;
+} __attribute__((__packed__)) fpp_qm_query_rl_t;
+
+typedef struct fpp_qm_query_cmd
+{
+	u_int16_t action;
+	u_int16_t port;
+	u_int32_t queue_qosenable_mask;         // bit mask of queues on which Qos is enabled
+	u_int32_t max_txdepth;
+
+	u_int32_t shaper_qmask[FPP_NUM_SHAPERS];			// mask of queues assigned to this shaper
+	u_int32_t tokens_per_clock_period[FPP_NUM_SHAPERS];	// bits worth of tokens available on every 1 msec clock period
+	u_int32_t bucket_size[FPP_NUM_SHAPERS];		// max bucket size in bytes 
+
+	u_int32_t sched_qmask[FPP_NUM_SCHEDULERS];
+	u_int8_t sched_alg[FPP_NUM_SCHEDULERS];				// current scheduling algorithm
+	
+	u_int16_t max_qdepth[FPP_NUM_QUEUES];
+} __attribute__((__packed__)) fpp_qm_query_cmd_t;
+
+typedef struct fpp_qm_reset_cmd {
+        u_int16_t	interface;
+	u_int16_t	pad;
+} __attribute__((__packed__)) fpp_qm_reset_cmd_t;
+
+typedef struct fpp_qm_shaper_cfg {
+        u_int16_t	interface;
+        u_int16_t	shaper;
+        u_int16_t	enable;
+        u_int8_t	ifg;
+        u_int8_t	ifg_change_flag;
+        u_int32_t	rate;
+        u_int32_t	bucket_size;
+        u_int32_t	queues;
+} __attribute__((__packed__)) fpp_qm_shaper_cfg_t;
+
+typedef struct fpp_qm_scheduler_cfg {
+        u_int16_t	interface;
+        u_int16_t	scheduler;
+        u_int8_t	algo;
+        u_int8_t	algo_change_flag;
+	u_int16_t	pad;
+        u_int32_t	queues;
+} __attribute__((__packed__)) fpp_qm_scheduler_cfg_t;
+
+typedef struct fpp_qm_dscp_queue_mod {
+        u_int16_t	queue;
+        u_int16_t	num_dscp;
+        u_int8_t	dscp[FPP_NUM_DSCP];
+} __attribute__((__packed__)) fpp_qm_dscp_queue_mod_t;
+
+/*---------------------------------------- RX --------------------------------*/
+/*Function codes*/
+/* 0x00xx : Rx module */
+#define FPP_CMD_RX_CNG_ENABLE			0x0003
+#define FPP_CMD_RX_CNG_DISABLE			0x0004
+#define FPP_CMD_RX_CNG_SHOW			0x0005
+
+#define FPP_CMD_RX_L2BRIDGE_ENABLE		0x0008
+#define FPP_CMD_RX_L2BRIDGE_ADD			0x0009
+#define FPP_CMD_RX_L2BRIDGE_REMOVE		0x000a
+#define FPP_CMD_RX_L2BRIDGE_QUERY_STATUS	0x000b
+#define FPP_CMD_RX_L2BRIDGE_QUERY_ENTRY		0x000c
+#define FPP_CMD_RX_L2FLOW_ENTRY		0x000d
+#define FPP_CMD_RX_L2BRIDGE_MODE			0x000e
+#define FPP_CMD_RX_L2BRIDGE_FLOW_TIMEOUT	0x000f
+#define FPP_CMD_RX_L2BRIDGE_FLOW_RESET		0x0010
+
+#define FPP_ERR_BRIDGE_ENTRY_NOT_FOUND  50
+#define FPP_ERR_BRIDGE_ENTRY_ALREADY_EXISTS  51
+
+#define FPP_BRIDGE_QMOD_NONE 			0
+#define FPP_BRIDGE_QMOD_DSCP			1
+
+#define FPP_L2_BRIDGE_MODE_MANUAL	0	
+#define FPP_L2_BRIDGE_MODE_AUTO		1
+
+typedef struct fpp_rx_icc_enable_cmd {
+	u_int16_t	interface;
+	u_int16_t	acc_value;
+	u_int16_t	on_thr;
+	u_int16_t	off_thr;
+	u_int32_t	flag;
+	u_int32_t	val1;
+	u_int32_t	val2;
+} __attribute__((__packed__)) fpp_rx_icc_enable_cmd_t;
+
+typedef struct fpp_rx_icc_disable_cmd {
+	u_int16_t	interface;
+} __attribute__((__packed__)) fpp_rx_icc_disable_cmd_t;
+
+typedef struct fpp_rx_icc_show_return_cmd {
+	u_int16_t	padding_in_rc_out;
+	u_int16_t	state;
+	u_int16_t	acc_value;
+	u_int16_t	on_thr;
+	u_int16_t	off_thr;
+} __attribute__((__packed__)) fpp_rx_icc_show_return_cmd_t;
+
+/* L2 Bridging Enable command */
+typedef struct fpp_l2_bridge_enable_cmd {
+	u_int16_t	interface;
+	u_int16_t	enable_flag;
+	char  		input_name[16];
+} __attribute__((__packed__)) fpp_l2_bridge_enable_cmd_t;
+
+
+/* L2 Bridging Add Entry command */
+typedef struct fpp_l2_bridge_add_entry_cmd {
+	u_int16_t	input_interface;
+	u_int16_t	input_vlan;
+	u_int8_t	destaddr[6];
+	u_int8_t	srcaddr[6];
+	u_int16_t	ethertype;
+	u_int16_t	output_interface;
+	u_int16_t	output_vlan;
+	u_int16_t	pkt_priority;
+ 	u_int16_t	vlan_priority;
+	char		input_name[16];
+	char		output_name[16];
+	u_int16_t	queue_modifier;
+	u_int16_t	session_id;
+} __attribute__((__packed__)) fpp_l2_bridge_add_entry_cmd_t;
+
+
+/* L2 Bridging Remove Entry command */
+typedef struct fpp_l2_bridge_remove_entry_cmd {
+	u_int16_t	input_interface;
+	u_int16_t	input_vlan;
+        u_int8_t	destaddr[6];
+        u_int8_t	srcaddr[6];
+	u_int16_t	ethertype;
+	u_int16_t	session_id;
+	char  		input_name[16];
+} __attribute__((__packed__)) fpp_l2_bridge_remove_entry_cmd_t;
+
+
+/* L2 Bridging Query Status response */
+typedef struct fpp_l2_bridge_query_status_response {
+	u_int16_t ackstatus;
+	u_int16_t status;
+	u_int8_t ifname[16];
+	u_int32_t eof;
+} __attribute__((__packed__)) fpp_l2_bridge_query_status_response_t;
+
+
+/* L2 Bridging Query Entry response */
+typedef struct fpp_l2_bridge_query_entry_response {
+	u_int16_t	ackstatus;
+	u_int16_t	eof;
+	u_int16_t	input_interface;
+	u_int16_t	input_vlan;
+	u_int8_t	destaddr[6];
+	u_int8_t	srcaddr[6];
+	u_int16_t	ethertype;
+	u_int16_t	output_interface;
+	u_int16_t	output_vlan;
+	u_int16_t	pkt_priority;
+	u_int16_t	vlan_priority;
+	char		input_name[16];
+	char		output_name[16];
+	u_int16_t	queue_modifier;
+	u_int16_t	session_id;
+	u_int16_t	reserved;
+} __attribute__((__packed__)) fpp_l2_bridge_query_entry_response_t;
+
+/* L2 Bridging  Flow entry command */
+typedef struct fpp_l2_bridge_flow_entry_cmd {
+	u_int16_t action;				/*Action to perform*/
+	u_int16_t	ethertype;			/* If VLAN Tag !=0, ethertype of next header */
+	u_int8_t	destaddr[6];			/* Dst MAC addr */
+	u_int8_t	srcaddr[6];			/* Src MAC addr */
+	u_int16_t	vlan_tag; 			/* TCI */
+	u_int16_t	session_id;			/* Meaningful only if ethertype PPPoE */
+	char		input_name[16];		/* Input itf name */
+	char		output_name[16];	/* Output itf name */
+	/* L3-4 optional information*/
+	u_int32_t saddr[4];
+	u_int32_t daddr[4];
+	u_int16_t sport;
+	u_int16_t dport;
+	u_int8_t proto;
+	u_int8_t pad;
+	u_int16_t mark;				/* QoS Mark*/
+	u_int32_t timeout;			/* Entry timeout only for QUERY */
+} __attribute__((__packed__)) fpp_l2_bridge_flow_entry_cmd_t;
+
+/* L2 Bridging Control command */
+typedef struct fpp_l2_bridge_control_cmd {
+	u_int16_t mode_timeout;		/* Either set bridge mode or set timeout for flow entries */
+} __attribute__((__packed__)) fpp_l2_bridge_control_cmd_t;
+
+/*------------------------------------- Stat ----------------------------------*/
+/*Function codes*/
+/* 0x00xx : Stat module */
+#define FPP_CMD_STAT_ENABLE		0x0E01 
+#define FPP_CMD_STAT_QUEUE		0x0E02  
+#define FPP_CMD_STAT_INTERFACE_PKT	0x0E03
+#define FPP_CMD_STAT_CONNECTION		0x0E04
+#define FPP_CMD_STAT_PPPOE_STATUS	0x0E05
+#define FPP_CMD_STAT_PPPOE_ENTRY	0x0E06
+#define FPP_CMD_STAT_BRIDGE_STATUS	0x0E07
+#define FPP_CMD_STAT_BRIDGE_ENTRY	0x0E08
+#define FPP_CMD_STAT_IPSEC_STATUS	0x0E09
+#define FPP_CMD_STAT_IPSEC_ENTRY	0x0E0A
+#define FPP_CMD_STAT_VLAN_STATUS        0x0E0B
+#define FPP_CMD_STAT_VLAN_ENTRY         0x0E0C
+
+#define FPP_CMM_STAT_RESET		0x0001
+#define FPP_CMM_STAT_QUERY		0x0002
+#define FPP_CMM_STAT_QUERY_RESET	0x0003
+
+#define FPP_CMM_STAT_ENABLE		0x0001
+#define FPP_CMM_STAT_DISABLE		0x0000
+
+/* Definitions of Bit Masks for the features */
+#define FPP_STAT_QUEUE_BITMASK		0x00000001
+#define FPP_STAT_INTERFACE_BITMASK	0x00000002
+#define FPP_STAT_PPPOE_BITMASK		0x00000008
+#define FPP_STAT_BRIDGE_BITMASK		0x00000010
+#define FPP_STAT_IPSEC_BITMASK		0x00000020
+#define FPP_STAT_VLAN_BITMASK 		0x00000040
+
+#define FPP_STAT_UNKNOWN_CMD		0
+#define FPP_STAT_ENABLE_CMD		1 
+#define FPP_STAT_QUEUE_CMD		2
+#define FPP_STAT_INTERFACE_PKT_CMD	3
+#define FPP_STAT_CONNECTION_CMD		4
+#define FPP_STAT_PPPOE_CMD		5
+#define FPP_STAT_BRIDGE_CMD		6
+#define FPP_STAT_IPSEC_CMD		7
+#define FPP_STAT_VLAN_CMD               8
+
+typedef struct fpp_stat_enable_cmd {
+	u_int16_t	action; /* 1 - Enable, 0 - Disable */
+	u_int16_t	pad;
+	u_int32_t	bitmask; /* Specifies the feature to be enabled or disabled */
+} __attribute__((__packed__)) fpp_stat_enable_cmd_t;
+
+typedef struct fpp_stat_queue_cmd {
+	u_int16_t	action; /* Reset, Query, Query & Reset */
+	u_int16_t	interface;
+	u_int16_t	queue;
+	u_int16_t	pad;
+} __attribute__((__packed__)) fpp_stat_queue_cmd_t;
+
+typedef struct fpp_stat_interface_cmd {
+	u_int16_t	action; /* Reset, Query, Query & Reset */
+	u_int16_t	interface;
+} __attribute__((__packed__)) fpp_stat_interface_cmd_t;
+
+typedef struct fpp_stat_connection_cmd {
+	u_int16_t	action; /* Reset, Query, Query & Reset */
+	u_int16_t	pad;
+} __attribute__((__packed__)) fpp_stat_connection_cmd_t;
+
+typedef struct fpp_stat_pppoe_status_cmd {
+	u_int16_t	action; /* Reset, Query, Query & Reset */
+	u_int16_t	pad;
+} __attribute__((__packed__)) fpp_stat_pppoe_status_cmd_t;
+
+typedef struct fpp_stat_bridge_status_cmd {
+	u_int16_t	action; /* Reset, Query, Query & Reset */
+	u_int16_t	pad;
+} __attribute__((__packed__)) fpp_stat_bridge_status_cmd_t;
+
+typedef struct fpp_stat_ipsec_status_cmd {
+	u_int16_t	action; /* Reset, Query, Query & Reset */
+	u_int16_t	pad;
+} __attribute__((__packed__)) fpp_stat_ipsec_status_cmd_t;
+
+typedef struct fpp_stat_vlan_status_cmd {
+	u_int16_t	action; /* Reset, Query, Query & Reset */
+	u_int16_t	pad;
+} __attribute__((__packed__)) fpp_stat_vlan_status_cmd_t;
+
+typedef struct fpp_stat_queue_response {
+	u_int16_t	ackstatus; 
+	u_int16_t	rsvd1;
+	u_int32_t	peak_queue_occ; 
+	u_int32_t	emitted_pkts; 
+	u_int32_t	dropped_pkts; 
+} __attribute__((__packed__)) fpp_stat_queue_response_t;
+
+typedef struct fpp_stat_interface_pkt_response {
+	u_int16_t	ackstatus;
+	u_int16_t	rsvd1;
+	u_int32_t	total_pkts_transmitted;
+	u_int32_t	total_pkts_received;
+	u_int32_t	total_bytes_transmitted[2]; /* 64 bit counter stored as 2*32 bit counters */ 
+	u_int32_t	total_bytes_received[2]; /* 64 bit counter stored as 2*32 bit counters */
+} __attribute__((__packed__)) fpp_stat_interface_pkt_response_t;
+
+typedef struct fpp_stat_conn_response {
+	u_int16_t	ackstatus;
+	u_int16_t	rsvd1;
+	u_int32_t	max_active_connections;
+	u_int32_t	num_active_connections;
+} __attribute__((__packed__)) fpp_stat_conn_response_t;
+
+typedef struct fpp_stat_pppoe_status_response {
+	u_int16_t ackstatus;
+} __attribute__((__packed__)) fpp_stat_pppoe_status_response_t;
+
+typedef struct fpp_stat_pppoe_entry_response {
+	u_int16_t 	ackstatus;
+	u_int16_t 	eof;
+	u_int16_t	sessionid;
+	u_int16_t	interface_no; /* WAN_PORT_ID for WAN & LAN_PORT_ID for LAN */
+	u_int32_t	total_packets_received;  
+	u_int32_t	total_packets_transmitted; 
+} __attribute__((__packed__)) fpp_stat_pppoe_entry_response_t;
+
+typedef struct fpp_stat_bridge_status_response {
+	u_int16_t	ackstatus;
+} __attribute__((__packed__)) fpp_stat_bridge_status_response_t;
+
+typedef struct fpp_stat_bridge_entry_response {
+	u_int16_t	ackstatus;
+	u_int16_t	eof;
+	u_int16_t	input_interface;
+	u_int16_t	input_vlan; 
+	u_int8_t	dst_mac[6];
+	u_int8_t	src_mac[6];
+	u_int16_t	ether_type;
+	u_int16_t	output_interface;
+	u_int16_t	output_vlan; 
+	u_int16_t	session_id;
+	u_int32_t	total_packets_transmitted; 
+	char        input_name[16];
+	char        output_name[16];
+} __attribute__((__packed__)) fpp_stat_bridge_entry_response_t;
+
+typedef struct fpp_stat_ipsec_entry_response {
+	u_int16_t	ackstatus;
+	u_int16_t	eof;
+	u_int16_t	family;
+	u_int16_t	proto;
+	u_int32_t	spi;
+	u_int32_t	dst_ip[4];
+	u_int32_t	total_pkts_processed;
+	u_int32_t	total_bytes_processed[2];
+	u_int16_t	sagd;
+	u_int16_t	pad;
+} __attribute__((__packed__)) fpp_stat_ipsec_entry_response_t;
+
+
+typedef struct fpp_stat_vlan_entry_response {
+	u_int16_t ackstatus;
+	u_int16_t eof;
+	u_int16_t vlanID;
+	u_int16_t rsvd;
+	u_int32_t total_packets_received;  
+	u_int32_t total_packets_transmitted; 
+	u_int32_t total_bytes_received[2];  
+	u_int32_t total_bytes_transmitted[2]; 	
+	unsigned char vlanifname[12];
+	unsigned char phyifname[12];
+} __attribute__((__packed__)) fpp_stat_vlan_entry_response_t;
+
+/*------------------------------------ Altconf --------------------------------*/
+#define FPP_CMD_ALTCONF_SET		0x1001
+#define FPP_CMD_ALTCONF_RESET		0x1002
+
+/* option IDs */
+#define FPP_ALTCONF_OPTION_MCTTL	0x0001  /*Multicast TTL option */
+#define FPP_ALTCONF_OPTION_IPSECRL	0x0002  /*IPSEC Rate Limiting option */
+#define FPP_ALTCONF_OPTION_ALL		0xFFFF
+#define FPP_ALTCONF_OPTION_MAX		FPP_ALTCONF_OPTION_IPSECRL + 1 /*include the "all" option*/
+
+#define FPP_ALTCONF_MODE_DEFAULT	0 /* same default value used for all options */
+#define FPP_ALTCONF_OPTION_MAX_PARAMS	3 /* IPSEC Rate Limiting has 3 parameters. To be updated if a new option is add with more 32bits params */
+
+/* ALL options */
+#define FPP_ALTCONF_ALL_NUM_PARAMS	1
+#define FPP_ALTCONF_ALL_MODE_DEFAULT	FPP_ALTCONF_MODE_DEFAULT
+
+/* Multicast TTL Configuration definitions */
+#define FPP_ALTCONF_MCTTL_MODE_DEFAULT	FPP_ALTCONF_MODE_DEFAULT
+#define FPP_ALTCONF_MCTTL_MODE_IGNORE	1
+#define FPP_ALTCONF_MCTTL_MODE_MAX	FPP_ALTCONF_MCTTL_MODE_IGNORE
+#define FPP_ALTCONF_MCTTL_NUM_PARAMS	1  //maximu number of u32 allowed for this option
+
+/* IPSEC Rate Limiting Configuration definitions */
+#define FPP_ALTCONF_IPSECRL_OFF		0
+#define FPP_ALTCONF_IPSECRL_ON		1
+#define FPP_ALTCONF_IPSECRL_NUM_PARAMS	3  //maximu number of u32 allowed for this option
+
+typedef struct fpp_alt_set_cmd {
+	u_int16_t	option_id;
+	u_int16_t	num_params;
+	u_int32_t	params[FPP_ALTCONF_OPTION_MAX_PARAMS];
+} __attribute__((__packed__)) fpp_alt_set_cmd_t;
+
+/*--------------------------------- NATPT ------------------------------------*/
+#define FPP_CMD_NATPT_OPEN		0x1101
+#define FPP_CMD_NATPT_CLOSE		0x1102
+#define FPP_CMD_NATPT_QUERY		0x1103
+
+#define FPP_NATPT_CONTROL_6to4		0x01
+#define FPP_NATPT_CONTROL_4to6		0x02
+#define FPP_NATPT_CONTROL_TCPFIN	0x0100
+
+typedef struct fpp_natpt_open_cmd {
+	u_int16_t		socket_a;
+	u_int16_t		socket_b;
+	u_int16_t		control;
+	u_int16_t		rsvd1;
+} __attribute__((__packed__)) fpp_natpt_open_cmd_t;
+
+typedef struct fpp_natpt_close_cmd {
+	u_int16_t		socket_a;
+	u_int16_t		socket_b;
+} __attribute__((__packed__)) fpp_natpt_close_cmd;
+
+typedef struct fpp_natpt_query_cmd {
+	u_int16_t		reserved1;
+	u_int16_t		socket_a;
+	u_int16_t		socket_b;
+	u_int16_t		reserved2;
+} __attribute__((__packed__)) fpp_natpt_query_cmd_t;
+
+typedef struct fpp_natpt_query_response {
+	u_int16_t		retcode;
+	u_int16_t		socket_a;
+	u_int16_t		socket_b;
+	u_int16_t		control;
+	u_int64_t		stat_v6_received;
+	u_int64_t		stat_v6_transmitted;
+	u_int64_t		stat_v6_dropped;
+	u_int64_t		stat_v6_sent_to_ACP;
+	u_int64_t		stat_v4_received;
+	u_int64_t		stat_v4_transmitted;
+	u_int64_t		stat_v4_dropped;
+	u_int64_t		stat_v4_sent_to_ACP;
+} __attribute__((__packed__)) fpp_natpt_query_response_t;
+
+/*---------------------------------- Fast Forwarding -------------------------*/
+#define FPP_CMD_IPV4_FF_CONTROL		0x0321
+
+/* Structure representing the command sent to enable/disable fast-forward */
+typedef struct fpp_ff_ctrl_cmd {
+        u_int16_t enable;
+        u_int16_t reserved;
+} __attribute__((__packed__)) fpp_ff_ctrl_cmd_t;
+
+/*---------------------------------- VLAN ------------------------------------*/
+#define FPP_ERR_VLAN_ENTRY_ALREADY_REGISTERED	600
+#define FPP_ERR_VLAN_ENTRY_NOT_FOUND		601
+
+#define FPP_CMD_VLAN_ENTRY		0x0901
+#define FPP_CMD_VLAN_RESET		0x0902
+
+/* VLAN command as understood by FPP */
+typedef struct fpp_vlan_cmd {
+        u_int16_t       action;
+        u_int16_t       vlan_id; // Carries skip count for ACTION_QUERY
+        char 		vlan_ifname[12];
+        char 		vlan_phy_ifname[12];
+} __attribute__((__packed__)) fpp_vlan_cmd_t;
+
+/*---------------------------------- MacVlan ------------------------------------*/
+#define FPP_CMD_MACVLAN_ENTRY		0x1401
+#define FPP_CMD_MACVLAN_RESET           0x1402
+
+#define FPP_ERR_MACVLAN_ENTRY_ALREADY_REGISTERED       60
+#define FPP_ERR_MACVLAN_ENTRY_NOT_FOUND                61
+
+
+/* MacVlan command as understood by FPP */
+typedef struct fpp_macvlan_cmd {
+        u_int16_t       action;
+        unsigned char   macaddr[6]; 
+        char 		macvlan_ifname[12];
+        char 		macvlan_phy_ifname[12];
+} __attribute__((__packed__)) fpp_macvlan_cmd_t;
+
+/*--------------------------------- Ipsec ------------------------------------*/
+/* 0x0axx : IPSec module */
+#define FPP_CMD_IPSEC_SA_ADD			0x0a01
+#define FPP_CMD_IPSEC_SA_DELETE			0x0a02
+#define FPP_CMD_IPSEC_SA_FLUSH			0x0a03
+#define FPP_CMD_IPSEC_SA_SET_KEYS		0x0a04
+#define FPP_CMD_IPSEC_SA_SET_TUNNEL		0x0a05
+#define FPP_CMD_IPSEC_SA_SET_NATT		0x0a06
+#define FPP_CMD_IPSEC_SA_SET_STATE		0x0a07
+#define FPP_CMD_IPSEC_SA_SET_LIFETIME		0x0a08
+#define FPP_CMD_IPSEC_SA_NOTIFY			0x0a09 
+#define FPP_CMD_IPSEC_SA_ACTION_QUERY		0x0a0a 
+#define FPP_CMD_IPSEC_SA_ACTION_QUERY_CONT	0x0a0b 
+#define FPP_CMD_IPSEC_FLOW_ADD			0x0a11
+#define FPP_CMD_IPSEC_FLOW_REMOVE		0x0a12
+#define FPP_CMD_IPSEC_FLOW_NOTIFY		0x0a13
+#define FPP_CMD_IPSEC_FRAG_CFG			0x0a14
+
+#define FPP_CMD_NETKEY_SA_ADD			FPP_CMD_IPSEC_SA_ADD
+#define FPP_CMD_NETKEY_SA_DELETE		FPP_CMD_IPSEC_SA_DELETE
+#define FPP_CMD_NETKEY_SA_FLUSH			FPP_CMD_IPSEC_SA_FLUSH
+#define FPP_CMD_NETKEY_SA_SET_KEYS		FPP_CMD_IPSEC_SA_SET_KEYS
+#define FPP_CMD_NETKEY_SA_SET_TUNNEL		FPP_CMD_IPSEC_SA_SET_TUNNEL
+#define FPP_CMD_NETKEY_SA_SET_NATT		FPP_CMD_IPSEC_SA_SET_NATT
+#define FPP_CMD_NETKEY_SA_SET_STATE		FPP_CMD_IPSEC_SA_SET_STATE
+#define FPP_CMD_NETKEY_SA_SET_LIFETIME		FPP_CMD_IPSEC_SA_SET_LIFETIME
+#define FPP_CMD_NETKEY_FLOW_ADD			FPP_CMD_IPSEC_FLOW_ADD
+#define FPP_CMD_NETKEY_FLOW_REMOVE		FPP_CMD_IPSEC_FLOW_REMOVE
+#define FPP_CMD_NETKEY_FLOW_NOTIFY		FPPCMD_IPSEC_FLOW_NOTIFY
+
+typedef struct fpp_sa_query_cmd {
+        u_int16_t	action;
+        u_int16_t	handle; /* handle */
+        /* SPI information */
+        u_int16_t	mtu;    /* mtu configured */
+        u_int16_t	rsvd1;
+        u_int32_t	spi;      /* spi */
+        u_int8_t	sa_type; /* SA TYPE Prtocol ESP/AH */
+        u_int8_t	family; /* Protocol Family */
+        u_int8_t	mode; /* Tunnel/Transport mode */
+        u_int8_t	replay_window; /* Replay Window */
+        u_int32_t	dst_ip[4];
+        u_int32_t	src_ip[4];
+
+          /* Key information */
+        u_int8_t	key_alg;
+        u_int8_t	state; /* SA VALID /EXPIRED / DEAD/ DYING */
+	u_int16_t	flags; /* ESP AH enabled /disabled */
+
+        u_int8_t	cipher_key[32];
+        u_int8_t	auth_key[20];
+        u_int8_t	ext_auth_key[12];
+
+
+        /* Tunnel Information */
+        u_int8_t	tunnel_proto_family;
+        u_int8_t	rsvd[3];
+        union {
+                struct {
+                        u_int32_t	daddr;
+                        u_int32_t	saddr;
+                        u_int8_t	tos;
+                        u_int8_t	protocol;
+                        u_int16_t	total_length;
+                } ipv4;
+
+                struct {
+                        u_int32_t	traffic_class_hi:4;
+                        u_int32_t	version:4;
+                        u_int32_t	flow_label_high:4;
+                        u_int32_t	traffic_class:4;
+                        u_int32_t	flow_label_lo:16;
+                        u_int32_t	daddr[4];
+                        u_int32_t	saddr[4];
+                } ipv6;
+
+        } tnl;
+
+        u_int64_t	soft_byte_limit;
+        u_int64_t	hard_byte_limit;
+        u_int64_t	soft_packet_limit;
+        u_int64_t	hard_packet_limit;
+
+} __attribute__((__packed__)) fpp_sa_query_cmd_t;
+
+/*--------------------------------------- PPPoE --------------------------------*/
+#define FPP_CMD_PPPOE_ENTRY             0x0601
+#define FPP_CMD_PPPOE_RELAY_ENTRY	0x0610
+#define FPP_CMD_PPPOE_RELAY_ADD		0x0611
+#define FPP_CMD_PPPOE_RELAY_REMOVE	0x0612
+
+#define FPP_ERR_PPPOE_ENTRY_ALREADY_REGISTERED	800
+#define FPP_ERR_PPPOE_ENTRY_NOT_FOUND		801
+
+/* Structure representing the command sent to add or remove a pppoe session */
+typedef struct fpp_pppoe_cmd {
+	u_int16_t action;		 	/*Action to perform*/
+	u_int16_t sessionid;
+	u_int8_t  macaddr[6];
+	char      phy_intf[12];
+	char      log_intf[12];
+	u_int16_t pad;
+} __attribute__((__packed__)) fpp_pppoe_cmd_t;
+
+typedef struct fpp_relay_info {
+        u_int8_t        peermac1[6];
+        u_int8_t        peermac2[6];
+        char            ipifname[IFNAMSIZ];
+        char            opifname[IFNAMSIZ];
+        u_int16_t       sesID;
+        u_int16_t       relaysesID;
+} __attribute__((__packed__)) fpp_relay_info_t;
+
+/* Structure representing the command sent to add or remove a pppoe session */
+typedef struct fpp_pppoe_relay_cmd {
+        u_int16_t       action;      /*Action to perform */
+        u_int8_t        peermac1[6];
+        u_int8_t        peermac2[6];
+	u_int8_t        ipif_mac[6];
+	u_int8_t        opif_mac[6];
+        char            ipifname[IFNAMSIZ];
+        char            opifname[IFNAMSIZ];
+        u_int16_t       sesID;
+        u_int16_t       relaysesID;
+        u_int16_t       pad;
+} __attribute__((__packed__)) fpp_pppoe_relay_cmd_t;
+
+#ifdef WIFI_ENABLE
+/*----------------------------------------WiFi ------------------------------*/
+#define FPP_ERR_WIFI_DUPLICATE_OPERATION	2001
+//0x2000: WiFi module
+#define FPP_CMD_WIFI_VAP_ENTRY			0x2001
+#define FPP_CMD_VWD_ENABLE			0x2002
+#define FPP_CMD_VWD_DISABLE			0x2003
+#define FPP_CMD_WIFI_VAP_QUERY			0x2004
+#define FPP_CMD_WIFI_VAP_RESET			0x2005
+
+typedef struct fpp_wifi_vap_query_response
+{
+	u_int16_t	vap_id;
+	char		ifname[12];
+	u_int16_t	phy_port_id;
+} __attribute__((__packed__)) fpp_wifi_vap_query_response_t;
+
+typedef struct fpp_wifi_cmd
+{
+#define		FPP_VWD_VAP_ADD     0
+#define		FPP_VWD_VAP_REMOVE  1
+#define		FPP_VWD_VAP_UPDATE  2
+#define		FPP_VWD_VAP_RESET    3
+	u_int16_t	action;
+	u_int16_t	vap_id;
+	char		ifname[12];
+	char		mac_addr[6];
+	u_int16_t	pad;
+} __attribute__((__packed__)) fpp_wifi_cmd_t;
+
+#endif
+
+/*-------------------------------------- Tunnel -----------------------------*/
+#define FPP_CMD_TUNNEL_ADD		0x0B01
+#define FPP_CMD_TUNNEL_DEL		0x0B02
+#define FPP_CMD_TUNNEL_UPDATE		0x0B03
+#define FPP_CMD_TUNNEL_SEC		0x0B04
+#define FPP_CMD_TUNNEL_QUERY		0x0B05
+#define FPP_CMD_TUNNEL_QUERY_CONT	0x0B06
+#define FPP_CMD_TUNNEL_4rd_ID_CONV_dport    0x0B07
+#define FPP_CMD_TUNNEL_4rd_ID_CONV_psid     0x0B08
+
+/* CMM / FPP API Command */
+typedef struct fpp_tunnel_create_cmd {
+	char            name[16];
+	u_int32_t       local[4];
+	u_int32_t       remote[4];
+	char            output_device[16];
+	u_int8_t        mode;
+	u_int8_t        secure;
+	u_int8_t        encap_limit;
+	u_int8_t        hop_limit;
+	u_int32_t       flow_info; /* Traffic class and FlowLabel */
+	u_int16_t       frag_off;
+	u_int16_t       enabled;
+	u_int32_t	route_id;
+} __attribute__((__packed__)) fpp_tunnel_create_cmd_t;
+
+typedef struct fpp_tunnel_del_cmd {
+        char            name[16];
+} __attribute__((__packed__)) fpp_tunnel_del_cmd_t;
+
+typedef struct fpp_tunnel_sec_cmd {
+        char            name[16];
+        u_int16_t       sa_nr;
+        u_int16_t       sa_reply_nr;
+        u_int16_t       sa_handle[4];
+        u_int16_t       sa_reply_handle[4];
+} __attribute__((__packed__)) fpp_tunnel_sec_cmd_t;
+
+/* CMM / FPP API Command */
+typedef struct fpp_tunnel_query_cmd {
+	unsigned short	result;
+	unsigned short 	unused;
+        char            name[16];
+        u_int32_t       local[4];
+        u_int32_t       remote[4];
+        u_int8_t        mode;
+        u_int8_t        secure;
+        u_int8_t        encap_limit;
+        u_int8_t        hop_limit;
+        u_int32_t       flow_info; /* Traffic class and FlowLabel */
+        u_int16_t       frag_off;
+        u_int16_t       enabled;
+        u_int32_t       route_id;
+} __attribute__((__packed__)) fpp_tunnel_query_cmd_t;
+
+
+#ifdef SAM_LEGACY
+
+typedef struct {
+          int                            port_set_id;                    /**< Port Set ID               */
+          int                            port_set_id_length;             /**< Port Set ID length        */
+          int                            psid_offset;                    /**< PSID offset               */
+}sam_port_info_t;
+typedef sam_port_info_t rt_mw_ipstack_sam_port_t;
+
+typedef struct fpp_tunnel_id_conv_cmd {
+       u_int8_t        name[16];
+       sam_port_info_t sam_port_info;
+        u_int32_t       IdConvStatus:1,
+                       unused:31;
+} __attribute__((__packed__)) fpp_tunnel_id_conv_cmd_t;
+
+#else
+
+typedef struct fpp_tunnel_id_conv_cmd {
+	u_int16_t IdConvStatus;
+        u_int16_t       Pad;
+} __attribute__((__packed__)) fpp_tunnel_id_conv_cmd_t;
+#endif
+
+/*--------------------------------- Timeout ---------------------------------*/
+#define FPP_CMD_IPV4_SET_TIMEOUT	0x0319
+#define FPP_CMD_IPV4_GET_TIMEOUT	0x0320
+#define FPP_CMD_IPV4_FRAGTIMEOUT        0x0333
+#define FPP_CMD_IPV4_SAMFRAGTIMEOUT	0x0334
+#define FPP_CMD_IPV6_GET_TIMEOUT	0x0420
+#define FPP_CMD_IPV6_FRAGTIMEOUT	0x0433
+
+/* Timeout Update command */
+typedef struct fpp_timeout_cmd {
+	u_int16_t	protocol;
+	u_int16_t	sam_4o6_timeout;
+	u_int32_t	timeout_value1;
+	u_int32_t	timeout_value2;
+} __attribute__((__packed__)) fpp_timeout_cmd_t;
+
+typedef struct fpp_frag_timeout_cmd {
+	u_int16_t	timeout;
+	u_int16_t	mode;
+} __attribute__((__packed__)) fpp_frag_timeout_cmd_t;
+
+/*---------------------------------------PKTCAP---------------------------------*/
+#define FPP_CMD_PKTCAP_IFSTATUS				0x0d02
+#define FPP_CMD_PKTCAP_FLF                              0x0d03
+#define FPP_CMD_PKTCAP_SLICE				0x0d04
+#define FPP_CMD_PKTCAP_QUERY				0x0d05
+
+#define FPP_PKTCAP_STATUS				0x1
+#define FPP_PKTCAP_SLICE				0x2
+#define MAX_FLF_INSTRUCTIONS                            30
+
+typedef struct fpp_pktcap_status_cmd{
+	u_int16_t	action;
+	u_int8_t 	ifindex;
+	u_int8_t	status;
+}__attribute__((__packed__)) fpp_pktcap_status_cmd_t;
+
+typedef struct fpp_pktcap_slice_cmd{
+	u_int16_t	action;
+	u_int8_t 	ifindex;
+	u_int8_t	rsvd;
+	u_int16_t	slice;
+}__attribute__((__packed__)) fpp_pktcap_slice_cmd_t;
+
+typedef struct fpp_pktcap_query_cmd{
+	u_int16_t	slice;
+	u_int16_t	status;
+}__attribute__((__packed__)) fpp_pktcap_query_cmd_t;
+
+typedef struct fpp_pktcap_flf_cmd { /* First level filter */
+        u_int16_t flen; /* filter length */
+        unsigned char  ifindex;
+        unsigned char  mfg; /*  The most significant bit tells fpp if more fragments are expected.
+                        The least significant 3 bits give the sequence no of the fragment.  */
+        struct bpf_insn filter[MAX_FLF_INSTRUCTIONS];
+}__attribute__((__packed__)) fpp_pktcap_flf_cmd_t;
+
+
+/*----------------------------------------PKTCAP-------------------------------*/
+
+/* Port Update command - begin */
+
+#define FPP_CMD_PORT_UPDATE 0x0505
+typedef struct fpp_port_update_cmd {
+	u_int16_t port_id;
+	char ifname[16];
+}__attribute__((__packed__)) fpp_port_update_cmd_t;
+
+
+/*---------------------------------------ICC---------------------------------*/
+
+#define FPP_CMD_ICC_RESET				0x1500
+#define FPP_CMD_ICC_THRESHOLD				0x1501
+#define FPP_CMD_ICC_ADD_DELETE				0x1502
+#define FPP_CMD_ICC_QUERY				0x1503
+
+#define FPP_ERR_ICC_TOO_MANY_ENTRIES		1500
+#define FPP_ERR_ICC_ENTRY_ALREADY_EXISTS	1501
+#define FPP_ERR_ICC_ENTRY_NOT_FOUND		1502
+#define FPP_ERR_ICC_THRESHOLD_OUT_OF_RANGE	1503
+#define FPP_ERR_ICC_INVALID_MASKLEN		1504
+
+typedef struct fpp_icc_reset_cmd {
+	u_int16_t	reserved1;
+	u_int16_t	reserved2;
+} __attribute__((__packed__)) fpp_icc_reset_cmd_t;
+
+typedef struct fpp_icc_threshold_cmd {
+	u_int16_t	bmu1_threshold;
+	u_int16_t	bmu2_threshold;
+} __attribute__((__packed__)) fpp_icc_threshold_cmd_t;
+
+typedef struct fpp_icc_add_delete_cmd {
+	u_int16_t	action;
+	u_int8_t	interface;
+	u_int8_t	table_type;
+	union {
+		struct {
+			u_int16_t type;
+		} ethertype;
+		struct {
+			u_int8_t ipproto[256 / 8];
+		} protocol;
+		struct {
+			u_int8_t dscp_value[64 / 8];
+		} dscp;
+		struct {
+			u_int32_t v4_addr;
+			u_int8_t v4_masklen;
+		} ipaddr;
+		struct {
+			u_int32_t v6_addr[4];
+			u_int8_t v6_masklen;
+		} ipv6addr;
+		struct {
+			u_int16_t sport_from;
+			u_int16_t sport_to;
+			u_int16_t dport_from;
+			u_int16_t dport_to;
+		} port;
+		struct {
+			u_int16_t vlan_from;
+			u_int16_t vlan_to;
+			u_int16_t prio_from;
+			u_int16_t prio_to;
+		} vlan;
+	};
+} __attribute__((__packed__)) fpp_icc_add_delete_cmd_t;
+
+typedef struct fpp_icc_query_cmd {
+	u_int16_t	action;
+	u_int8_t	interface;
+	u_int8_t	reserved;
+} __attribute__((__packed__)) fpp_icc_query_cmd_t;
+
+typedef struct fpp_icc_query_reply {
+	u_int16_t	rtncode;
+	u_int16_t	query_result;
+	u_int8_t	interface;
+	u_int8_t	table_type;
+	union {
+		struct {
+			u_int16_t type;
+		} ethertype;
+		struct {
+			u_int8_t ipproto[256 / 8];
+		} protocol;
+		struct {
+			u_int8_t dscp_value[64 / 8];
+		} dscp;
+		struct {
+			u_int32_t v4_addr;
+			u_int8_t v4_masklen;
+		} ipaddr;
+		struct {
+			u_int32_t v6_addr[4];
+			u_int8_t v6_masklen;
+		} ipv6addr;
+		struct {
+			u_int16_t sport_from;
+			u_int16_t sport_to;
+			u_int16_t dport_from;
+			u_int16_t dport_to;
+		} port;
+		struct {
+			u_int16_t vlan_from;
+			u_int16_t vlan_to;
+			u_int16_t prio_from;
+			u_int16_t prio_to;
+		} vlan;
+	};
+} __attribute__((__packed__)) fpp_icc_query_reply_t;
+
+/*----------------------------------------L2TP-------------------------------*/
+#define FPP_CMD_L2TP_ITF_ADD		0x1600
+#define FPP_CMD_L2TP_ITF_DEL		0x1601
+
+typedef struct fpp_l2tp_itf_add_cmd {
+	char ifname[16];
+	u_int16_t	sock_id;
+	u_int16_t	local_tun_id;
+	u_int16_t	peer_tun_id;
+	u_int16_t	local_ses_id;
+	u_int16_t	peer_ses_id;
+	u_int16_t	options;	
+}__attribute__((__packed__)) fpp_l2tp_itf_add_cmd_t;
+
+typedef struct fpp_l2tp_itf_del_cmd {
+	char ifname[16];
+}__attribute__((__packed__)) fpp_l2tp_itf_del_cmd_t;
+#endif
diff --git a/cmm/src/fpp_private.h b/cmm/src/fpp_private.h
new file mode 100644
index 0000000..d7e92df
--- /dev/null
+++ b/cmm/src/fpp_private.h
@@ -0,0 +1,63 @@
+/*
+ *
+ *  Copyright (C) 2010 Mindspeed Technologies, Inc.
+ *
+ * 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 __FPP_PRIVATE__
+#define __FPP_PRIVATE__
+
+/*----------------------------------------- IPV4 -----------------------------*/
+#define FPP_CMD_IPV4_CONNTRACK_CHANGE		0x0315
+#define FPP_CMD_IPV4_SOCK_OPEN			0x0330
+#define FPP_CMD_IPV4_SOCK_CLOSE			0x0331
+#define FPP_CMD_IPV4_SOCK_UPDATE		0x0332
+
+/*----------------------------------------- IPV6 -----------------------------*/
+#define FPP_CMD_IPV6_CONNTRACK_CHANGE		0x0415
+#define FPP_CMD_IPV6_SOCK_OPEN			0x0430
+#define FPP_CMD_IPV6_SOCK_CLOSE			0x0431
+#define FPP_CMD_IPV6_SOCK_UPDATE		0x0432
+
+#define FPP_PROGRAMMED          (1 << 0)
+#define FPP_NEEDS_UPDATE        (1 << 1)
+#define NEEDS_UPDATE            (1 << 2)
+#define INVALID                 (1 << 3)
+#define RT_POLICY               (1 << 4)
+#define USER_ADDED              (1 << 5)
+#define CHECK_BRIDGE_PORT       (1 << 6)
+#define NEEDS_SOLICIT	        (1 << 7)
+
+#define ADD             (1 << 0)
+#define UPDATE          (1 << 1)
+#define REMOVE          (1 << 2)
+
+#define IPADDRLEN(family) ((family) == AF_INET ? 4 : 16)
+
+/* CMM tunnel entry states */
+#define TNL_IPSEC      		(1 << 0)
+#define TNL_6RD			(1 << 1)
+#define TNL_4RD                 (1 << 2)
+
+#ifndef IPPROTO_ETHERIP
+#define IPPROTO_ETHERIP		97
+#endif
+
+#define TNL_ETHIPOIP6  		0
+#define TNL_6O4			1
+#define TNL_4O6			2
+
+#endif
+
diff --git a/cmm/src/itf.c b/cmm/src/itf.c
new file mode 100644
index 0000000..1d5ef6c
--- /dev/null
+++ b/cmm/src/itf.c
@@ -0,0 +1,1529 @@
+#include <string.h>
+#include <errno.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <linux/netlink.h>
+#include <linux/sockios.h>
+#include <linux/rtnetlink.h>
+#include <linux/if_bridge.h>
+#include <linux/if_vlan.h>
+#include <net/if_arp.h>
+
+#include "cmm.h"
+#include "itf.h"
+#include "pppoe.h"
+#include "ffbridge.h"
+
+struct gemac_port port_table[GEM_PORTS] = {
+				   {"eth0", "wan", GEMAC_PORT_TYPE_WAN, 0, GEMAC0_PORT, 1},
+				   {"eth2", "lan", GEMAC_PORT_TYPE_LAN, 0, GEMAC1_PORT, 1},
+				   {"eth3", "wan1", GEMAC_PORT_TYPE_WAN, 0, GEMAC2_PORT, 1}
+				};
+
+struct interface_table itf_table;
+
+static struct interface_addr *__addr_find(struct interface *itf, unsigned int *ipaddr, unsigned int len);
+
+#ifdef WIFI_ENABLE
+static int ____itf_is_bridge(struct interface *itf);
+
+extern struct wifi_ff_entry glbl_wifi_ff_ifs[MAX_WIFI_FF_IFS];
+#endif
+
+extern int tunnel_send_cmd(FCI_CLIENT *fci_handle, int request, struct interface *itf);
+
+int LO_IFINDEX;
+
+static void __addr_remove(struct interface_addr *addr)
+{
+	cmm_print(DEBUG_INFO, "%s: address removed\n", __func__);
+
+	list_del(&addr->list);
+	free(addr);
+}
+
+static struct interface_addr *__addr_add(struct interface *itf)
+{
+	struct interface_addr *addr;
+
+	addr = malloc(sizeof(struct interface_addr));
+	if (!addr)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: malloc() failed\n", __func__, __LINE__);
+		goto err;
+	}
+	memset(addr, 0, sizeof(struct interface_addr));
+
+	list_add(&itf->addr_list, &addr->list);
+
+	cmm_print(DEBUG_INFO, "%s: address added\n", __func__);
+
+	return addr;
+
+err:
+	return NULL;
+}
+
+static void __addr_update(struct interface_addr *addr, struct ifaddrmsg *ifa, struct rtattr *tb[])
+{
+	struct rtattr *attr;
+
+	attr = tb[IFA_ADDRESS];
+
+	addr->len = RTA_PAYLOAD(attr);
+	memcpy(addr->address, RTA_DATA(attr), addr->len);
+
+	addr->prefixlen = ifa->ifa_prefixlen;
+	addr->scope = ifa->ifa_scope;
+	addr->family = ifa->ifa_family;
+}
+
+static void __newaddr(struct ifaddrmsg *ifa, struct rtattr *tb[])
+{
+	struct interface *itf;
+	struct interface_addr *addr;
+
+	itf = __itf_find(ifa->ifa_index);
+	if (!itf)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: __itf_find(%d) failed\n", __func__, __LINE__, ifa->ifa_index);
+		goto out;
+	}
+
+	addr = __addr_add(itf);
+	if (!addr)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: __addr_add(%d) failed\n", __func__, __LINE__, ifa->ifa_index);
+		goto out;
+	}
+
+	__addr_update(addr, ifa, tb);
+
+out:
+	return;
+}
+
+static void newaddr(struct interface_table *ctx, struct ifaddrmsg *ifa, struct rtattr *tb[])
+{
+	__pthread_mutex_lock(&ctx->lock);
+	__newaddr(ifa, tb);
+	__pthread_mutex_unlock(&ctx->lock);
+}
+
+
+static void __deladdr(struct ifaddrmsg *ifa, struct rtattr *tb[])
+{
+	struct interface *itf;
+	struct interface_addr *addr;
+	struct rtattr *attr;
+
+	attr = tb[IFA_ADDRESS];
+
+	itf = __itf_find(ifa->ifa_index);
+	if (!itf)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: __itf_find(%d) failed\n", __func__, __LINE__, ifa->ifa_index);
+		goto out;
+	}
+		
+	addr = __addr_find(itf, RTA_DATA(attr), RTA_PAYLOAD(attr));
+	if (!addr)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: __addr_find failed\n", __func__, __LINE__);
+		goto out;
+	}
+
+	__addr_remove(addr);
+out:
+	return;
+}
+
+
+static void deladdr(struct interface_table *ctx, struct ifaddrmsg *ifa, struct rtattr *tb[])
+{
+	__pthread_mutex_lock(&ctx->lock);
+	__deladdr(ifa, tb);
+	__pthread_mutex_unlock(&ctx->lock);
+}
+
+
+static struct interface_addr *__addr_find(struct interface *itf, unsigned int *ipaddr, unsigned int len)
+{
+	struct interface_addr *addr;
+	struct list_head *entry;
+
+	for (entry = list_first(&itf->addr_list); entry != &itf->addr_list; entry = list_next(entry))
+	{
+		addr = container_of(entry, struct interface_addr, list);
+		if (cmmPrefixEqual(addr->address, ipaddr, 8 * len))
+			goto found;
+	}
+
+	return NULL;
+
+found:
+	return addr;
+}
+
+#ifndef SAM_LEGACY
+static struct map_rule * mr_add(struct interface *itf)
+{
+       struct map_rule *mr;
+
+       mr = malloc(sizeof(struct map_rule));
+       if (!mr)
+       {
+               cmm_print(DEBUG_ERROR, "%s::%d: malloc() failed\n", __func__, __LINE__);
+               goto err;
+       }
+       memset(mr, 0, sizeof(struct map_rule));
+
+       list_add(&itf->mr_list, &mr->list);
+
+       cmm_print(DEBUG_INFO, "%s: map rule added\n", __func__);
+
+       return mr;
+
+err:
+       return NULL;
+}
+
+
+static void  mr_debug( struct interface * itf)
+{
+       struct list_head *entry, *next_entry;
+       struct map_rule *mr;
+
+
+       for (entry = list_first(&itf->mr_list); next_entry = list_next(entry), entry != &itf->mr_list; entry = next_entry)
+       {
+               mr = container_of(entry, struct map_rule, list);
+       cmm_print(DEBUG_ERROR, "%03d : %03d.%03d.%03d.%03d/%02d %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x/%03d %02x%02x     :%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x/%03d eabit:%03d offset:%03d \n",
+                                       mr->rule.entry_num,
+                                       (ntohl(mr->rule.prefix) >> 24) & 0xff,
+                                       (ntohl(mr->rule.prefix) >> 16) & 0xff,
+                                       (ntohl(mr->rule.prefix) >>  8) & 0xff,
+                                       ntohl(mr->rule.prefix) & 0xff,
+                                       mr->rule.prefixlen,
+                                       mr->rule.relay_prefix.s6_addr[0],
+                                       mr->rule.relay_prefix.s6_addr[1],
+                                       mr->rule.relay_prefix.s6_addr[2],
+                                       mr->rule.relay_prefix.s6_addr[3],
+                                       mr->rule.relay_prefix.s6_addr[4],
+                                       mr->rule.relay_prefix.s6_addr[5],
+                                       mr->rule.relay_prefix.s6_addr[6],
+                                       mr->rule.relay_prefix.s6_addr[7],
+                                       mr->rule.relay_prefix.s6_addr[8],
+                                       mr->rule.relay_prefix.s6_addr[9],
+                                       mr->rule.relay_prefix.s6_addr[10],
+                                       mr->rule.relay_prefix.s6_addr[11],
+                                       mr->rule.relay_prefix.s6_addr[12],
+                                       mr->rule.relay_prefix.s6_addr[13],
+                                       mr->rule.relay_prefix.s6_addr[14],
+                                       mr->rule.relay_prefix.s6_addr[15],
+                                       mr->rule.relay_prefixlen,
+                                       mr->rule.relay_suffix.s6_addr[0],
+                                       mr->rule.relay_suffix.s6_addr[1],
+                                       mr->rule.relay_suffix.s6_addr[2],
+                                       mr->rule.relay_suffix.s6_addr[3],
+                                       mr->rule.relay_suffix.s6_addr[4],
+                                       mr->rule.relay_suffix.s6_addr[5],
+                                       mr->rule.relay_suffix.s6_addr[6],
+                                       mr->rule.relay_suffix.s6_addr[7],
+                                       mr->rule.relay_suffix.s6_addr[8],
+                                       mr->rule.relay_suffix.s6_addr[9],
+                                       mr->rule.relay_suffix.s6_addr[10],
+                                       mr->rule.relay_suffix.s6_addr[11],
+                                       mr->rule.relay_suffix.s6_addr[12],
+                                       mr->rule.relay_suffix.s6_addr[13],
+                                       mr->rule.relay_suffix.s6_addr[14],
+                                       mr->rule.relay_suffix.s6_addr[15],
+                                       mr->rule.relay_suffixlen,
+                                       mr->rule.eabit_len,
+                                       mr->rule.psid_offsetlen );
+
+
+       }
+       return ;
+}
+
+
+static struct map_rule * mr_find( int entry_num,struct interface * itf)
+{
+       struct list_head *entry, *next_entry;
+       struct map_rule *mr;
+
+       cmm_print(DEBUG_INFO, "%s: mapping rule entry find %d \n", __func__, entry_num);
+
+       for (entry = list_first(&itf->mr_list); next_entry = list_next(entry), entry != &itf->mr_list; entry = next_entry)
+       {
+               mr = container_of(entry, struct map_rule, list);
+               if(mr->rule.entry_num == entry_num)
+                       return mr;
+
+       }
+       return NULL;
+}
+
+static void __mr_delete(struct map_rule *mr)
+{
+       cmm_print(DEBUG_INFO, "%s: mapping rule removed\n", __func__);
+
+       list_del(&mr->list);
+       free(mr);
+}
+
+static void mr_delete(int entry_num, int reset, struct interface* itf)
+{
+       struct list_head *entry, *next_entry;
+       struct map_rule *mr;
+
+       cmm_print(DEBUG_INFO, "%s: mapping rule entry delete  %d reset is %d \n", __func__, entry_num,reset);
+       for (entry = list_first(&itf->mr_list); next_entry = list_next(entry), entry != &itf->mr_list; entry = next_entry)
+       {
+               mr = container_of(entry, struct map_rule, list);
+               if(reset)
+                       __mr_delete(mr);
+               else if(mr->rule.entry_num == entry_num)
+               {
+                       __mr_delete(mr);
+                       return;
+               }
+
+       }
+       return ;
+}
+
+static void __mr_update(struct map_rule * mr, struct ip6_4rd_map_msg *mr_msg)
+{
+       mr->rule.prefix = mr_msg->prefix ;
+       memcpy(&mr->rule.relay_prefix,&mr_msg->relay_prefix, sizeof(mr_msg->relay_prefix));
+       memcpy(&mr->rule.relay_suffix,&mr_msg->relay_suffix, sizeof(mr_msg->relay_suffix));
+       mr->rule.prefixlen = mr_msg->prefixlen ;
+       mr->rule.relay_prefixlen = mr_msg->relay_prefixlen ;
+       mr->rule.relay_suffixlen = mr_msg->relay_suffixlen ;
+       mr->rule.psid_offsetlen = mr_msg->psid_offsetlen ;
+       mr->rule.eabit_len = mr_msg->eabit_len ;
+       mr->rule.entry_num = mr_msg->entry_num ;
+       return;
+}
+
+static void mr_update(FCI_CLIENT *fci_handle,struct ip6_4rd_map_msg *mr_msg)
+{
+       struct interface *itf;
+       struct map_rule *mr;
+
+       itf = __itf_find(mr_msg->ifindex);
+       if (!itf)
+       {
+               cmm_print(DEBUG_ERROR, "%s::%d: __itf_find(%d) failed\n", __func__, __LINE__, mr_msg->ifindex);
+               goto out;
+       }
+
+       mr = mr_find(mr_msg->entry_num, itf);
+       if (!mr)
+       {
+               // Add new mapping rule
+               mr = mr_add(itf);
+               if(!mr)
+               {
+                       cmm_print(DEBUG_ERROR, "%s::%d: __mr_add(%d) failed\n", __func__, __LINE__, mr_msg->entry_num);
+                       goto out;
+               }
+	       if(!(itf->tunnel_flags & TNL_4RD))
+	       {
+			/* Set tunnel mode to 4RD and update tunnel in FPP */
+			itf->tunnel_flags |= TNL_4RD;
+			itf->flags |= FPP_NEEDS_UPDATE;
+			tunnel_send_cmd(fci_handle, UPDATE,itf);	
+	       }
+			
+       }
+       __mr_update(mr, mr_msg);
+out:
+       return;
+}
+
+static void mr_remove(FCI_CLIENT *fci_handle,struct ip6_4rd_map_msg *mr_msg)
+{
+       struct interface *itf;
+       struct list_head *entry;
+
+       itf = __itf_find(mr_msg->ifindex);
+       if (!itf)
+       {
+               cmm_print(DEBUG_ERROR, "%s::%d: __itf_find(%d) failed\n", __func__, __LINE__, mr_msg->ifindex);
+               goto out;
+       }
+
+       mr_delete(mr_msg->entry_num, mr_msg->reset, itf);
+       entry = &itf->mr_list;
+       if(list_empty(entry))
+       {
+	       if(itf->tunnel_flags & TNL_4RD)	
+	       {
+		       itf->tunnel_flags &= ~TNL_4RD;
+		       /* The tunnel needs  to be updated as type 4o6 */
+			itf->flags |= FPP_NEEDS_UPDATE;
+			tunnel_send_cmd(fci_handle, UPDATE,itf);	
+	       }	
+       }
+out:
+       return;
+}
+#endif
+
+static void __itf_remove(struct interface *itf)
+{
+	struct interface_addr *addr;
+	struct list_head *entry, *next_entry;
+#ifndef SAM_LEGACY
+	struct map_rule *mr;
+#endif
+
+	cmm_print(DEBUG_INFO, "%s: interface(%d) removed\n", __func__, itf->ifindex);
+
+	for (entry = list_first(&itf->addr_list); next_entry = list_next(entry), entry != &itf->addr_list; entry = next_entry)
+	{
+		addr = container_of(entry, struct interface_addr, list);
+		__addr_remove(addr);
+	}
+#ifndef SAM_LEGACY
+       for (entry = list_first(&itf->mr_list); next_entry = list_next(entry), entry != &itf->mr_list; entry = next_entry)
+       {
+	       mr = container_of(entry, struct map_rule, list);
+	       __mr_delete(mr);
+
+       }
+#endif
+
+	if (__itf_is_l2tp(itf))
+		l2tp_itf_del(itf_table.fci_handle, itf);
+
+	list_del(&itf->list);
+	free(itf);
+}
+
+static void __itf_update(struct interface_table *ctx, struct interface *itf, struct ifinfomsg *ifi, struct rtattr *tb[])
+{
+	struct rtattr *attr;
+
+	itf->ifindex = ifi->ifi_index;
+	itf->type = ifi->ifi_type;
+	itf->ifi_flags = ifi->ifi_flags;
+
+	/* If the interface is down don't try to update the other fields,
+	   the information may already be missing in the kernel and we will get wrong results */
+	if (!__itf_is_up(itf))
+		goto out;
+
+#ifdef WIFI_ENABLE	
+	/* FIXME : Skip wireless events */
+	attr = tb[IFLA_WIRELESS];
+	
+	if(attr)
+		goto out;	
+#endif
+
+	attr = tb[IFLA_ADDRESS];
+	if (attr)
+	{
+		/* mark mac address valid */
+		itf->macaddr_len = RTA_PAYLOAD(attr);
+
+		/* Ethip kernel mod WA compatibility */
+		if(itf->macaddr_len > 6)
+			itf->macaddr_len = 6;
+		
+		memcpy(itf->macaddr, RTA_DATA(attr), itf->macaddr_len);
+	}
+	else
+	{
+		memset(itf->macaddr, 0, 6);
+		itf->macaddr_len = 0;
+	}
+
+	attr = tb[IFLA_MTU];
+	if (attr)
+		itf->mtu = *(unsigned int *)RTA_DATA(attr);
+	else
+		itf->mtu = 0;
+
+	attr = tb[IFLA_LINK];
+	if (attr)
+		itf->phys_ifindex = *(int *)RTA_DATA(attr);
+	else
+		/* will be updated later if pppoe */
+		itf->phys_ifindex = itf->ifindex;
+
+	if (__itf_is_pppoe(itf))
+	{
+		itf->itf_flags &= ~ITF_PPPOE_SESSION_UP;
+
+		if (!ctx->fp)
+		{
+			ctx->fp = fopen(PPPOE_PATH, "r");
+			if (!ctx->fp)
+			{
+				cmm_print(DEBUG_ERROR, "%s::%d: fopen(%s) error %s\n", __func__, __LINE__, PPPOE_PATH, strerror(errno));
+				goto out;
+			}
+		}
+
+		__cmmGetPPPoESession(ctx->fp, itf);
+	}
+	else
+        {
+
+		__cmmGetVlan(ctx->fd, itf);
+#ifdef WIFI_ENABLE	
+		__cmmGetWiFi(ctx->fd, itf);
+#endif
+
+		itf->itf_flags &= ~ITF_BRIDGE;
+		__cmmGetBridges(ctx->fd);
+		__cmmGetTunnel(ctx->fd, itf);
+	
+#ifdef IFLA_LINKINFO
+		unsigned char *pInfoKind = NULL ;
+		unsigned int uLen = 0 ;
+		attr = tb[IFLA_LINKINFO];
+		if ( attr )
+		{
+		  struct rtattr *attr2;
+
+		  attr2 = cmm_get_rtattr(RTA_DATA(attr), RTA_PAYLOAD(attr), IFLA_INFO_KIND);
+		  if ( attr2 )
+		  {
+		     uLen = RTA_PAYLOAD(attr2);
+		
+		     pInfoKind = (unsigned char *)RTA_DATA(attr2) ;
+		  }
+		}
+		itf->itf_flags &= ~ITF_MACVLAN;
+		if ( uLen >= INFO_KIND_MACVLAN_STR_LEN ) 
+		{
+	    	  __cmmGetMacVlan(ctx->fd, itf, pInfoKind );
+		}
+#endif
+	}
+
+out:
+	cmm_print(DEBUG_INFO, "%s: itf: %lx, ifindex: %d, phys_ifindex: %d, flags: %x\n", __func__, (unsigned long)itf, itf->ifindex, itf->phys_ifindex, itf->itf_flags);
+
+	/* FIXME resolve physical interface for vlan + bridge, bridge + vlan */
+}
+
+static struct interface *__itf_add(struct interface_table *ctx, int ifindex)
+{
+	struct interface *itf;
+	int key;
+
+	itf = malloc(sizeof(struct interface));
+	if (!itf)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: malloc() failed\n", __func__, __LINE__);
+		goto err;
+	}
+
+	memset(itf, 0, sizeof(struct interface));
+
+	itf->count = 0;
+
+	list_head_init(&itf->addr_list);
+#ifndef SAM_LEGACY
+	list_head_init(&itf->mr_list);
+#endif
+
+	key = HASH_ITF(ifindex);
+	list_add(&ctx->hash[key], &itf->list);
+
+	cmm_print(DEBUG_INFO, "%s: interface(%d) added\n", __func__, ifindex);
+
+	return itf;
+
+err:
+	return NULL;
+}
+
+#ifndef SAM_LEGACY
+static int __cmmGetMappingRuleFilter(const struct sockaddr_nl *nladdr, struct nlmsghdr *nlh, void *arg)
+{
+	struct interface_table *ctx = arg;
+	struct ip6_4rd_map_msg *mr;
+//	struct rtattr *tb[IF_MR_MAX + 1];
+
+	if (nlh->nlmsg_type != RTM_NEW4RD)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: unexpected netlink message(%d)\n",
+						 __func__, __LINE__, nlh->nlmsg_type);
+		goto out;
+	}
+
+	mr = NLMSG_DATA(nlh);
+
+	mr_update(ctx->fci_handle,mr);	
+	struct interface * itf = __itf_find(mr->ifindex);
+	if (itf)
+	{
+		mr_debug(itf);
+	}
+
+
+out:
+	return RTNL_CB_CONTINUE;
+}
+
+static int __cmmGetMappingRule(struct interface_table *ctx)
+{
+	struct ip6_4rd_map_msg mr;
+
+	int rc;
+	memset(&mr,0,sizeof(mr));
+
+	if ((rc = cmm_rtnl_dump_request(&ctx->rth, RTM_GET4RD, &mr, sizeof(struct ip6_4rd_map_msg))) < 0)
+		goto out;
+
+	rc = cmm_rtnl_listen(&ctx->rth, __cmmGetMappingRuleFilter, ctx);
+
+out:
+	return rc;
+}
+#endif
+
+void __itf_update_connection(FCI_CLIENT *fci_handle, int ifindex)
+{
+	struct list_head *entry, *next_entry;
+	struct RtEntry *route;
+	int i;
+
+	for (i = 0; i < ROUTE_HASH_TABLE_SIZE * 2; i++)
+	{
+		for (entry = list_first(&rt_table[i]); next_entry = list_next(entry), entry != &rt_table[i]; entry = next_entry)
+		{
+			route = container_of(entry, struct RtEntry, list);
+
+			if (!((route->oifindex == ifindex) || (route->phys_oifindex == ifindex)))
+				continue;
+
+			/* Force lookup of bridge port */
+			if (route->neighEntry)
+				route->neighEntry->port = -1;
+
+			route->flags |= CHECK_BRIDGE_PORT;
+
+			__cmmCtUpdateWithRoute(fci_handle, route);
+
+			__cmmTunnelUpdateWithRoute(fci_handle, route);
+
+			__cmmSocketUpdateWithRoute(fci_handle, route);
+		}
+	}
+}
+
+
+static void __updatelink(struct interface_table *ctx, struct ifinfomsg *ifi, struct rtattr *tb[], int dellink)
+{
+	struct interface *itf;
+
+	itf = __itf_find(ifi->ifi_index);
+	if (!itf)
+	{
+		if (dellink && !(ifi->ifi_flags & IFF_UP) && (ifi->ifi_change == 0xffffffff))
+			goto out;
+
+		itf = __itf_add(ctx, ifi->ifi_index);
+		if (!itf)
+		{
+			cmm_print(DEBUG_ERROR, "%s::%d: __itf_add(%d) failed\n", __func__, __LINE__, ifi->ifi_index);
+			goto out;
+		}
+	}
+
+	__itf_update(ctx, itf, ifi, tb);
+
+	/* For IP tunnels we don't care about physical output interface here,
+		everything is handled later through the tunnel route output interface */
+	if (__itf_is_tunnel(itf))
+	{
+			if (__itf_is_up(itf))
+				__tunnel_add(ctx->fci_handle, itf);
+			else
+				__tunnel_del(ctx->fci_handle, ctx->fci_key_handle, itf);
+	}
+	else if (__itf_is_l2tp(itf))
+	{
+		if (__itf_is_up(itf))
+			/* L2TP interface being a virtual interface, the physical and logical ifindices are the same */
+			l2tp_itf_add(ctx->fci_handle, ADD, itf);
+		else
+			__l2tp_itf_del(ctx->fci_handle, itf);
+	}
+	else
+	{
+#ifdef WIFI_ENABLE
+		if(__itf_is_wifi(itf))
+		{					
+		//	cmm_print( DEBUG_INFO, "%s : vap : %s\n", __func__, itf->ifname);
+
+			if (__itf_is_up(itf))
+				cmmFeWiFiUpdate(ctx->fci_handle, ctx->fd, ADD, itf);
+			else
+				cmmFeWiFiUpdate(ctx->fci_handle, ctx->fd, REMOVE, itf);
+		}
+		else 
+#endif
+		if (__itf_is_programmed(itf->phys_ifindex) > 0)
+		{
+			if (__itf_is_pppoe(itf) && ctx->fp)
+			{
+				if (__itf_is_up(itf) && (itf->itf_flags & ITF_PPPOE_SESSION_UP))
+					cmmFePPPoEUpdate(ctx->fci_handle, ADD, itf);
+				else
+					cmmFePPPoEUpdate(ctx->fci_handle, REMOVE, itf);
+			}
+			else if (__itf_is_vlan(itf))
+			{
+				if (cmmVlanCheckPolicy(itf))
+				{
+					if (__itf_is_up(itf))
+						cmmFeVLANUpdate(ctx->fci_handle, ADD, itf);
+					else
+						cmmFeVLANUpdate(ctx->fci_handle, REMOVE, itf);
+				}
+			}
+			else if (__itf_is_macvlan(itf))
+			{
+				if (__itf_is_up(itf)) {
+					cmmFeMacVlanUpdate(ctx->fci_handle,ctx->fd,ADD,itf);
+				}
+				else  {
+					cmmFeMacVlanUpdate(ctx->fci_handle,ctx->fd,REMOVE,itf);
+				}
+			}
+		}
+#ifdef WIFI_ENABLE	
+		else if (____itf_is_bridge( itf ))
+		{
+			
+			if (__itf_is_up(itf))
+				cmmFeWiFiBridgeUpdate(ctx->fci_handle, ctx->fd, ADD, itf);
+		}
+#endif
+		
+	}
+
+	if (dellink && !__itf_is_up(itf) && (ifi->ifi_change == 0xffffffff))
+		__itf_remove(itf);
+
+out:
+	return;
+}
+
+static void updatelink(struct interface_table *ctx, struct ifinfomsg *ifi, struct rtattr *tb[], int dellink)
+{
+	__pthread_mutex_lock(&ctx->lock);
+	__pthread_mutex_lock(&ctMutex);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+
+	__updatelink(ctx, ifi, tb, dellink);
+	__itf_update_connection(ctx->fci_handle, ifi->ifi_index);
+	mc_update_table(ctx->fci_handle, tb, ifi);
+
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&ctx->lock);
+}
+
+struct interface *__itf_find(int ifindex)
+{
+	struct list_head *entry;
+	struct interface *itf;
+	int key;
+
+	cmm_print(DEBUG_INFO, "%s: find interface(%d)\n", __func__, ifindex);
+
+	key = HASH_ITF(ifindex);
+
+	entry = list_first(&itf_table.hash[key]);
+	while (entry != &itf_table.hash[key])
+	{
+		itf = container_of(entry, struct interface, list);
+		if (itf->ifindex == ifindex)
+			goto found;
+
+		entry = list_next(entry);
+	}
+
+	itf = NULL;
+
+found:
+	return itf;
+}
+
+static int __cmmGetAddrFilter(const struct sockaddr_nl *nladdr, struct nlmsghdr *nlh, void *arg)
+{
+	struct ifaddrmsg *ifa;
+	struct rtattr *tb[IFA_MAX + 1];
+
+	if (nlh->nlmsg_type != RTM_NEWADDR)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: unexpected netlink message(%d)\n",
+						 __func__, __LINE__, nlh->nlmsg_type);
+
+		goto out;
+	}
+
+	ifa = NLMSG_DATA(nlh);
+
+	cmm_parse_rtattr(tb, IFA_MAX, IFA_RTA(ifa), IFA_PAYLOAD(nlh));
+
+	if (!tb[IFA_ADDRESS])
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: rtnetlink message missing interface addr\n", __func__, __LINE__);
+		goto out;
+	}
+
+	__newaddr(ifa, tb);
+
+out:
+	return RTNL_CB_CONTINUE;
+}
+
+static int __cmmGetAddr(struct rtnl_handle *rth, int family)
+{
+	struct ifaddrmsg ifa = {
+		.ifa_family = family,
+		.ifa_prefixlen = 0,
+		.ifa_flags = 0,
+		.ifa_scope = 0,
+		.ifa_index = 0,
+	};
+	int rc;
+
+	if ((rc = cmm_rtnl_dump_request(rth, RTM_GETADDR, &ifa, sizeof(struct ifaddrmsg))) < 0)
+		goto out;
+
+	rc = cmm_rtnl_listen(rth, __cmmGetAddrFilter, NULL);
+
+out:
+	return rc;
+}
+
+static int __cmmGetLinkFilter(const struct sockaddr_nl *nladdr, struct nlmsghdr *nlh, void *arg)
+{
+	struct interface_table *ctx = arg;
+	struct ifinfomsg *ifi;
+	struct rtattr *tb[IFLA_MAX + 1];
+
+	if (nlh->nlmsg_type != RTM_NEWLINK)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: unexpected netlink message(%d)\n",
+						 __func__, __LINE__, nlh->nlmsg_type);
+		goto out;
+	}
+
+	ifi = NLMSG_DATA(nlh);
+
+	cmm_parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), IFLA_PAYLOAD(nlh));
+
+	__updatelink(ctx, ifi, tb, 0);
+
+out:
+	return RTNL_CB_CONTINUE;
+}
+
+static int __cmmGetLink(struct interface_table *ctx)
+{
+	struct ifinfomsg ifi = {
+		.ifi_family = AF_UNSPEC,
+		.ifi_type = 0,
+		.ifi_index = 0,
+		.ifi_flags = 0,
+		.ifi_change = 0,
+	};
+	int rc;
+
+	if ((rc = cmm_rtnl_dump_request(&ctx->rth, RTM_GETLINK, &ifi, sizeof(struct ifinfomsg))) < 0)
+		goto out;
+
+	rc = cmm_rtnl_listen(&ctx->rth, __cmmGetLinkFilter, ctx);
+
+out:
+	return rc;
+}
+
+static int __itf_table_update(struct interface_table *ctx)
+{
+	__cmmGetLink(ctx);
+	__cmmGetAddr(&ctx->rth, AF_INET);
+	__cmmGetAddr(&ctx->rth, AF_INET6);
+#ifndef SAM_LEGACY
+	__cmmGetMappingRule(ctx);
+#endif
+
+	return 0;
+}
+
+static int itf_table_update(struct interface_table *ctx)
+{
+	int rc;
+
+	__pthread_mutex_lock(&ctx->lock);
+	__pthread_mutex_lock(&ctMutex);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+
+	rc = __itf_table_update(ctx);
+
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&ctx->lock);
+
+	return rc;
+}
+
+
+struct interface *__itf_get(int ifindex)
+{
+	struct interface *itf;
+
+	itf = __itf_find(ifindex);
+	if (!itf)
+	{
+		__itf_table_update(&itf_table);
+
+		itf = __itf_find(ifindex);
+		if (!itf)
+			goto err;
+	}
+
+//	itf->count++;
+
+	return itf;
+
+err:
+	return NULL;
+}
+
+void __itf_put(struct interface *itf)
+{
+#if 0
+	itf->count--;
+	if (itf->count <= 0)
+		__itf_remove(itf);
+#endif
+}
+
+int itf_get_ipaddr(int ifindex, int family, unsigned char scope, unsigned int *ipaddr, unsigned int *target)
+{
+	struct interface *itf;
+	struct interface_addr *addr;
+	struct list_head *entry;
+	int rc = -1;
+
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&ctMutex);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+
+	itf = __itf_get(ifindex);
+	if (!itf)
+		goto unlock;
+
+	for (entry = list_first(&itf->addr_list); entry != &itf->addr_list; entry = list_next(entry))
+	{
+		addr = container_of(entry, struct interface_addr, list);
+		if ((addr->family == family) && (addr->scope == scope) && (((family == AF_INET) && cmmPrefixEqual(target, addr->address, addr->prefixlen)) || (family == AF_INET6)))
+		{
+			memcpy(ipaddr, addr->address, addr->len);
+			rc = 0;
+			break;
+		}
+	}
+
+	__itf_put(itf);
+
+unlock:
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	return rc;
+}
+
+int __itf_get_macaddr(struct interface *itf, unsigned char *macaddr)
+{
+	if (!itf->macaddr_len)
+		goto err;
+
+	memcpy(macaddr, itf->macaddr, itf->macaddr_len);
+
+	return 0;
+
+err:
+	return -1;
+}
+
+int itf_get_macaddr(int ifindex, unsigned char *macaddr)
+{
+	struct interface *itf;
+	int rc = -1;
+
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&ctMutex);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+
+	itf = __itf_get(ifindex);
+	if (!itf)
+		goto unlock;
+
+	rc = __itf_get_macaddr(itf, macaddr);
+
+	__itf_put(itf);
+
+unlock:
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	return rc;
+}
+
+int __itf_get_mtu(int ifindex)
+{
+	struct interface *itf;
+	int rc = -1;
+
+	itf = __itf_find(ifindex);
+	if (!itf)
+		goto out;
+
+	rc = itf->mtu;
+
+out:
+	return rc;
+}
+
+
+int ____itf_get_name(struct interface *itf, char *ifname, int len)
+{
+	if (!if_indextoname(itf->ifindex, itf->ifname))
+	{
+		cmm_print(DEBUG_WARNING, "%s: if_indextoname() failed\n", __func__);
+
+		if (itf->ifname[0] == '\0')
+			goto err;
+	}
+
+	len = (len < IFNAMSIZ ? len : IFNAMSIZ) - 1;
+
+	ifname[len] = '\0';
+
+	memcpy(ifname, itf->ifname, len);
+
+	return 0;
+
+err:
+	return -1;
+}
+
+int __itf_get_name(int ifindex, char *ifname, int len)
+{
+	struct interface *itf;
+	int rc = -1;
+
+	itf = __itf_find(ifindex);
+	if (!itf)
+		goto out;
+
+	rc = ____itf_get_name(itf, ifname, len);
+
+out:
+	return rc;
+}
+
+
+static int ____itf_is_bridge(struct interface *itf)
+{
+	if (itf->itf_flags & ITF_BRIDGE)
+		return 1;
+
+	return 0;
+}
+
+int __itf_is_bridge(int ifindex)
+{
+	struct interface *itf;
+	int rc = -1;
+
+	itf = __itf_find(ifindex);
+	if (!itf)
+		goto out;
+
+	if (itf->itf_flags & ITF_BRIDGE)
+		rc = 1;
+	else
+		rc = 0;
+
+out:
+	return rc;
+}
+
+#ifdef WIFI_ENABLE
+int __itf_is_wifi(struct interface *itf)
+{
+	if (itf->itf_flags & ITF_WIFI)
+		return 1;
+
+	return 0;
+}
+#endif
+
+int __itf_is_vlan(struct interface *itf)
+{
+	if (itf->itf_flags & ITF_VLAN)
+		return 1;
+
+	return 0;
+}
+
+
+int __itf_is_pointopoint(struct interface *itf)
+{
+	if (itf->ifi_flags & IFF_POINTOPOINT)
+		return 1;
+
+	return 0;
+}
+
+
+int __itf_is_pppoe(struct interface *itf)
+{
+	if ((itf->type == ARPHRD_PPP) && !(itf->itf_flags & ITF_L2TP))
+		return 1;
+
+	return 0;
+}
+
+
+int __itf_is_noarp(int ifindex)
+{
+	struct interface *itf;
+	int rc = -1;
+
+	itf = __itf_find(ifindex);
+	if (!itf)
+		goto out;
+
+	if (itf->ifi_flags & IFF_NOARP)
+		rc = 1;
+	else
+		rc = 0;
+
+out:
+	return rc;
+}
+
+
+int __itf_is_up(struct interface *itf)
+{
+	if (itf->ifi_flags & IFF_UP)
+		return 1;
+
+	return 0;
+}
+
+
+int __itf_is_tunnel(struct interface *itf)
+{
+	if (itf->itf_flags & ITF_TUNNEL)
+		return 1;
+
+	return 0;
+}
+
+int __itf_is_l2tp(struct interface *itf)
+{
+	if (itf->itf_flags & ITF_L2TP)
+		return 1;
+
+	return 0;
+}
+
+int __itf_get_from_bridge_port(int ifindex, int port)
+{
+	struct interface *itf;
+	int rc = -1;
+
+	itf = __itf_find(ifindex);
+	if (!itf)
+		goto out;
+
+	if (!____itf_is_bridge(itf))
+		goto out;
+
+	if (port >= MAX_PORTS)
+		goto out;
+
+	rc = itf->ifindices[port];
+
+out:
+	return rc;
+}
+
+static int ____itf_is_programmed(struct interface *itf)
+{
+	if (itf->flags & FPP_PROGRAMMED)
+		return 1;
+	else
+		return 0;
+}
+
+int __itf_is_programmed(int ifindex)
+{
+	struct interface *itf;
+	int rc = -1, ii;
+
+	/* LAN/WAN interfaces are programmed in FPP by default */
+	for (ii = 0; ii < GEM_PORTS; ii++)
+	{
+		if (port_table[ii].enable && port_table[ii].ifindex == ifindex)
+		{
+			rc = 1;
+			goto out;
+		}
+	}
+
+	itf = __itf_find(ifindex);
+	if (!itf)
+		goto out;
+
+	rc = ____itf_is_programmed(itf);
+
+out:
+	return rc;
+}
+
+
+int itf_is_programmed(int ifindex)
+{
+	struct interface *itf;
+	int rc = -1, ii;
+
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&ctMutex);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+
+	/* LAN/WAN interfaces are programmed in FPP by default */
+	for (ii = 0; ii < GEM_PORTS; ii++)
+	{
+		if (port_table[ii].enable && port_table[ii].ifindex == ifindex)
+		{
+			rc = 1;
+			goto out;
+		}
+	}
+
+	itf = __itf_get(ifindex);
+	if (!itf)
+		goto out;
+
+	rc = ____itf_is_programmed(itf);
+
+out:
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	return rc;
+}
+
+int __itf_is_macvlan(struct interface *itf)
+{
+	if (itf->itf_flags & ITF_MACVLAN)
+		return 1;
+
+	return 0;
+}
+
+int ____itf_is_4o6_tunnel(struct interface *itf)
+{
+	if (!__itf_is_tunnel(itf) || (itf->tunnel_parm6.proto != IPPROTO_IPIP ))
+		return 0;
+	else
+		return 1;
+}
+
+
+int ____itf_is_floating_sit_tunnel(struct interface *itf)
+{
+	if (!__itf_is_tunnel(itf) || (itf->type != ARPHRD_SIT) || itf->tunnel_parm4.iph.daddr)
+		return 0;
+	else
+		return 1;
+}
+
+
+int __itf_is_floating_sit_tunnel(int ifindex)
+{
+	struct interface *itf;
+	int rc = -1;
+
+	itf = __itf_find(ifindex);
+	if (!itf)
+		goto out;
+
+	rc = ____itf_is_floating_sit_tunnel(itf);
+
+out:
+	return rc;
+}
+
+int itf_name_update(FCI_CLIENT *fci_handle, struct gemac_port *port)
+{
+	/* Send a message to FPP to set the interface name associated with  each GEM Port */
+	fpp_port_update_cmd_t cmd;
+	int ret;
+
+	cmd.port_id = port->port_id;
+	strncpy(cmd.ifname, port->ifname, sizeof(cmd.ifname));
+	cmd.ifname[sizeof(cmd.ifname) - 1] = '\0';
+
+	cmm_print(DEBUG_INFO, "%s: port mapping %d <=> %s\n", __func__, cmd.port_id, cmd.ifname);
+
+	if (FPP_ERR_OK != (ret = fci_write(fci_handle, FPP_CMD_PORT_UPDATE , sizeof(cmd), (unsigned short *) &cmd)))
+	{
+		cmm_print(DEBUG_CRIT, "%s: Port update failed in FPP %d \n", __func__, ret);
+		return -1;
+	}
+
+	return 0;
+}
+
+int itf_table_init(struct interface_table *ctx)
+{
+	int i;
+
+	pthread_mutex_init(&ctx->lock, NULL);
+
+	for (i = 0; i < ITF_HASH_TABLE_SIZE; i++)
+		list_head_init(&ctx->hash[i]);
+
+	for ( i = 0; i < GEM_PORTS; i++)
+	{
+		port_table[i].ifindex = if_nametoindex(port_table[i].ifname);
+		if (!port_table[i].ifindex)
+			cmm_print(DEBUG_ERROR, "%s::%d: if_nametoindex(%s) failed\n", __func__, __LINE__,  port_table[i].ifname);
+	}
+
+	LO_IFINDEX = if_nametoindex(LO_INTERFACE_NAME);
+	if (!LO_IFINDEX)
+		cmm_print(DEBUG_ERROR, "%s::%d: if_nametoindex(%s) failed\n", __func__, __LINE__, LO_INTERFACE_NAME);
+	
+	ctx->fp = fopen(PPPOE_PATH, "r");
+	/* we will retry later if it fails here, this happens when ppp modules are not loaded yet */
+
+	ctx->fd = socket(AF_INET, SOCK_DGRAM, 0);
+	if (ctx->fd < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: inet socket() %s\n", __func__, __LINE__, strerror(errno));
+		goto err1;
+	}
+
+	/* get netlink link and address information */
+	if (cmm_rtnl_open(&ctx->rth, 0) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: netlink socket() %s\n", __func__, __LINE__, strerror(errno));
+		goto err2;
+	}
+
+	ctx->fci_handle = fci_open(FCILIB_FF_TYPE, 0);
+	if (!ctx->fci_handle)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: fci_open() %s\n", __func__, __LINE__, strerror(errno));
+		goto err3;
+	}
+
+#if !defined(IPSEC_SUPPORT_DISABLED)
+	ctx->fci_key_handle = fci_open(FCILIB_KEY_TYPE, 0);
+	if (!ctx->fci_key_handle)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: fci_open() %s\n", __func__, __LINE__, strerror(errno));
+		goto err4;
+	}
+#endif
+
+#ifdef WIFI_ENABLE
+	cmmWiFiReset(ctx->fci_handle);
+#endif
+	cmmVlanReset(ctx->fci_handle);
+
+	itf_table_update(ctx);
+
+	return 0;
+
+#if !defined(IPSEC_SUPPORT_DISABLED)
+err4:
+	fci_close(ctx->fci_handle);
+#endif
+
+err3:
+	cmm_rtnl_close(&ctx->rth);
+
+err2:
+	close(ctx->fd);
+
+err1:
+	if (ctx->fp)
+		fclose(ctx->fp);
+
+	return -1;
+}
+
+
+/*****************************************************************
+* cmmRtnlLink
+* 
+*
+******************************************************************/
+int cmmRtnlLink(const struct sockaddr_nl *who, struct nlmsghdr *nlh, void *arg)
+{
+	struct interface_table *ctx = arg;
+	struct ifinfomsg *ifi;
+	struct rtattr *tb[IFLA_MAX + 1];
+	char ifname[IFNAMSIZ];
+
+	switch (nlh->nlmsg_type)
+	{
+	case RTM_NEWLINK:
+	case RTM_DELLINK:
+		break;
+
+	default:
+		cmm_print(DEBUG_ERROR, "%s: unsupported LINK netlink message %x\n", __func__, nlh->nlmsg_type);
+		goto out;
+		break;
+	}
+
+	ifi = NLMSG_DATA(nlh);
+
+	if (nlh->nlmsg_type == RTM_NEWLINK)
+	{
+		cmm_print(DEBUG_INFO, "%s: RTM_NEWLINK %s\n", __func__, if_indextoname(ifi->ifi_index, ifname));
+	}
+	else
+	{
+		cmm_print(DEBUG_INFO, "%s: RTM_DELLINK %s\n", __func__, if_indextoname(ifi->ifi_index, ifname));
+	}
+
+	cmm_print(DEBUG_INFO, "%s: ifinfomsg family: %x, type: %x, index: %d, flags: %x, change: %x\n", __func__,
+				ifi->ifi_family, ifi->ifi_type,
+				ifi->ifi_index, ifi->ifi_flags, ifi->ifi_change);
+
+	cmm_parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), IFLA_PAYLOAD(nlh));
+
+	updatelink(ctx, ifi, tb, nlh->nlmsg_type == RTM_DELLINK);
+
+out:
+	return RTNL_CB_CONTINUE;
+}
+
+/*****************************************************************
+* cmmRtnlIfAddr
+* 
+*
+******************************************************************/
+int cmmRtnlIfAddr(const struct sockaddr_nl *who, struct nlmsghdr *nlh, void *arg)
+{
+	struct interface_table *ctx = arg;
+	struct ifaddrmsg *ifa;
+	struct rtattr *tb[IFA_MAX + 1];
+	char address[INET6_ADDRSTRLEN];
+	unsigned int *ipaddr;
+#ifndef SAM_LEGACY
+	struct ip6_4rd_map_msg *mr;
+#endif
+
+	switch (nlh->nlmsg_type)
+	{
+#ifndef SAM_LEGACY
+	case RTM_NEW4RD:
+        case RTM_DEL4RD:
+		{
+			mr = NLMSG_DATA(nlh);
+
+
+			if(nlh->nlmsg_type == RTM_NEW4RD)
+				mr_update(ctx->fci_handle,mr);
+			else if(nlh->nlmsg_type == RTM_DEL4RD)
+				mr_remove(ctx->fci_handle,mr);
+			struct interface * itf = __itf_find(mr->ifindex);
+			if (itf)
+			{
+				mr_debug(itf);
+			}
+
+			return 0;
+		}
+#endif
+	case RTM_NEWADDR:
+	case RTM_DELADDR:
+		break;
+
+	default:
+		cmm_print(DEBUG_ERROR, "%s: unsupported IFADDR netlink message %x\n", __func__, nlh->nlmsg_type);
+		goto out;
+		break;
+	}	
+
+	ifa = NLMSG_DATA(nlh);
+
+	cmm_print(DEBUG_INFO, "%s: ifaddr family: %x, prefixlen: %d, flags: %x, scope: %d, index: %d\n", __func__,
+					ifa->ifa_family, ifa->ifa_prefixlen,
+					ifa->ifa_flags, ifa->ifa_scope, ifa->ifa_index);
+
+	cmm_parse_rtattr(tb, IFA_MAX, IFA_RTA(ifa), IFA_PAYLOAD(nlh));
+
+	if (!tb[IFA_ADDRESS])
+		goto out;
+
+	ipaddr = RTA_DATA(tb[IFA_ADDRESS]);
+
+	if (nlh->nlmsg_type == RTM_NEWADDR)
+	{
+		cmm_print(DEBUG_INFO, "%s: RTM_NEWADDR %s\n", __func__, inet_ntop(ifa->ifa_family, ipaddr, address, sizeof(address)));
+
+		newaddr(ctx, ifa, tb);
+	}
+	else
+	{
+		cmm_print(DEBUG_INFO, "%s: RTM_DELADDR %s\n", __func__, inet_ntop(ifa->ifa_family, ipaddr, address, sizeof(address)));
+
+		deladdr(ctx, ifa, tb);
+	}
+
+out:
+	return RTNL_CB_CONTINUE;
+}
diff --git a/cmm/src/itf.h b/cmm/src/itf.h
new file mode 100644
index 0000000..748af57
--- /dev/null
+++ b/cmm/src/itf.h
@@ -0,0 +1,316 @@
+#ifndef __CMM_ITF_H
+#define __CMM_ITF_H
+
+#include <stdio.h>
+#include <libfci.h>
+#include <netinet/ip.h>
+#include <net/ethernet.h>
+#include <linux/ip6_tunnel.h>
+#include <linux/if_tunnel.h>
+
+#include "rtnl.h"
+#include "list.h"
+
+#ifdef COMCERTO_2000
+#define GEM_PORTS 3
+#else
+#define GEM_PORTS 2
+#endif
+
+/* default value for WAN interface is eth0, and LAN interface is eth2 */
+#define GEMAC0_PORT	0 //do not change !
+#define GEMAC1_PORT	1 //do not change !
+#define GEMAC2_PORT	2 //do not change !
+
+struct gemac_port {
+	char ifname[12];
+	char logical_name[12];
+	int  type;
+	int  ifindex;
+	int  port_id;
+	int  enable;
+};
+
+#define GEMAC_PORT_TYPE_LAN	0x0
+#define GEMAC_PORT_TYPE_WAN	0x1
+
+#define LO_INTERFACE_NAME	"lo"
+
+#ifdef WIFI_ENABLE
+#define WIFI_PORT0	GEM_PORTS //do not change !
+#endif
+
+extern struct gemac_port port_table[GEM_PORTS];
+static inline int is_wan_port_ifindex(int ifindex)
+{
+	int ii;
+
+	for (ii = 0; ii < GEM_PORTS; ii++)
+		if ((port_table[ii].ifindex == ifindex) && (port_table[ii].type == GEMAC_PORT_TYPE_WAN))
+			return 1;
+
+	return 0;
+}
+
+static inline int is_wan_port_id(int port_id)
+{
+	int ii;
+
+	for (ii = 0; ii < GEM_PORTS; ii++)
+		if ((port_table[ii].port_id == port_id) && (port_table[ii].type == GEMAC_PORT_TYPE_WAN))
+			return 1;
+	return 0;
+}
+
+static inline void print_all_gemac_ports(char *buf, int buf_len)
+{
+	int len = 0, ii;
+
+	for (ii = 0; ii < GEM_PORTS; ii++){
+
+		if (!port_table[ii].enable)
+			continue;
+
+		len += snprintf(&buf[len], buf_len, "%s|", port_table[ii].ifname);
+		buf_len = buf_len > len ? buf_len - len : 0;
+	}
+
+	for (ii = 0; ii < GEM_PORTS; ii++) {
+
+		if (!port_table[ii].enable)
+			continue;
+
+		len += snprintf(&buf[len], buf_len, "%s|", port_table[ii].logical_name);
+		buf_len = buf_len > len ? buf_len - len : 0;
+	}
+
+	buf[strlen(buf) - 1] = '\0';
+}
+
+static inline int get_port_id(char *name)
+{
+	int ii;
+
+	for (ii = 0; ii < GEM_PORTS; ii++)
+	{
+		if (!port_table[ii].enable)
+			continue;
+
+		if (!strcmp(name, port_table[ii].ifname) || !strcmp(name, port_table[ii].logical_name))
+			return port_table[ii].port_id;
+	}
+
+	return -1;
+}
+
+static inline int get_port_ifindex(char *name)
+{
+	int ii;
+
+	for (ii = 0; ii < GEM_PORTS; ii++)
+	{
+		if (!strcmp(name, port_table[ii].ifname) || !strcmp(name, port_table[ii].logical_name))
+			return port_table[ii].ifindex;
+	}
+
+	return -1;
+}
+
+static inline char *get_port_name(int port_id, char *buf, int buf_size)
+{
+	int ii;
+
+	buf[0] = '\0';
+
+	for (ii = 0; ii < GEM_PORTS; ii++)
+	{
+		if (!port_table[ii].enable)
+			continue;
+
+		if (port_table[ii].port_id == port_id)
+			snprintf(buf, buf_size, "%s",  port_table[ii].ifname);
+	}
+
+	return buf;
+}
+
+#define ITF_HASH_TABLE_SIZE	64
+#define MAX_BRIDGES	64
+#define MAX_PORTS	64
+
+#define ITF_BRIDGE		(1 << 0)
+#define ITF_VLAN		(1 << 1)
+#define ITF_BRIDGED		(1 << 2)
+#define ITF_TUNNEL		(1 << 3)
+#define ITF_PPPOE_SESSION_UP    (1 << 4)
+#define ITF_PPPOE_AUTO_MODE     (1 << 5)
+#define ITF_MACVLAN 	(1 << 6)
+#ifdef WIFI_ENABLE
+#define ITF_WIFI	(1 << 7)
+#endif
+#define ITF_L2TP	(1 << 8)
+
+#ifndef SAM_LEGACY
+
+#ifndef RTM_NEW4RD
+#define RTM_NEW4RD 80 /* If RTM_NEW4RD is not defined we can safely assume that RTM_DEL4RD and RTM_GET4RD will also not be defined */
+#define RTM_DEL4RD 81
+#define RTM_GET4RD 82
+struct ip6_4rd_map_msg {
+	__u32 reset;
+	__u32 ifindex;
+	__be32 prefix;
+	__u16 prefixlen;
+	struct in6_addr relay_prefix;
+	struct in6_addr relay_suffix;
+	__u16 relay_prefixlen;
+	__u16 relay_suffixlen;
+	__u16 psid_offsetlen;
+	__u16 eabit_len;
+	__u16 entry_num;
+};
+#endif
+#endif
+
+#define INFO_KIND_MACVLAN_STR_LEN 7
+#define INFO_KIND_MACVLAN_STR     "macvlan"
+
+#ifndef SIOCGET6RD
+#define SIOCGET6RD	(SIOCDEVPRIVATE + 8)
+
+struct ip_tunnel_6rd {
+	struct in6_addr		prefix;
+	u_int32_t		relay_prefix;
+	u_int16_t		prefixlen;
+	u_int16_t		relay_prefixlen;
+};
+#endif
+
+struct l2tp_itf_info {
+	u_int16_t local_tun_id;
+	u_int16_t peer_tun_id;
+	u_int16_t local_ses_id;
+	u_int16_t peer_ses_id;
+	u_int16_t options;
+	struct socket *sock;
+};
+
+struct interface_addr {
+	struct list_head list;
+	unsigned int address[4];
+	unsigned short len;
+	int family;
+	unsigned char scope;
+	unsigned char prefixlen;
+};
+
+struct interface {
+	struct list_head list;
+
+	/* netlink address information */
+	struct list_head addr_list;
+
+	char ifname[IFNAMSIZ];
+
+	/* netlink link information */
+	int ifindex;
+	unsigned char macaddr[ETH_ALEN];
+	int macaddr_len;
+	unsigned short type;	/* ARPHRD_* */
+	unsigned ifi_flags;	/* IFF_* flags */
+	unsigned int mtu;
+
+	/* cmm information */
+	unsigned int itf_flags; /* bit field with ITF_xxx flags */
+
+	int phys_ifindex;	/* physical interface index, if vlan/pppoe */
+
+	u_int16_t session_id; /* session id if pppoe interface */
+	unsigned char dst_macaddr[ETH_ALEN]; /* peer mac address if pppoe interface */
+
+	u_int16_t vlan_id;	/* vlan id if vlan interface */
+
+	int ifindices[MAX_PORTS];	/* list of bridge ports if bridge interface */
+
+	struct ct_route rt;		/* Route information if tunnel interface */
+
+	struct FlowEntry *flow_orig;	/* Flow information if tunnel interface */
+	struct FlowEntry *flow_rep;	/* Flow information if tunnel interface */
+	union {
+		struct ip6_tnl_parm tunnel_parm6;
+		struct ip_tunnel_parm tunnel_parm4;
+	};
+	struct ip_tunnel_6rd tunnel_parm6rd;
+
+	int tunnel_flags;
+	int tunnel_family;
+	int tunnel_enabled;
+
+	int count;
+	int flags;
+#ifdef WIFI_ENABLE
+	struct wifi_ff_entry *wifi_if;
+#endif
+#ifdef SAM_LEGACY
+	u_int16_t sam_enable;
+#else
+	struct list_head mr_list; /* netlink mapping rule information */
+#endif
+	/* If L2TP interface */
+	struct l2tp_itf_info l2tp;
+};
+
+struct interface_table {
+	pthread_mutex_t lock;
+	struct list_head hash[ITF_HASH_TABLE_SIZE];
+	FILE *fp;
+	int fd;
+	struct rtnl_handle rth;
+	FCI_CLIENT *fci_handle;
+	FCI_CLIENT *fci_key_handle;
+};
+
+extern struct interface_table itf_table;
+extern int LO_IFINDEX;
+struct gemac_port ;
+
+struct interface *__itf_get(int ifindex);
+void __itf_put(struct interface *itf);
+struct interface *__itf_find(int ifindex);
+
+int itf_table_init(struct interface_table *ctx);
+int itf_get_ipaddr(int ifindex, int family, unsigned char scope, unsigned int *ipaddr, unsigned int *target);
+int __itf_get_macaddr(struct interface *itf, unsigned char *macaddr);
+int itf_get_macaddr(int ifindex, unsigned char *macaddr);
+int __itf_get_mtu(int ifindex);
+int ____itf_get_name(struct interface *itf, char *ifname, int len);
+int __itf_get_name(int ifindex, char *ifname, int len);
+int __itf_is_bridge(int ifindex);
+int __itf_is_vlan(struct interface *itf);
+int __itf_is_macvlan(struct interface *itf);
+int __itf_is_pointopoint(struct interface *itf);
+int __itf_is_pppoe(struct interface *itf);
+int __itf_is_noarp(int ifindex);
+int __itf_is_up(struct interface *itf);
+int __itf_is_tunnel(struct interface *itf);
+int __itf_is_l2tp(struct interface *itf);
+int __itf_get_from_bridge_port(int ifindex, int port);
+int __itf_is_programmed(int ifindex);
+int itf_is_programmed(int ifindex);
+ int ____itf_is_4o6_tunnel(struct interface *itf);
+int ____itf_is_floating_sit_tunnel(struct interface *itf);
+int __itf_is_floating_sit_tunnel(int ifindex);
+int itf_name_update(FCI_CLIENT *fci_handle, struct gemac_port *port);
+
+int cmmRtnlLink(const struct sockaddr_nl *who, struct nlmsghdr *nlh, void *arg);
+int cmmRtnlIfAddr(const struct sockaddr_nl *who, struct nlmsghdr *nlh, void *arg);
+
+#ifdef WIFI_ENABLE
+int __itf_is_wifi_ff_if(struct interface *itf);
+int __itf_is_wifi(struct interface *itf);
+#endif
+static inline u_int32_t HASH_ITF(int ifindex)
+{
+	return ifindex & (ITF_HASH_TABLE_SIZE - 1);
+}
+#endif /* __CMM_ITF_H */
diff --git a/cmm/src/jhash.h b/cmm/src/jhash.h
new file mode 100644
index 0000000..92f4d78
--- /dev/null
+++ b/cmm/src/jhash.h
@@ -0,0 +1,86 @@
+#ifndef __JHASH_H
+#define __JHASH_H
+
+#define __jhash_mix(a, b, c) \
+{ \
+	a -= b; a -= c; a ^= (c>>13); \
+	b -= c; b -= a; b ^= (a<<8); \
+	c -= a; c -= b; c ^= (b>>13); \
+	a -= b; a -= c; a ^= (c>>12);  \
+	b -= c; b -= a; b ^= (a<<16); \
+	c -= a; c -= b; c ^= (b>>5); \
+	a -= b; a -= c; a ^= (c>>3);  \
+	b -= c; b -= a; b ^= (a<<10); \
+	c -= a; c -= b; c ^= (b>>15); \
+}
+
+
+/* The golden ration: an arbitrary value */
+#define JHASH_GOLDEN_RATIO      0x9e3779b9
+
+/* The most generic version, hashes an arbitrary sequence
+ * of bytes.  No alignment or length assumptions are made about
+ * the input key.
+ */
+static inline u_int32_t jhash(const void *key, u_int32_t length, u_int32_t initval)
+{
+        u_int32_t a, b, c, len;
+        const u_int8_t *k = key;
+
+        len = length;
+        a = b = JHASH_GOLDEN_RATIO;
+        c = initval;
+
+        while (len >= 12) {
+                a += (k[0] +((u_int32_t)k[1]<<8) +((u_int32_t)k[2]<<16) +((u_int32_t)k[3]<<24));
+                b += (k[4] +((u_int32_t)k[5]<<8) +((u_int32_t)k[6]<<16) +((u_int32_t)k[7]<<24));
+                c += (k[8] +((u_int32_t)k[9]<<8) +((u_int32_t)k[10]<<16)+((u_int32_t)k[11]<<24));
+
+                __jhash_mix(a,b,c);
+
+                k += 12;
+                len -= 12;
+        }
+
+        c += length;
+        switch (len) {
+        case 11: c += ((u_int32_t)k[10]<<24);
+        case 10: c += ((u_int32_t)k[9]<<16);
+        case 9 : c += ((u_int32_t)k[8]<<8);
+        case 8 : b += ((u_int32_t)k[7]<<24);
+        case 7 : b += ((u_int32_t)k[6]<<16);
+        case 6 : b += ((u_int32_t)k[5]<<8);
+        case 5 : b += k[4];
+        case 4 : a += ((u_int32_t)k[3]<<24);
+        case 3 : a += ((u_int32_t)k[2]<<16);
+        case 2 : a += ((u_int32_t)k[1]<<8);
+        case 1 : a += k[0];
+        };
+
+        __jhash_mix(a,b,c);
+
+        return c;
+}
+
+static inline u_int32_t jhash_3words(u_int32_t a, u_int32_t b, u_int32_t c, u_int32_t initval)
+{
+        a += JHASH_GOLDEN_RATIO;
+        b += JHASH_GOLDEN_RATIO;
+        c += initval;
+
+        __jhash_mix(a, b, c);
+
+        return c;
+}
+
+static inline u_int32_t jhash_2words(u_int32_t a, u_int32_t b, u_int32_t initval)
+{
+        return jhash_3words(a, b, 0, initval);
+}
+
+static inline u_int32_t jhash_1word(u_int32_t a, u_int32_t initval)
+{
+        return jhash_3words(a, 0, 0, initval);
+}
+
+#endif
diff --git a/cmm/src/keytrack.c b/cmm/src/keytrack.c
new file mode 100644
index 0000000..1d55cd1
--- /dev/null
+++ b/cmm/src/keytrack.c
@@ -0,0 +1,1255 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+#include <net/if.h>
+
+#include "cmm.h"
+#include "fpp.h"
+#include "cmmd.h"
+
+/*************************************************************
+Conventions:
+-----------
+
+Key Engine = Linux XFRM module (a.k.a SADB Managment module)
+
+IPSec = IPSec module running on FPP
+
+**************************************************************/
+
+struct list_head flow_table[FLOW_HASH_TABLE_SIZE];
+
+pthread_mutex_t flowMutex = PTHREAD_MUTEX_INITIALIZER;	
+
+
+#define DEFAULT_DPD_TIMEOUT 30
+char gSAQueryTimerEnable = 0; /*Flag to check SA query timer is enabled or not*/
+int gSAQueryTimerVal = DEFAULT_DPD_TIMEOUT;
+
+/*****************************************************************
+* cmmKeyEnginetoIPSec
+*
+*
+******************************************************************/
+int cmmKeyEnginetoIPSec(FCI_CLIENT *fci_handle, unsigned short fcode, unsigned short len, unsigned short *payload)
+{
+	int rc = 0;
+
+	cmm_print(DEBUG_INFO, "%s: fcode 0x%x len %d bytes\n", __func__, fcode, len);
+
+	if ((rc = fci_write(fci_handle, fcode, len, payload)))
+	{
+		cmm_print(DEBUG_ERROR, "%s: error %d while sending function code 0x%x\n", __func__, rc, fcode);
+
+		return -1;
+	}
+	
+	return 0;
+
+}
+
+/*****************************************************************
+* cmmIPSectoKeyEngine
+*
+*
+******************************************************************/
+int cmmIPSectoKeyEngine(FCI_CLIENT *fci_handle, unsigned short fcode, unsigned short len, unsigned short *payload)
+{
+	int rc = 0;
+
+	cmm_print(DEBUG_INFO, "cmmIPSectoKeyEngine: fcode 0x%x len %d bytes\n", fcode, len);
+	
+	if ((rc = fci_write(fci_handle, fcode, len, payload)))
+	{
+		cmm_print(DEBUG_ERROR, "%s: error %d while sending function code 0x%x\n", __func__, rc, fcode);
+
+		return -1;
+	}
+
+	return 0;
+}
+
+/*****************************************************************
+* cmmFlowKeyEngineRemove
+*
+*
+******************************************************************/
+int cmmFlowKeyEngineRemove(FCI_CLIENT *fci_handle, struct FlowEntry *fentry)
+{
+	unsigned short msg[sizeof(fentry->fl) + sizeof(fentry->family) + sizeof(fentry->dir)] = {0};
+	unsigned short len = 0;
+#ifdef IPSEC_DBG
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+#endif
+
+	memcpy(msg, (unsigned char *)&fentry->fl, sizeof(struct flowi));
+	len += sizeof(struct flowi);
+	
+	msg[len/2] = fentry->family;
+	len += sizeof(fentry->family);
+
+	msg[len/2] = fentry->dir;
+	len += sizeof(fentry->dir);
+
+	/* Notify the XFRM to remove this flow from its flow cache */
+	return cmmIPSectoKeyEngine(fci_handle, FPP_CMD_NETKEY_FLOW_REMOVE, len, (unsigned short *)msg);
+}
+
+/*****************************************************************
+* __cmmFlowGet
+*
+*
+******************************************************************/
+struct FlowEntry *__cmmFlowGet(int family, const unsigned int *Saddr, const unsigned int *Daddr, unsigned short Sport, unsigned short Dport, unsigned char proto)
+{
+	struct FlowEntry *flow;
+
+	flow = __cmmFlowFind(family, Saddr, Daddr, Sport, Dport, proto);
+
+	if (flow)
+		flow->ref_count++;
+
+	return flow;
+}
+
+/*****************************************************************
+* __cmmFlowPut
+*
+*
+******************************************************************/
+void __cmmFlowPut(struct FlowEntry *flow)
+{
+	if(flow->ref_count)
+		flow->ref_count--;
+
+	if(!(flow->ref_count))
+		__cmmFlowRemove(flow);
+}
+
+/*****************************************************************
+* __cmmFlowFind
+*
+*
+******************************************************************/
+struct FlowEntry *__cmmFlowFind(int family, const unsigned int *Saddr, const unsigned int *Daddr, unsigned short Sport, unsigned short Dport, unsigned char proto)
+{
+	struct FlowEntry *flow;
+	struct list_head *entry;
+	unsigned int key;
+
+	key = HASH_CT(family, Saddr, Daddr, Sport, Dport, proto);
+
+	entry = list_first(&flow_table[key]);
+
+	while (entry != &flow_table[key])
+	{
+		flow = container_of(entry, struct FlowEntry, list);
+
+
+		if( family == AF_INET)
+		{
+
+			if(!memcmp(Saddr, &flow->fl.u.ip4.saddr, 4) &&
+			!memcmp(Daddr, &flow->fl.u.ip4.daddr, 4) &&  
+			(Sport == flow->fl.u.ip4.fl4_sport) &&
+			(Dport == flow->fl.u.ip4.fl4_dport) &&
+			(proto == flow->fl.flowi_proto))
+			{
+				cmm_print(DEBUG_INFO, " flow found: Sport %d Dport %d\n", Sport, Dport);
+				//Entry found
+				goto found;
+			}
+
+		}
+		else if (family ==AF_INET6)
+		{
+			if(((family == AF_INET6) && !memcmp(Saddr, flow->fl.u.ip6.saddr.s6_addr32 /*flow->fl.nl_u.ip6_u.saddr*/, 16) &&
+			!memcmp(Daddr, flow->fl.u.ip6.daddr.s6_addr32, 16)) &&
+			/*Port*/
+			(Sport == flow->fl.u.ip6.fl4_sport) &&
+			(Dport == flow->fl.u.ip6.fl4_dport) &&
+			/*Protocol*/
+			(proto == flow->fl.flowi_proto))
+			{
+				cmm_print(DEBUG_INFO, " flow found: Sport %d Dport %d\n", Sport, Dport);
+				//Entry found
+				goto found;
+			}
+
+
+		}
+
+		entry = list_next(entry);
+	}
+
+	cmm_print(DEBUG_INFO, " flow NOT found\n");
+
+	flow = NULL;
+found:
+	return flow;
+}
+
+/*****************************************************************
+* __cmmFlowRemove
+*
+*
+******************************************************************/
+void __cmmFlowRemove(struct FlowEntry *flow)
+{
+	char sbuf[INET6_ADDRSTRLEN], dbuf[INET6_ADDRSTRLEN];
+	unsigned int *sAddr, *dAddr;
+
+	if (flow->family == AF_INET)
+	{
+		sAddr = &flow->fl.u.ip4.saddr;
+		dAddr = &flow->fl.u.ip4.daddr;
+	}
+	else
+	{
+		sAddr = flow->fl.u.ip6.saddr.s6_addr32;
+		dAddr = flow->fl.u.ip6.daddr.s6_addr32;
+	}
+
+	cmm_print(DEBUG_INFO, "%s: Flow(%s, %s, %d, %d, %d) removed\n",
+			__func__,
+			inet_ntop(flow->family, sAddr, sbuf, INET6_ADDRSTRLEN),
+			inet_ntop(flow->family, dAddr, dbuf, INET6_ADDRSTRLEN),
+			  ntohs(flow->fl.u.ip4.fl4_sport), ntohs(flow->fl.u.ip4.fl4_dport), flow->fl.flowi_proto);
+
+	list_del(&flow->list);
+	free(flow);
+}
+
+
+/*****************************************************************
+* __cmmFlowAdd
+*
+*
+******************************************************************/
+struct FlowEntry *__cmmFlowAdd(int family, struct flowi *fl, unsigned char sa_nr, unsigned short *sa_handle, unsigned short dir)
+{
+	struct FlowEntry *flow;
+	unsigned int *sAddr, *dAddr;
+	unsigned short sport, dport;
+	char sbuf[INET6_ADDRSTRLEN], dbuf[INET6_ADDRSTRLEN];
+	unsigned int key;
+	
+	//Add the new flow to the local flow cache
+	flow = (struct FlowEntry *) malloc(sizeof(struct FlowEntry));
+	if (!flow)
+	{
+		cmm_print(DEBUG_ERROR, "%s: malloc() failed\n", __func__);
+		goto err0;
+	}
+
+	memset(flow, 0, sizeof(struct FlowEntry));
+
+	memcpy(&flow->fl, fl, sizeof(struct flowi));
+	memcpy(&flow->sa_handle, sa_handle, sizeof(unsigned short) * sa_nr);
+	flow->sa_nr = sa_nr;
+	flow->family = family;
+	flow->dir = dir;
+
+	if (family == AF_INET)
+	{
+		sAddr = &fl->u.ip4.saddr;
+		dAddr = &fl->u.ip4.daddr;
+		sport = fl->u.ip4.fl4_sport;
+		dport = fl->u.ip4.fl4_dport;
+	key = HASH_CT(family, sAddr, dAddr, fl->u.ip4.fl4_sport, fl->u.ip4.fl4_dport, fl->flowi_proto);
+	}
+	else
+	{
+		sAddr = fl->u.ip6.saddr.s6_addr32;
+		dAddr = fl->u.ip6.daddr.s6_addr32;
+		sport = fl->u.ip6.fl6_sport;
+		dport = fl->u.ip6.fl6_dport;
+	key = HASH_CT(family, sAddr, dAddr, fl->u.ip6.fl4_sport, fl->u.ip6.fl4_dport, fl->flowi_proto);
+	}
+
+
+	list_add(&flow_table[key], &flow->list);
+
+	cmm_print(DEBUG_INFO, "%s: Flow(%s, %s, %d, %d, %d) added\n",
+			__func__,
+			inet_ntop(family, sAddr, sbuf, INET6_ADDRSTRLEN),
+			inet_ntop(family, dAddr, dbuf, INET6_ADDRSTRLEN),
+			ntohs(sport), ntohs(dport), fl->flowi_proto);
+
+err0:
+	return flow;
+}
+
+/* This function displays the list of local Secure Flows */
+
+int cmmFlowLocalShow( struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	struct FlowEntry *flow;
+	struct list_head *entry;
+	int i, j, cpt=0,len=0;
+	char buf1[INET6_ADDRSTRLEN], buf2[INET6_ADDRSTRLEN];
+	char output_buf[256];
+
+	for (i = 0 ; i < FLOW_HASH_TABLE_SIZE; i++)
+	{
+		__pthread_mutex_lock(&flowMutex);
+
+		for(entry = list_first(&flow_table[i]);
+			entry != &flow_table[i];
+			entry = list_next(entry))
+		{
+			flow = container_of(entry, struct FlowEntry, list);
+			cpt++;
+
+		//	cli_print(cli,"Incoming interface: %s  Outgoing interface :%s \n ",
+		//	if_indextoname(flow->fl.iif ,iifname ),
+		//	if_indextoname( flow->fl.oif, oifname));
+
+			if (flow->family == AF_INET)
+			{
+				cli_print(cli ,
+					"[%4d]:Src Addr : %s     Dest Addr : %s \n",cpt,
+					inet_ntop(flow->family, &flow->fl.u.ip4.saddr, buf1,INET6_ADDRSTRLEN),
+					inet_ntop(flow->family, &flow->fl.u.ip4.daddr, buf2, INET6_ADDRSTRLEN) );
+			}
+            else
+			{
+				cli_print(cli ,
+					"[%4d]:Src Addr : %s     Dest Addr : %s \n",cpt,
+					inet_ntop(flow->family, flow->fl.u.ip6.saddr.s6_addr32, buf1,INET6_ADDRSTRLEN),
+					inet_ntop(flow->family, flow->fl.u.ip6.daddr.s6_addr32, buf2,INET6_ADDRSTRLEN) );
+			}
+
+			if ((flow->fl.flowi_proto == IPPROTO_TCP) ||
+				(flow->fl.flowi_proto == IPPROTO_UDP))
+    		{
+				if(flow->family == AF_INET)
+					cli_print(cli , "Protocol : %x  Sport :%d  Dport :%d\n",
+						flow->fl.flowi_proto,
+						htons(flow->fl.u.ip4.fl4_sport),
+						htons(flow->fl.u.ip4.fl4_dport));
+				else 
+				cli_print(cli , "Protocol : %x  Sport :%d  Dport :%d\n",
+						flow->fl.flowi_proto,
+						htons(flow->fl.u.ip6.fl4_sport),
+						htons(flow->fl.u.ip6.fl4_dport));
+
+			}
+			else if (flow->fl.flowi_proto == IPPROTO_ICMP)
+			{
+				cli_print(cli , "Protocol : ICMP  Type :%x  Code :%x\n",
+					flow->fl.u.ip4.fl4_icmp_type,
+					flow->fl.u.ip4.fl4_icmp_code);
+			}
+			else if ((flow->fl.flowi_proto == IPPROTO_AH) ||
+				(flow->fl.flowi_proto == IPPROTO_ESP))
+			{
+				cli_print(cli , "Protocol : AH/ESP  spi :%x\n",
+					flow->fl.u.ip4.fl4_ipsec_spi);
+			}
+
+			len += snprintf(output_buf+len ,256-len, "Dir:%x Flags :%x ", flow->dir,flow->flags);
+			len += snprintf(output_buf+len , 256-len, "SA(sa_nr:%d HO:", flow->sa_nr);
+
+			for (j = 0; j < flow->sa_nr; j++)
+		           len += snprintf(output_buf+len,256-len, "%x:", flow->sa_handle[j]);
+
+			len += snprintf(output_buf+len , 256-len, ")");
+			cli_print(cli,output_buf);
+			cli_print(cli, "Flow ref count %d\n",flow->ref_count);
+			len = 0;
+		}
+
+		__pthread_mutex_unlock(&flowMutex);
+		/* Give a chance to other processes waiting for the lock */
+		if (!(i % 100))
+			sched_yield();
+	}
+
+	cli_print(cli, " %d  secure connections printed", cpt);
+
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmKeyEngineFlow2Conntrack
+*
+*
+******************************************************************/
+int cmmKeyEngineFlow2Conntrack(FCI_CLIENT *fci_handle, unsigned short fcode, unsigned short len, unsigned short *payload)
+{
+	unsigned short sa_nr;
+	unsigned short family;
+	unsigned short dir;
+	unsigned short sa_handle[2];
+	unsigned short msg_len = 0;
+	struct flowi *fl;
+	struct ctTable *ctEntry;
+	struct FlowEntry *flow;
+	struct interface *itf;
+#ifdef COMCERTO_2000
+	struct socket *sock;
+#endif
+	unsigned int *flsaddr, *fldaddr;
+	unsigned short flsport, fldport;
+	char sbuf[INET6_ADDRSTRLEN], dbuf[INET6_ADDRSTRLEN];
+	char ifname[IFNAMSIZ];
+	char orig;
+	int i;
+
+	// decode nl_key message
+
+	// number of SA associated to this flow
+	sa_nr = *payload++;
+	msg_len += sizeof(unsigned short);
+
+	// SA handles
+	for (i = 0; i < sa_nr; i++) {
+		sa_handle[i] = *payload++;
+//#ifdef  IPSEC_DBG
+		cmm_print(DEBUG_INFO, "%s: sa_handle %x\n", __func__, sa_handle[i]);
+//#endif
+	}
+
+	msg_len += sa_nr * sizeof(unsigned short);
+
+	cmm_print(DEBUG_INFO, "%s: sa_nr %d msg_len %d len %d\n", __func__, sa_nr, msg_len, len);
+	
+	if (msg_len > len) {
+		cmm_print(DEBUG_INFO, "%s: ERROR msg_len > len\n", __func__);
+		goto error;
+	}
+	
+	// Flow descriptor
+	family = *payload++;
+	msg_len += sizeof(unsigned short);
+	dir = *payload++;
+	msg_len += sizeof(unsigned short);
+
+	if ((len - msg_len) != sizeof(struct flowi)) {
+		cmm_print(DEBUG_INFO, "%s: ERROR (len - msg_len) != sizeof(struct flowi)\n", __func__);
+		goto error;
+	}
+	
+	fl = (struct flowi*)payload;
+	
+	cmm_print(DEBUG_INFO, "%s: fl->proto %d\n", __func__, fl->flowi_proto);
+
+	switch (fl->flowi_proto)
+	{
+	case IPPROTO_ETHERIP:
+	case IPPROTO_IPIP:
+		/* Make sure to reset port information */
+		if (family == AF_INET)
+		{
+			fl->u.ip4.fl4_sport = 0;
+			fl->u.ip4.fl4_dport = 0;
+		}
+		else
+		{
+			fl->u.ip6.fl6_sport = 0;
+			fl->u.ip6.fl6_dport = 0;
+		}
+		/* fallthrough */
+	case IPPROTO_TCP:
+	case IPPROTO_UDP:
+
+		if (family == AF_INET)
+		{
+			flsaddr = &fl->u.ip4.saddr;
+			fldaddr = &fl->u.ip4.daddr;
+			flsport = fl->u.ip4.fl4_sport;
+			fldport = fl->u.ip4.fl4_dport;
+		}
+		else
+		{
+			flsaddr = fl->u.ip6.saddr.s6_addr32;
+			fldaddr = fl->u.ip6.daddr.s6_addr32;
+			flsport = fl->u.ip6.fl6_sport;
+			fldport = fl->u.ip6.fl6_dport;
+		}
+
+		cmm_print(DEBUG_INFO, "%s: Flow(%s, %s, %d, %d, %d)\n",
+			__func__,
+			inet_ntop(family, flsaddr, sbuf, INET6_ADDRSTRLEN),
+			inet_ntop(family, fldaddr, dbuf, INET6_ADDRSTRLEN),
+				  ntohs(flsport), ntohs(fldport), fl->flowi_proto);
+
+		__pthread_mutex_lock(&itf_table.lock);
+		__pthread_mutex_lock(&ctMutex);
+		__pthread_mutex_lock(&rtMutex);
+		__pthread_mutex_lock(&neighMutex);
+		__pthread_mutex_lock(&flowMutex);
+
+		/* Create or update flow */
+		flow = __cmmFlowFind(family, flsaddr, fldaddr, flsport, fldport, fl->flowi_proto);
+		if (!flow)
+		{
+			flow = __cmmFlowAdd(family, fl, sa_nr, sa_handle, dir);
+			if (!flow)
+			{
+				cmm_print(DEBUG_ERROR, "%s: flow add failed\n", __func__);
+				goto out;
+			}
+		}
+		else
+		{
+			if ((flow->sa_nr != sa_nr) || memcmp(flow->sa_handle, sa_handle, sa_nr * sizeof(unsigned short))) {
+				memcpy(flow->sa_handle, sa_handle, sa_nr * sizeof(unsigned short));
+				flow->sa_nr = sa_nr;
+				flow->flags |= FPP_NEEDS_UPDATE;
+			}
+		}
+
+		/* Look for connections that use this flow */
+		ctEntry = __cmmCtFindFromFlow(family, flsaddr, fldaddr, flsport, fldport, fl->flowi_proto, &orig);
+		if (ctEntry)
+		{
+			/* Update flow pointers in Ct entry */
+			if (orig) {
+				if (!ctEntry->fEntryOrig) {
+					ctEntry->fEntryOrig = flow;
+					flow->ref_count++;
+				}
+				else {
+					if(ctEntry->fEntryOrig != flow)  {
+						__cmmFlowPut(ctEntry->fEntryOrig);
+						ctEntry->fEntryOrig = flow;
+						flow->ref_count++;
+					}
+				}
+			}
+			else {
+				if (!ctEntry->fEntryRep) {
+					ctEntry->fEntryRep = flow;
+					flow->ref_count++;
+				}
+				else {
+					if(ctEntry->fEntryRep != flow)  {
+						__cmmFlowPut(ctEntry->fEntryRep);
+						ctEntry->fEntryRep = flow;
+						flow->ref_count++;
+					}
+				}
+			}
+
+			/* Update connection in FPP */
+			____cmmCtRegister(fci_handle, ctEntry);
+		}
+
+		/* Look for tunnels that use this flow */
+		itf = __cmmTunnelFindFromFlow(family, flsaddr, fldaddr, fl->flowi_proto, &orig);
+		if (itf)
+		{
+			cmm_print(DEBUG_INFO, "%s: Flow(%s, %s, %d, %d, %d) matches tunnel: %s\n",
+				__func__,
+				inet_ntop(family, flsaddr, sbuf, INET6_ADDRSTRLEN),
+				inet_ntop(family, fldaddr, dbuf, INET6_ADDRSTRLEN),
+					  ntohs(flsport), ntohs(fldport), fl->flowi_proto, if_indextoname(itf->ifindex, ifname));
+
+			/* Update flow pointers in tunnel entry */
+			if (orig) {
+				if (!itf->flow_orig) {
+					itf->flow_orig = flow;
+					flow->ref_count++;
+				}
+				else {
+					if(itf->flow_orig != flow)  {
+						__cmmFlowPut(itf->flow_orig);
+						itf->flow_orig = flow;
+						flow->ref_count++;
+					}
+				}
+			}
+			else {
+				if (!itf->flow_rep) {
+					itf->flow_rep = flow;
+					flow->ref_count++;
+				}
+				else {
+					if(itf->flow_rep != flow)  {
+						__cmmFlowPut(itf->flow_rep);
+						itf->flow_rep = flow;
+						flow->ref_count++;
+					}
+				}
+			}
+
+			__tunnel_add(fci_handle, itf);
+		}
+
+#ifdef COMCERTO_2000
+		/* Look for sockets that use this flow */
+		sock = __cmmSocketFindFromFlow(family, flsaddr, fldaddr, fl->flowi_proto, &orig);
+		if (sock)
+		{
+			cmm_print(DEBUG_INFO, "%s: Flow(%s, %s, %d, %d, %d) matches socket ID %d\n",
+				__func__,
+				inet_ntop(family, flsaddr, sbuf, INET6_ADDRSTRLEN),
+				inet_ntop(family, fldaddr, dbuf, INET6_ADDRSTRLEN),
+				ntohs(flsport), ntohs(fldport), fl->flowi_proto, sock->id);
+			/* Update flow pointers in socket entry */
+			/*tx and rx flows are swapped for sockets (L2TP sockets.) , 
+			  this is because unlike RTP Relay, for L2TP a single socket is used, 
+                          so the socket is created with daddr  as local address and saddr as peer address. 
+                          This might need revisiting if the flows are extended for other sockets, 
+                          right now this reduces code duplication as well as additional checks for sockets in PFE  */
+
+			if (orig) {
+				if (!sock->rx_flow) {
+					sock->rx_flow = flow;
+					flow->ref_count++;
+				}
+				else {
+					if (sock->rx_flow != flow) {
+						__cmmFlowPut(sock->rx_flow);
+						sock->rx_flow = flow;
+						flow->ref_count++;
+					}
+				}
+			} else {
+				if (!sock->tx_flow) {
+					sock->tx_flow = flow;
+					flow->ref_count++;
+				}
+				else {
+					if (sock->tx_flow != flow) {
+						__cmmFlowPut(sock->tx_flow);
+						sock->tx_flow = flow;
+						flow->ref_count++;
+					}
+				}
+			}
+			__socket_open(fci_handle, sock);
+		}
+#endif
+
+	out:
+		__pthread_mutex_unlock(&flowMutex);
+		__pthread_mutex_unlock(&neighMutex);
+		__pthread_mutex_unlock(&rtMutex);
+		__pthread_mutex_unlock(&ctMutex);
+		__pthread_mutex_unlock(&itf_table.lock);
+
+	default:
+		break;
+	}
+
+	return 0;
+	
+error :
+	return -1;
+}
+
+/*****************************************************************
+* cmmKeyEngineFlowRemove
+*
+*
+******************************************************************/
+int cmmKeyEngineFlowRemove(FCI_CLIENT *fci_handle, unsigned short fcode, unsigned short len, unsigned short *payload)
+{
+	unsigned short family;
+	unsigned short dir;
+	unsigned short msg_len = 0;
+	struct flowi *fl;
+	struct FlowEntry *flow;
+	unsigned int *flsaddr, *fldaddr;
+	unsigned short flsport, fldport;
+	char sbuf[INET6_ADDRSTRLEN], dbuf[INET6_ADDRSTRLEN];
+
+	// decode nl_key message
+
+	// Flow descriptor
+	family = *payload++;
+	msg_len += sizeof(unsigned short);
+	dir = *payload++;
+	msg_len += sizeof(unsigned short);
+
+	if ((len - msg_len) != sizeof(struct flowi))
+	{
+		cmm_print(DEBUG_ERROR,"%s: msg_len mismatch for struct flowi\n",__func__);
+		goto error;
+	}
+
+	fl = (struct flowi*)payload;
+
+	switch (fl->flowi_proto)
+	{
+	case IPPROTO_ETHERIP:
+		/* Make sure to reset port information */
+		if (family == AF_INET)
+		{
+			fl->u.ip4.fl4_sport = 0;
+			fl->u.ip4.fl4_dport = 0;
+		}
+		else
+		{
+			fl->u.ip6.fl6_sport = 0;
+			fl->u.ip6.fl6_dport = 0;
+		}
+		/* fallthrough */
+	case IPPROTO_TCP:
+	case IPPROTO_UDP:
+
+		if (family == AF_INET)
+		{
+			flsaddr = &fl->u.ip4.saddr;
+			fldaddr = &fl->u.ip4.daddr;
+			flsport = fl->u.ip4.fl4_sport;
+			fldport = fl->u.ip4.fl4_dport;
+		}
+		else
+		{
+			flsaddr = fl->u.ip6.saddr.s6_addr32;
+			fldaddr = fl->u.ip6.daddr.s6_addr32;
+			flsport = fl->u.ip6.fl6_sport;
+			fldport = fl->u.ip6.fl6_dport;
+		}
+
+		cmm_print(DEBUG_INFO, "%s: Flow(%s, %s, %d, %d, %d)\n",
+			__func__,
+			inet_ntop(family, flsaddr, sbuf, INET6_ADDRSTRLEN),
+			inet_ntop(family, fldaddr, dbuf, INET6_ADDRSTRLEN),
+				  ntohs(flsport), ntohs(fldport), fl->flowi_proto);
+
+		pthread_mutex_lock(&itf_table.lock);
+		pthread_mutex_lock(&ctMutex);
+		pthread_mutex_lock(&rtMutex);
+		pthread_mutex_lock(&neighMutex);
+		pthread_mutex_lock(&flowMutex);
+
+		/* Find the flow */
+		flow = __cmmFlowFind(family, flsaddr, fldaddr, flsport, fldport, fl->flowi_proto);
+		if (!flow)
+		{
+			//cmm_print(DEBUG_INFO, "%s: flow not found\n", __func__);
+			goto out;
+		}
+		else
+		{
+			if (flow->ref_count == 0)
+				/*Remove this flow from cache*/
+				__cmmFlowRemove(flow);
+		}
+	out:
+		pthread_mutex_unlock(&flowMutex);
+		pthread_mutex_unlock(&neighMutex);
+		pthread_mutex_unlock(&rtMutex);
+		pthread_mutex_unlock(&ctMutex);
+		pthread_mutex_unlock(&itf_table.lock);
+
+	default:
+		break;
+	}
+
+	return 0;
+	
+error :
+	return -1;
+}
+
+/*****************************************************************
+* cmmKeyCatch
+*
+*
+******************************************************************/
+int cmmKeyCatch(unsigned short fcode, unsigned short len, unsigned short *payload)
+{
+	int rc = FCI_CB_CONTINUE;	
+
+	cmm_print(DEBUG_INFO, "%s: fcode 0x%x len %d bytes\n", __func__, fcode, len);
+
+	switch (fcode)
+	{
+		case FPP_CMD_NETKEY_SA_ADD:
+		case FPP_CMD_NETKEY_SA_DELETE:
+		case FPP_CMD_NETKEY_SA_FLUSH:
+		case FPP_CMD_NETKEY_SA_SET_KEYS:
+		case FPP_CMD_NETKEY_SA_SET_TUNNEL:
+		case FPP_CMD_NETKEY_SA_SET_NATT:
+		case FPP_CMD_NETKEY_SA_SET_STATE:
+		case FPP_CMD_NETKEY_SA_SET_LIFETIME:
+			if (cmmKeyEnginetoIPSec(globalConf.ct.fci_handle, fcode, len, payload) < 0)
+			{
+				rc = FCI_CB_STOP;
+			}
+
+			break;
+
+		case FPP_CMD_NETKEY_FLOW_ADD:
+			cmmKeyEngineFlow2Conntrack(globalConf.ct.fci_handle, fcode, len, payload);
+			break;
+
+		case FPP_CMD_NETKEY_FLOW_REMOVE:
+			cmmKeyEngineFlowRemove(globalConf.ct.fci_handle, fcode, len, payload);
+			break;
+
+		default:
+			cmm_print(DEBUG_ERROR, "%s: unknow message(%x) received from linux Key Engine\n", __func__, fcode);
+			break;
+	}
+
+	return rc;
+}
+
+/************************************************************
+ **
+ ** cmmSAQueryProcess
+ **
+ *************************************************************/
+
+
+int cmmSAQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int rcvBytes = 0,count=0,len=0;
+	char rcvBuffer[256];
+	short rc;
+	unsigned short auth_algo, cipher_algo;
+	char output_buf[256];
+	char buf1[INET6_ADDRSTRLEN];
+	char buf2[INET6_ADDRSTRLEN];
+
+	memset(rcvBuffer, 0, 256);
+	fpp_sa_query_cmd_t *pSAQuery = (fpp_sa_query_cmd_t *)rcvBuffer;
+
+	rcvBytes = cmmSendToDaemon(daemon_handle,FPP_CMD_IPSEC_SA_ACTION_QUERY ,
+								pSAQuery, sizeof(fpp_sa_query_cmd_t) , rcvBuffer);
+
+	if (rcvBytes < sizeof(fpp_sa_query_cmd_t)  + sizeof(unsigned short)) {
+		rc = (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer);
+		if (rc == FPP_ERR_UNKNOWN_ACTION) {
+			cmm_print(DEBUG_STDERR, "ERROR: doess not support ACTION_QUERY\n");
+		} else if (rc == FPP_ERR_SA_ENTRY_NOT_FOUND) {
+			cmm_print(DEBUG_STDERR, "ERROR: SA table empty\n");
+		} else {
+			cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%d\n", rc);
+		}
+		return CLI_OK;
+	}
+
+		cmm_print(DEBUG_STDOUT, "SA List:\n");
+
+	do {
+		len += sprintf(output_buf+len , "[%d] Handle : %x  SPI: %x ", 
+		count,pSAQuery->handle, htonl(pSAQuery->spi) );
+		len += sprintf(output_buf+len , "sa_type:  " );
+		switch (pSAQuery->sa_type)
+		{
+			case 50:
+				len += sprintf(output_buf+len , "ESP-Tunnel\n" );
+				break;
+			case 51:
+				len += sprintf(output_buf+len , "AH\n" );
+				break;
+			default:
+				len += sprintf(output_buf+len , "Unknown:%d\n", pSAQuery->sa_type);
+				break;
+		}
+
+		cmm_print(DEBUG_STDOUT, "%s", output_buf);
+		len = 0;
+		cmm_print(DEBUG_STDOUT, "\n");
+		len = sprintf(output_buf+len , "Source Addr:");
+		if (pSAQuery->family == FPP_PROTO_IPV4)
+		{
+			len += sprintf(output_buf+len , "%s " , 
+			inet_ntop(AF_INET, &pSAQuery->src_ip[0],buf1,INET_ADDRSTRLEN));
+		}
+	    else if(pSAQuery->family == FPP_PROTO_IPV6)
+		{
+			len += sprintf(output_buf+len , "%s " , 
+			inet_ntop(AF_INET6, &pSAQuery->src_ip[0],buf1,INET6_ADDRSTRLEN));
+		}
+		else
+			cmm_print(DEBUG_ERROR, "ERROR: Incorrect SA Family" );
+
+		len += sprintf(output_buf+len , "Destination Addr:");
+		if (pSAQuery->family == FPP_PROTO_IPV4)
+		{
+			len += sprintf(output_buf+len , "%s " , 
+			inet_ntop(AF_INET, &pSAQuery->dst_ip[0],buf1,INET_ADDRSTRLEN));
+		}
+		else if(pSAQuery->family == FPP_PROTO_IPV6)
+		{
+			len += sprintf(output_buf+len , "%s " , 
+			inet_ntop(AF_INET6, &pSAQuery->dst_ip[0],buf1,INET6_ADDRSTRLEN));
+		}
+		else
+			cmm_print(DEBUG_ERROR, "ERROR: Incorrect SA Family" );
+
+		len += sprintf (output_buf+len, " mtu :%d state: %d\n", pSAQuery->mtu , pSAQuery->state);	
+
+		cmm_print(DEBUG_STDOUT, "%s",output_buf);
+		len = 0;
+		cmm_print(DEBUG_STDOUT, "\n");
+
+		cmm_print(DEBUG_STDOUT, "Flags:%x Replay_window:%x\n", pSAQuery->flags,pSAQuery->replay_window);
+		if (pSAQuery->replay_window)
+			cmm_print(DEBUG_STDOUT, "ANTI REPLAY ENABLE");
+		else
+			cmm_print(DEBUG_STDOUT, "ANTI REPLAY DISABLE");
+
+		auth_algo = (pSAQuery->key_alg & 0x7);
+		cipher_algo = ((pSAQuery->key_alg >> 4)& 0x1F);
+		if (auth_algo)
+		{
+			int i;
+			len += sprintf(output_buf+len, "Auth Algorithm: ");  
+			switch(auth_algo)
+			{
+				case 0:
+					len += sprintf(output_buf+len, " HMAC_NULL ");  
+					break;
+				case 1:
+					len += sprintf(output_buf + len, " HMAC_MD5 ");  
+					break;
+				case 2:
+					len += sprintf(output_buf + len, " HMAC_SHA1 ");  
+					break;
+				case 3:
+					len += sprintf(output_buf + len, " HMAC_SHA2 ");  
+					break;
+				default:
+					len += sprintf(output_buf + len, " Unknown %d", auth_algo);  
+					break;
+			}
+			len += sprintf(output_buf+len, "\nAuth Key : " );
+			for (i = 0; i < 5; i++)
+			{
+				int temp_val =htonl(*(unsigned int*)&pSAQuery->auth_key[i*4]);
+				len += sprintf (output_buf+len,"%x", temp_val);
+			}
+
+			cmm_print(DEBUG_STDOUT, "%s",output_buf);
+			len = 0;
+			cmm_print(DEBUG_STDOUT, "\n");
+			if (auth_algo == 3)
+			{
+				len += sprintf(output_buf+len, "\nExt-Auth Key : " );
+				for (i = 0; i < 3; i++)
+				{
+					int temp_val =htonl(*(unsigned int*)&pSAQuery->ext_auth_key[i*4]);
+					len += sprintf (output_buf+len,"%x", temp_val);
+				}
+				cmm_print(DEBUG_STDOUT,"%s", output_buf);
+				len = 0;
+				cmm_print(DEBUG_STDOUT, "\n");
+			}
+		}
+
+		if (cipher_algo)
+		{
+			int i;
+			len += sprintf(output_buf+len, "Cipher Algorithm: ");
+			switch(cipher_algo)
+			{
+				case 0:
+					len += sprintf(output_buf+len, " NONE ");
+					break;
+				case 1:
+					len += sprintf(output_buf+len, " DESCBC ");
+					break;
+				case 2:
+					len += sprintf(output_buf+len, " 3DESCBC ");
+					break;
+				case 3:
+					len += sprintf(output_buf+len, " AES128 ");
+					break;
+				case 4:
+					len += sprintf(output_buf+len, " AES192 ");
+					break;
+				case 5:
+					len += sprintf(output_buf+len, " AES256 ");
+					break;
+				default:
+				len += sprintf(output_buf+len, " Unknown %d", cipher_algo);  
+					break;
+			}
+			len += sprintf(output_buf+len, "\nCipher Key : " );
+			for (i = 0; i < 8; i++)
+			{
+				int temp_val =htonl(*(unsigned int*)&pSAQuery->cipher_key[i*4]);
+				len += sprintf (output_buf+len,"%x", temp_val);
+			}
+
+			cmm_print(DEBUG_STDOUT,"%s", output_buf);
+			len = 0;
+			cmm_print(DEBUG_STDOUT, "\n");
+		}
+	
+		if (pSAQuery->mode == 1 ) // SA_MODE_TUNNEL
+		{
+			cmm_print(DEBUG_STDOUT, "Tunnel details : " );
+			if (pSAQuery->tunnel_proto_family == AF_INET)
+			{
+				cmm_print (DEBUG_STDOUT, 
+					"IPV4: Dest Addr: %s SrcAddr :%s TOS: %x Protocol:%x Total Length :%x\n",
+					inet_ntop(AF_INET, &pSAQuery->tnl.ipv4.daddr,buf1,INET_ADDRSTRLEN),
+					inet_ntop(AF_INET, &pSAQuery->tnl.ipv4.saddr,buf2,INET_ADDRSTRLEN),
+					pSAQuery->tnl.ipv4.tos, pSAQuery->tnl.ipv4.protocol , 
+					pSAQuery->tnl.ipv4.total_length);	
+			}
+			else
+			{
+				cmm_print(DEBUG_STDOUT, 
+					"IPV6:Dest Addr: %s SrcAddr :%s\n", 
+					inet_ntop(AF_INET6, &pSAQuery->tnl.ipv6.daddr[0],buf1,INET6_ADDRSTRLEN),
+					inet_ntop(AF_INET6, &pSAQuery->tnl.ipv6.saddr[0],buf2,INET6_ADDRSTRLEN));
+
+				cmm_print (DEBUG_STDOUT, 
+					"TrafficClassHi:%x Version:%x FlowLabelHi:%x TrafficClass:%x FlowLabelLo:%x \n", 
+					pSAQuery->tnl.ipv6.traffic_class_hi,
+					pSAQuery->tnl.ipv6.version,
+					pSAQuery->tnl.ipv6.flow_label_high,
+					pSAQuery->tnl.ipv6.traffic_class,
+					pSAQuery->tnl.ipv6.flow_label_lo);
+			}
+		}
+
+		cmm_print(DEBUG_STDOUT, "Life time details : " );
+		cmm_print (DEBUG_STDOUT,"soft_byte_limit : %llx hard_byte_limit :%llx\n", 
+		pSAQuery->soft_byte_limit,pSAQuery->hard_byte_limit); 
+
+		cmm_print (DEBUG_STDOUT,"soft_packet_limit : %llx hard_packet_limit :%llx\n", 
+		pSAQuery->soft_packet_limit,pSAQuery->hard_packet_limit); 
+
+		count++; 
+		cmm_print(DEBUG_STDOUT, "\n " );
+		memset(rcvBuffer,0,256);
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_IPSEC_SA_ACTION_QUERY_CONT, pSAQuery, sizeof(fpp_sa_query_cmd_t) , rcvBuffer);
+	}while(rcvBytes >= sizeof(fpp_sa_query_cmd_t) + sizeof(unsigned short));
+
+	cmm_print(DEBUG_STDOUT, "Total SA Entries: %d\n", count);
+	return CLI_OK;
+}
+
+void cmmDPDIPsecSAUpdate(struct cmm_ct *ctx)
+{
+	static unsigned int gDPDCurrAutoTimeout = 0;
+	static time_t last_dpd = 0;
+	double dt;
+	time_t now;
+	netkey_sa_update_cmd_t msg;
+	unsigned short *payload;
+	fpp_stat_ipsec_status_cmd_t ipsecStatusCmd;
+	uint64_t total_bytes_transmitted_0={0};
+	uint64_t total_bytes_transmitted_1={0};
+	uint64_t total_bytes_transmitted={0};
+	short ret = 1;
+	char rcvBuffer[256]={0};
+	unsigned short rcvBytes = 0;
+	unsigned short fcode;
+	unsigned short len = 0;
+
+	if(gSAQueryTimerEnable)
+	{
+		now = time(NULL);
+		
+		dt = now - last_dpd;
+
+		gDPDCurrAutoTimeout += (unsigned int) dt;
+
+		if (gDPDCurrAutoTimeout >= gSAQueryTimerVal)
+		{
+			fpp_stat_ipsec_entry_response_t *pEntryResponse = (fpp_stat_ipsec_entry_response_t *)rcvBuffer;
+			ipsecStatusCmd.action = FPP_CMM_STAT_QUERY;
+			/* Send CMD_STAT_IPSEC_STATUS command */
+			ret = fci_write(ctx->fci_handle, FPP_CMD_STAT_IPSEC_STATUS, sizeof(ipsecStatusCmd), (unsigned short *) &ipsecStatusCmd);
+
+			if ((ret != FPP_ERR_OK) || (ret < 0))
+			{
+				cmm_print(DEBUG_ERROR, "Error %d when sending FPP_CMD_STAT_IPSEC_STATUS \n", ret);
+			}
+			else
+			{
+				while (1)
+				{
+					ret = fci_query(ctx->fci_handle,FPP_CMD_STAT_IPSEC_ENTRY,0,NULL,
+							&rcvBytes,(unsigned short *) (rcvBuffer + sizeof(ret)));
+					rcvBytes += sizeof(ret);
+					memcpy(rcvBuffer, &ret, sizeof(ret));
+	                                if ((ret != FPP_ERR_OK) || (ret < 0))
+        	                        {
+						cmm_print(DEBUG_ERROR, "Error %d when sending FPP_CMD_STAT_IPSEC_ENTRY \n", ret);
+						break;
+	                                }
+					if ((rcvBytes) != sizeof(fpp_stat_ipsec_entry_response_t))
+					{
+						cmm_print(DEBUG_ERROR, "%s: wrong response length %d received from FPP for FPP_CMD_STAT_IPSEC_ENTRY\n", __func__, rcvBytes);
+						break;
+					}
+					if (pEntryResponse->eof)
+						break;
+
+					total_bytes_transmitted_0 = pEntryResponse->total_bytes_processed[0];
+					total_bytes_transmitted_1 = pEntryResponse->total_bytes_processed[1];
+					total_bytes_transmitted_1 <<= 32;
+
+					total_bytes_transmitted = total_bytes_transmitted_0 | total_bytes_transmitted_1;
+
+					memset(&msg, 0, sizeof(netkey_sa_update_cmd_t));
+					msg.sagd = pEntryResponse->sagd;
+					msg.packets = pEntryResponse->total_pkts_processed;
+					msg.bytes = total_bytes_transmitted;
+
+					fcode = NETKEY_CMD_SA_INFO_UPDATE;
+					len = sizeof(msg);
+					payload = (unsigned short *)&msg;
+			                cmmIPSectoKeyEngine(ctx->fci_key_handle, fcode, len, payload);
+				}
+			}
+			gDPDCurrAutoTimeout = 0;
+		}
+		last_dpd = now;
+	}
+}
+
+void cmmDPDSaQueryPrintHelp(int cmd_type)
+{
+	if (cmd_type == SAQUERY_UNKNOWN_CMD || cmd_type == SAQUERY_ENABLE_CMD)
+	{
+		cmm_print(DEBUG_STDOUT, "Usage: set sa_query_timer enable \n"
+									"      set sa_query_timer disable \n");
+	}
+	if (cmd_type == SAQUERY_UNKNOWN_CMD || cmd_type == SAQUERY_TIMER_CMD)
+	{
+		cmm_print(DEBUG_STDOUT,
+					"Usage: set sa_query_timer timer_value <time in seconds> \n");
+	}
+	if (cmd_type == SAQUERY_UNKNOWN_CMD)
+	{
+		cmm_print(DEBUG_STDOUT, "\n");
+	}
+}
+
+int cmmDPDSaQuerySetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cmd_type = SAQUERY_UNKNOWN_CMD;
+	int cpt = tabStart;
+	char * endptr;
+	unsigned int tmp;
+	int rc;
+
+	char sndBuffer[256];
+	char rcvBuffer[256];
+	cmmd_saquery_timer_t* entryCmd = (cmmd_saquery_timer_t*) sndBuffer;
+
+	memset(sndBuffer, 0, sizeof(sndBuffer));
+	cmm_print(DEBUG_INFO, "Entered DPD SA Query Set Process\n");
+
+	if(!keywords[cpt])
+		goto help;
+
+	if( (strcasecmp(keywords[cpt], "enable") == 0) ||
+	    (strcasecmp(keywords[cpt], "disable") == 0) )
+	{
+		cmd_type = SAQUERY_ENABLE_CMD;
+
+		if(strcasecmp(keywords[cpt], "enable") == 0)
+			entryCmd->action = CMMD_DPDSAQUERY_ACTION_ENABLE;
+		else
+			entryCmd->action = CMMD_DPDSAQUERY_ACTION_DISABLE;
+	}
+	else if(strcasecmp(keywords[cpt], "timer_value") == 0)
+	{
+		cmd_type = SAQUERY_TIMER_CMD;
+		if(!keywords[++cpt])
+			goto help;
+
+		/*Get an integer from the string*/
+		endptr = NULL;
+		tmp = strtoul(keywords[cpt], &endptr, 0);
+		if ((keywords[cpt] == endptr) ||  (tmp < 20))
+		{
+			cmm_print(DEBUG_CRIT, "SA_Query_Timer ERROR: Timer Value must be greater than or equal to 20 seconds \n");
+			goto help;
+		}
+
+		entryCmd->action = CMMD_DPDSAQUERY_ACTION_SETTIMER;
+		entryCmd->SaQueryTimerVal = tmp;
+	}
+	else
+		goto keyword_error;
+
+	rc = cmmSendToDaemon(daemon_handle, CMMD_CMD_IPSEC_DPDSAQUERYTIMER, sndBuffer, sizeof(cmmd_saquery_timer_t), rcvBuffer);
+	if(rc != 2)
+	{
+		if(rc >= 0)
+			cmm_print(DEBUG_STDERR, "Unexpected response size for CMD_IPSEC_DPDSAQUERYTIMER: %d\n", rc);
+		return -1;
+	}
+	else if (((unsigned short *)rcvBuffer)[0] != CMMD_ERR_OK)
+	{
+		cmm_print(DEBUG_STDERR, "Error %d received for CMDD_DPDSAQUERYTIMER\n", ((unsigned short *)rcvBuffer)[0]);
+		return -1;
+	}
+
+	return 0;
+
+keyword_error:
+	cmm_print(DEBUG_CRIT, "ERROR: Unknown keyword %s\n", keywords[cpt]);
+
+help:
+	cmmDPDSaQueryPrintHelp(cmd_type);
+	return -1;
+
+}
+
+
+int cmmDPDSAQUERYProcessClientCmd(u_int8_t *cmd_buf, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	cmmd_saquery_timer_t	*entryCmd = (cmmd_saquery_timer_t*) cmd_buf;
+
+	cmm_print(DEBUG_INFO, "cmmDPDSAQUERYProcessClientCmd\n");
+
+	res_buf[0] = CMMD_ERR_OK;
+	*res_len = 2;
+
+	switch (entryCmd->action) {
+		case CMMD_DPDSAQUERY_ACTION_ENABLE:
+			cmm_print(DEBUG_INFO, "cmmDPDSAQUERYProcessClientCmd- CMMD_DPDSAQUERY_ACTION_ENABLE\n");
+			gSAQueryTimerEnable = 1;
+			break;
+
+		case CMMD_DPDSAQUERY_ACTION_DISABLE:
+			cmm_print(DEBUG_INFO, "cmmDPDSAQUERYProcessClientCmd- CMMD_DPDSAQUERY_ACTION_ENABLE\n");
+			gSAQueryTimerEnable = 0;
+			break;
+
+		case CMMD_DPDSAQUERY_ACTION_SETTIMER:
+			cmm_print(DEBUG_INFO, "cmmDPDSAQUERYProcessClientCmd- CMMD_DPDSAQUERY_ACTION_SETTIMER\n");
+	                gSAQueryTimerVal = entryCmd->SaQueryTimerVal;
+			break;
+
+		default:
+			res_buf[0] = CMMD_ERR_UNKNOWN_ACTION;
+			break;
+	}
+	return 0;
+}
+
+int cmmSaQueryTimerShow(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	if(gSAQueryTimerEnable)
+		cli_print(cli, " The SA query timer is enabled: the current timer value is %d", gSAQueryTimerVal);
+	else
+		cli_print(cli, " The SA query timer is disabled: the current timer value is %d", gSAQueryTimerVal);
+
+	return CLI_OK;
+}
diff --git a/cmm/src/keytrack.h b/cmm/src/keytrack.h
new file mode 100644
index 0000000..c0caa22
--- /dev/null
+++ b/cmm/src/keytrack.h
@@ -0,0 +1,187 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __KEYTRACK_H__
+#define __KEYTRACK_H__
+
+#include "list.h"
+#include "conntrack.h"
+
+
+#define MAX_SA_BUNDLE 4
+#define FLOW_HASH_TABLE_SIZE	CONNTRACK_HASH_TABLE_SIZE	// uses HASH_CT macros for keys
+
+struct flowi_common {
+	int	flowic_oif;
+	int	flowic_iif;
+	__u32	flowic_mark;
+	__u8	flowic_tos;
+	__u8	flowic_scope;
+	__u8	flowic_proto;
+	__u8	flowic_flags;
+	#define FLOWI_FLAG_ANYSRC		0x01
+	#define FLOWI_FLAG_PRECOW_METRICS	0x02
+	#define FLOWI_FLAG_CAN_SLEEP		0x04
+	__u32	flowic_secid;
+};
+
+union flowi_uli {
+	struct {
+		__be16	dport;
+		__be16	sport;
+	} ports;
+	
+	struct {
+		__u8	type;
+		__u8	code;
+	} icmpt;
+	
+	struct {
+		__le16	dport;
+		__le16	sport;
+	} dnports;
+	
+	__be32		spi;
+	__be32		gre_key;
+	
+	struct {
+		__u8	type;
+	} mht;
+};
+
+struct flowi4 {
+	struct flowi_common	__fl_common;
+	#define flowi4_oif		__fl_common.flowic_oif
+	#define flowi4_iif		__fl_common.flowic_iif
+	#define flowi4_mark		__fl_common.flowic_mark
+	#define flowi4_tos		__fl_common.flowic_tos
+	#define flowi4_scope		__fl_common.flowic_scope
+	#define flowi4_proto		__fl_common.flowic_proto
+	#define flowi4_flags		__fl_common.flowic_flags
+	#define flowi4_secid		__fl_common.flowic_secid
+	__be32			daddr;
+	__be32			saddr;
+	union flowi_uli		uli;
+	#define fl4_sport		uli.ports.sport
+	#define fl4_dport		uli.ports.dport
+	#define fl4_icmp_type		uli.icmpt.type
+	#define fl4_icmp_code		uli.icmpt.code
+	#define fl4_ipsec_spi		uli.spi
+	#define fl4_mh_type		uli.mht.type
+	#define fl4_gre_key		uli.gre_key
+};
+
+struct flowi6 {
+	struct flowi_common	__fl_common;
+	#define flowi6_oif		__fl_common.flowic_oif
+	#define flowi6_iif		__fl_common.flowic_iif
+	#define flowi6_mark		__fl_common.flowic_mark
+	#define flowi6_tos		__fl_common.flowic_tos
+	#define flowi6_scope		__fl_common.flowic_scope
+	#define flowi6_proto		__fl_common.flowic_proto
+	#define flowi6_flags		__fl_common.flowic_flags
+	#define flowi6_secid		__fl_common.flowic_secid
+	struct in6_addr		daddr;
+	struct in6_addr		saddr;
+	__be32			flowlabel;
+	union flowi_uli		uli;
+	#define fl6_sport		uli.ports.sport
+	#define fl6_dport		uli.ports.dport
+	#define fl6_icmp_type		uli.icmpt.type
+	#define fl6_icmp_code		uli.icmpt.code
+	#define fl6_ipsec_spi		uli.spi
+	#define fl6_mh_type		uli.mht.type
+	#define fl6_gre_key		uli.gre_key
+};
+
+struct flowidn {
+	struct flowi_common	__fl_common;
+	#define flowidn_oif		__fl_common.flowic_oif
+	#define flowidn_iif		__fl_common.flowic_iif
+	#define flowidn_mark		__fl_common.flowic_mark
+	#define flowidn_scope		__fl_common.flowic_scope
+	#define flowidn_proto		__fl_common.flowic_proto
+	#define flowidn_flags		__fl_common.flowic_flags
+	__le16			daddr;
+	__le16			saddr;
+	union flowi_uli		uli;
+	#define fld_sport		uli.ports.sport
+	#define fld_dport		uli.ports.dport
+};
+
+struct flowi {
+	union {
+		struct flowi_common	__fl_common;
+		struct flowi4		ip4;
+		struct flowi6		ip6;
+		struct flowidn		dn;
+	} u;
+	#define flowi_oif	u.__fl_common.flowic_oif
+	#define flowi_iif	u.__fl_common.flowic_iif
+	#define flowi_mark	u.__fl_common.flowic_mark
+	#define flowi_tos	u.__fl_common.flowic_tos
+	#define flowi_scope	u.__fl_common.flowic_scope
+	#define flowi_proto	u.__fl_common.flowic_proto
+	#define flowi_flags	u.__fl_common.flowic_flags
+	#define flowi_secid	u.__fl_common.flowic_secid
+};
+
+
+struct FlowEntry
+{
+	struct list_head list;
+	struct flowi  fl;
+	unsigned char sa_nr;
+	unsigned short family;
+	unsigned short dir;
+	int flags;
+	unsigned short sa_handle[MAX_SA_BUNDLE];
+	unsigned int ref_count;
+};
+
+typedef struct netkey_sa_update_cmd{
+	unsigned short sagd;
+	unsigned short rsvd;
+	unsigned long long bytes;
+	unsigned long long packets;
+}netkey_sa_update_cmd_t;
+
+#define SAQUERY_UNKNOWN_CMD	0
+#define SAQUERY_ENABLE_CMD	1
+#define SAQUERY_TIMER_CMD	2
+
+#define NETKEY_CMD_SA_INFO_UPDATE	0x0a0c
+
+extern pthread_mutex_t flowMutex;
+extern struct  list_head flow_table[FLOW_HASH_TABLE_SIZE];
+
+int cmmKeyCatch(unsigned short fcode, unsigned short len, unsigned short *payload);
+int cmmKeyEnginetoIPSec(FCI_CLIENT *fci_handle, unsigned short fcode, unsigned short len, unsigned short *payload);
+int cmmIPSectoKeyEngine(FCI_CLIENT *fci_handle, unsigned short fcode, unsigned short len, unsigned short *payload);
+int cmmFlowKeyEngineRemove(FCI_CLIENT *fci_handle, struct FlowEntry *fentry);
+
+struct FlowEntry *__cmmFlowFind(int family, const unsigned int *Saddr, const unsigned int *Daddr, unsigned short Sport, unsigned short Dport, unsigned char proto);
+void __cmmFlowRemove(struct FlowEntry *flow);
+struct FlowEntry *__cmmFlowAdd(int family, struct flowi *fl, unsigned char sa_nr, unsigned short *sa_handle, unsigned short dir);
+struct FlowEntry *__cmmFlowGet(int family, const unsigned int *Saddr, const unsigned int *Daddr, unsigned short Sport, unsigned short Dport, unsigned char proto);
+void __cmmFlowPut(struct FlowEntry *flow);
+
+int cmmDPDSaQuerySetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+int cmmSaQueryTimerShow(struct cli_def * cli, char *command, char *argv[], int argc);
+int cmmDPDSAQUERYProcessClientCmd(u_int8_t *cmd_buf, u_int16_t *res_buf, u_int16_t *res_len);
+#endif
diff --git a/cmm/src/libcmm.c b/cmm/src/libcmm.c
new file mode 100644
index 0000000..f5a4541
--- /dev/null
+++ b/cmm/src/libcmm.c
@@ -0,0 +1,178 @@
+/*
+ *
+ *  Copyright (C) 2010 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+#include <unistd.h>
+
+#include "libcmm.h"
+#include "cmm.h"
+
+#define MAX_PATH 32
+
+struct cmm_handle
+{
+	long	uniqueid;
+	int	tmp_fd;
+	int 	queue_id_rx;
+	int 	queue_id_tx;
+	char	path[MAX_PATH];
+};
+
+int getpgid(pid_t _pid); /* XXX: uclibs doesn't declare this function is unistd.h as it has to, 
+			  * therefore declare it by ourselves
+			  */
+
+static int get_daemon_pid()
+{
+        FILE*fd;
+        char buf[10];
+
+        fd = fopen(CMM_PID_FILE_PATH, "r");
+        if(fd > 0) {
+		// Read the pid written in the pid file
+		fgets(buf, 10, fd);
+		fclose(fd);
+
+		// Check the daemon is really running
+		if (getpgid(atoi(buf)) != -1)
+			return atoi(buf);
+	}
+
+	// No daemon is running
+	return 0;
+}
+
+static int gen_uniqueid(cmm_handle_t *handle)
+{
+	unsigned i;
+        srandom(time(NULL));
+	
+	for (i = 0; i < 10; i++) {
+		handle->uniqueid = random();
+		snprintf(handle->path, sizeof(handle->path), "%s.%lu", "/tmp/cmm", handle->uniqueid);
+		handle->tmp_fd = open(handle->path, O_CREAT | O_EXCL);
+		if (handle->tmp_fd == -1)
+			continue;
+		else
+			return 0;
+	}
+
+        return -1;
+}
+
+cmm_handle_t *cmm_open(void)
+{
+	key_t key;
+	int pid = get_daemon_pid();
+	cmm_handle_t *handle;
+
+	if (!pid) {
+                fprintf(stderr, "Daemon is not running\n");
+                return NULL;
+        }
+
+	handle = malloc(sizeof(cmm_handle_t));
+	if (!handle) {
+		fprintf(stderr, "Error allocating CMM handle\n");
+		return NULL;
+	}
+
+	memset(handle, 0, sizeof(cmm_handle_t));
+	
+	if (gen_uniqueid(handle) != 0) {
+		fprintf(stderr, "Error getting uniqueid\n");
+		goto ERR_UNIQUEID;
+	}
+
+        pid = ((pid & 0xff) ^ ((pid >> 8) & 0xff)) | 1;
+        key = ftok("/tmp", pid);
+        if (key == (key_t)-1) {
+                fprintf(stderr, "ftok(%d) failed, %s\n", pid, strerror(errno));
+                goto ERR_QUEUE;
+        }
+
+        handle->queue_id_rx = msgget(key, 0);
+        if (handle->queue_id_rx < 0) {
+                fprintf(stderr, "rx msgget() failed, %s\n", strerror(errno));
+                goto ERR_QUEUE;
+        }
+
+	key = ftok("/tmp", pid ^ 0xff);
+        if (key == (key_t)-1) {
+                fprintf(stderr, "ftok(%d) failed, %s\n", pid, strerror(errno));
+                goto ERR_QUEUE;
+        }
+
+        handle->queue_id_tx = msgget(key, 0);
+        if (handle->queue_id_tx < 0) {
+                fprintf(stderr, "tx msgget() failed, %s\n", strerror(errno));
+                goto ERR_QUEUE;
+        }
+
+	return handle;
+
+ERR_QUEUE:
+	close(handle->tmp_fd);
+	unlink(handle->path);
+ERR_UNIQUEID:
+	free(handle);
+
+	return NULL;
+}
+
+void cmm_close(cmm_handle_t* handle)
+{
+	close(handle->tmp_fd);
+	unlink(handle->path);
+	free(handle);
+}
+
+int cmm_send(cmm_handle_t *handle, cmm_command_t* cmd, int nonblocking)
+{
+	cmd->msg_type = handle->uniqueid;
+
+        return msgsnd(handle->queue_id_tx, 
+		      cmd, 
+		      sizeof(cmm_command_t) - sizeof(cmd->buf) + cmd->length, 
+		      nonblocking ? IPC_NOWAIT : 0);
+}
+
+int cmm_recv(cmm_handle_t *handle, cmm_response_t* res, int nonblocking)
+{
+        int len = msgrcv(handle->queue_id_rx, 
+			 res, 
+			 sizeof(cmm_response_t), 
+			 handle->uniqueid, 
+			 nonblocking ? IPC_NOWAIT : 0);
+	if (len < 0)
+                return len;
+
+	if (res->daemon_errno) {
+		errno = res->daemon_errno;
+		return -1;
+	}
+
+	return len;
+}
+
diff --git a/cmm/src/libcmm.h b/cmm/src/libcmm.h
new file mode 100644
index 0000000..e57ed37
--- /dev/null
+++ b/cmm/src/libcmm.h
@@ -0,0 +1,58 @@
+/*
+ *
+ *  Copyright (C) 2010 Mindspeed Technologies, Inc.
+ *
+ * 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 __CMMLIB__
+#define __CMMLIB__
+
+#include <sys/types.h>
+
+#define CMM_BUF_SIZE 512 
+
+typedef struct cmm_handle cmm_handle_t;
+
+typedef struct cmm_command
+{
+	long int	msg_type;		/* internal, user shouldn't use this*/
+	u_int16_t	func;			/* function code, filled by user */ 
+	u_int16_t	length;			/* buf length, filled by user */
+	u_int8_t	buf[CMM_BUF_SIZE];	/* command payload, filled by user */
+} __attribute__((__packed__)) cmm_command_t;	/* to be consistent with cmm_response_t, actually 
+						 * no demand for "packed" here
+						 */
+
+typedef struct cmm_response
+{
+	long int 	msg_type;		/* internal, user shouldn't use this */
+	int 		daemon_errno;		/* internal, user shouldn't use this */
+	u_int16_t	func;			/* function code, set by remote side */
+	u_int16_t	length;			/* length of a buf, set by remote side */
+	union {
+		u_int16_t	rc;			/* return code, set by remote side */
+		u_int8_t	buf[CMM_BUF_SIZE];	/* response payload, set by remote side */
+	};
+} __attribute__((__packed__)) cmm_response_t;	/* "packed" is due to operations
+						 * on the structure using memcpy() internally in CMM daemon
+						 */
+
+cmm_handle_t 	*cmm_open(void);
+void		cmm_close(cmm_handle_t*);
+int		cmm_send(cmm_handle_t*, cmm_command_t*, int nonblocking);
+int		cmm_recv(cmm_handle_t*, cmm_response_t*, int nonblocking);
+
+#endif
+
diff --git a/cmm/src/libcmm_sample.c b/cmm/src/libcmm_sample.c
new file mode 100644
index 0000000..6ecd20b
--- /dev/null
+++ b/cmm/src/libcmm_sample.c
@@ -0,0 +1,90 @@
+/*
+ *
+ *  Copyright (C) 2010 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+#include <sys/types.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+
+#include "libcmm.h"
+#include "cmmd.h"
+#include "fpp.h"
+
+int main()
+{
+	cmm_command_t		cmd;
+	cmm_response_t		res;
+	fpp_rtcp_query_cmd_t 	*rtcp_cmd;
+	fpp_rtcp_query_res_t    *rtcp_res;
+	cmm_handle_t  		*handle;
+
+	memset(&cmd, 0 , sizeof(cmd));
+	memset(&res, 0 , sizeof(res));
+
+	handle = cmm_open();
+	if (!handle) {
+		printf("Error opening CMM\n");
+		return -1;
+	}
+
+	cmd.func = FPP_CMD_RTCP_QUERY;
+	cmd.length = sizeof(fpp_rtcp_query_cmd_t);
+	rtcp_cmd = (fpp_rtcp_query_cmd_t*)&cmd.buf;
+	rtcp_cmd->socket_id = 1;
+
+	if (cmm_send(handle, &cmd, 0) != 0) {
+		printf("Error sending message to CMM, error = `%s'\n", strerror(errno));
+		return -1;
+	}
+
+	if (cmm_recv(handle, &res, 0) < 0) {
+		printf("Error receiving message from CMM, error = `%s'\n", strerror(errno));
+		return -1;
+	}
+
+	if (res.rc != FPP_ERR_OK) {
+		printf("Error from CMM, error = `%d'\n", res.rc);
+		return -1;
+	}
+
+	// message handling goes here
+	rtcp_res = (fpp_rtcp_query_res_t*)&res.buf;
+	printf("RTCP Statistics\n\n"
+               "prev_reception_period	: %d\n"
+               "last_reception_period	: %d\n"
+               "num_tx_pkts		: %d\n"
+               "num_rx_pkts 		: %d\n"
+               "last_rx_seq		: %d\n"
+               "last_rx_ts		: %d\n"
+               "num_dup_rx		: %d\n"
+               "num_rx_since_rtcp	: %d\n"
+               "num_tx_bytes		: %d\n",
+               rtcp_res->prev_reception_period,
+               rtcp_res->last_reception_period,
+               rtcp_res->num_tx_pkts,
+               rtcp_res->num_rx_pkts,
+               rtcp_res->last_rx_seq,
+               rtcp_res->last_rx_timestamp,
+               rtcp_res->num_rx_dup,
+               rtcp_res->num_rx_since_rtcp,
+               rtcp_res->num_tx_bytes);
+        
+	return 0;
+}
+
diff --git a/cmm/src/list.h b/cmm/src/list.h
new file mode 100644
index 0000000..be310e3
--- /dev/null
+++ b/cmm/src/list.h
@@ -0,0 +1,64 @@
+/*
+ *
+ *  Copyright (C) 2009 Mindspeed Technologies, Inc.
+ *
+ * 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 __LIST_H
+#define __LIST_H
+
+#include <assert.h>
+
+struct list_head {
+	struct list_head *prev;
+	struct list_head *next;
+};
+
+static inline void list_head_init(struct list_head *head)
+{
+	head->prev = head;
+	head->next = head;
+}
+
+static inline void list_add(struct list_head *head, struct list_head *entry)
+{
+	assert((!entry->next) && (!entry->prev));
+
+	entry->next = head->next;
+	entry->next->prev = entry;
+
+	head->next = entry;
+	entry->prev = head;
+}
+
+static inline void list_del(struct list_head *entry)
+{
+	entry->prev->next = entry->next;
+	entry->next->prev = entry->prev;
+	entry->prev = NULL;
+	entry->next = NULL;
+}
+
+#define list_empty(head)	((head)->next == (head))
+
+#define offset_of(type, member) ((unsigned long)&(((type *)0)->member))
+#define container_of(entry, type, member) ((type *)((unsigned char *)(entry) - offset_of(type, member)))
+
+#define list_first(head)	((head)->next)
+#define list_last(head)		((head)->prev)
+#define list_next(entry)	((entry)->next)
+
+#endif
diff --git a/cmm/src/module_expt.c b/cmm/src/module_expt.c
new file mode 100644
index 0000000..e2eaffc
--- /dev/null
+++ b/cmm/src/module_expt.c
@@ -0,0 +1,228 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+#include "cmm.h"
+#include "fpp.h"
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+void cmmExptShowPrintHelp()
+{
+	cmm_print(DEBUG_STDOUT, "show expt not yet supported\n");
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+int cmmExptShowProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	cmmExptShowPrintHelp();
+	return -1;
+}
+/************************************************************
+ *
+ *
+ *
+ *************************************************************/
+int cmmExptQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	cmmExptShowPrintHelp();
+        return -1;
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+void cmmExptSetPrintHelp()
+{
+	cmm_print(DEBUG_STDOUT, 
+                  "Usage: set expt queue {0|1|2|3} [dscp {0-63}]\n"
+                  "                                      [control]\n");
+}
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+int cmmExptSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	int num_dscp = 0;
+	unsigned int tmp, i = 0;
+	char * endptr;
+	unsigned char selected_queue = 0, first_dscp = 0, last_dscp = 0, dscp_range = 0;
+	unsigned char dscp_value[FPP_EXPT_MAX_DSCP + 1] = {0};
+	char sndBuffer[256];
+	char rcvBuffer[256];
+	fpp_expt_queue_dscp_cmd_t *dscpCmd = NULL;
+	fpp_expt_queue_control_cmd_t *ctrlCmd = NULL;
+
+	memset(sndBuffer, 0, sizeof(sndBuffer));
+	cmm_print(DEBUG_INFO, "Entered Expt Set Process\n");
+
+	if(!keywords[cpt])
+		goto help;
+
+	if(strcasecmp(keywords[cpt], "reset") == 0)
+	{
+		cmm_print(DEBUG_INFO, "cmmExptSetProcess - reset all queues\n");
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_EXPT_QUEUE_RESET, NULL, 0, rcvBuffer) == 2)
+		{
+			if ( ((unsigned short *)rcvBuffer)[0] != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_EXPT_QUEUE_RESET\n", ((unsigned short *)rcvBuffer)[0]);
+		}
+		return ((unsigned short *)rcvBuffer)[0];
+	}
+	else if(strcasecmp(keywords[cpt], "queue") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+
+		 /*Get an integer from the string*/
+		endptr = NULL;
+		tmp = strtoul(keywords[cpt], &endptr, 0);
+		if ((keywords[cpt] == endptr) || (tmp > FPP_EXPT_MAX_QUEUE))
+		{
+			cmm_print(DEBUG_STDERR, "Expt ERROR: selected queue must be a number between 0 and %d\n", FPP_EXPT_MAX_QUEUE);
+			goto help;
+		}
+		selected_queue = tmp;
+		cmm_print(DEBUG_INFO, "cmmExptSetProcess - queue %d selected\n", selected_queue);
+
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "dscp") == 0)
+		{
+			/* get list of dscp values assigned to the selected queue */
+			if(!keywords[++cpt])
+				goto help;
+			num_dscp = 0;
+			first_dscp = 0;
+			cmm_print(DEBUG_INFO, "cmmExptSetProcess - parsing dscp list for queue %d\n", selected_queue);
+			while(keywords[cpt])
+			{
+				cmm_print(DEBUG_INFO, "cmmExptSetProcess - processing arg '%s' \n", keywords[cpt]);
+				if(strcasecmp(keywords[cpt], "-") == 0)
+				{
+					dscp_range = 1;
+					cmm_print(DEBUG_INFO, "cmmExptSetProcess - dscp range detected\n");
+				}
+				else
+				{
+					endptr = NULL;
+					tmp = strtoul(keywords[cpt], &endptr, 0);
+					if ((keywords[cpt] == endptr) || (tmp > FPP_EXPT_MAX_DSCP))
+					{
+						cmm_print(DEBUG_STDERR, "Expt ERROR: DSCP value out of range\n");
+						goto help;
+					}
+					else
+					{
+						cmm_print(DEBUG_INFO, "cmmExptSetProcess - one more dscp added\n");
+						/* save low-end dscp value i.e. the first value specified*/
+						if(num_dscp == 0)
+							first_dscp = tmp;
+						last_dscp = tmp; /* save high end dscp i.e. the last one specified*/
+						dscp_value[num_dscp++] = tmp;
+					}
+				}
+				cpt++;
+			}
+
+			dscpCmd = (fpp_expt_queue_dscp_cmd_t *) sndBuffer;
+			dscpCmd->queue = selected_queue;
+			/* no dscp specified means all dscp */
+			if(num_dscp == 0) 
+			{
+				for(i = 0; i < FPP_EXPT_MAX_DSCP; i++)
+					dscpCmd->dscp[i] = i;
+				dscpCmd->num_dscp = FPP_EXPT_MAX_DSCP + 1;
+				cmm_print(DEBUG_INFO, "cmmExptSetProcess - all dscp assigned\n");
+			}
+			else if (dscp_range)
+			{
+				if(last_dscp <= first_dscp)
+				{
+					cmm_print(DEBUG_STDERR, "Expt ERROR: wrong DSCP range\n");
+					goto help;
+				}
+				for(i = first_dscp; i <= last_dscp; i++)
+					dscpCmd->dscp[i - first_dscp] = i;
+				dscpCmd->num_dscp = (last_dscp - first_dscp) + 1; 
+				cmm_print(DEBUG_INFO, "cmmExptSetProcess - dscp range %d to %d\n", first_dscp, last_dscp);
+			}
+			else
+			{
+				cmm_print(DEBUG_INFO, "cmmExptSetProcess - dscp non-ordered list\n");
+				dscpCmd->num_dscp = num_dscp;
+				for(i = 0; i < dscpCmd->num_dscp; i++)
+					dscpCmd->dscp[i] = dscp_value[i];
+			}
+			cmm_print(DEBUG_INFO, "cmmExptSetProcess - %d dscp assigned ->\n", dscpCmd->num_dscp);
+			for(i = 0; i < dscpCmd->num_dscp; i++)
+				cmm_print(DEBUG_INFO, "%d ", dscpCmd->dscp[i]);
+			cmm_print(DEBUG_INFO, "\n");
+
+			if(cmmSendToDaemon(daemon_handle, FPP_CMD_EXPT_QUEUE_DSCP, sndBuffer, sizeof(fpp_expt_queue_dscp_cmd_t), rcvBuffer) == 2)
+			{
+				if ( ((unsigned short *)rcvBuffer)[0] != 0)
+					cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_EXPT_QUEUE_DSCP\n", ((unsigned short *)rcvBuffer)[0]);
+				return ((unsigned short *)rcvBuffer)[0];
+			}
+		}
+		else if(strcasecmp(keywords[cpt], "control") == 0)
+		{
+			memset(sndBuffer, 0, sizeof(sndBuffer));
+			ctrlCmd = (fpp_expt_queue_control_cmd_t *) sndBuffer;
+			ctrlCmd->queue = selected_queue;
+			cmm_print(DEBUG_INFO, "cmmExptSetProcess - control assigned to queue %d\n", ctrlCmd->queue);
+
+			if(cmmSendToDaemon(daemon_handle, FPP_CMD_EXPT_QUEUE_CONTROL, sndBuffer, sizeof(fpp_expt_queue_control_cmd_t), rcvBuffer) == 2)
+			{
+				if ( ((unsigned short *)rcvBuffer)[0] != 0)
+					cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_EXPT_QUEUE_CONTROL\n", ((unsigned short *)rcvBuffer)[0]);
+				return ((unsigned short *)rcvBuffer)[0];
+			}
+		}
+		else {
+			cmm_print(DEBUG_STDERR, "ERROR: Unknown keyword %s\n", keywords[cpt]);
+			goto help;
+		}
+
+		return 0;
+	}
+	
+
+help:
+	cmmExptSetPrintHelp();
+	return -1;
+}
+
+
diff --git a/cmm/src/module_expt.h b/cmm/src/module_expt.h
new file mode 100644
index 0000000..d9fa1e7
--- /dev/null
+++ b/cmm/src/module_expt.h
@@ -0,0 +1,28 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_EXPT_H__
+#define __MODULE_EXPT_H__
+
+	void cmmExptShowPrintHelp();
+	int cmmExptShowProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+	void cmmExptSetPrintHelp();
+	int cmmExptSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+
+#endif
diff --git a/cmm/src/module_icc.c b/cmm/src/module_icc.c
new file mode 100644
index 0000000..cee5edc
--- /dev/null
+++ b/cmm/src/module_icc.c
@@ -0,0 +1,560 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+
+#include <net/if.h>
+#include <linux/if_vlan.h>
+#include <linux/sockios.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <ctype.h>
+
+#include "libcmm.h"
+#include "fpp.h"
+#include "cmm.h"
+#include "itf.h"
+#include "module_icc.h"
+
+
+static void print_error(u_int32_t rc)
+{
+	switch (rc)
+	{
+	case FPP_ERR_ICC_TOO_MANY_ENTRIES:
+		cmm_print(DEBUG_ERROR,"Error: Too many entries\n");
+		break;
+	case FPP_ERR_ICC_ENTRY_ALREADY_EXISTS:
+		cmm_print(DEBUG_ERROR,"Error: Entry already exists\n");
+		break;
+	case FPP_ERR_ICC_ENTRY_NOT_FOUND:
+		cmm_print(DEBUG_ERROR,"Error: Entry not found\n");
+		break;
+	case FPP_ERR_ICC_THRESHOLD_OUT_OF_RANGE:
+		cmm_print(DEBUG_ERROR,"Error: Threshold value out of range\n");
+		break;
+	default:
+		cmm_print(DEBUG_ERROR,"Error from CMM, error = `%d'\n", rc);
+		break;
+	}
+}
+
+int IccReset(daemon_handle_t daemon_handle, int argc, char *argv[])
+{
+
+        cmm_command_t           cmd;
+        cmm_response_t          res;
+        fpp_icc_reset_cmd_t 	reset_cmd;
+	
+	if (argc != 0)
+		goto usage;
+		
+	memset(&cmd, 0, sizeof(cmd));
+        memset(&res, 0, sizeof(res));
+	memset(&reset_cmd, 0, sizeof(reset_cmd));
+	
+	cmd.func 	= FPP_CMD_ICC_RESET;
+	cmd.length 	= sizeof(reset_cmd);
+	memcpy(&cmd.buf, &reset_cmd, sizeof(reset_cmd));
+	if (cmm_send(daemon_handle, &cmd, 0) != 0) {
+                cmm_print(DEBUG_ERROR,"Error sending message to CMM, error = `%s'\n", strerror(errno));
+                return -1;
+        }
+
+        if (cmm_recv(daemon_handle, &res, 0) < 0) {
+                cmm_print(DEBUG_ERROR,"Error receiving message from CMM, error = `%s'\n", strerror(errno));
+                return -1;
+        }
+
+        if (res.rc != FPP_ERR_OK) {
+		print_error(res.rc);
+                return -1;
+        }
+	
+        return CLI_OK;
+usage:
+	cmm_print(DEBUG_ERROR, "Usage: icc reset\n");
+        return -1;
+}
+
+int IccThreshold(daemon_handle_t daemon_handle, int argc, char *argv[])
+{
+        cmm_command_t           cmd;
+        cmm_response_t          res;
+        fpp_icc_threshold_cmd_t thresh_cmd;
+	u_int32_t val1, val2;
+
+	if (argc != 2)
+		goto usage;
+
+        memset(&cmd, 0, sizeof(cmd));
+        memset(&res, 0, sizeof(res));
+        memset(&thresh_cmd, 0, sizeof(thresh_cmd));
+
+	if (parse_value(argv[0], &val1, 1024) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "ERROR: Invalid bmu1 threshold: %s\n", argv[0]);
+		goto usage;
+	}
+	if (parse_value(argv[1], &val2, 1024) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "ERROR: Invalid bmu2 threshold: %s\n", argv[1]);
+		goto usage;
+	}
+
+	thresh_cmd.bmu1_threshold = val1;
+	thresh_cmd.bmu2_threshold = val2;
+        
+        cmd.func        = FPP_CMD_ICC_THRESHOLD;
+        cmd.length      = sizeof(fpp_icc_threshold_cmd_t);
+	memcpy(&cmd.buf, &thresh_cmd, sizeof(thresh_cmd));
+
+        if (cmm_send(daemon_handle, &cmd, 0) != 0) {
+                cmm_print(DEBUG_ERROR,"Error sending message to CMM, error = `%s'\n", strerror(errno));
+                return -1;
+        }
+
+        if (cmm_recv(daemon_handle, &res, 0) < 0) {
+                cmm_print(DEBUG_ERROR,"Error receiving message from CMM, error = `%s'\n", strerror(errno));
+                return -1;
+        }
+
+        if (res.rc != FPP_ERR_OK) {
+		print_error(res.rc);
+                return -1;
+        }
+
+        return CLI_OK;
+usage:
+	cmm_print(DEBUG_ERROR, "Usage: icc threshold <bmu1-thresh> <bmu2-thresh>\n");
+        return CLI_OK;
+
+}
+
+static int icc_add_delete(daemon_handle_t daemon_handle, int argc, char *argv[], u_int32_t action)
+{
+	int i;
+        cmm_command_t           cmd;
+        cmm_response_t          res;
+        fpp_icc_add_delete_cmd_t ad_cmd;
+	unsigned short interface;
+	u_int32_t val1, val2;
+	int arg = 2;
+
+	if (argc < 3)
+		goto usage;
+
+        memset(&cmd, 0, sizeof(cmd));
+        memset(&res, 0, sizeof(res));
+        memset(&ad_cmd, 0, sizeof(ad_cmd));
+	ad_cmd.action = action;
+
+	if (parse_icc_interface(argv[0], &interface, ICC_NUM_INTERFACES) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "ERROR: Invalid interface: %s\n", argv[0]);
+		goto usage;
+	}
+	ad_cmd.interface = interface;
+
+	if (strcasecmp(argv[1], "ethertype") == 0)
+	{
+		if (argc != 3)
+			goto usage;
+		ad_cmd.table_type = ICC_TABLETYPE_ETHERTYPE;
+		if (parse_value(argv[2], &val1, 0xffff) < 0)
+		{
+			cmm_print(DEBUG_ERROR, "ERROR: Invalid ethertype: %s\n", argv[2]);
+			goto usage;
+		}
+		ad_cmd.ethertype.type = val1;
+	}
+	else if (strcasecmp(argv[1], "protocol") == 0)
+	{
+		ad_cmd.table_type = ICC_TABLETYPE_PROTOCOL;
+		while (argv[arg])
+		{
+			if (parse_range(argv[arg], &val1, &val2, 255) < 0)
+			{
+				cmm_print(DEBUG_ERROR, "ERROR: Invalid protocol: %s\n", argv[arg]);
+				goto usage;
+			}
+			for (i = val1; i <= val2; i++)
+				setbit_in_array(ad_cmd.protocol.ipproto, i, 1);
+			arg++;
+		}
+	}
+	else if (strcasecmp(argv[1], "dscp") == 0)
+	{
+		ad_cmd.table_type = ICC_TABLETYPE_DSCP;
+		while (argv[arg])
+		{
+			if (parse_range(argv[arg], &val1, &val2, 63) < 0)
+			{
+				cmm_print(DEBUG_ERROR, "ERROR: Invalid dscp value: %s\n", argv[arg]);
+				goto usage;
+			}
+			for (i = val1; i <= val2; i++)
+				setbit_in_array(ad_cmd.dscp.dscp_value, i, 1);
+			arg++;
+		}
+	}
+	else if (strcasecmp(argv[1], "saddr") == 0 || strcasecmp(argv[1], "daddr") == 0)
+	{
+		if (argc > 4)
+			goto usage;
+		ad_cmd.table_type = strcasecmp(argv[1], "saddr") == 0 ? ICC_TABLETYPE_SADDR : ICC_TABLETYPE_DADDR;
+		if (inet_pton(AF_INET, argv[2], &ad_cmd.ipaddr.v4_addr) != 1)
+		{
+			cmm_print(DEBUG_ERROR, "ERROR: Invalid IP address: %s\n", argv[2]);
+			goto usage;
+		}
+		if (argc == 4)
+		{
+			if (parse_value(argv[3], &val1, 32) < 0 || val1 == 0)
+			{
+				cmm_print(DEBUG_ERROR, "ERROR: Invalid mask length: %s\n", argv[3]);
+				goto usage;
+			}
+			ad_cmd.ipaddr.v4_masklen = val1;
+		}
+		else
+		{
+			ad_cmd.ipaddr.v4_masklen = 32;
+		}
+	}
+	else if (strcasecmp(argv[1], "saddr6") == 0 || strcasecmp(argv[1], "daddr6") == 0)
+	{
+		if (argc > 4)
+			goto usage;
+		ad_cmd.table_type = strcasecmp(argv[1], "saddr6") == 0 ? ICC_TABLETYPE_SADDR6 : ICC_TABLETYPE_DADDR6;
+		if (inet_pton(AF_INET6, argv[2], ad_cmd.ipv6addr.v6_addr) != 1)
+		{
+			cmm_print(DEBUG_ERROR, "ERROR: Invalid IPv6 address: %s\n", argv[2]);
+			goto usage;
+		}
+		if (argc == 4)
+		{
+			if (parse_value(argv[3], &val1, 128) < 0 || val1 == 0)
+			{
+				cmm_print(DEBUG_ERROR, "ERROR: Invalid mask length: %s\n", argv[3]);
+				goto usage;
+			}
+			ad_cmd.ipv6addr.v6_masklen = val1;
+		}
+		else
+		{
+			ad_cmd.ipv6addr.v6_masklen = 128;
+		}
+	}
+	else if (strcasecmp(argv[1], "port") == 0)
+	{
+		if (argc != 4)
+			goto usage;
+		ad_cmd.table_type = ICC_TABLETYPE_PORT;
+		if (parse_range(argv[2], &val1, &val2, 0xffff) < 0)
+		{
+			cmm_print(DEBUG_ERROR, "ERROR: Invalid source port: %s\n", argv[2]);
+			goto usage;
+		}
+		ad_cmd.port.sport_from = val1;
+		ad_cmd.port.sport_to = val2;
+		if (parse_range(argv[3], &val1, &val2, 0xffff) < 0)
+		{
+			cmm_print(DEBUG_ERROR, "ERROR: Invalid destination port: %s\n", argv[3]);
+			goto usage;
+		}
+		ad_cmd.port.dport_from = val1;
+		ad_cmd.port.dport_to = val2;
+	}
+	else if (strcasecmp(argv[1], "sport") == 0)
+	{
+		if (argc != 3)
+			goto usage;
+		ad_cmd.table_type = ICC_TABLETYPE_PORT;
+		if (parse_range(argv[2], &val1, &val2, 0xffff) < 0)
+		{
+			cmm_print(DEBUG_ERROR, "ERROR: Invalid source port: %s\n", argv[2]);
+			goto usage;
+		}
+		ad_cmd.port.sport_from = val1;
+		ad_cmd.port.sport_to = val2;
+		ad_cmd.port.dport_from = 0;
+		ad_cmd.port.dport_to = 65535;
+	}
+	else if (strcasecmp(argv[1], "dport") == 0)
+	{
+		if (argc != 3)
+			goto usage;
+		ad_cmd.table_type = ICC_TABLETYPE_PORT;
+		if (parse_range(argv[2], &val1, &val2, 0xffff) < 0)
+		{
+			cmm_print(DEBUG_ERROR, "ERROR: Invalid destination port: %s\n", argv[2]);
+			goto usage;
+		}
+		ad_cmd.port.dport_from = val1;
+		ad_cmd.port.dport_to = val2;
+		ad_cmd.port.sport_from = 0;
+		ad_cmd.port.sport_to = 65535;
+	}
+	else if (strcasecmp(argv[1], "vlan") == 0)
+	{
+		ad_cmd.table_type = ICC_TABLETYPE_VLAN;
+		if (argc > 4)
+			goto usage;
+		if (parse_range(argv[2], &val1, &val2, 8191) < 0)
+		{
+			cmm_print(DEBUG_ERROR, "ERROR: Invalid vlan ID: %s\n", argv[2]);
+			goto usage;
+		}
+		ad_cmd.vlan.vlan_from = val1;
+		ad_cmd.vlan.vlan_to = val2;
+		if (argc == 4)
+		{
+			if (parse_range(argv[3], &val1, &val2, 7) < 0)
+			{
+				cmm_print(DEBUG_ERROR, "ERROR: Invalid vlan priority: %s\n", argv[3]);
+				goto usage;
+			}
+		}
+		else
+		{
+			val1 = 0;
+			val2 = 7;
+		}
+		ad_cmd.vlan.prio_from = val1;
+		ad_cmd.vlan.prio_to = val2;
+	}
+	else
+	{
+		cmm_print(DEBUG_ERROR, "ERROR: Unknown keyword %s\n", argv[1]);
+		goto usage;
+	}
+
+        cmd.func        = FPP_CMD_ICC_ADD_DELETE;
+        cmd.length      = sizeof(fpp_icc_add_delete_cmd_t);
+	memcpy(&cmd.buf, &ad_cmd, sizeof(ad_cmd));
+
+        if (cmm_send(daemon_handle, &cmd, 0) != 0) {
+                cmm_print(DEBUG_ERROR,"Error sending message to CMM, error = `%s'\n", strerror(errno));
+                return -1;
+        }
+
+        if (cmm_recv(daemon_handle, &res, 0) < 0) {
+                cmm_print(DEBUG_ERROR,"Error receiving message from CMM, error = `%s'\n", strerror(errno));
+                return -1;
+        }
+
+        if (res.rc != FPP_ERR_OK) {
+		print_error(res.rc);
+                return -1;
+        }
+
+        return CLI_OK;
+
+usage:
+	cmm_print(DEBUG_ERROR, "Usage: icc [add | delete] <interface>\n"
+					"\t[\n"
+					"\t\t[ethertype <type>] |\n"
+					"\t\t[protocol <proto-1> <proto-2> ...] |\n"
+					"\t\t[dscp <value-1> <value-2> ...] |\n"
+					"\t\t[saddr <addr> [<masklen>]] |\n"
+					"\t\t[daddr <addr> [<masklen>]] |\n"
+					"\t\t[saddr6 <addr> [<masklen>]] |\n"
+					"\t\t[daddr6 <addr> [<masklen>]] |\n"
+					"\t\t[port <srcport> <dstport>] |\n"
+					"\t\t[sport <srcport>] |\n"
+					"\t\t[dport <dstport>] |\n"
+					"\t\t[vlan <id> [<priority>]] |\n"
+					"\t]\n");
+        return CLI_OK;
+}
+
+int IccAdd(daemon_handle_t daemon_handle, int argc, char *argv[])
+{
+	return icc_add_delete(daemon_handle, argc, argv, ICC_ACTION_ADD);
+}
+
+int IccDelete(daemon_handle_t daemon_handle, int argc, char *argv[])
+{
+	return icc_add_delete(daemon_handle, argc, argv, ICC_ACTION_DELETE);
+}
+
+int IccQuery(daemon_handle_t daemon_handle, int argc, char *argv[])
+{
+	int i, j;
+        cmm_command_t           cmd;
+        cmm_response_t          res;
+        fpp_icc_query_cmd_t query_cmd;
+        fpp_icc_query_reply_t *prsp = (fpp_icc_query_reply_t *)&res.buf[0];
+	u_int16_t interface;
+	u_int16_t interface_from, interface_to;
+	u_int16_t action;
+	char buf[1024];
+
+	if (argc > 1)
+		goto usage;
+
+        memset(&cmd, 0, sizeof(cmd));
+        memset(&res, 0, sizeof(res));
+        memset(&query_cmd, 0, sizeof(query_cmd));
+
+	if (argc == 1)
+	{
+		if (parse_icc_interface(argv[0], &interface_from, ICC_NUM_INTERFACES) < 0)
+		{
+			cmm_print(DEBUG_ERROR, "ERROR: Invalid interface: %s\n", argv[0]);
+			goto usage;
+		}
+		interface_to = interface_from;
+	}
+	else
+	{
+		interface_from = 0;
+		interface_to = ICC_NUM_INTERFACES - 1;
+	}
+
+	for (interface = interface_from; interface <= interface_to; interface++)
+	{
+		cmm_print(DEBUG_STDOUT, "ICC interface %d --\n", interface);
+		cmd.func = FPP_CMD_ICC_QUERY;
+		cmd.length = sizeof(fpp_icc_query_cmd_t);
+		action = ICC_ACTION_QUERY;
+		while (1)
+		{
+			query_cmd.action = action;
+			query_cmd.interface = interface;
+			memcpy(&cmd.buf, &query_cmd, sizeof(query_cmd));
+			if (cmm_send(daemon_handle, &cmd, 0) != 0) {
+				cmm_print(DEBUG_ERROR, "Error sending message to CMM, error = `%s'\n", strerror(errno));
+				return -1;
+			}
+			if (cmm_recv(daemon_handle, &res, 0) < 0) {
+				cmm_print(DEBUG_ERROR, "Error receiving message from CMM, error = `%s'\n", strerror(errno));
+				return -1;
+			}
+			if (prsp->query_result != 0 || prsp->interface != interface)
+				break;
+			switch (prsp->table_type)
+			{
+				case ICC_TABLETYPE_ETHERTYPE:
+				{
+					cmm_print(DEBUG_STDOUT, "Ethertype: 0x%04x\n", prsp->ethertype.type);
+					break;
+				}
+				case ICC_TABLETYPE_PROTOCOL:
+				{
+					buf[0] = '\0';
+					for (i = 0; i < 256; i++)
+					{
+						if (!testbit_in_array(prsp->protocol.ipproto, i))
+							continue;
+						j = i + 1;
+						if (j == 256 || !testbit_in_array(prsp->protocol.ipproto, j))
+						{
+							sprintf(buf + strlen(buf), "%d ", i);
+						}
+						else
+						{
+							while (j < 255 && testbit_in_array(prsp->protocol.ipproto, j + 1))
+								j++;
+							sprintf(buf + strlen(buf), "%d-%d ", i, j);
+						}
+						i = j;
+					}
+					cmm_print(DEBUG_STDOUT, "Protocols: %s\n", buf);
+					break;
+				}
+				case ICC_TABLETYPE_DSCP:
+				{
+					buf[0] = '\0';
+					for (i = 0; i < 64; i++)
+					{
+						if (!testbit_in_array(prsp->dscp.dscp_value, i))
+							continue;
+						j = i + 1;
+						if (j == 64 || !testbit_in_array(prsp->dscp.dscp_value, j))
+						{
+							sprintf(buf + strlen(buf), "%d ", i);
+						}
+						else
+						{
+							while (j < 63 && testbit_in_array(prsp->dscp.dscp_value, j + 1))
+								j++;
+							sprintf(buf + strlen(buf), "%d-%d ", i, j);
+						}
+						i = j;
+					}
+					cmm_print(DEBUG_STDOUT, "DSCP values: %s\n", buf);
+					break;
+				}
+				case ICC_TABLETYPE_SADDR:
+				{
+					cmm_print(DEBUG_STDOUT, "IPv4 Source Address: %s/%d\n",
+							inet_ntop(AF_INET, &prsp->ipaddr.v4_addr, buf, sizeof(buf)),
+							prsp->ipaddr.v4_masklen);
+					break;
+				}
+				case ICC_TABLETYPE_DADDR:
+				{
+					cmm_print(DEBUG_STDOUT, "IPv4 Destination Address: %s/%d\n",
+							inet_ntop(AF_INET, &prsp->ipaddr.v4_addr, buf, sizeof(buf)),
+							prsp->ipaddr.v4_masklen);
+					break;
+				}
+				case ICC_TABLETYPE_SADDR6:
+				{
+					cmm_print(DEBUG_STDOUT, "IPv6 Source Address: %s/%d\n",
+							inet_ntop(AF_INET6, prsp->ipv6addr.v6_addr, buf, sizeof(buf)),
+							prsp->ipv6addr.v6_masklen);
+					break;
+				}
+				case ICC_TABLETYPE_DADDR6:
+				{
+					cmm_print(DEBUG_STDOUT, "IPv6 Destination Address: %s/%d\n",
+							inet_ntop(AF_INET6, prsp->ipv6addr.v6_addr, buf, sizeof(buf)),
+							prsp->ipv6addr.v6_masklen);
+					break;
+				}
+				case ICC_TABLETYPE_PORT:
+				{
+					cmm_print(DEBUG_STDOUT, "Ports: Source %d-%d / Destination %d-%d\n",
+							prsp->port.sport_from, prsp->port.sport_to,
+							prsp->port.dport_from, prsp->port.dport_to);
+					break;
+				}
+				case ICC_TABLETYPE_VLAN:
+				{
+					cmm_print(DEBUG_STDOUT, "VLAN: ID %d-%d / Priority %d-%d\n",
+							prsp->vlan.vlan_from, prsp->vlan.vlan_to,
+							prsp->vlan.prio_from, prsp->vlan.prio_to);
+					break;
+				}
+			}
+			action = ICC_ACTION_QUERY_CONT;
+		}
+		cmm_print(DEBUG_STDOUT, "-------------\n\n");
+	}
+
+        return CLI_OK;
+
+usage:
+	cmm_print(DEBUG_ERROR, "Usage: icc query [<interface>]\n");
+        return CLI_OK;
+}
diff --git a/cmm/src/module_icc.h b/cmm/src/module_icc.h
new file mode 100644
index 0000000..980a279
--- /dev/null
+++ b/cmm/src/module_icc.h
@@ -0,0 +1,48 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_ICC_H__
+#define __MODULE_ICC_H__
+#include "fpp.h"
+
+#define ICC_NUM_INTERFACES	3
+
+#define ICC_ACTION_ADD		0
+#define ICC_ACTION_DELETE	1
+
+#define ICC_ACTION_QUERY	0
+#define ICC_ACTION_QUERY_CONT	1
+
+#define	ICC_TABLETYPE_ETHERTYPE	0
+#define	ICC_TABLETYPE_PROTOCOL	1
+#define	ICC_TABLETYPE_DSCP	2
+#define	ICC_TABLETYPE_SADDR	3
+#define	ICC_TABLETYPE_DADDR	4
+#define	ICC_TABLETYPE_SADDR6	5
+#define	ICC_TABLETYPE_DADDR6	6
+#define	ICC_TABLETYPE_PORT	7
+#define	ICC_TABLETYPE_VLAN	8
+
+int IccReset(daemon_handle_t daemon_handle, int argc, char *argv[]);
+int IccThreshold(daemon_handle_t daemon_handle, int argc, char *argv[]);
+int IccAdd(daemon_handle_t daemon_handle, int argc, char *argv[]);
+int IccDelete(daemon_handle_t daemon_handle, int argc, char *argv[]);
+int IccQuery(daemon_handle_t daemon_handle, int argc, char *argv[]);
+
+#endif
diff --git a/cmm/src/module_l2tp.c b/cmm/src/module_l2tp.c
new file mode 100644
index 0000000..99c5489
--- /dev/null
+++ b/cmm/src/module_l2tp.c
@@ -0,0 +1,322 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+#include "cmm.h"
+#include "module_l2tp.h"
+#include "fpp_private.h"
+#include "fpp.h"
+#include "cmmd.h"
+
+int l2tp_itf_add(FCI_CLIENT *fci_handle, int request, struct interface *itf)
+{
+	int rc = CMMD_ERR_NOT_CONFIGURED;
+	fpp_l2tp_itf_add_cmd_t cmd;
+
+	cmm_print(DEBUG_INFO, "%s ifindex(%d)\n", __func__, itf->ifindex);
+
+	if (!__itf_is_up(itf))
+		goto out;
+
+	if (!(itf->flags & USER_ADDED) || (!itf->l2tp.sock)) /* If USER_ADDED l2tp.sock should never be NULL */
+		goto out;
+
+	switch (request)
+	{
+	case ADD:
+		if ((itf->flags & (FPP_PROGRAMMED | FPP_NEEDS_UPDATE)) == FPP_PROGRAMMED) {
+			rc = 0;
+			goto out;
+		}
+
+		if ((itf->flags & (FPP_PROGRAMMED | FPP_NEEDS_UPDATE)) == (FPP_PROGRAMMED | FPP_NEEDS_UPDATE))
+		{
+			cmm_print(DEBUG_ERROR, "%s: trying to update L2TP/PPP interface(%d)\n", __func__, itf->ifindex);
+			goto out;
+		}
+
+		break;
+
+	default:
+		cmm_print(DEBUG_ERROR, "%s: Command not supported\n", __func__);
+		rc = CMMD_ERR_UNKNOWN_COMMAND;
+		goto out;
+		break;
+	}
+
+	memset(&cmd, 0, sizeof(cmd));
+
+	cmd.sock_id = itf->l2tp.sock->id;
+	cmd.local_tun_id = itf->l2tp.local_tun_id;
+	cmd.peer_tun_id = itf->l2tp.peer_tun_id;
+	cmd.local_ses_id = itf->l2tp.local_ses_id;
+	cmd.peer_ses_id = itf->l2tp.peer_ses_id;
+	cmd.options = itf->l2tp.options;
+
+	if (____itf_get_name(itf, cmd.ifname, sizeof(cmd.ifname)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: ____itf_get_name(%d) failed\n", __func__, itf->ifindex);
+		goto out;
+	}
+	cmm_print(DEBUG_COMMAND, "Send FPP_CMD_L2TP_ITF_ADD\n");
+	rc = fci_write(fci_handle, FPP_CMD_L2TP_ITF_ADD, sizeof(cmd), (unsigned short *) &cmd);
+	if (rc == FPP_ERR_OK)
+	{
+		itf->flags |= FPP_PROGRAMMED;
+		itf->flags &= ~FPP_NEEDS_UPDATE;
+	}
+	else
+		cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_L2TP_ITF_ADD\n", __func__, rc);
+
+out:
+	return rc;
+}
+
+int __l2tp_itf_del(FCI_CLIENT *fci_handle, struct interface *itf)
+{
+	fpp_l2tp_itf_del_cmd_t cmd;
+	int rc = FPP_ERR_OK;
+
+	if (!(itf->flags & FPP_PROGRAMMED))
+		goto out;
+
+	memset(&cmd, 0, sizeof(cmd));
+
+	if (____itf_get_name(itf, cmd.ifname, sizeof(cmd.ifname)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: ____itf_get_name(%d) failed\n", __func__, itf->ifindex);
+		goto out;
+	}
+	cmm_print(DEBUG_COMMAND, "Send FPP_CMD_L2TP_ITF_DEL\n");
+	rc = fci_write(fci_handle, FPP_CMD_L2TP_ITF_DEL, sizeof(cmd), (unsigned short *) &cmd);
+	if (rc == FPP_ERR_OK)
+	{
+		itf->flags &= ~FPP_PROGRAMMED;
+		itf->flags &= ~FPP_NEEDS_UPDATE;
+	}
+	else
+		cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_L2TP_ITF_DEL\n", __func__, rc);
+
+out:
+	return rc;
+}
+
+int l2tp_itf_del(FCI_CLIENT *fci_handle, struct interface *itf)
+{
+	int rc;
+	struct socket *s;
+
+	s = itf->l2tp.sock;
+
+	rc = __l2tp_itf_del(fci_handle, itf);
+
+	if(itf->l2tp.sock)
+	{
+		__socket_close(fci_handle,itf_table.fci_key_handle,s);
+		itf->l2tp.sock =NULL;
+		itf->flags &=~USER_ADDED;
+		itf->itf_flags &= ~ITF_L2TP;
+	}
+	return rc;
+}
+
+int l2tp_new_session(FCI_CLIENT *fci_handle, cmmd_l2tp_session_t *cmd, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	int ifindex;
+	struct interface *itf;
+	int rc = 0;
+	struct socket *s = NULL;
+
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+	__pthread_mutex_lock(&socket_lock);
+
+	ifindex = if_nametoindex(cmd->itf_name);
+
+	itf = __itf_get(ifindex);
+	if (!itf)
+	{
+		cmm_print(DEBUG_ERROR, "%s: interface %s not found\n", __func__, cmd->itf_name);
+		res_buf[0] = CMMD_ERR_NOT_FOUND;
+		goto err;
+	}
+	if (itf->flags & FPP_PROGRAMMED)
+	{
+		cmm_print(DEBUG_ERROR, "%s: interface %s is already offloaded to PFE\n", __func__, cmd->itf_name);
+		res_buf[0] = CMMD_ERR_DUPLICATE;
+		goto err;
+	}
+	else if(itf->l2tp.sock) /* This should not happen */
+	{
+		/* Close stale socket */		
+		rc = __socket_close(fci_handle,itf_table.fci_key_handle,s);
+
+		if(rc == CMMD_ERR_OK)
+		{
+			itf->l2tp.sock =NULL;
+			itf->flags &=~USER_ADDED;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "%s: Stale Socket ID %d could not be closed\n", __func__,s->id);
+			res_buf[0] = rc; /* Should we ignore this error and continue ?*/
+			goto err;
+		}
+	}
+
+	itf->itf_flags |= ITF_L2TP;
+	itf->l2tp.local_ses_id = cmd->local_ses_id;
+	itf->l2tp.peer_ses_id = cmd->peer_ses_id;
+	itf->l2tp.local_tun_id = cmd->local_tun_id;
+	itf->l2tp.peer_tun_id = cmd->peer_tun_id;
+
+	s = socket_find_by_addr(cmd->family, cmd->peer_addr, cmd->local_addr, cmd->peer_port, cmd->local_port, IPPROTO_UDP);
+	if (!s)	{
+
+		s = malloc(sizeof(struct socket));
+
+		if (!s)	{
+			cmm_print(DEBUG_ERROR, "%s: malloc() failed\n", __func__);
+			goto err;
+		}
+
+		memset(s, 0, sizeof(struct socket));
+		s->family = cmd->family;
+		s->id = new_socket_id();
+		if(!s->id)
+		{
+			cmm_print(DEBUG_ERROR, "%s: No Socket ID available \n", __func__);
+			res_buf[0] = CMMD_ERR_SOCKID_ALREADY_USED;
+			goto err;
+		}
+		s->type = CMMD_SOCKET_TYPE_L2TP;
+		s->mode = SOCKET_CONNECTED;
+		memcpy(s->saddr, cmd->peer_addr, IPADDRLEN(s->family));
+		memcpy(s->daddr, cmd->local_addr, IPADDRLEN(s->family));
+		s->sport = cmd->peer_port;
+		s->dport = cmd->local_port;
+		s->proto = IPPROTO_UDP;
+		s->dscp = cmd->dscp;
+		s->fwmark = cmd->fwmark;
+		s->queue = cmd->queue;
+		__socket_add(s);
+	}
+	else {
+	/*
+ 	 * TODO
+ 	 * In theory we could have multiple L2TP interfaces / sessions on the same socket
+	 * Not likely in CPE...
+ 	 * Would need ref_count on L2TP socket
+	 * 
+ 	 */
+		res_buf[0] = CMMD_ERR_DUPLICATE;
+		cmm_print(DEBUG_ERROR, "%s: can't offload this L2TP session (%s), it uses the same socket\n", __func__, cmd->itf_name);
+	}
+
+	itf->l2tp.sock = s;
+	itf->flags |= USER_ADDED;
+
+	rc = l2tp_itf_add(fci_handle, ADD, itf);
+	if(rc != CMMD_ERR_OK) {
+		itf->flags &= ~USER_ADDED;
+		goto err;
+	}
+
+	rc = __socket_open(fci_handle, s);
+	if(rc != CMMD_ERR_OK) {
+		l2tp_itf_del(fci_handle, itf);
+		goto err;
+	}
+
+	if (rc >= 0) {
+		res_buf[0] = rc;
+		rc = 0;
+	}
+err:
+	__pthread_mutex_unlock(&socket_lock);
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	*res_len = 2;
+	return rc;
+}
+
+
+int l2tp_delete_session(FCI_CLIENT *fci_handle, cmmd_l2tp_session_t *cmd, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	int rc = 0;
+	struct interface *itf;
+	int ifindex;
+
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+	__pthread_mutex_lock(&socket_lock);
+
+
+	ifindex = if_nametoindex(cmd->itf_name);
+
+	itf = __itf_get(ifindex);
+	if (!itf)
+	{
+		cmm_print(DEBUG_ERROR, "%s: interface %s not found\n", __func__, cmd->itf_name);
+		rc = CMMD_ERR_NOT_FOUND;
+		goto err;
+	}
+
+	if (__itf_is_l2tp(itf))
+		rc = l2tp_itf_del(itf_table.fci_handle, itf);
+err:
+	__pthread_mutex_unlock(&socket_lock);
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	res_buf[0] = rc;
+	*res_len = 2;
+
+	return rc;
+}
+
+
+int l2tp_daemon(FCI_CLIENT *fci_handle,int command, cmmd_l2tp_session_t *cmd,  u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	int rc = 0; 
+	
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	res_buf[0] = CMMD_ERR_WRONG_COMMAND_SIZE;
+
+	*res_len = 2;
+
+	if (cmd_len < sizeof(*cmd))
+	{
+		cmm_print(DEBUG_ERROR, "%s: l2tp session command size too small(%d, %d)\n", __func__, cmd_len, sizeof(*cmd));
+		return rc;
+	}
+	if(command == CMMD_CMD_L2TP_SESSION_CREATE)
+		return l2tp_new_session(fci_handle, cmd, res_buf, res_len);
+	else if(command == CMMD_CMD_L2TP_SESSION_DESTROY)
+		return l2tp_delete_session(fci_handle, cmd, res_buf, res_len);
+}
+
diff --git a/cmm/src/module_l2tp.h b/cmm/src/module_l2tp.h
new file mode 100644
index 0000000..9fdd63d
--- /dev/null
+++ b/cmm/src/module_l2tp.h
@@ -0,0 +1,28 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_L2TP_H__
+#define __MODULE_L2TP_H__
+
+
+int l2tp_itf_add(FCI_CLIENT *fci_handle, int request, struct interface *itf);
+int l2tp_itf_del(FCI_CLIENT *fci_handle, struct interface *itf);
+int l2tp_daemon(FCI_CLIENT *fci_handle,int command, cmmd_l2tp_session_t *cmd,  u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len);
+
+#endif
diff --git a/cmm/src/module_macvlan.c b/cmm/src/module_macvlan.c
new file mode 100755
index 0000000..3e15d8a
--- /dev/null
+++ b/cmm/src/module_macvlan.c
@@ -0,0 +1,255 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+#include "cmm.h"
+#include "itf.h"
+#include "fpp.h"
+#include "cmmd.h"
+#include <string.h>
+
+#if 0
+#include <linux/sockios.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#endif
+#include <net/if_arp.h>
+
+#if 0
+static int macvlan_get_phys_interface(struct interface *itf, struct interface **phy_itf)
+{
+	struct interface *pitf = itf;
+
+	while(1) {
+		if (pitf->ifindex == pitf->phys_ifindex) {
+			if (phy_itf != NULL)
+				*phy_itf = pitf;
+			return pitf->ifindex;
+		}
+
+		pitf = __itf_get(pitf->phys_ifindex);
+		if (pitf == NULL)
+			break;
+	}
+
+	return -1;
+}
+#endif
+
+/*********************************************************************
+ * __cmmGetMacVlan:
+ *
+ ********************************************************************/
+void __cmmGetMacVlan(int fd, struct interface *itf, unsigned char *pInfoKind )
+{
+	itf->itf_flags &= ~ITF_MACVLAN;
+
+	if ( ! strncmp( (const char *)pInfoKind, INFO_KIND_MACVLAN_STR, INFO_KIND_MACVLAN_STR_LEN ) )
+	{
+	  itf->itf_flags |= ITF_MACVLAN;
+	}
+#if 0
+	if (!__itf_is_tunnel(itf) && 
+            !__itf_is_vlan(itf) &&
+	    !__itf_is_bridge(itf->ifindex) &&
+	    itf->type == ARPHRD_ETHER &&
+	    itf->phys_ifindex &&
+	    itf->phys_ifindex != itf->ifindex )
+	{
+          int ifindex ;
+	  ifindex = macvlan_get_phys_interface(itf, NULL);
+	  if ( ( ifindex == WAN_IFINDEX ) || ( ifindex == LAN_IFINDEX ) )
+	  {
+		itf->itf_flags |= ITF_MACVLAN;
+	  }
+	}
+#endif
+}
+
+/*****************************************************************
+* cmmFeMacVlanUpdate
+*
+*****************************************************************/
+int cmmFeMacVlanUpdate(FCI_CLIENT *fci_handle, int fd, int request, 
+				struct interface *itf)
+{
+	fpp_macvlan_cmd_t cmd;
+	short ret;
+	int action;
+
+	switch (request)
+	{
+	default:
+	case ADD:
+		if ((itf->flags & FPP_PROGRAMMED) == FPP_PROGRAMMED)
+			goto out;
+
+		action = FPP_ACTION_REGISTER;
+		break;
+	case REMOVE:
+		if (!(itf->flags & FPP_PROGRAMMED))
+			goto out;
+
+		action = FPP_ACTION_DEREGISTER;
+		break;
+	}
+
+	memset(&cmd, 0, sizeof(cmd));
+	cmd.action = action;
+	if (____itf_get_name(itf, cmd.macvlan_ifname, sizeof(cmd.macvlan_ifname)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: ____itf_get_name(%d) failed\n", __func__, itf->ifindex);
+
+		goto err;
+	}
+
+	/* Get parent interface name */
+	if (__itf_get_name(itf->phys_ifindex , cmd.macvlan_phy_ifname, sizeof(cmd.macvlan_phy_ifname)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: __itf_get_name(%d) failed\n", __func__, itf->phys_ifindex);
+
+		goto err;
+	}
+
+	memcpy(cmd.macaddr, itf->macaddr, itf->macaddr_len);
+	switch (action)
+	{
+	case FPP_ACTION_REGISTER:
+		cmm_print(DEBUG_COMMAND, "Send FPP_CMD_MACVLAN_ENTRY FPP_ACTION_REGISTER\n");
+
+		ret = fci_write(fci_handle, FPP_CMD_MACVLAN_ENTRY, sizeof(fpp_macvlan_cmd_t), (unsigned short *) &cmd);
+		if ((ret == FPP_ERR_OK) || (ret == FPP_ERR_MACVLAN_ENTRY_ALREADY_REGISTERED))
+		{
+			cmm_print(DEBUG_COMMAND, "Send FPP_CMD_MACVLAN_ENTRY FPP_ACTION_REGISTER: success\n");
+			itf->flags |= FPP_PROGRAMMED;
+			//itf->flags &= ~FPP_NEEDS_UPDATE; FIXME
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "%s: Error %d while sending FPP_CMD_MACVLAN_ENTRY, FPP_ACTION_REGISTER\n", __func__, ret);
+			goto err;
+		}
+		break;
+	case FPP_ACTION_DEREGISTER:
+	
+		cmm_print(DEBUG_COMMAND, "Send FPP_CMD_MACVLAN_ENTRY FPP_ACTION_DEREGISTER\n");
+
+		ret = fci_write(fci_handle, FPP_CMD_MACVLAN_ENTRY, sizeof(fpp_macvlan_cmd_t), (unsigned short *) &cmd);
+		if ((ret == FPP_ERR_OK) || (ret == FPP_ERR_MACVLAN_ENTRY_NOT_FOUND))
+		{
+			cmm_print(DEBUG_COMMAND, "Send FPP_CMD_MACVLAN_ENTRY FPP_ACTION_DEREGISTER: success\n");
+			itf->flags &= ~FPP_PROGRAMMED;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "%s: Error %d while sending FPP_CMD_MACVLAN_ENTRY, FPP_ACTION_DEREGISTER\n", __func__, ret);
+			goto err;
+		}
+		break;
+
+	default:
+		cmm_print(DEBUG_ERROR, "%s: unknown FPP_CMD_MACVLAN_ENTRY action %x\n", __func__, action);
+		break;
+	}
+out:
+	return 0;
+
+err:
+	return -1;
+}
+
+/*******************************************************************
+ * cmmMacVlanQuery
+ * 
+ *******************************************************************/
+int cmmMacVlanQueryProcess(char **keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+        int rcvBytes = 0;
+        char rcvBuffer[256];
+        short rc;
+        int count = 0;
+        cmmd_macvlan_cmd_t* pMacVlanCmd = (cmmd_macvlan_cmd_t *) rcvBuffer;
+
+        pMacVlanCmd->action = CMMD_ACTION_QUERY;
+        rcvBytes = cmmSendToDaemon(daemon_handle, CMMD_CMD_MACVLAN_ENTRY, pMacVlanCmd,
+                                  sizeof(cmmd_macvlan_cmd_t) , rcvBuffer);
+
+        if (rcvBytes < (int)sizeof(cmmd_macvlan_cmd_t) ) {
+                rc = (rcvBytes < sizeof(unsigned short) ) ? 0 :
+                                               *((unsigned short *) rcvBuffer);
+                if (rc == CMMD_ERR_UNKNOWN_ACTION) {
+                    cmm_print(DEBUG_STDERR,
+                         "ERROR: FPP MACVLAN does not support CMMD_ACTION_QUERY\n");
+                } else if (rc == CMMD_ERR_MACVLAN_ENTRY_NOT_FOUND) {
+                    cmm_print(DEBUG_STDERR, "ERROR: FPP MACVLAN table empty\n");
+                } else {
+                    cmm_print(DEBUG_STDERR,
+                            "ERROR: Unexpected result returned from FPP rc:%d\n", rc);
+                }
+                return CLI_OK;
+            }
+            cmm_print(DEBUG_STDOUT, "MACVLAN interfaces:\n");
+            do {
+                        cmm_print(DEBUG_STDOUT, "Interface: %s, Physical Interface: %s HWaddr: %02x:%02x:%02x:%02x:%02x:%02x \n", pMacVlanCmd->macvlan_ifname, pMacVlanCmd->macvlan_phy_ifname,
+                        pMacVlanCmd->macaddr[0],pMacVlanCmd->macaddr[1],
+                        pMacVlanCmd->macaddr[2],pMacVlanCmd->macaddr[3],
+                        pMacVlanCmd->macaddr[4],pMacVlanCmd->macaddr[5]);
+                        count++;
+                        pMacVlanCmd->action = CMMD_ACTION_QUERY_CONT;
+                        rcvBytes = cmmSendToDaemon(daemon_handle, CMMD_CMD_MACVLAN_ENTRY, pMacVlanCmd,
+                                           sizeof(cmmd_macvlan_cmd_t) , rcvBuffer);
+           }while (rcvBytes >= sizeof(cmmd_macvlan_cmd_t) );
+           cmm_print(DEBUG_STDOUT, "Total MACVLAN Entries:%d\n", count);
+
+        return CLI_OK;
+}
+
+/*****************************************************************
+* cmmMacVlanLocalShow
+*
+*
+******************************************************************/
+int cmmMacVlanLocalShow(struct cli_def *cli, char *command, char *argv[], int argc)
+{
+	struct list_head *entry;
+	struct interface *itf;
+	char ifname[IFNAMSIZ], phys_ifname[IFNAMSIZ];
+	int i;
+
+	cli_print(cli,"MACVLAN Interfaces:"); 
+	for (i = 0; i < ITF_HASH_TABLE_SIZE; i++)
+	{
+		__pthread_mutex_lock(&itf_table.lock);
+
+		for (entry = list_first(&itf_table.hash[i]); entry != &itf_table.hash[i]; entry = list_next(entry))
+		{
+			itf = container_of(entry, struct interface, list);
+
+			if (!__itf_is_macvlan(itf))
+				continue;
+
+			cli_print(cli, "Interface: %s, Physical Interface: %s, HWaddr: %02x:%02x:%02x:%02x:%02x:%02x, %s", if_indextoname(itf->ifindex, ifname), if_indextoname(itf->phys_ifindex, phys_ifname), itf->macaddr[0], itf->macaddr[1], itf->macaddr[2], itf->macaddr[3], itf->macaddr[4], itf->macaddr[5], (__itf_is_up(itf)?"UP":"DOWN"));
+		}
+
+		__pthread_mutex_unlock(&itf_table.lock);
+	}
+
+	return CLI_OK;
+}
diff --git a/cmm/src/module_macvlan.h b/cmm/src/module_macvlan.h
new file mode 100755
index 0000000..f1cd82a
--- /dev/null
+++ b/cmm/src/module_macvlan.h
@@ -0,0 +1,31 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_MACVLAN_H__
+#define __MODULE_MACVLAN_H__
+
+#include "itf.h"
+
+void __cmmGetMacVlan(int fd, struct interface *itf, unsigned char *pInfoKind);
+int cmmFeMacVlanUpdate(FCI_CLIENT *fci_handle,int fd, int request, struct interface *itf);
+int cmmMacVlanQueryProcess(char **keywords, int tabStart, daemon_handle_t daemon_handle);
+int cmmMacVlanLocalShow(struct cli_def *cli, char *command, char *argv[], int argc);
+
+#endif
+
diff --git a/cmm/src/module_mc4.c b/cmm/src/module_mc4.c
new file mode 100755
index 0000000..5d8182f
--- /dev/null
+++ b/cmm/src/module_mc4.c
@@ -0,0 +1,506 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+#include <net/if.h>
+
+#include "cmm.h"
+#include "cmmd.h"
+
+#define MC4_MAX_LISTENERS_IN_QUERY    5
+extern int cmmMcParseListener(char ** keywords, int *cpt, cmmd_mc6_listener_t * listener, u_int8_t * mode, u_int16_t action );
+extern pthread_mutex_t mc_lock;
+
+int cmmMc4Show(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	int count = 0, ii, jj;
+	struct list_head *entry;
+	struct mcast_entry *mc;
+        char buf1[INET_ADDRSTRLEN];
+        char buf2[INET_ADDRSTRLEN];
+
+	__pthread_mutex_lock(&mc_lock);
+	
+	for( ii = 0; ii < MC_NUM_HASH_ENTRIES; ii++ )
+	{
+		for (entry = list_first(&mc_table[ii]); entry != &mc_table[ii]; entry = list_next(entry))
+		{
+			mc = container_of(entry, struct mcast_entry, list);
+			
+			if( mc->family != AF_INET )
+				continue;
+			
+                	cmm_print(DEBUG_STDOUT, "%04d: Src addr: %s  src_mask_len: %x   Dst addr: %s  Queue : %d\n",
+			  count,
+			  inet_ntop(AF_INET, &mc->src_addr, buf1, INET_ADDRSTRLEN),
+			  mc->src_mask_len,
+			  inet_ntop(AF_INET, &mc->dst_addr, buf2, INET_ADDRSTRLEN),
+                          mc->queue); 
+			for( jj = 0; jj < mc->num_output; jj++) 	
+			{
+				cmm_print(DEBUG_STDOUT," PROGRAMMED : %02d TIMER : 0x%x   SHAPER : 0x%x  Interface %s\n",mc->l_program[jj],
+					mc->listener[jj].timer,mc->listener[jj].shaper_mask , mc->listener[jj].output_device_str);
+				if(mc->listener[jj].q_bit)
+					cmm_print(DEBUG_STDOUT," QUEUE : 0x%x  \n",mc->listener[jj].queue );
+				if(mc->listener[jj].uc_bit)
+					cmm_print(DEBUG_STDOUT,"UC MAC is %02x:%02x:%02x:%02x:%02x:%02x  ",mc->listener[jj].uc_mac[0],mc->listener[jj].uc_mac[1],mc->listener[jj].uc_mac[2],mc->listener[jj].uc_mac[3],mc->listener[jj].uc_mac[4],mc->listener[jj].uc_mac[5]);
+			}	
+
+			
+			count++;	
+				
+		}
+	}  
+        cmm_print(DEBUG_STDOUT, "Total Multicast v4 Entries: %d\n", count);
+	__pthread_mutex_unlock(&mc_lock);
+	
+	return 0;
+}
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+void cmmMc4ShowPrintHelp()
+{
+	cmm_print(DEBUG_STDOUT, "show mc4 not yet supported\n");
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+int cmmMc4ShowProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	
+//help:
+	cmmMc4ShowPrintHelp();
+	return -1;
+}
+/************************************************************
+ *
+ *
+ *
+ *************************************************************/
+int cmmMc4QueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+        int rcvBytes = 0;
+        char rcvBuffer[256];
+        char buf1[INET_ADDRSTRLEN];
+        char buf2[INET_ADDRSTRLEN];
+	char output_buf[256];
+        short rc;
+        int count = 0,len=0;
+        cmmd_mc4_entry_t *mc4_entry = (cmmd_mc4_entry_t *) rcvBuffer;
+	cmmd_mc4_listener_t* mc4_listener = (cmmd_mc4_listener_t *)(rcvBuffer + sizeof (cmmd_mc4_entry_t)); 
+
+        mc4_entry->action = CMMD_ACTION_QUERY;
+        rcvBytes = cmmSendToDaemon(daemon_handle,CMMD_CMD_MC4_MULTICAST , 
+                  mc4_entry, sizeof(cmmd_mc4_entry_t)+ MC4_MAX_LISTENERS_IN_QUERY * sizeof(cmmd_mc4_listener_t) , rcvBuffer);
+
+        if (rcvBytes < sizeof(cmmd_mc4_entry_t) + sizeof (cmmd_mc4_listener_t) + sizeof(unsigned short)) {
+                rc = (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer);
+                if (rc == CMMD_ERR_UNKNOWN_ACTION) {
+                    cmm_print(DEBUG_STDERR, "ERROR: FPP CMD_MC4_MULTICAST does not support ACTION_QUERY\n");
+                } else if (rc == CMMD_ERR_MC_ENTRY_NOT_FOUND) {
+                    cmm_print(DEBUG_STDERR, "ERROR: FPP Multicast IPV4 table empty\n");
+                } else {
+                    cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%d\n", rc);
+                }
+                return CLI_OK;
+            }
+            cmm_print(DEBUG_STDOUT, "IPv4 Multicast Entries: \n");
+            do {
+        	int i, listener_count = 0;
+		if((ntohl(mc4_entry->dst_addr) & 0xE0000000) == 0xE0000000)
+		{
+                	cmm_print(DEBUG_STDOUT, "%04d: Src addr: %s  src_mask_len: %x   Dst addr: %s	Queue: 0x%x  \n\n",
+			  count,
+			  inet_ntop(AF_INET, &mc4_entry->src_addr, buf1, INET_ADDRSTRLEN),
+			  mc4_entry->src_mask_len,
+			  inet_ntop(AF_INET, &mc4_entry->dst_addr, buf2, INET_ADDRSTRLEN),
+			  mc4_entry->queue);
+			count++;
+		}
+		listener_count = mc4_entry->num_output;
+		if(listener_count > MC4_MAX_LISTENERS_IN_QUERY)
+                {
+                        cmm_print(DEBUG_STDOUT,"output interfaces are more than %d",MC4_MAX_LISTENERS_IN_QUERY);
+                        listener_count = MC4_MAX_LISTENERS_IN_QUERY;
+                }
+
+                for ( i = 0; i < listener_count; i++)
+		{
+	            len += sprintf(output_buf + len, "output interface:  ");
+                    len += sprintf(output_buf + len, "%s  ", mc4_listener[i].output_device_str);
+		    cmm_print (DEBUG_STDOUT,output_buf);
+                    if(mc4_listener[i].uc_bit)
+                           cmm_print(DEBUG_STDOUT,"UC MAC is %02x:%02x:%02x:%02x:%02x:%02x  ",mc4_listener[i].uc_mac[0],mc4_listener[i].uc_mac[1],mc4_listener[i].uc_mac[2],mc4_listener[i].uc_mac[3],mc4_listener[i].uc_mac[4],mc4_listener[i].uc_mac[5]);
+                   cmm_print(DEBUG_STDOUT," TIMER : 0x%x   SHAPER : 0x%x   QUEUE : 0x%x\n",mc4_listener[i].timer,mc4_listener[i].shaper_mask, mc4_listener[i].queue);
+                   len = 0;
+		}
+
+                mc4_entry->action = CMMD_ACTION_QUERY_CONT;
+                rcvBytes = cmmSendToDaemon(daemon_handle, CMMD_CMD_MC4_MULTICAST, mc4_entry, 
+                                          sizeof(cmmd_mc4_entry_t)+ 4* sizeof(cmmd_mc4_listener_t), rcvBuffer);
+            } while (rcvBytes >= sizeof(cmmd_mc4_entry_t)+ sizeof(cmmd_mc4_listener_t) + sizeof(unsigned short));
+            cmm_print(DEBUG_STDOUT, "Total Multicast Entries: %d\n", count);
+
+        return CLI_OK;
+
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+void cmmMc4SetPrintHelp()
+{
+#ifdef COMCERTO_2000
+	cmm_print(DEBUG_STDOUT, "Usage: set mc4 interface {if_name} {add | del | update}\n"
+									"                 group {bit_mask} {ipv4_src_addr} {ipv4_multicast_dst_addr}\n"
+									"                 [timer {timer_value}]\n"
+									"                 [mode {bridged | routed}]\n"
+									"                 [queue {0..19}]\n"
+									"                 [listener [timer {timer_value1}] [shapers {0..0xFF}][mc | uc {Mac addr1} ] [queue {0..19}] [if {if_name}]] \n"
+									"                 [listener [timer {timer_value2}] [shapers {0..0xFF}][mc | uc {Mac addr2} ] [queue {0..19}] [if {if_name}]] ...\n"
+									"                 [listener [timer {timer_valuen}] [shapers {0..0xFF}][mc | uc {Mac addrn} ] [queue {0..19}] [if {if_name}]] \n");
+#else
+	cmm_print(DEBUG_STDOUT, "Usage: set mc4 interface {if_name} {add | del | update}\n"
+									"                 group {bit_mask} {ipv4_src_addr} {ipv4_multicast_dst_addr}\n"
+									"                 [timer {timer_value}]\n"
+									"                 [mode {bridged | routed}]\n"
+									"                 [queue {0..31}]\n"
+									"                 [listener [timer {timer_value1}] [shapers {0..0xFF}][mc | uc {Mac addr1} ] [queue {0..31}] [if {if_name}]] \n"
+									"                 [listener [timer {timer_value2}] [shapers {0..0xFF}][mc | uc {Mac addr2} ] [queue {0..31}] [if {if_name}]] ...\n"
+									"                 [listener [timer {timer_valuen}] [shapers {0..0xFF}][mc | uc {Mac addrn} ] [queue {0..31}] [if {if_name}]] \n");
+
+#endif									
+}
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+int cmmMc4SetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	unsigned int tmp;
+	char * endptr;
+	
+	char sndBuffer[256];
+	char rcvBuffer[256];
+	cmmd_mc4_entry_t * entryCmd = (cmmd_mc4_entry_t *) sndBuffer;
+	cmmd_mc4_listener_t * listener = (cmmd_mc4_listener_t *) (sndBuffer + sizeof(cmmd_mc4_entry_t));
+	char interfaceName[11] = {};
+	int listenerCnt = 0;
+	u_int8_t mode = 0;
+	int rc = 0;
+
+	memset(sndBuffer, 0, sizeof(sndBuffer));
+	listener->timer = 0xFFFFFFFF;
+	listener->q_bit = 0;
+	listener->uc_bit = 0; // Multicast by default when a new entry is added
+	listener->Ifbit = 0;
+
+
+	if(!keywords[cpt])
+		goto help;
+
+	if(strcasecmp(keywords[cpt], "interface") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+
+		if (strlen(keywords[cpt]) > 10) {
+			cmm_print(DEBUG_STDERR, "Error : interface name %s limited to 10 characters\n", keywords[cpt]);
+			goto help;
+		}
+		strcpy(interfaceName, keywords[cpt]);
+		strcpy(listener->output_device_str,interfaceName);
+	}
+	else if(strcasecmp(keywords[cpt], "reset") == 0)
+	{
+		/*Reset, special case*/
+		if(cmmSendToDaemon(daemon_handle, CMMD_CMD_MC4_RESET, NULL, 0, rcvBuffer) == 2)
+		{
+			if ( ((unsigned short *)rcvBuffer)[0] != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_MC4_RESET\n", ((unsigned short *)rcvBuffer)[0]);
+		}
+		return ((unsigned short *)rcvBuffer)[0];
+	}
+	else
+		goto keyword_error;
+
+	if(!keywords[++cpt])
+		goto help;
+	
+	if(strcasecmp(keywords[cpt], "add") == 0)
+	{		
+		entryCmd->action = CMMD_MC_ACTION_ADD;
+	}
+	else if(strcasecmp(keywords[cpt], "del") == 0)
+	{
+		entryCmd->action = CMMD_MC_ACTION_REMOVE;
+	}
+	else if(strcasecmp(keywords[cpt], "update") == 0)
+	{
+		entryCmd->action = CMMD_MC_ACTION_UPDATE;
+	}
+	else
+		goto keyword_error;
+
+	if(!keywords[++cpt])
+		goto help;
+
+	if (strcasecmp(keywords[cpt], "group") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+		
+		/*Get an integer from the string for the MASK*/
+		endptr = NULL;
+		tmp = strtoul(keywords[cpt], &endptr, 0);
+		entryCmd->src_mask_len = tmp;
+
+		if(!keywords[++cpt])
+			goto help;
+
+		/*Get an integer from the string for the IPsrc*/
+		if(inet_pton(AF_INET, keywords[cpt], &entryCmd->src_addr) != 1)
+			goto help;
+
+		if(!keywords[++cpt])
+			goto help;
+
+		/*Get an integer from the string for the IPdst*/
+		if(inet_pton(AF_INET, keywords[cpt], &entryCmd->dst_addr) != 1)
+			goto help;
+	}
+	++cpt;
+
+	while(keywords[cpt])
+	{
+		strcpy(((cmmd_mc4_listener_t *)listener + listenerCnt)->output_device_str,interfaceName);
+		if (strncasecmp(keywords[cpt], "listener",strlen(keywords[cpt])) == 0) //May be a case of multiple listeners, parse differently
+		{
+			++cpt;
+			if(!cmmMcParseListener(keywords, &cpt, listener + listenerCnt, &mode, entryCmd->action))
+			{
+				if(++listenerCnt ==  MC4_MAX_LISTENERS_IN_QUERY)
+					//Send first batch to FPP and reset listener count
+				{
+
+					entryCmd->num_output = listenerCnt;
+					if(cmmSendToDaemon(daemon_handle, CMMD_CMD_MC4_MULTICAST, sndBuffer, sizeof(cmmd_mc4_entry_t) + (listenerCnt * sizeof(cmmd_mc4_listener_t)), rcvBuffer) == 2)
+					{
+						if ( (rc = ((unsigned short *)rcvBuffer)[0]) != 0)
+						{
+							if(rc == CMMD_ERR_NOT_CONFIGURED)
+								cmm_print(DEBUG_STDERR, "%d Interface not yet up in FPP, will be configured when interface comes up\n", rc);
+							else if(rc == CMMD_ERR_MC_MAX_LISTENERS)
+								cmm_print(DEBUG_STDERR, "Error %d MAX listeners for the group exhausted\n", rc);
+							else if(rc == CMMD_ERR_MC_INTERFACE_NOT_ALLOWED)
+								cmm_print(DEBUG_STDERR, "Error %d Interface configured cannot support Unicast MAC\n", rc);
+							else if(rc == CMMD_ERR_MC_ENTRY_OVERLAP)
+							{
+								cmm_print(DEBUG_STDERR, "Error %d Overlapping entry configured\n", rc);
+								entryCmd->action = CMMD_MC_ACTION_REMOVE_LOCAL;
+								cmmSendToDaemon(daemon_handle, CMMD_CMD_MC4_MULTICAST, sndBuffer, 
+								sizeof(cmmd_mc4_entry_t) +  (listenerCnt * sizeof(cmmd_mc4_listener_t)), rcvBuffer);	
+							}
+							else
+								cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_MC6_MULTICAST\n", rc);
+						}
+
+					}
+					listenerCnt = 0;
+					memset(sndBuffer + sizeof(cmmd_mc4_entry_t), 0 , sizeof(sndBuffer) - sizeof(cmmd_mc4_entry_t));
+				}
+			}
+			else
+				goto help;
+		}
+		else
+		{
+			if(!cmmMcParseListener(keywords, &cpt, listener, &mode, entryCmd->action))
+			{
+				listener->q_bit = 0; // Default config listener q_bit is always zero.
+				entryCmd->queue = listener->queue;
+				entryCmd->mode = mode;
+			}
+			else
+				goto help;
+		}
+	}
+	if(!listenerCnt & !entryCmd->num_output)
+		listenerCnt = 1; //fall back to legacy design, single listener is configured.
+
+	entryCmd->num_output = listenerCnt;
+
+	if(listenerCnt && (cmmSendToDaemon(daemon_handle, CMMD_CMD_MC4_MULTICAST, sndBuffer, sizeof(cmmd_mc4_entry_t) + (listenerCnt * sizeof(cmmd_mc4_listener_t)), rcvBuffer) == 2))
+	{
+		if ( (rc = ((unsigned short *)rcvBuffer)[0]) != 0)
+		{
+			if(rc == CMMD_ERR_NOT_CONFIGURED)
+				cmm_print(DEBUG_STDERR, "%d Interface not yet up in FPP, will be configured when interface comes up\n", rc);
+			else if(rc == CMMD_ERR_MC_MAX_LISTENERS)
+				cmm_print(DEBUG_STDERR, "Error %d MAX listeners for the group exhausted\n", rc);
+			else if(rc == CMMD_ERR_MC_INTERFACE_NOT_ALLOWED)
+				cmm_print(DEBUG_STDERR, "Error %d Interface configured cannot support Unicast MAC\n", rc);
+			else if(rc == CMMD_ERR_MC_ENTRY_OVERLAP)
+			{
+				cmm_print(DEBUG_STDERR, "Error %d Overlapping entry configured\n", rc);
+				entryCmd->action = CMMD_MC_ACTION_REMOVE_LOCAL;
+				cmmSendToDaemon(daemon_handle, CMMD_CMD_MC4_MULTICAST, sndBuffer, 
+				sizeof(cmmd_mc4_entry_t) +  (listenerCnt * sizeof(cmmd_mc4_listener_t)), rcvBuffer);	
+			}
+			else
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_MC6_MULTICAST\n", rc);
+		}
+	}
+
+
+#if 1
+		cmm_print(DEBUG_INFO, "action:%x\n",entryCmd->action);
+		cmm_print(DEBUG_INFO, "src addr:%x\n",entryCmd->src_addr);
+		cmm_print(DEBUG_INFO, "src addr:%x\n",entryCmd->dst_addr);
+		cmm_print(DEBUG_INFO, "src masklen:%x\n",entryCmd->src_mask_len);
+		cmm_print(DEBUG_INFO, "num output:%x\n",entryCmd->num_output);
+		cmm_print(DEBUG_INFO, "timer:%x\n",listener->timer);
+		cmm_print(DEBUG_INFO, "outputstring:%s\n",listener->output_device_str);
+		cmm_print(DEBUG_INFO, "queue:%d\n",entryCmd->queue);
+#endif
+
+	return rc;
+
+keyword_error:
+	cmm_print(DEBUG_STDERR, "ERROR: Unknown keyword %s\n", keywords[cpt]);
+
+help:
+	cmmMc4SetPrintHelp();
+	return -1;
+}
+
+
+/************************************************************
+ * cmmMc4ProcessClientCmd
+ *    This function do needed local process before sending
+ *    the command to FPP
+ *     
+ ************************************************************/
+
+int cmmMc4ProcessClientCmd(FCI_CLIENT* fci_handle, int function_code, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	int ret = 0;
+	cmmd_mc4_entry_t * entry = (cmmd_mc4_entry_t *) cmd_buf;
+	cmmd_mc4_listener_t * listener;
+
+	switch(function_code)
+	{
+		case CMMD_CMD_MC4_MULTICAST:
+			// We need to check if we don't have to do something with the interface names
+
+			//Sanity checks
+			if (cmd_len < sizeof(cmmd_mc4_entry_t))
+			{
+				res_buf[0] = CMMD_ERR_WRONG_COMMAND_SIZE;
+				break;
+			}
+
+                        if ((entry->action == CMMD_ACTION_QUERY) ||
+                            (entry->action == CMMD_ACTION_QUERY_CONT) ||
+			    (entry->action == CMMD_ACTION_KEEP_ALIVE))
+				goto FCI_CMD;
+
+			if (entry->num_output > MC4_MAX_LISTENERS_IN_QUERY)
+			{
+				res_buf[0] = CMMD_ERR_WRONG_COMMAND_PARAM;
+				break;
+			}
+
+			if (cmd_len < (sizeof(cmmd_mc4_entry_t) + (entry->num_output * sizeof(cmmd_mc4_listener_t))))
+			{
+				res_buf[0] = CMMD_ERR_WRONG_COMMAND_SIZE;
+				break;
+			}
+
+
+			// Check if the listeners are on virtual interface
+			listener = (cmmd_mc4_listener_t *)(cmd_buf + sizeof(cmmd_mc4_entry_t) );
+			switch( entry->action )
+			{
+				
+				case CMMD_MC_ACTION_ADD:
+				case CMMD_MC_ACTION_REMOVE:
+				case CMMD_MC_ACTION_UPDATE:
+					res_buf[0] = CMMD_ERR_OK;
+					ret = mc4_update_entry( entry, listener, entry->action );
+					if( ret != CMMD_ERR_OK )
+					{
+						res_buf[0] = ret;
+						goto out;
+					}
+					goto FCI_CMD;
+					break;
+				case CMMD_MC_ACTION_REMOVE_LOCAL:
+					mc_remove_group(entry,AF_INET);
+					break;
+				
+			}
+out:
+			break;
+
+		case CMMD_CMD_MC4_RESET:
+			__pthread_mutex_lock(&itf_table.lock);
+			__pthread_mutex_lock(&ctMutex);
+			__pthread_mutex_lock(&rtMutex);
+			__pthread_mutex_lock(&neighMutex);
+			__pthread_mutex_lock(&flowMutex);
+			__pthread_mutex_lock(&mc_lock);
+			
+			res_buf[0] = fci_write(fci_handle, CMMD_CMD_MC4_RESET, 0, NULL);
+			if ( ret == CMMD_ERR_OK )
+				mc_reset(AF_INET);		
+
+			__pthread_mutex_unlock(&mc_lock);
+			__pthread_mutex_unlock(&flowMutex);
+			__pthread_mutex_unlock(&neighMutex);
+			__pthread_mutex_unlock(&rtMutex);
+			__pthread_mutex_unlock(&ctMutex);
+			__pthread_mutex_unlock(&itf_table.lock);
+			break;
+
+		default:
+			res_buf[0] = CMMD_ERR_UNKNOWN_COMMAND;
+			break;
+	}
+
+	*res_len = 2;
+	return 0;
+
+FCI_CMD:
+	return fci_cmd(fci_handle, function_code, (u_int16_t*)cmd_buf, cmd_len, res_buf, res_len);
+}
+
diff --git a/cmm/src/module_mc4.h b/cmm/src/module_mc4.h
new file mode 100755
index 0000000..cab4c69
--- /dev/null
+++ b/cmm/src/module_mc4.h
@@ -0,0 +1,31 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_MC4_H__
+#define __MODULE_MC4_H__
+
+	void cmmMc4ShowPrintHelp();
+	int cmmMc4ShowProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+	void cmmMc4SetPrintHelp();
+	int cmmMc4SetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+	int cmmMc4ProcessClientCmd(FCI_CLIENT* fciMsgHandler, int function_code, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len);
+	 int cmmMc4QueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+	int cmmMc4Show(struct cli_def * cli, char *command, char *argv[], int argc);
+
+#endif
diff --git a/cmm/src/module_mc6.c b/cmm/src/module_mc6.c
new file mode 100755
index 0000000..ae9ffc7
--- /dev/null
+++ b/cmm/src/module_mc6.c
@@ -0,0 +1,628 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+#include <net/if.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+
+#include "cmm.h"
+#include "cmmd.h"
+#include "module_mc6.h"
+
+#define MC6_MAX_LISTENERS_IN_QUERY     5
+
+unsigned char Null_Mac[6] = {0,0,0,0,0,0};
+
+extern pthread_mutex_t mc_lock;
+
+int cmmMc6Show(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	int count = 0, ii, jj;
+	struct list_head *entry;
+	struct mcast_entry *mc;
+        char buf1[INET6_ADDRSTRLEN];
+        char buf2[INET6_ADDRSTRLEN];
+
+	__pthread_mutex_lock(&mc_lock);
+	
+	for( ii = 0; ii < MC_NUM_HASH_ENTRIES; ii++ )
+	{
+		for (entry = list_first(&mc_table[ii]); entry != &mc_table[ii]; entry = list_next(entry))
+		{
+			mc = container_of(entry, struct mcast_entry, list);
+			
+			if( mc->family != AF_INET6 )
+				continue;
+			
+                	 cmm_print(DEBUG_STDOUT, "%04d: Src addr: %s  src_mask_len: %x   Dst addr: %s Queue %d  \n",
+			  count,
+			  inet_ntop(AF_INET6, &mc->src_addr, buf1, INET6_ADDRSTRLEN),
+			  mc->src_mask_len,
+			  inet_ntop(AF_INET6, &mc->dst_addr, buf2, INET6_ADDRSTRLEN),
+                          mc->queue);
+		  	for( jj = 0; jj < mc->num_output; jj++) 	
+			{
+				cmm_print(DEBUG_STDOUT," PROGRAMMED : %02d TIMER : 0x%x   SHAPER : 0x%x  Interface %s\n",mc->l_program[jj],
+					mc->listener[jj].timer,mc->listener[jj].shaper_mask, mc->listener[jj].output_device_str);
+				if(mc->listener[jj].q_bit)
+					cmm_print(DEBUG_STDOUT," QUEUE : 0x%x  \n",mc->listener[jj].queue );
+				if(mc->listener[jj].uc_bit)
+					cmm_print(DEBUG_STDOUT,"UC MAC is %02x:%02x:%02x:%02x:%02x:%02x  ",mc->listener[jj].uc_mac[0],mc->listener[jj].uc_mac[1],mc->listener[jj].uc_mac[2],mc->listener[jj].uc_mac[3],mc->listener[jj].uc_mac[4],mc->listener[jj].uc_mac[5]);
+			}	
+			count++;	
+				
+		}
+	}  
+        cmm_print(DEBUG_STDOUT, "Total Multicast v6 Entries: %d\n", count);
+	__pthread_mutex_unlock(&mc_lock);
+	
+	return 0;
+}
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+void cmmMc6ShowPrintHelp()
+{
+	cmm_print(DEBUG_STDOUT, "show mc6 not yet supported\n");
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+int cmmMc6ShowProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	
+//help:
+	cmmMc6ShowPrintHelp();
+	return -1;
+}
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+int cmmMc6QueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	
+        int rcvBytes = 0;
+        char rcvBuffer[256];
+        char buf1[INET6_ADDRSTRLEN];
+        char buf2[INET6_ADDRSTRLEN];
+	char output_buf[256];
+        short rc;
+        int count = 0,len =0;
+        cmmd_mc6_entry_t *mc6_entry = (cmmd_mc6_entry_t *) rcvBuffer;
+        cmmd_mc6_listener_t* mc6_listener = (cmmd_mc6_listener_t *)(rcvBuffer + sizeof (cmmd_mc6_entry_t));
+
+        mc6_entry->action = CMMD_ACTION_QUERY;
+        rcvBytes = cmmSendToDaemon(daemon_handle,CMMD_CMD_MC6_MULTICAST ,
+                  mc6_entry, sizeof(cmmd_mc6_entry_t)+ MC6_MAX_LISTENERS_IN_QUERY * sizeof(cmmd_mc6_listener_t) , rcvBuffer);
+
+        if (rcvBytes < sizeof(cmmd_mc6_entry_t) + sizeof (cmmd_mc6_listener_t) + sizeof(unsigned short)) {
+                rc = (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer);
+                if (rc == CMMD_ERR_UNKNOWN_ACTION) {
+                    cmm_print(DEBUG_STDERR, "ERROR: FPP CMD_MC6_MULTICAST does not support ACTION_QUERY\n");
+                } else if (rc == CMMD_ERR_MC_ENTRY_NOT_FOUND) {
+                    cmm_print(DEBUG_STDERR, "ERROR: FPP Multicast V6 table empty\n");
+                } else {
+                    cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%d\n", rc);
+                }
+                return CLI_OK;
+            }
+            cmm_print(DEBUG_STDOUT, "IPv6 Multicast Entries:\n");
+            do {
+                int i, listner_count;
+		if(mc6_entry->dst_addr[0] & 0xFF)
+		{
+	                cmm_print(DEBUG_STDOUT, "\n%04d: Src addr: %s  src_mask_len: %x   Dst addr: %s   Queue: 0x%x \n\n",
+        	                  count,
+                	          inet_ntop(AF_INET6, &mc6_entry->src_addr, buf1, INET6_ADDRSTRLEN),
+                        	  mc6_entry->src_mask_len,
+	                          inet_ntop(AF_INET6, &mc6_entry->dst_addr, buf2, INET6_ADDRSTRLEN),
+				  mc6_entry->queue );
+			count++;
+		}
+                listner_count = mc6_entry->num_output;
+                if (listner_count > MC6_MAX_LISTENERS_IN_QUERY)
+                {
+                        cmm_print(DEBUG_STDOUT,"output interfaces are more than %d",MC6_MAX_LISTENERS_IN_QUERY);
+                        listner_count = MC6_MAX_LISTENERS_IN_QUERY;
+                }
+
+                for ( i = 0; i < listner_count; i++)
+		{
+	            len += sprintf(output_buf + len, "output interface:  ");
+                    len += sprintf(output_buf + len, "%s  ", mc6_listener[i].output_device_str);
+		    cmm_print (DEBUG_STDOUT,output_buf);
+                    if(mc6_listener[i].uc_bit)
+                           cmm_print(DEBUG_STDOUT,"UC MAC is %02x:%02x:%02x:%02x:%02x:%02x  ",mc6_listener[i].uc_mac[0],mc6_listener[i].uc_mac[1],mc6_listener[i].uc_mac[2],mc6_listener[i].uc_mac[3],mc6_listener[i].uc_mac[4],mc6_listener[i].uc_mac[5]);
+                   cmm_print(DEBUG_STDOUT," TIMER : 0x%x   SHAPER : 0x%x   QUEUE : 0x%x\n",mc6_listener[i].timer,mc6_listener[i].shaper_mask, mc6_listener[i].queue);
+                   len = 0;
+		}
+
+                mc6_entry->action = CMMD_ACTION_QUERY_CONT;
+                rcvBytes = cmmSendToDaemon(daemon_handle, CMMD_CMD_MC6_MULTICAST, mc6_entry,
+                                          sizeof(cmmd_mc6_entry_t)+ MC6_MAX_LISTENERS_IN_QUERY * sizeof(cmmd_mc6_listener_t), rcvBuffer);
+            } while (rcvBytes >= sizeof(cmmd_mc6_entry_t)+ sizeof(cmmd_mc6_listener_t) + sizeof(unsigned short));
+            cmm_print(DEBUG_STDOUT, "Total Multicast v6 Entries: %d\n", count);
+
+        return CLI_OK;
+
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+void cmmMc6SetPrintHelp()
+{
+#ifdef COMCERTO_2000	
+	cmm_print(DEBUG_STDOUT, "Usage: set mc6 interface {if_name} {add | del | update } \n\tgroup {bit_mask} {IPv6 Src Address} {IPv6 Multicast Dst Address} [mode {bridged | routed}] [queue {0..19}] \n\t[listener [timer {timer_value1}] [shapers {0..0xFF}][mc | uc {Mac addr1} ] [queue {0..19}]] [if {if_name}] \n\t [ listener [timer {timer_value2}]  [shapers {0..0xFF}][mc | uc {Mac addr2} ] [queue {0..19}]] [if {if_name}]...  \n\t[ listener [timer {timer_valueN}]  [shapers {0..0xFF}][mc | uc {Mac addrN} ] [queue {0..19}]] [if {if_name}]");
+#else
+	cmm_print(DEBUG_STDOUT, "Usage: set mc6 interface {if_name} {add | del | update } \n\tgroup {bit_mask} {IPv6 Src Address} {IPv6 Multicast Dst Address} [mode {bridged | routed}] [queue {0..31}]\n\t[listener [timer {timer_value1}] [shapers {0..0xFF}][mc | uc {Mac addr1} ] [queue {0..31}]] [if {if_name}] \n\t [ listener [timer {timer_value2}]  [shapers {0..0xFF}][mc | uc {Mac addr2} ] [queue {0..31}]] [if {if_name}]...  \n\t[ listener [timer {timer_valueN}]  [shapers {0..0xFF}][mc | uc {Mac addrN} ] [queue {0..31}]] [if {if_name}] ");
+#endif
+	cmm_print(DEBUG_STDOUT, "\n\nUsage:set mc6 mode route|bridge\n");
+}
+
+/************************************************************
+ * cmmMc6ParseListener
+ * This function parses the mc6 command with multiple listeners
+ * and a single listener alike.
+ *
+ ************************************************************/
+int cmmMcParseListener(char ** keywords, int *cpt, cmmd_mc6_listener_t * listener, u_int8_t * mode, u_int16_t action)
+{
+
+	unsigned int tmp;
+	char * endptr;
+	
+	listener->timer = 0xFFFFFFFF;
+	listener->q_bit = 0;
+	listener->uc_bit = 0; // Multicast by default when a new entry is added
+	listener->Ifbit = 0;
+	
+	while(keywords[*cpt] && (strncasecmp(keywords[*cpt],"listener",strlen(keywords[*cpt])) != 0))
+	{
+		if(strcasecmp(keywords[*cpt],"mc") == 0)
+		{
+			listener->uc_bit = 0;
+		}
+		else if(strcasecmp(keywords[*cpt],"uc") == 0)
+		{
+			if(!keywords[++*cpt])
+				return 1;
+			listener->uc_bit = 1;
+			if (!parse_macaddr(keywords[*cpt], listener->uc_mac))
+			{
+				cmm_print(DEBUG_STDERR, "ERROR %d Invalid Mac Address \n",CMMD_ERR_MC_INVALID_MAC);
+				return 1;
+			}
+			if((listener->uc_mac[0] & 0x01) || !memcmp(listener->uc_mac,Null_Mac,6))
+			{
+				cmm_print(DEBUG_STDERR, "ERROR %d Invalid Mac Address \n",CMMD_ERR_MC_INVALID_MAC);
+				return 1;
+			}
+		}
+
+		else if (strcasecmp(keywords[*cpt], "timer") == 0)
+		{
+			if(!keywords[++*cpt])
+				return 1;
+
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[*cpt], &endptr, 0);
+			listener->timer = tmp;
+		}
+		else if (strcasecmp(keywords[*cpt], "mode") == 0)
+		{
+			if(!keywords[++*cpt])
+				return 1;
+
+			if (strcasecmp(keywords[*cpt], "bridged") == 0)
+				*mode = CMMD_MC6_MODE_BRIDGED;
+			else if (strcasecmp(keywords[*cpt], "routed") == 0)
+				*mode = CMMD_MC6_MODE_ROUTED;
+			else 
+				return 1;
+
+		}
+		else if (strcasecmp(keywords[*cpt], "queue") == 0)
+		{
+
+			if(!keywords[++*cpt])
+				return 1;
+
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[*cpt], &endptr, 0);
+			listener->q_bit = 1;
+
+			if (tmp < FPP_NUM_QUEUES)
+				listener->queue = tmp;
+			else 
+				return 1;
+		}
+		else if (strcasecmp(keywords[*cpt], "shapers") == 0)
+		{
+			if(!keywords[++*cpt])
+				return 1;
+
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[*cpt], &endptr, 0);
+
+			if (tmp <= 0xFF)
+				listener->shaper_mask = tmp;
+			else 
+				return 1;
+		}
+		else if(strcasecmp(keywords[*cpt],"if") == 0 )
+		{
+			if(action != CMMD_MC_ACTION_UPDATE)
+				return 1;
+
+			if(!keywords[++*cpt])
+				return 1;
+
+			if (strlen(keywords[*cpt]) > 10) {
+				cmm_print(DEBUG_STDERR, "Error : interface name %s limited to 10 characters\n", keywords[*cpt]);
+				return 1;
+			}
+			strcpy(listener->new_output_device_str, keywords[*cpt]);
+			listener->Ifbit = 1;	
+		}
+		else
+			return 1;
+		++*cpt;
+
+	}
+	return 0;
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+int cmmMc6SetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	unsigned int tmp;
+	char * endptr;
+	int rc = 0;
+	char sndBuffer[256];
+	char rcvBuffer[256];
+	char interfaceName[11] = {};
+	cmmd_mc6_entry_t * entryCmd = (cmmd_mc6_entry_t *) sndBuffer;
+	cmmd_mc6_listener_t * listener = (cmmd_mc6_listener_t *) (sndBuffer + sizeof(cmmd_mc6_entry_t));
+	int listenerCnt = 0;
+	u_int8_t mode = 0;
+
+	memset(sndBuffer, 0, sizeof(sndBuffer));
+	listener->timer = 0xFFFFFFFF;
+	listener->q_bit = 0;
+	listener->uc_bit = 0; // Multicast by default when a new entry is added
+	listener->Ifbit = 0;
+
+	if(!keywords[cpt])
+		goto help;
+
+	if(strcasecmp(keywords[cpt], "interface") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+
+		if (strlen(keywords[cpt]) > 10) {
+			cmm_print(DEBUG_STDERR, "Error : interface name %s limited to 10 characters\n", keywords[cpt]);
+			goto help;
+		}
+		strcpy(interfaceName, keywords[cpt]);
+		strcpy(listener->output_device_str,interfaceName);
+	}
+	else if(strcasecmp(keywords[cpt], "reset") == 0)
+	{
+		/*Reset, special case*/
+		if(cmmSendToDaemon(daemon_handle, CMMD_CMD_MC6_RESET, NULL, 0, rcvBuffer) == 2)
+		{
+			if ( ((unsigned short *)rcvBuffer)[0] != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_MC6_RESET\n", ((unsigned short *)rcvBuffer)[0]);
+		}
+		return ((unsigned short *)rcvBuffer)[0];
+	}
+	else if (strcasecmp(keywords[cpt], "mode") == 0)
+	{
+		unsigned short mc6_mode;
+
+		if (!keywords[++cpt])
+			goto help;
+
+		if (strcasecmp(keywords[cpt], "bridge") == 0)
+			mc6_mode = CMMD_MC6_MODE_BRIDGED;
+		else if (strcasecmp(keywords[cpt], "route") == 0)
+			mc6_mode = CMMD_MC6_MODE_ROUTED;
+		else
+			goto help;
+
+		if(cmmSendToDaemon(daemon_handle, CMMD_CMD_MC6_MODE, &mc6_mode, sizeof(mc6_mode), rcvBuffer) == 2)
+		{
+			if ( ((unsigned short *)rcvBuffer)[0] != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_MC6_MODE\n", ((unsigned short *)rcvBuffer)[0]);
+		}
+		return ((unsigned short *)rcvBuffer)[0];
+
+	}
+	else
+		goto keyword_error;
+
+	if(!keywords[++cpt])
+		goto help;
+	
+	if(strcasecmp(keywords[cpt], "add") == 0)
+	{		
+		entryCmd->action = CMMD_MC_ACTION_ADD;
+	}
+	else if(strcasecmp(keywords[cpt], "del") == 0)
+	{
+		entryCmd->action = CMMD_MC_ACTION_REMOVE;
+	}
+	else if(strcasecmp(keywords[cpt], "update") == 0)
+	{
+		entryCmd->action = CMMD_MC_ACTION_UPDATE;
+	}
+	else
+		goto keyword_error;
+
+	if(!keywords[++cpt])
+		goto help;
+
+	if (strcasecmp(keywords[cpt], "group") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+
+		/*Get an integer from the string for the MASK*/
+		endptr = NULL;
+		tmp = strtoul(keywords[cpt], &endptr, 0);
+		entryCmd->src_mask_len = tmp;
+
+		if(!keywords[++cpt])
+			goto help;
+
+		/*Get an integer from the string for the IPsrc*/
+		if(inet_pton(AF_INET6, keywords[cpt], &entryCmd->src_addr) != 1)
+			goto help;
+
+		if(!keywords[++cpt])
+			goto help;
+
+		/*Get an integer from the string for the IPdst*/
+		if(inet_pton(AF_INET6, keywords[cpt], &entryCmd->dst_addr) != 1)
+			goto help;
+
+		if (! (entryCmd->dst_addr[0] & 0xFF))
+			goto help;
+	}
+
+	++cpt;
+
+	while(keywords[cpt])
+	{
+		strcpy(((cmmd_mc6_listener_t *)listener + listenerCnt)->output_device_str,interfaceName);
+		if (strncasecmp(keywords[cpt], "listener",strlen(keywords[cpt])) == 0) //May be a case of multiple listeners, parse differently
+		{
+			++cpt;
+			if(!cmmMcParseListener(keywords, &cpt, listener + listenerCnt, &mode, entryCmd->action))
+			{
+				if(++listenerCnt ==  MC6_MAX_LISTENERS_IN_QUERY)
+					//Send first batch to FPP and reset listener count
+				{
+
+					entryCmd->num_output = listenerCnt;
+					if(cmmSendToDaemon(daemon_handle, CMMD_CMD_MC6_MULTICAST, sndBuffer, sizeof(cmmd_mc6_entry_t) + (listenerCnt * sizeof(cmmd_mc6_listener_t)), rcvBuffer) == 2)
+					{
+						if ( (rc = ((unsigned short *)rcvBuffer)[0]) != 0)
+						{
+							if(rc == CMMD_ERR_NOT_CONFIGURED)
+								cmm_print(DEBUG_STDERR, "%d Interface not yet up in FPP, will be configured when interface comes up\n", rc);
+							else if(rc == CMMD_ERR_MC_MAX_LISTENERS)
+								cmm_print(DEBUG_STDERR, "Error %d MAX listeners for the group exhausted\n", rc);
+							else if(rc == CMMD_ERR_MC_INTERFACE_NOT_ALLOWED)
+								cmm_print(DEBUG_STDERR, "Error %d Interface configured cannot support Unicast MAC\n", rc);
+							else if(rc == CMMD_ERR_MC_ENTRY_OVERLAP)
+							{
+								cmm_print(DEBUG_STDERR, "Error %d Overlapping entry configured\n", rc);
+								entryCmd->action = CMMD_MC_ACTION_REMOVE_LOCAL;
+								cmmSendToDaemon(daemon_handle, CMMD_CMD_MC6_MULTICAST, sndBuffer, 
+								sizeof(cmmd_mc6_entry_t) + (listenerCnt * sizeof(cmmd_mc6_listener_t)), rcvBuffer);	
+							}
+							else
+								cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_MC6_MULTICAST\n", rc);
+						}
+					}
+					listenerCnt = 0;
+					memset(sndBuffer + sizeof(cmmd_mc6_entry_t), 0 , sizeof(sndBuffer) - sizeof(cmmd_mc6_entry_t));
+				}
+			}
+			else
+				goto help;
+		}
+		else
+		{
+			if(!cmmMcParseListener(keywords, &cpt, listener, &mode, entryCmd->action))
+			{
+				listener->q_bit = 0; // Default config listener q_bit is always zero.
+				entryCmd->queue = listener->queue;
+				entryCmd->mode = mode;
+			}
+			else
+				goto help;
+		}
+
+	}
+	if(!listenerCnt & !entryCmd->num_output)
+		listenerCnt = 1; //fall back to legacy design, single listener is configured.
+
+	entryCmd->num_output = listenerCnt;
+
+	if(listenerCnt && (cmmSendToDaemon(daemon_handle, CMMD_CMD_MC6_MULTICAST, sndBuffer, sizeof(cmmd_mc6_entry_t) + (listenerCnt * sizeof(cmmd_mc6_listener_t)), rcvBuffer) == 2))
+	{
+		if ( (rc = ((unsigned short *)rcvBuffer)[0]) != 0)
+		{
+			if(rc == CMMD_ERR_NOT_CONFIGURED)
+				cmm_print(DEBUG_STDERR, "%d Interface not yet up in FPP, will be configured when interface comes up\n", rc);
+			else if(rc == CMMD_ERR_MC_MAX_LISTENERS)
+				cmm_print(DEBUG_STDERR, "Error %d MAX listeners for the group exhausted\n", rc);
+			else if(rc == CMMD_ERR_MC_INTERFACE_NOT_ALLOWED)
+				cmm_print(DEBUG_STDERR, "Error %d Interface configured cannot support Unicast MAC\n", rc);
+			else if(rc == CMMD_ERR_MC_ENTRY_OVERLAP)
+			{
+				cmm_print(DEBUG_STDERR, "Error %d Overlapping entry configured\n", rc);
+				entryCmd->action = CMMD_MC_ACTION_REMOVE_LOCAL;
+				cmmSendToDaemon(daemon_handle, CMMD_CMD_MC6_MULTICAST, sndBuffer, 
+				sizeof(cmmd_mc6_entry_t) + (listenerCnt * sizeof(cmmd_mc6_listener_t)), rcvBuffer);	
+			}
+			else
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_MC6_MULTICAST\n", rc);
+		}
+	}
+	return rc;
+
+keyword_error:
+	cmm_print(DEBUG_STDERR, "ERROR: Unknown keyword %s\n", keywords[cpt]);
+
+help:
+	cmmMc6SetPrintHelp();
+	return -1;
+}
+
+
+/************************************************************
+ * cmmMc6ProcessClientCmd
+ *    This function do needed local process before sending
+ *    the command to FPP
+ *     
+ ************************************************************/
+
+int cmmMc6ProcessClientCmd(FCI_CLIENT* fci_handle, int function_code, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	int ret = 0;
+	cmmd_mc6_entry_t * entry = (cmmd_mc6_entry_t *) cmd_buf;
+	cmmd_mc6_listener_t * listener;
+
+	switch(function_code)
+	{
+		case CMMD_CMD_MC6_MULTICAST:
+			// We need to check if we don't have to do something with the interface names
+
+			//Sanity checks
+			if (cmd_len < sizeof(cmmd_mc6_entry_t))
+			{
+				res_buf[0] = CMMD_ERR_WRONG_COMMAND_SIZE;
+				break;
+			}
+
+			if ((entry->action == CMMD_ACTION_QUERY) ||
+                            (entry->action == CMMD_ACTION_QUERY_CONT))
+                             goto FCI_CMD;
+
+			if (entry->num_output > MC6_MAX_LISTENERS_IN_QUERY)
+			{
+				res_buf[0] = CMMD_ERR_WRONG_COMMAND_PARAM; 
+				break;
+			}
+
+			if (cmd_len < (sizeof(cmmd_mc6_entry_t) + (entry->num_output * sizeof(cmmd_mc6_listener_t))))
+			{
+				res_buf[0] = CMMD_ERR_WRONG_COMMAND_SIZE;
+				break;
+			}
+
+
+			// Check if the listeners are on virtual interface
+			listener = (cmmd_mc6_listener_t *)(cmd_buf + sizeof(cmmd_mc6_entry_t) );
+			switch( entry->action )
+			{
+				case CMMD_MC_ACTION_ADD:
+				case CMMD_MC_ACTION_REMOVE:
+				case CMMD_MC_ACTION_UPDATE:
+					res_buf[0] = CMMD_ERR_OK;
+					ret = mc6_update_entry(entry, listener, entry->action );
+					if( ret != CMMD_ERR_OK )
+					{
+						res_buf[0] = ret;
+						goto out;
+					}
+					goto FCI_CMD;		
+					break;
+				case CMMD_MC_ACTION_REMOVE_LOCAL:
+					mc_remove_group(entry,AF_INET6);
+					break;
+					
+			}
+out:
+			
+			break;
+
+		case CMMD_CMD_MC6_RESET:
+			__pthread_mutex_lock(&itf_table.lock);
+			__pthread_mutex_lock(&ctMutex);
+			__pthread_mutex_lock(&rtMutex);
+			__pthread_mutex_lock(&neighMutex);
+			__pthread_mutex_lock(&flowMutex);
+			__pthread_mutex_lock(&mc_lock);
+			
+			res_buf[0] = fci_write(fci_handle, CMMD_CMD_MC6_RESET, 0, NULL);
+			if ( ret == CMMD_ERR_OK )
+				mc_reset(AF_INET);		
+
+			__pthread_mutex_unlock(&mc_lock);
+			__pthread_mutex_unlock(&flowMutex);
+			__pthread_mutex_unlock(&neighMutex);
+			__pthread_mutex_unlock(&rtMutex);
+			__pthread_mutex_unlock(&ctMutex);
+			__pthread_mutex_unlock(&itf_table.lock);
+			break;
+
+		case CMMD_CMD_MC6_MODE:
+			goto FCI_CMD;
+
+		default:
+			res_buf[0] = CMMD_ERR_UNKNOWN_COMMAND;
+			break;
+	}
+
+	*res_len = 2;
+	return 0;
+
+FCI_CMD:
+	return fci_cmd(fci_handle, function_code, (u_int16_t*)cmd_buf, cmd_len, res_buf, res_len);
+}
+
diff --git a/cmm/src/module_mc6.h b/cmm/src/module_mc6.h
new file mode 100755
index 0000000..e11aa74
--- /dev/null
+++ b/cmm/src/module_mc6.h
@@ -0,0 +1,34 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_MC6_H__
+#define __MODULE_MC6_H__
+
+	void cmmMc6ShowPrintHelp();
+	int cmmMc6ShowProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+	int cmmMc6QueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+	void cmmMc6SetPrintHelp();
+	int cmmMc6SetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+	int cmmMc6ProcessClientCmd(FCI_CLIENT* fciMsgHandler, int function_code, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len);
+	int cmmMc6Show(struct cli_def * cli, char *command, char *argv[], int argc);
+
+	extern  int parse_macaddr(char *pstring, unsigned char *pmacaddr);
+
+
+#endif
diff --git a/cmm/src/module_mcast.c b/cmm/src/module_mcast.c
new file mode 100644
index 0000000..859b8e0
--- /dev/null
+++ b/cmm/src/module_mcast.c
@@ -0,0 +1,617 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+#include <net/if.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+
+#include "cmm.h"
+#include "cmmd.h"
+
+struct list_head mc_table[MC_NUM_HASH_ENTRIES];
+pthread_mutex_t mc_lock = PTHREAD_MUTEX_INITIALIZER;
+
+/************************************************************
+ *
+ *
+ ************************************************************/
+struct mcast_entry *mc_find( void  *data,  unsigned char family )
+{
+	struct mcast_entry *mc = NULL;
+	struct list_head *entry;
+	int hash, addr_len;
+	unsigned int src_addr[4], dst_addr[4];
+
+	
+	if ( family == AF_INET )
+	{
+		memcpy(src_addr, &((cmmd_mc4_entry_t *)data)->src_addr, 4 );
+		memcpy(dst_addr, &((cmmd_mc4_entry_t *)data)->dst_addr, 4 );
+		addr_len = 4;
+	}
+	else
+	{
+		memcpy(src_addr, &((cmmd_mc6_entry_t *)data)->src_addr, 16 );
+		memcpy(dst_addr, &((cmmd_mc6_entry_t *)data)->dst_addr, 16 );
+		addr_len = 16;
+	}
+	
+	hash = MC_HASH(dst_addr, family); 
+		
+	for (entry = list_first(&mc_table[hash]); entry != &mc_table[hash]; entry = list_next(entry))
+	{
+		mc = container_of(entry, struct mcast_entry, list);
+		if(!(memcmp(mc->src_addr, src_addr, addr_len)) && 
+			!(memcmp(mc->dst_addr, dst_addr, addr_len)) && 
+			(mc->family == family) )
+		{
+			cmm_print(DEBUG_INFO, "%s: (%d) mc found\n", __func__, __LINE__);
+			goto found;	
+		}	
+		
+	}
+	
+	mc = NULL;
+	
+
+found:
+	return mc;	
+} 
+
+/************************************************************
+ *
+ *
+ ************************************************************/
+int mc6_send_command( FCI_CLIENT *fci, unsigned short action, struct mcast_entry *mc , char * Ifname )
+{
+	int ret = 0, i,j;
+	char sndBuffer[256], program = 0;
+	cmmd_mc6_entry_t * entryCmd = (cmmd_mc6_entry_t *) sndBuffer;
+	cmmd_mc_listener_t *listener = (cmmd_mc_listener_t *) (sndBuffer + sizeof(cmmd_mc6_entry_t));
+
+    cmm_print(DEBUG_INFO, "%s: output: %s action : %d \n", __func__, Ifname, action);
+	program = (action ==  CMMD_MC_ACTION_ADD) ? 1 : 0;
+	entryCmd->action = action;	
+	entryCmd->mode = mc->mode;	
+	entryCmd->queue = mc->queue;	
+	entryCmd->rsvd = mc->rsvd;	
+	entryCmd->src_mask_len = mc->src_mask_len;	
+	memcpy(entryCmd->src_addr, mc->src_addr, 16);
+	memcpy(entryCmd->dst_addr, mc->dst_addr, 16);
+	for(i = 0 , j = 0 ; i < mc->num_output; i++)
+	{
+		if((program ^ mc->l_program[i]) && ((Ifname) && (!strncmp(mc->listener[i].output_device_str,Ifname,
+						sizeof(mc->listener[i].output_device_str)))))
+		{
+			memcpy(listener + j++, &mc->listener[i], sizeof(cmmd_mc_listener_t));	
+			mc->l_program[i] = program;
+		}
+	}
+	entryCmd->num_output = j;
+	
+        cmm_print(DEBUG_INFO, "%s: j is  %d \n", __func__, j);
+	ret = fci_write(fci, CMMD_CMD_MC6_MULTICAST, 
+		sizeof(cmmd_mc6_entry_t) + ( j * sizeof(cmmd_mc_listener_t)), (u_int16_t *) sndBuffer);
+        
+	if( ( ret == FPP_ERR_MC_ENTRY_NOT_FOUND ) && (action == CMMD_MC_ACTION_REMOVE) )
+	{
+        	cmm_print(DEBUG_INFO, "%s: Entry not found, might be deleted by fpp : %d\n", __func__, ret);
+		return FPP_ERR_OK;	
+	}
+
+	if (ret != FPP_ERR_OK)
+        {
+        	cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_MC6_MULTICAST\n", __func__, ret);
+        }
+	
+	return ret;
+}
+
+/************************************************************
+ *
+ *
+ ***********************************************************/
+int mc4_send_command( FCI_CLIENT *fci, unsigned short action, struct mcast_entry *mc, char * Ifname)
+{
+	int ret = 0, i, j;
+	char sndBuffer[256], program = 0;
+	cmmd_mc4_entry_t * entryCmd = (cmmd_mc4_entry_t *) sndBuffer;
+	cmmd_mc_listener_t * listener = (cmmd_mc_listener_t *) (sndBuffer + sizeof(cmmd_mc4_entry_t));
+	
+        cmm_print(DEBUG_INFO, "%s: (%d) interface : %s command : %d\n", __func__, __LINE__, Ifname , action);
+
+	program = (action ==  CMMD_MC_ACTION_ADD) ? 1 : 0;
+	entryCmd->action = action;	
+	entryCmd->mode = mc->mode;	
+	entryCmd->queue = mc->queue;	
+	entryCmd->rsvd = mc->rsvd;	
+	entryCmd->src_mask_len = mc->src_mask_len;	
+	entryCmd->src_addr = mc->src_addr[0];
+	entryCmd->dst_addr = mc->dst_addr[0];
+	// copy each listener for the given interface.
+	for(i = 0 , j = 0 ; i< mc->num_output; i++)
+	{
+		if( (program ^ mc->l_program[i]) && ((Ifname) && (!strncmp(mc->listener[i].output_device_str,Ifname, 
+						sizeof(mc->listener[i].output_device_str)))))
+		{
+			memcpy(listener + j++, &mc->listener[i], sizeof(cmmd_mc_listener_t));	
+			mc->l_program[i] = program;
+		}
+	}
+	entryCmd->num_output = j;
+	ret = fci_write(fci, CMMD_CMD_MC4_MULTICAST, 
+		sizeof(cmmd_mc4_entry_t) + (j * sizeof(cmmd_mc_listener_t) ), (u_int16_t *) sndBuffer);
+       
+	if( ( ret == FPP_ERR_MC_ENTRY_NOT_FOUND ) && (action == CMMD_MC_ACTION_REMOVE) )
+	{
+        	cmm_print(DEBUG_INFO, "%s: Entry not found, might be deleted by fpp : %d\n", __func__, ret);
+		return FPP_ERR_OK;	
+	}
+
+	if (ret != FPP_ERR_OK)
+        {
+        	cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_MC4_MULTICAST\n", __func__, ret);
+        }
+	
+	return ret;
+}
+    
+/***********************************************************
+ * Name : mc_reset
+ *
+ ***********************************************************/ 
+int mc_reset( unsigned char family )
+{
+	struct list_head *entry;
+	struct mcast_entry *mc;
+	int ii;
+
+        cmm_print(DEBUG_INFO, "%s: %d\n", __func__, __LINE__);
+	
+	for( ii = 0; ii < MC_NUM_HASH_ENTRIES; ii++)
+	{
+		for (entry = list_first(&mc_table[ii]); entry != &mc_table[ii]; entry = list_next(entry))
+		{	
+			mc = container_of(entry, struct mcast_entry, list);
+			
+			if ( family == mc->family )
+			{
+				list_del(&mc->list);
+				free(mc);
+			}	
+				
+		}
+		
+	}
+	
+	return 0;
+}
+	
+int mc_update( struct mcast_entry *mc, cmmd_mc_listener_t *listener, int  num_output)
+{
+	int i = 0, j =0,program = 1;
+	cmm_print(DEBUG_INFO, "%s: \n", __func__);
+
+	for( j = 0 ; j < num_output; j++)
+	{
+		for(i=0 ;i < mc->num_output; i++)
+		{
+			if(!memcmp((listener + j)->uc_mac, mc->listener[i].uc_mac,6) && 
+				(!strcasecmp((listener + j)->output_device_str,mc->listener[i].output_device_str))) 
+			{
+				memcpy(&mc->listener[i], (listener + j), sizeof(cmmd_mc_listener_t));
+				program = mc->l_program[i];
+			}
+		}
+	}
+	return program;
+}
+
+/************************************************************
+ * Name : mc6_add_entry
+ * Parameters : 
+ *
+ ***********************************************************/
+struct mcast_entry *mc_add(struct mcast_entry *mc, void *entry, cmmd_mc_listener_t *listener, unsigned char program, unsigned char family )
+{
+	int hash, add_group = 1 , i = 0, j =0, k = 0, dup = 0;
+	cmm_print(DEBUG_INFO, "%s: \n", __func__);
+
+	if( !((family == AF_INET) || (family == AF_INET6)) )
+		return NULL;  
+	
+	if(mc)
+		add_group = 0;	
+	else 
+	{
+		if((mc = (struct mcast_entry *)malloc(sizeof(struct mcast_entry))) == NULL)
+			return NULL;
+		memset(mc, 0, sizeof(struct mcast_entry));
+	}
+
+	if ( family == AF_INET )
+	{
+		cmmd_mc4_entry_t *mc4 = (cmmd_mc4_entry_t *)entry;
+		if( add_group)
+		{
+			mc->mode = mc4->mode;
+			mc->queue = mc4->queue;
+			mc->rsvd = mc4->rsvd;
+			mc->src_addr[0] = mc4->src_addr;
+			mc->dst_addr[0] = mc4->dst_addr;
+			mc->src_mask_len = mc4->src_mask_len;
+			mc->family = AF_INET;
+		}
+		for( i = mc->num_output , j = 0 ;( ( i < MC_MAX_LISTENERS_PER_GROUP)  && (j < mc4->num_output)); i++, j++)
+		{
+			for(k=0 ;k < i; k++)
+			{
+				if(!memcmp((listener + j)->uc_mac, mc->listener[k].uc_mac,6) && // Duplicate entry
+					(!strcasecmp((listener + j)->output_device_str,mc->listener[k].output_device_str))) 
+				{
+					dup++;
+					break;	
+				}
+			}
+			if(k == i)	
+			{
+				memcpy(&mc->listener[i], (listener + j), sizeof(cmmd_mc_listener_t));
+				mc->l_program[i] = program;
+			}
+		}
+		mc->num_output =  i - dup;
+	}
+	else
+	{	
+		cmmd_mc6_entry_t *mc6 = (cmmd_mc6_entry_t *)entry;
+		if(add_group)
+		{	
+			mc->mode = mc6->mode;
+			mc->queue = mc6->queue;
+			mc->rsvd = mc6->rsvd;
+			memcpy(mc->src_addr, mc6->src_addr, 16);
+			memcpy(mc->dst_addr, mc6->dst_addr, 16);
+			mc->src_mask_len = mc6->src_mask_len;
+			mc->family = AF_INET6;
+		}
+
+		for( i = mc->num_output, j = 0 ;(( i < MC_MAX_LISTENERS_PER_GROUP) && ( j< mc6->num_output)); i++, j++ )
+		{
+			for(k=0 ;k < i; k++)
+			{
+				if(!memcmp((listener + j)->uc_mac, mc->listener[k].uc_mac,6) && // Duplicate entry
+					(!strcasecmp((listener + j)->output_device_str,mc->listener[k].output_device_str))) 
+				{
+					dup++;
+					break;	
+				}
+			}
+			if(k == i)	
+			{
+				memcpy(&mc->listener[i], (listener + j), sizeof(cmmd_mc_listener_t));
+				mc->l_program[i] = program;
+			}
+		}
+		mc->num_output =  i - dup;
+	}
+	// If new mc entry add group and listeners
+	if(add_group)
+	{
+		hash = MC_HASH(mc->dst_addr, family);
+		list_add(&mc_table[hash], &mc->list);
+	}
+	return mc;
+}
+
+/************************************************************
+ * Name : mc_remove_group
+ * Parameters : 
+ *
+ ***********************************************************/
+void mc_remove_group(void * entry,unsigned char family)
+{
+
+	struct mcast_entry *mc =  NULL;
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&ctMutex);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+	__pthread_mutex_lock(&mc_lock);
+
+	mc = mc_find( entry, family);
+	if(mc)
+	{
+		list_del(&mc->list);
+		free(mc);
+	}
+	__pthread_mutex_unlock(&mc_lock);
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+}
+
+/************************************************************
+ * Name : mc_remove
+ * Parameters : 
+ *
+ ***********************************************************/
+int  mc_remove( struct mcast_entry *mc, cmmd_mc_listener_t * listener, int num_output )
+{
+	int i = 0, j = 0;
+	int ret = CMMD_ERR_OK;
+	for(i = 0;  i <  num_output; i++ )
+	{
+		for(j = 0 ; j < mc->num_output; j++ )
+		{
+			if((listener + i)->uc_bit)
+			{
+				if(!(mc->listener[j].uc_bit))
+					continue;
+
+				if(!memcmp((listener + i)->uc_mac, mc->listener[j].uc_mac,6))
+				{
+					cmm_print(DEBUG_STDOUT,"UC MAC is %02x:%02x:%02x:%02x:%02x:%02x  ",mc->listener[j].uc_mac[0],mc->listener[j].uc_mac[1],mc->listener[j].uc_mac[2],mc->listener[j].uc_mac[3],mc->listener[j].uc_mac[4],mc->listener[j].uc_mac[5]);
+					if(!mc->l_program[j])
+						ret = CMMD_ERR_NOT_CONFIGURED;
+					// Found a match remove it and fill the hole
+					memcpy(&mc->listener[j],&mc->listener[j+1], (mc->num_output - (j+1)) * sizeof(cmmd_mc_listener_t));
+					mc->num_output -=1;
+					break;
+				}
+			}
+			else
+			{
+				if(mc->listener[j].uc_bit)
+					continue;
+
+				if(!strncmp((listener + i)->output_device_str, mc->listener[j].output_device_str,sizeof((listener + i)->output_device_str)))
+				{
+					if(!mc->l_program[j])
+						ret = CMMD_ERR_NOT_CONFIGURED;
+					// Found a match remove it and fill the hole
+					memcpy(&mc->listener[j],&mc->listener[j+1], (mc->num_output - (j+1)) * sizeof(cmmd_mc_listener_t));
+					mc->num_output -=1;
+					break;
+				}
+
+			}
+		}
+	}	
+	if(! mc-> num_output)
+	{
+		list_del(&mc->list);
+		free(mc);
+	}
+	return ret;
+}
+
+/************************************************************
+ *
+ *
+ ************************************************************/ 
+void mc_update_table( FCI_CLIENT *fci, struct rtattr *tb[], struct ifinfomsg *ifi )
+{
+	struct mcast_entry *mc = NULL;
+	struct list_head *entry;
+	char ifname[IFNAMSIZ] = {} ;
+	unsigned int ii, len, ret, jj;
+	unsigned short action = CMMD_MC_ACTION_ADD;
+	
+	if(!ifi->ifi_change)
+		return;
+
+	len = RTA_PAYLOAD(tb[IFLA_IFNAME]);
+	
+	memcpy( ifname, RTA_DATA(tb[IFLA_IFNAME]), len );
+	ifname[len] = '\0';
+	
+        cmm_print(DEBUG_INFO, "%s: (%d) interface name : %s index:%d length is %d  change is %d \n", __func__, __LINE__, 
+								ifname, ifi->ifi_index, len, ifi->ifi_change ) ;
+
+	if( __itf_is_programmed(ifi->ifi_index) <= 0 )
+		action = CMMD_MC_ACTION_REMOVE; 
+
+	__pthread_mutex_lock(&mc_lock);
+	
+	for( ii = 0; ii < MC_NUM_HASH_ENTRIES; ii++ )
+	{
+		for (entry = list_first(&mc_table[ii]); entry != &mc_table[ii]; entry = list_next(entry))
+		{
+			mc = container_of(entry, struct mcast_entry, list);
+			for(jj =0 ; jj < mc->num_output; jj++)
+			{
+				 cmm_print(DEBUG_INFO, "%s: %s", mc->listener[jj].output_device_str, ifname);		
+				if(! strncmp(mc->listener[jj].output_device_str, ifname, sizeof(mc->listener[jj].output_device_str) ) )
+				{
+					if( mc->family == AF_INET )
+						ret = mc4_send_command( fci, action, mc, ifname);
+					else
+						ret = mc6_send_command( fci, action, mc, ifname);
+				}
+			}
+			/* In case of VLAN, MC entries in FPP are purged, when vlan is down */ 
+		}
+	}  
+	__pthread_mutex_unlock(&mc_lock);
+
+	return;
+}
+
+
+/**************************************************************************
+ *
+ *
+ *************************************************************************/ 
+int mc6_update_entry( cmmd_mc6_entry_t *entry, 
+			cmmd_mc_listener_t *listener, unsigned short action )
+{
+	struct mcast_entry *mc = NULL;
+	int program = 1, ret = CMMD_ERR_OK;	
+				
+
+	if (!strcasecmp( listener->output_device_str, "acp"))
+		return CMMD_ERR_OK;
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&ctMutex);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+	__pthread_mutex_lock(&mc_lock);
+		
+
+	cmm_print(DEBUG_INFO, "%s, Check for interface %s index : %d \n", 
+				__func__, listener->output_device_str, 
+				if_nametoindex(listener->output_device_str));
+
+	if( __itf_is_programmed(if_nametoindex(listener->output_device_str)) <= 0 )
+		program = 0;
+	mc = mc_find( entry, AF_INET6);
+
+	switch( action )
+	{
+		case CMMD_MC_ACTION_ADD:
+			if( mc && mc->num_output == MC_MAX_LISTENERS_PER_GROUP)
+			{
+				ret = CMMD_ERR_MC_MAX_LISTENERS; 
+				goto done;
+			}
+			mc = mc_add(mc,entry, listener, program, AF_INET6 );
+			if(!program)
+				ret = CMMD_ERR_NOT_CONFIGURED;
+			break;
+						
+						
+		case CMMD_MC_ACTION_REMOVE:
+			if(mc)
+				ret = mc_remove(mc,listener, entry->num_output);
+			else
+			{
+				ret = CMMD_ERR_NOT_FOUND;		
+				goto done;
+			}
+
+			break;
+		case CMMD_MC_ACTION_UPDATE:
+			if(mc)
+			{
+				mc->mode = entry->mode;
+				mc->queue = entry->queue;
+				if(! mc_update(mc,listener, entry->num_output))
+					ret = CMMD_ERR_NOT_CONFIGURED;
+			}
+			else
+			{
+				ret = CMMD_ERR_NOT_FOUND;		
+				goto done;
+			}
+		break;	
+	}					
+done:
+	__pthread_mutex_unlock(&mc_lock);
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	return ret;	
+}
+
+/**************************************************************************
+ *
+ *
+ *************************************************************************/ 
+int mc4_update_entry( cmmd_mc4_entry_t *entry, 
+			cmmd_mc_listener_t *listener, unsigned short action )
+{
+	struct mcast_entry *mc = NULL;
+	int program = 1, ret = CMMD_ERR_OK;	
+				
+
+	if (!strcasecmp( listener->output_device_str, "acp"))
+		return CMMD_ERR_OK;
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&ctMutex);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+	__pthread_mutex_lock(&mc_lock);
+		
+	cmm_print(DEBUG_INFO, "%s, Check for interface %s index : %d \n", 
+				__func__, listener->output_device_str, 
+				if_nametoindex(listener->output_device_str));
+	if( __itf_is_programmed(if_nametoindex(listener->output_device_str)) <= 0 )
+			program = 0;
+
+
+	mc = mc_find( entry, AF_INET);
+	switch( action )
+	{
+		case CMMD_MC_ACTION_ADD:
+			if(mc && (mc->num_output == MC_MAX_LISTENERS_PER_GROUP))
+			{
+				ret = CMMD_ERR_MC_MAX_LISTENERS; 
+				goto done;
+			}
+			mc = mc_add(mc, entry, listener, program, AF_INET );
+			if(!program)
+				ret = CMMD_ERR_NOT_CONFIGURED;
+			break;
+						
+						
+		case CMMD_MC_ACTION_REMOVE:
+			if ( mc )
+				ret = mc_remove(mc,listener, entry->num_output);
+			else
+			{
+				ret = CMMD_ERR_NOT_FOUND;		
+				goto done;
+			}
+			break;
+			
+		case CMMD_MC_ACTION_UPDATE:
+			if(mc)
+			{
+				mc->mode = entry->mode;
+				mc->queue = entry->queue;
+				if(! mc_update(mc,listener, entry->num_output))
+					ret = CMMD_ERR_NOT_CONFIGURED;
+
+			}
+			else
+			{
+				ret = CMMD_ERR_NOT_FOUND;		
+				goto done;
+			}
+		break;	
+	}					
+				
+done:
+	__pthread_mutex_unlock(&mc_lock);
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	return ret;	
+}
diff --git a/cmm/src/module_mcast.h b/cmm/src/module_mcast.h
new file mode 100644
index 0000000..8bc2edc
--- /dev/null
+++ b/cmm/src/module_mcast.h
@@ -0,0 +1,70 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_MCAST_H__
+#define __MODULE_MCAST_H__
+#include "cmmd.h"
+
+#define MC_NUM_HASH_ENTRIES 32
+#define MC_HASH(_addr, _family) ((_family == AF_INET) ? (ntohl(_addr[0])&(MC_NUM_HASH_ENTRIES - 1)):(ntohl(_addr[3])&(MC_NUM_HASH_ENTRIES - 1)))	
+
+#define MC_MAX_LISTENERS_PER_GROUP 10
+typedef struct mc_listener {
+	u_int32_t timer;
+	char	  output_device_str[11];
+	unsigned char shaper_mask ;
+	u_int8_t	uc_bit:1,
+			q_bit:1,
+			rsvd:6;
+	u_int8_t        uc_mac[6];
+	u_int8_t	queue;
+	char		new_output_device_str[11];
+	u_int8_t	Ifbit:1,
+			rsvd1:7;
+}__attribute__((__packed__)) mc_listener_t;
+
+struct mcast_entry {
+	struct list_head list;
+	u_int8_t  family;
+//	u_int8_t  programmed;
+	u_int8_t  mode : 1, 
+		  queue : 5, 
+		  rsvd : 2;
+	u_int8_t  src_mask_len;
+	u_int32_t src_addr[4];
+	u_int32_t dst_addr[4];
+	u_int8_t num_output;
+	u_int8_t l_program[MC_MAX_LISTENERS_PER_GROUP];
+	struct mc_listener listener[MC_MAX_LISTENERS_PER_GROUP];
+}__attribute__((__packed__)) mcast_entry_t;
+
+extern struct list_head mc_table[MC_NUM_HASH_ENTRIES];
+struct mcast_entry *mc_find ( void  *data, unsigned char family );
+struct mcast_entry *mc_add(struct mcast_entry *mc, void *entry, cmmd_mc_listener_t *listener, unsigned char program, unsigned char family );
+int  mc_remove( struct mcast_entry *mc, cmmd_mc_listener_t * listener, int num_entries );
+void mc_remove_group(void * entryCmd,unsigned char family);
+int mc_reset(  unsigned char family );
+int mc_update( struct mcast_entry *mc, cmmd_mc_listener_t *listener, int  num_output);
+void mc_update_table( FCI_CLIENT *fci, struct rtattr *tb[], struct ifinfomsg *ifi );
+int mc6_send_command( FCI_CLIENT *fci, unsigned short action, struct mcast_entry *mc , char * Ifname);
+int mc4_send_command( FCI_CLIENT *fci, unsigned short action, struct mcast_entry *mc , char * Ifname);
+
+int mc4_update_entry( cmmd_mc4_entry_t *entry,cmmd_mc_listener_t *listener, unsigned short action );
+int mc6_update_entry( cmmd_mc6_entry_t *entry,cmmd_mc_listener_t *listener, unsigned short action );
+#endif
diff --git a/cmm/src/module_natpt.c b/cmm/src/module_natpt.c
new file mode 100755
index 0000000..a604bcc
--- /dev/null
+++ b/cmm/src/module_natpt.c
@@ -0,0 +1,301 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+#include "cmm.h"
+#include <stdlib.h>
+#include <string.h>
+#include "module_natpt.h"
+
+static void cmmNATPTSetUsage(void)
+{
+	cmm_print(DEBUG_STDOUT, 
+			"Usage: set natpt \n"
+			"\n"
+			"                                  [open]\n"
+			"                                       [sock_id_a {socket ID}]\n"
+			"                                       [sock_id_b {socket ID}]\n"
+			"                                       [6to4] \n"
+			"                                       [4to6] \n"
+			"\n"
+			"                                  [close]\n"
+			"                                       [sock_id_a {socket ID}]\n"
+			"                                       [sock_id_b {socket ID}]\n"
+			"\n"
+	          );
+}
+static void cmmNATPTQueryUsage(void)
+{
+	cmm_print(DEBUG_STDOUT, 
+			"Usage: query natpt\n"
+			"             [sock_id_a {socket ID}]\n"
+			"             [sock_id_b {socket ID}]\n"
+			"\n"
+	          );
+}
+int cmmNATPTSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	unsigned int tmp;
+	char * endptr;
+	char rcvBuffer[256];
+
+	if(!keywords[cpt])
+		goto print_help;
+
+	if (strcasecmp(keywords[cpt], "open") == 0)
+	{
+		fpp_natpt_open_cmd_t cmd;
+
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		memset(&cmd, 0, sizeof(cmd));
+
+		if((strcasecmp(keywords[cpt], "sock_id_a") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "ERROR: sock_id_a parameter must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.socket_a= tmp;
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto print_help;
+	
+		if((strcasecmp(keywords[cpt], "sock_id_b") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+		
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "ERROR: sock_id_b parameter must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.socket_b= tmp;
+		}
+		else
+			goto keyword_error;
+
+		while (keywords[++cpt])
+		{
+			if((strcasecmp(keywords[cpt], "6to4") == 0))
+				cmd.control |= FPP_NATPT_CONTROL_6to4;
+			else if((strcasecmp(keywords[cpt], "4to6") == 0))
+				cmd.control |= FPP_NATPT_CONTROL_4to6;
+			else
+				goto keyword_error;
+		}
+
+		if (cmd.control == 0)
+		{
+			cmm_print(DEBUG_CRIT, "ERROR: 6to4 or 4to6 must be specified\n");
+			goto print_help;
+		}
+
+		// Send  command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_NATPT_OPEN, &cmd, sizeof(cmd), &rcvBuffer) == 2)
+		{
+			if ((((unsigned short*)rcvBuffer)[0]) != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP \n", ((unsigned short*)rcvBuffer)[0]);
+		}
+	}
+	
+	else if (strcasecmp(keywords[cpt], "close") == 0)
+	{
+		fpp_natpt_close_cmd cmd;
+
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		memset(&cmd, 0, sizeof(cmd));
+
+		if((strcasecmp(keywords[cpt], "sock_id_a") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "ERROR: sock_id_a parameter must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.socket_a= tmp;
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto print_help;
+	
+		if((strcasecmp(keywords[cpt], "sock_id_b") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+		
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "ERROR: sock_id_b parameter must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.socket_b= tmp;
+		}
+		else
+			goto keyword_error;
+
+		if (keywords[++cpt])
+			goto keyword_error;
+
+		// Send  command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_NATPT_CLOSE, &cmd, sizeof(cmd), &rcvBuffer) == 2)
+		{
+			if ((((unsigned short*)rcvBuffer)[0]) != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP \n", ((unsigned short*)rcvBuffer)[0]);
+		}
+	}
+	else
+	{
+		goto keyword_error;
+	}
+	
+	return 0;
+
+keyword_error:
+	cmm_print(DEBUG_STDOUT,"ERR: unknown keyword %s\n", keywords[cpt]);
+print_help:
+	cmmNATPTSetUsage();
+	return -1;
+}
+
+int cmmNATPTQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int rcvBytes;
+	int cpt = tabStart;
+	unsigned int tmp;
+	char * endptr;
+	char rcvBuffer[256];
+	fpp_natpt_query_cmd_t cmd;
+	fpp_natpt_query_response_t *pEntryResponse;
+
+	if(!keywords[cpt])
+		goto print_help;
+
+	memset(&cmd, 0, sizeof(cmd));
+
+	if((strcasecmp(keywords[cpt], "sock_id_a") == 0))
+	{
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		/*Get an integer from the string*/
+		endptr = NULL;
+		tmp = strtoul(keywords[cpt], &endptr, 0);
+		if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+		{
+			cmm_print(DEBUG_CRIT, "ERROR: sock_id_a parameter must be a number between 0 and %d\n", USHRT_MAX);
+			goto  print_help;
+		}
+		cmd.socket_a= tmp;
+	}
+	else
+		goto keyword_error;
+
+	if(!keywords[++cpt])
+		goto print_help;
+
+	if((strcasecmp(keywords[cpt], "sock_id_b") == 0))
+	{
+		if(!keywords[++cpt])
+			goto print_help;
+	
+		/*Get an integer from the string*/
+		endptr = NULL;
+		tmp = strtoul(keywords[cpt], &endptr, 0);
+		if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+		{
+			cmm_print(DEBUG_CRIT, "ERROR: sock_id_b parameter must be a number between 0 and %d\n", USHRT_MAX);
+			goto  print_help;
+		}
+		cmd.socket_b= tmp;
+	}
+	else
+		goto keyword_error;
+
+	if (keywords[++cpt])
+		goto keyword_error;
+
+	// Send  command
+	rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_NATPT_QUERY, &cmd, sizeof(cmd), &rcvBuffer);
+	if (rcvBytes != sizeof(fpp_natpt_query_response_t))
+	{
+		cmm_print(DEBUG_STDERR, "ERROR: CMD_NATPT_QUERY Unexpected result returned from FPP rc:%04x - received %d - expected %d\n",
+			(rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer),
+			rcvBytes, sizeof(fpp_natpt_query_response_t)
+		);
+		return -1;
+	}
+	pEntryResponse = (fpp_natpt_query_response_t *)rcvBuffer;
+	if (pEntryResponse->retcode != 0)
+	{
+		cmm_print(DEBUG_STDERR, "Error %d received from FPP \n", pEntryResponse->retcode);
+		return -1;
+	}
+
+	cmm_print(DEBUG_STDOUT, "NAT-PT Entry:\n\tSocket A: %d, Socket B: %d%s%s%s\n",
+					pEntryResponse->socket_a, pEntryResponse->socket_b,
+					(pEntryResponse->control & FPP_NATPT_CONTROL_6to4) ? ", 6to4" : "",
+					(pEntryResponse->control & FPP_NATPT_CONTROL_4to6) ? ", 4to6" : "",
+					(pEntryResponse->control & FPP_NATPT_CONTROL_TCPFIN) ? ", TCP_FIN" : "");
+	cmm_print(DEBUG_STDOUT, "\t# of IPv6 Packets Received: %lld\n", pEntryResponse->stat_v6_received);
+	cmm_print(DEBUG_STDOUT, "\t# of IPv6 Packets Transmitted: %lld\n", pEntryResponse->stat_v6_transmitted);
+	cmm_print(DEBUG_STDOUT, "\t# of IPv6 Packets Dropped: %lld\n", pEntryResponse->stat_v6_dropped);
+	cmm_print(DEBUG_STDOUT, "\t# of IPv6 Packets Sent to ACP: %lld\n", pEntryResponse->stat_v6_sent_to_ACP);
+	cmm_print(DEBUG_STDOUT, "\t# of IPv4 Packets Received: %lld\n", pEntryResponse->stat_v4_received);
+	cmm_print(DEBUG_STDOUT, "\t# of IPv4 Packets Transmitted: %lld\n", pEntryResponse->stat_v4_transmitted);
+	cmm_print(DEBUG_STDOUT, "\t# of IPv4 Packets Dropped: %lld\n", pEntryResponse->stat_v4_dropped);
+	cmm_print(DEBUG_STDOUT, "\t# of IPv4 Packets Sent to ACP: %lld\n", pEntryResponse->stat_v4_sent_to_ACP);
+
+	return 0;
+
+
+keyword_error:
+	cmm_print(DEBUG_STDOUT,"ERR: unknown keyword %s\n", keywords[cpt]);
+print_help:
+	cmmNATPTQueryUsage();
+	return -1;
+}
+
diff --git a/cmm/src/module_natpt.h b/cmm/src/module_natpt.h
new file mode 100755
index 0000000..c7e3635
--- /dev/null
+++ b/cmm/src/module_natpt.h
@@ -0,0 +1,27 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_NATPT_H__
+#define __MODULE_NATPT_H__
+
+int cmmNATPTSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+int cmmNATPTQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+int cmmNATPTQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+
+#endif
diff --git a/cmm/src/module_pktcap.c b/cmm/src/module_pktcap.c
new file mode 100644
index 0000000..9eda636
--- /dev/null
+++ b/cmm/src/module_pktcap.c
@@ -0,0 +1,426 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+
+#include <net/if.h>
+#include <linux/if_vlan.h>
+#include <linux/sockios.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <ctype.h>
+
+#include "libcmm.h"
+#include "cmm.h"
+#include "fpp.h"
+#include "itf.h"
+#include "module_pktcap.h"
+
+#define MIN_SLICE_VALUE		40
+#define MAX_SLICE_VALUE		1518
+#define SNAP_LENGTH          	96
+
+
+
+int PktCapSliceProcess(daemon_handle_t daemon_handle, int argc, char *argv[])
+{
+
+        cmm_command_t           cmd;
+        cmm_response_t          res;
+        fpp_pktcap_slice_cmd_t 	*pktcap_cmd;
+	unsigned char		port_id;
+	unsigned short		slice;
+	char buf[128];
+
+	
+	if (argc != 2)
+		goto usage;
+		
+	if ((char)(port_id = get_port_id(argv[0])) < 0)
+		goto usage;
+
+
+	if (! isdigit(*argv[1]))
+		goto usage;
+	
+	slice = atoi(argv[1]);
+
+	if ( (slice < MIN_SLICE_VALUE )||(slice > MAX_SLICE_VALUE))
+	{
+		cmm_print(DEBUG_ERROR,"slice value should be between(%d-%d)", MIN_SLICE_VALUE, MAX_SLICE_VALUE);
+		return -1;
+	}
+
+	memset(&cmd, 0 , sizeof(cmd));
+        memset(&res, 0 , sizeof(res));
+	
+	
+	cmd.func 	= FPP_CMD_PKTCAP_SLICE;
+	cmd.length 	= sizeof(fpp_pktcap_slice_cmd_t);
+	pktcap_cmd	= (fpp_pktcap_slice_cmd_t*)&cmd.buf;
+	pktcap_cmd->action	= FPP_PKTCAP_SLICE;
+	pktcap_cmd->ifindex	= port_id;
+	pktcap_cmd->slice	= slice;
+	if (cmm_send(daemon_handle, &cmd, 0) != 0) {
+                cmm_print(DEBUG_ERROR,"Error sending message to CMM, error = `%s'\n", strerror(errno));
+                return -1;
+        }
+
+        if (cmm_recv(daemon_handle, &res, 0) < 0) {
+                cmm_print(DEBUG_ERROR,"Error receiving message from CMM, error = `%s'\n", strerror(errno));
+                return -1;
+        }
+
+        if (res.rc != FPP_ERR_OK) {
+                cmm_print(DEBUG_ERROR,"Error from CMM, error = `%d'\n", res.rc);
+                return -1;
+        }
+	
+        return CLI_OK;
+usage:
+	print_all_gemac_ports(buf, 128);
+	cmm_print(DEBUG_ERROR, "Usage: pktcapture  slice <%s> <value>\n", buf);
+        return -1;
+}
+
+int PktCapStatProcess(daemon_handle_t daemon_handle, int argc, char *argv[])
+{
+        cmm_command_t           cmd;
+        cmm_response_t          res;
+        fpp_pktcap_status_cmd_t        *pktcap_cmd;
+        unsigned char           port_id;
+        unsigned char		status;
+	char 			buf[128];
+
+
+	if (argc != 2)
+		goto usage;
+
+	if ((char)(port_id = get_port_id(argv[0])) < 0)
+		goto usage;
+
+
+        if (strcmp(argv[1] , "enable") == 0)
+                status = PKTCAP_IFSTATUS_ENABLE;
+        else if (strcmp(argv[1], "disable") == 0)
+                status = PKTCAP_IFSTATUS_DISABLE;
+        else
+                goto usage;
+	
+
+        memset(&cmd, 0 , sizeof(cmd));
+        memset(&res, 0 , sizeof(res));
+
+        
+        cmd.func        = FPP_CMD_PKTCAP_IFSTATUS;
+        cmd.length      = sizeof(fpp_pktcap_status_cmd_t);
+        pktcap_cmd      = (fpp_pktcap_status_cmd_t*)&cmd.buf;
+        pktcap_cmd->action      = FPP_PKTCAP_STATUS;
+        pktcap_cmd->ifindex     = port_id;
+        pktcap_cmd->status      = status;
+
+        if (cmm_send(daemon_handle, &cmd, 0) != 0) {
+                cmm_print(DEBUG_ERROR,"Error sending message to CMM, error = `%s'\n", strerror(errno));
+                return -1;
+        }
+
+        if (cmm_recv(daemon_handle, &res, 0) < 0) {
+                cmm_print(DEBUG_ERROR,"Error receiving message from CMM, error = `%s'\n", strerror(errno));
+                return -1;
+        }
+
+        if (res.rc != FPP_ERR_OK) {
+                cmm_print(DEBUG_ERROR,"Error from CMM, error = `%d'\n", res.rc);
+                return -1;
+        }
+
+        return CLI_OK;
+usage:
+	print_all_gemac_ports(buf, 128);
+	cmm_print(DEBUG_ERROR, "Usage: pktcapture status <%s> <enable|disable>\n", buf);
+        return CLI_OK;
+
+}
+
+
+int PktCapFilterProcess(daemon_handle_t daemon_handle, int argc, char *argv[])
+{
+	cmm_command_t           cmd;
+        cmm_response_t          res;
+        struct bpf_program fd = {0,NULL};
+        fpp_pktcap_flf_cmd_t *pFlfCmd = NULL;
+        int port_id = 0, fgmts = 0;
+	int length = 0, seqno = 0;
+	char buf[128];
+
+        if (argc < 2)
+                goto usage;
+
+	if ((char)(port_id = get_port_id(argv[0])) < 0)
+		goto usage;
+
+	
+
+	cmd.func        = FPP_CMD_PKTCAP_FLF;
+	cmd.length      = sizeof(fpp_pktcap_flf_cmd_t);
+	pFlfCmd =	(fpp_pktcap_flf_cmd_t* )&cmd.buf; 
+
+	if( strlen(argv[1]) >= 1024 )
+	{
+		cmm_print(DEBUG_ERROR,"Error Filter too long \n");
+		goto usage;
+	}
+	
+
+        pcap_t *pd = pcap_open_dead(DLT_EN10MB, SNAP_LENGTH);
+        if(pd)
+	{
+		if(pcap_compile(pd, &fd, argv[1], 1, 0)<0)
+		{
+			cmm_print(DEBUG_ERROR,"Error Invalid filter string \n");
+			goto done;
+		}
+
+		if(( fd.bf_len == 1)&& ( fd.bf_insns[0].code == BPF_RET ))// Filter reset !!	
+			goto reset_flf;
+
+		pFlfCmd->ifindex = port_id;
+		pFlfCmd->flen = length = fd.bf_len & 0xFFFF;
+
+		if(Check_BPFfilter(fd.bf_insns, fd.bf_len))
+		{
+			cmm_print(DEBUG_ERROR,"Error This filter combination is not supported by FLF\n");
+			goto done;
+		}
+			
+		if(fd.bf_len > MAX_FLF_INSTRUCTIONS) 
+		{
+			cmm_print(DEBUG_ERROR,"Warning: Filter could be too expensive");
+			length = MAX_FLF_INSTRUCTIONS;	
+			fgmts = (fd.bf_len / MAX_FLF_INSTRUCTIONS);
+			if( fd.bf_len % MAX_FLF_INSTRUCTIONS )
+				++fgmts; // Account for one more fragment;
+		}
+		do
+		{
+			
+			memcpy(pFlfCmd->filter, &fd.bf_insns[seqno * MAX_FLF_INSTRUCTIONS], length * sizeof(struct bpf_insn));
+
+			pFlfCmd->mfg     = ((( fgmts - (seqno + 1)) > 0) << 3 ) | (seqno & 0x7);
+					
+
+			/* Push to FPP */
+			if (cmm_send(daemon_handle, &cmd, 0) != 0) {
+				cmm_print(DEBUG_ERROR,"Error sending message to CMM, error = `%s'\n", strerror(errno));
+				goto reset_flf;
+			}
+
+			if (cmm_recv(daemon_handle, &res, 0) < 0) {
+				cmm_print(DEBUG_ERROR,"Error receiving message from CMM, error = `%s'\n", strerror(errno));
+				goto reset_flf;
+			}
+
+			if (res.rc != FPP_ERR_OK) {
+				cmm_print(DEBUG_ERROR,"Error from CMM, error = `%d'\n", res.rc);
+				goto reset_flf;
+			}
+			pFlfCmd->flen = (fd.bf_len - (++seqno * MAX_FLF_INSTRUCTIONS));
+			if( pFlfCmd->flen / MAX_FLF_INSTRUCTIONS)
+			{
+				length = pFlfCmd->flen = MAX_FLF_INSTRUCTIONS;
+				continue;
+			}
+			else
+				length = pFlfCmd->flen;
+			
+
+		}while(seqno < fgmts);
+	}
+
+done:
+        if(fd.bf_insns) free(fd.bf_insns);
+	if(pd) pcap_close(pd);
+        return CLI_OK;
+
+usage:
+	print_all_gemac_ports(buf, 128);
+	cmm_print(DEBUG_ERROR, "Usage: pktcapture filter <%s> <string>\n", buf);
+	return CLI_OK;
+
+reset_flf:
+	cmm_print(DEBUG_ERROR, "Resetting filter");
+	/* cleanup structures got from library */
+        if(fd.bf_insns) free(fd.bf_insns);
+	if(pd) pcap_close(pd);
+
+	/* reset length */
+	pFlfCmd->ifindex = port_id;
+	pFlfCmd->flen    = 0;
+
+	if (cmm_send(daemon_handle, &cmd, 0) != 0) {
+		cmm_print(DEBUG_ERROR,"Error sending message to CMM, error = `%s'\n", strerror(errno));
+		return -1;
+	}
+	if (cmm_recv(daemon_handle, &res, 0) < 0) {
+		cmm_print(DEBUG_ERROR,"Error receiving message from CMM, error = `%s'\n", strerror(errno));
+		return -1;
+	}
+	if (res.rc != FPP_ERR_OK) {
+		cmm_print(DEBUG_ERROR,"Error from CMM, error = `%d'\n", res.rc);
+		return -1;
+	}
+        return CLI_OK;
+}
+
+/* 
+ * The purpose of this function is to ensure the filter is compatible with our 
+ * version of BPF interpretor in FPP.
+ * As libpcap version changes further, with changes in the filter corresponding changes 
+ * will also have to be made in fpp. 
+ */
+
+int Check_BPFfilter(struct bpf_insn *filter, int flen)
+{
+        struct bpf_insn *ftest;
+        int pc;
+
+        if (flen == 0 || flen > (3*MAX_FLF_INSTRUCTIONS))
+                return -EINVAL;
+
+        /* check the filter code now */
+        for (pc = 0; pc < flen; pc++) {
+                ftest = &filter[pc];
+
+                /* Only allow valid instructions */
+                switch (ftest->code) {
+                case BPF_ALU|BPF_ADD|BPF_K:
+                case BPF_ALU|BPF_ADD|BPF_X:
+                case BPF_ALU|BPF_SUB|BPF_K:
+                case BPF_ALU|BPF_SUB|BPF_X:
+                case BPF_ALU|BPF_MUL|BPF_K:
+                case BPF_ALU|BPF_MUL|BPF_X:
+                case BPF_ALU|BPF_DIV|BPF_X:
+                case BPF_ALU|BPF_AND|BPF_K:
+                case BPF_ALU|BPF_AND|BPF_X:
+                case BPF_ALU|BPF_OR|BPF_K:
+                case BPF_ALU|BPF_OR|BPF_X:
+                case BPF_ALU|BPF_LSH|BPF_K:
+                case BPF_ALU|BPF_LSH|BPF_X:
+                case BPF_ALU|BPF_RSH|BPF_K:
+                case BPF_ALU|BPF_RSH|BPF_X:
+                case BPF_ALU|BPF_NEG:
+                case BPF_LD|BPF_W|BPF_ABS:
+                case BPF_LD|BPF_H|BPF_ABS:
+                case BPF_LD|BPF_B|BPF_ABS:
+                case BPF_LD|BPF_W|BPF_LEN:
+                case BPF_LD|BPF_W|BPF_IND:
+                case BPF_LD|BPF_H|BPF_IND:
+                case BPF_LD|BPF_B|BPF_IND:
+                case BPF_LD|BPF_IMM:
+                case BPF_LDX|BPF_W|BPF_LEN:
+                case BPF_LDX|BPF_B|BPF_MSH:
+                case BPF_LDX|BPF_IMM:
+                case BPF_MISC|BPF_TAX:
+                case BPF_MISC|BPF_TXA:
+                case BPF_RET|BPF_K:
+                case BPF_RET|BPF_A:
+                        break;
+
+                /* Some instructions need special checks */
+
+                case BPF_ALU|BPF_DIV|BPF_K:
+                        /* check for division by zero */
+                        if (ftest->k == 0)
+                                return -EINVAL;
+                        break;
+
+                case BPF_LD|BPF_MEM:
+                case BPF_LDX|BPF_MEM:
+                case BPF_ST:
+                case BPF_STX:
+                        /* check for invalid memory addresses */
+                        if (ftest->k >= BPF_MEMWORDS)
+                                return -EINVAL;
+                        break;
+
+                case BPF_JMP|BPF_JA:
+	                /*
+ 	                 * Note, the large ftest->k might cause loops.
+	                 * Compare this with conditional jumps below,
+                         * where offsets are limited. --ANK (981016)
+                         */
+                        if (ftest->k >= (unsigned)(flen-pc-1))
+                                return -EINVAL;
+                        break;
+
+                case BPF_JMP|BPF_JEQ|BPF_K:
+                case BPF_JMP|BPF_JEQ|BPF_X:
+                case BPF_JMP|BPF_JGE|BPF_K:
+                case BPF_JMP|BPF_JGE|BPF_X:
+                case BPF_JMP|BPF_JGT|BPF_K:
+                case BPF_JMP|BPF_JGT|BPF_X:
+                case BPF_JMP|BPF_JSET|BPF_K:
+                case BPF_JMP|BPF_JSET|BPF_X:
+                        /* for conditionals both must be safe */
+                        if (pc + ftest->jt + 1 >= flen ||
+                            pc + ftest->jf + 1 >= flen)
+                                return -EINVAL;
+                        break;
+
+                default:
+                        return -EINVAL;
+                }
+        }
+
+        return (BPF_CLASS(filter[flen - 1].code) == BPF_RET) ? 0 : -EINVAL;
+}
+
+
+
+int PktCapQueryProcess(struct cli_def *cli, daemon_handle_t daemon_handle) 
+{
+	/* Query fpp for the details */
+       	char rcvBuffer[256];
+	fpp_pktcap_query_cmd_t *pktcap_cmd; 
+	int ii;
+
+        pktcap_cmd      = (fpp_pktcap_query_cmd_t*)&rcvBuffer;
+	
+
+	if ((cmmSendToDaemon(daemon_handle, FPP_CMD_PKTCAP_QUERY, pktcap_cmd, 
+							0, pktcap_cmd)) < sizeof(fpp_pktcap_query_cmd_t))
+	{
+                cmm_print(DEBUG_ERROR,"Error sending message to CMM, error = `%s'\n", strerror(errno));
+                return -1;
+        }
+
+	for (ii = 0; ii < GEM_PORTS; ii++)
+	{
+		cli_print(cli, "slice  <%s> %d \n", port_table[ii].logical_name, pktcap_cmd[port_table[ii].port_id].slice);
+	}
+
+	for (ii = 0; ii < GEM_PORTS; ii++)
+	{
+		cli_print(cli, "status <%s> %d \n", port_table[ii].logical_name, pktcap_cmd[port_table[ii].port_id].status);
+	}
+
+        return CLI_OK;
+}
+
diff --git a/cmm/src/module_pktcap.h b/cmm/src/module_pktcap.h
new file mode 100644
index 0000000..ab4f7bf
--- /dev/null
+++ b/cmm/src/module_pktcap.h
@@ -0,0 +1,43 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_PKTCAP_H__
+#define __MODULE_PKTCAP_H__
+#include "fpp.h"
+
+#define CMD_PKTCAP_IFSTATUS	FPP_CMD_PKTCAP_IFSTATUS	
+#define CMD_PKTCAP_SLICE	FPP_CMD_PKTCAP_SLICE	
+#define CMD_PKTCAP_FLF          FPP_CMD_PKTCAP_FLF
+
+#define PKTCAP_IFSTATUS_ENABLE  0x1
+#define PKTCAP_IFSTATUS_DISABLE 0x0
+
+
+
+int PktCapSliceProcess(daemon_handle_t daemon_handle, int argc, char *argv[]);
+
+int PktCapStatProcess(daemon_handle_t daemon_handle, int argc, char *argv[]);
+
+int PktCapFilterProcess(daemon_handle_t daemon_handle, int argc, char *argv[]);
+
+int PktCapQueryProcess(struct cli_def *cli, daemon_handle_t daemon_handle);
+
+int Check_BPFfilter(struct bpf_insn *filter, int flen);
+
+#endif
diff --git a/cmm/src/module_prf.c b/cmm/src/module_prf.c
new file mode 100644
index 0000000..daf2b0b
--- /dev/null
+++ b/cmm/src/module_prf.c
@@ -0,0 +1,614 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+#include "cmm.h"
+#include <ctype.h>
+
+/*Function codes*/
+/* 0x0fxx : trace/profiling */
+#define FPP_CMD_TRC_ON                              0x0f01
+#define FPP_CMD_TRC_OFF                             0x0f02
+#define FPP_CMD_TRC_SWITCH                          0x0f03
+#define FPP_CMD_TRC_DMEM                            0x0f04
+#define FPP_CMD_TRC_SETMASK                         0x0f05
+#define FPP_CMD_TRC_SHOW                            0x0f06
+#define FPP_CMD_TRC_BSYCPU                          0x0f07
+#define FPP_CMD_TRC_STATUS                          0x0f08
+/* Trace/profiling return codes */
+#define FPP_ERR_TRC_SOME_OK                         0xf00
+#define FPP_ERR_TRC_UNIMPLEMENTED                   0xf7f
+
+/*
+** Command/response layouts
+*/
+/* Display memory command */
+typedef struct fpp_dm_cmd {
+        u_int16_t       pad_in_rc_out; /* Padding - retcode */
+        u_int16_t       msp_len;      /* Lenght of memory to display < 224 bytes
+                               ** returns length being displayed in response */
+        u_int32_t       msp_addr;       /* msp address of memory to display
+                               ** returns address being displayed in response */
+        u_int8_t        mspmem[224];
+} __attribute__((__packed__)) fpp_dm_cmd_t;
+
+/* Trace On command */
+typedef struct fpp_trc_on_cmd {
+        u_int16_t       pad_in_rc_out; /* Padding - retcode */
+        u_int16_t       pad;
+        u_int16_t       pmn0_id;       /* counter code for PMN0 counter to use - default 0*/
+        u_int16_t       pmn1_id;       /* counter code for PMN1 counter to use - default 2*/
+} __attribute__((__packed__)) fpp_trc_on_cmd_t;
+
+/* Trace switch/show/stop */
+typedef struct fpp_trc_off_cmd {
+        u_int16_t       pad_in_rc_out;
+        u_int16_t       pad_in_ec_out;
+        u_int16_t       pmn0_id;
+        u_int16_t       pmn1_id;
+        u_int16_t       trc_module_mask;
+        u_int16_t       trc_ctr_length;
+        u_int16_t       trc_mask_length;
+        u_int16_t       trc_length;
+        u_int32_t       trc_address;
+} __attribute__((__packed__)) fpp_trc_off_cmd_t;
+
+/* trace status */
+typedef struct fpp_trc_stat_cmd {
+        u_int16_t       pad_in_rc_out;  /* Padding - retcode */
+        u_int16_t       state;          /* state 0:off
+                                         * 1:tracing on
+                                         * 2:available cpu measurement on */
+        u_int16_t       pmn0;           /* counter code for PMN0 counter in use*/
+        u_int16_t       pmn1;           /* counter code for PMN1 counter in use*/
+        u_int32_t       trc_mask;       /* bitmask of module probes would be in effect */
+        u_int32_t       bsycpu_weight;  /* weight factor (would be) in effect */
+} __attribute__((__packed__)) fpp_trc_stat_cmd_t;
+
+/* trace setmask */
+typedef struct fpp_trc_sm_cmd {
+        u_int16_t       mask_in_rc_out; /* Input mask - retcode */
+} __attribute__((__packed__)) fpp_trc_sm_cmd_t;
+
+/* busycpy start/stop */
+typedef struct fpp_trc_cpu_cmd {
+        u_int16_t       pad_in_rc_out;          /* Padding - retcode */
+        u_int16_t       on_off;                 /* 0:stop, 1: start or change weight */
+        u_int32_t       on_weight_off_pad;      /* start only: weight factor value to use */
+        u_int64_t       off_rsp_busy_count; /* stop only: used cpu cycles */
+        u_int64_t       off_rsp_idle_count; /* stop only: available cpu cycles */
+} __attribute__((__packed__)) fpp_trc_cpu_cmd_t;
+
+/*****************************************************************
+ * cmmMspMemShow
+ *
+ *
+******************************************************************/
+
+static void msp_dm(daemon_handle_t daemon_handle, unsigned int mm_address, unsigned int mm_length, int fmt) {
+  /*
+  ** fmt - format - bit mask
+  ** 	0x1 - human readable words 
+  **	0x2 - prefix each line with hex addr
+  */
+  fpp_dm_cmd_t cmd, *prsp;
+
+  unsigned int tmp,i,j,k;
+  unsigned char rspbuf[512];
+  char output_line[128] ; //cli(cmm) inserts newlines - need to buffer 
+  unsigned short rsplen;
+  prsp = (void *)rspbuf;
+
+  for(tmp = 0;tmp < mm_length;) {
+    cmd.msp_addr = mm_address + tmp;
+    if ( (mm_length-tmp) > sizeof(cmd.mspmem))
+      cmd.msp_len = sizeof(cmd.mspmem);
+    else
+      cmd.msp_len = mm_length -tmp;
+      
+    if (cmd.msp_len > 16) { 
+      // For long queries we want to go in multiples of 16
+      cmd.msp_len = ((cmd.msp_len >> 4) << 4);
+    }
+//    cmm_print(DEBUG_COMMAND, "Send CMD_TRC_DMEM l:%d %04x ql:%04x qa:%08x\n",
+//	      (sizeof(cmd)- sizeof(cmd.mspmem)),
+//	      cmd.pad_in_rc_out,
+//	      cmd.msp_len,
+//	      cmd.msp_addr );
+    if ( 
+	( (rsplen = cmmSendToDaemon(daemon_handle,FPP_CMD_TRC_DMEM,&cmd,(sizeof(cmd)- sizeof(cmd.mspmem)),rspbuf)) < sizeof(unsigned short) ) ||
+	cmmDaemonCmdRC(rspbuf)
+	)
+      {
+      cmm_print(DEBUG_ERROR, "Error sending CMD_TRC_DMEM\n");
+      /*  break; */ return;
+    }
+//    cmm_print(DEBUG_COMMAND, "Response to CMD_TRC_DMEM rsplen rc:%04x rl:%04x ra:%08x\n",
+//	      prsp->pad_in_rc_out,
+//	      prsp->msp_len,
+//	      prsp->msp_addr );
+    tmp += prsp->msp_len;
+#define MIN_ACK_LEN 8
+
+    if ((rsplen < MIN_ACK_LEN ) || (prsp->pad_in_rc_out)) {
+       cmm_print(DEBUG_ERROR, "Bad response to CMD_TRC_DMEM, rsplen %d , rc %d\n", rsplen, prsp->pad_in_rc_out);
+      /*  break; */ return;
+    }
+#undef  MIN_ACK_LEN 
+    for(i=prsp->msp_len;i > 0;) {
+      k = (i > 16) ? 16 : i;
+      if (fmt & 2) 
+	j = sprintf(output_line,"0x%08x:", cmd.msp_addr + cmd.msp_len - i);
+      else
+	j = 0;
+      do {
+	switch (i) {
+	case 1:
+	  j += sprintf(output_line+j," %02x",
+		       prsp->mspmem[prsp->msp_len-1]);
+	  k -= 1;
+	  i -= 1;
+	  break;
+	case 2:
+	  j += sprintf(output_line+j," %02x%02x",
+		       prsp->mspmem[prsp->msp_len-2],
+		       prsp->mspmem[prsp->msp_len-1]);
+	  k -= 2;
+	  i -= 2;
+	  break;
+	case 3:
+	  j += sprintf(output_line+j," %02x%02x%02x",
+		       prsp->mspmem[prsp->msp_len-3],
+		       prsp->mspmem[prsp->msp_len-2],
+		       prsp->mspmem[prsp->msp_len-1]);
+	  k -= 3;
+	  i -= 3;
+	  break;
+	default:
+	  if (fmt & 1) {
+	    j += sprintf(output_line+j," %08x",
+			 *((unsigned int*)(prsp->mspmem+prsp->msp_len-i) )
+			 );
+	  } else {
+	  j += sprintf(output_line+j," %02x%02x%02x%02x",
+		       prsp->mspmem[prsp->msp_len-i],
+		       prsp->mspmem[prsp->msp_len-i+1],
+		       prsp->mspmem[prsp->msp_len-i+2],
+		       prsp->mspmem[prsp->msp_len-i+3]);
+	  }
+	  k -= 4;
+	  i -= 4;
+	  break;
+	}
+      } while(k);
+      cmm_print(DEBUG_STDOUT,"%s\n",output_line);
+    } // for
+
+  }
+  return;
+}
+
+int prfMspMS(daemon_handle_t daemon_handle, int argc, char *argv[])
+{
+  unsigned int startaddr;
+  unsigned int len,tmp;
+
+  //  startaddr = simple_strtoul(argv[0],NULL,0);
+  if ((argc < 1) || (1 != sscanf(argv[0],"%i",&startaddr)))
+    goto usage;
+
+  len = 16;
+  if (argc > 1) {
+    //    len =  simple_strtoul(argv[1],NULL,0);
+    if (1 == sscanf(argv[1],"%i",&tmp))
+      len = tmp;
+  }
+  // display - arbitrary length,wire format 
+  msp_dm(daemon_handle, startaddr, len, 0);
+  return 0;
+ usage:
+  cmm_print(DEBUG_ERROR, "Usage: shmspmem bytes addr [len|16]\n");
+  return 0;
+
+}
+
+int prfMspMSW(daemon_handle_t daemon_handle, int argc, char *argv[])
+{
+  unsigned int startaddr;
+  unsigned int len,tmp;
+
+  //  startaddr = simple_strtoul(argv[0],NULL,0);
+  if ((argc < 1) || (1 != sscanf(argv[0],"%i",&startaddr)))
+    goto usage;
+
+  len = 16;
+  if (argc > 1) {
+    //    len =  simple_strtoul(argv[1],NULL,0);
+    if (1 == sscanf(argv[1],"%i",&tmp))
+      len = tmp;
+  }
+  // display - arbitrary length,wire format 
+  msp_dm(daemon_handle, startaddr, len, 0x3);
+  return 0;
+ usage:
+  cmm_print(DEBUG_ERROR, "Usage: mspmem words addr [len|16], Address and length have to be multiple of 4\n");
+  return 0;
+
+}
+
+int prfMspCT(daemon_handle_t daemon_handle, int argc, char *argv[])
+{
+  /*  typedef */ struct {
+    void *next;
+    void *twin;
+    void *actNext;
+    void *actPrevious;
+    unsigned int Saddr;
+    unsigned int Daddr;
+    unsigned short Sport;
+    unsigned short Dport;
+    unsigned int     fwmark;
+    unsigned int keepAlive;  //keep alive timer
+    unsigned int timer;
+    void *pRtEntry;
+    void *pARPEntry;
+    //unsigned int fw_packets;
+    unsigned short ip_chksm_corr;
+    unsigned short tcp_udp_chksm_corr;
+    unsigned char      status;
+    unsigned char      proto;
+    unsigned char	pad1;
+    unsigned char	pad2;
+  } MCtEntry;
+
+  fpp_dm_cmd_t cmd, *prsp;
+    //Conntrack entry
+
+    unsigned int startaddr;
+    unsigned int tmp,count,j, k;
+    unsigned char rspbuf[512];
+    char output_line[128] ; //cli inserts newlines - need to buffer 
+
+  //  startaddr = simple_strtoul(argv[0],NULL,0);
+  if ((argc < 1) || (1 != sscanf(argv[0],"%i",&startaddr)))
+    goto usage;
+  
+  count = 16;
+  if (argc > 1) {
+    //    len =  simple_strtoul(argv[1],NULL,0);
+    if (1 == sscanf(argv[1],"%i",&tmp))
+      count = tmp;
+    if (count > 9999)
+      count = 9999;
+  }
+ 
+  prsp = (void*)rspbuf;
+  cmd.msp_addr = startaddr;
+  cmd.msp_len = sizeof(MCtEntry);
+  k = 0;
+  while (k < count) {
+    if (
+	(cmmSendToDaemon(daemon_handle,FPP_CMD_TRC_DMEM,&cmd,(sizeof(cmd)- sizeof(cmd.mspmem)),rspbuf) < sizeof(unsigned short) ) ||
+	cmmDaemonCmdRC(rspbuf)
+	)
+      {
+      cmm_print(DEBUG_ERROR, "Error_sending CMD_TRC_DMEM l:%d %04x ql:%04x qa:%08x\n",
+		(sizeof(cmd)- sizeof(cmd.mspmem)),
+		cmd.pad_in_rc_out,
+		cmd.msp_len,
+		cmd.msp_addr );
+      break;
+    }
+    memcpy(&MCtEntry,prsp->mspmem, sizeof(MCtEntry));
+    j = sprintf(output_line,"%04d @%08x", k,   prsp->msp_addr);
+    j += sprintf(output_line+j," n:%08x t:%08x an:%08x ap:%08x sa:%08x da:%08x S:%04x D:%04x",
+		 (int)MCtEntry.next,
+		 (int)MCtEntry.twin,
+		 (int)MCtEntry.actNext,
+		 (int)MCtEntry.actPrevious,
+		 MCtEntry.Saddr,
+		 MCtEntry.Daddr,
+		 MCtEntry.Sport,
+		 MCtEntry.Dport 
+		 );
+    cmm_print(DEBUG_STDOUT, "%s\n",output_line);
+    if ( MCtEntry.actNext == NULL)
+      break;
+    else
+      cmd.msp_addr = (unsigned int)MCtEntry.actNext;
+    cmd.msp_len = sizeof(MCtEntry);
+    k++;
+  }
+  
+  return 0;
+ usage:
+  cmm_print(DEBUG_STDOUT, "Usage: mspmem ct addr [count|9999], Address and length have to be multiple of 4\n");
+  return 0;
+
+}
+
+/* 
+   status
+*/  
+int prfStatus(daemon_handle_t daemon_handle, int argc, char *argv[]) {
+  fpp_trc_stat_cmd_t *res;
+  unsigned char rspbuf[CMM_BUF_SIZE];
+  unsigned short rc;
+
+  if (
+      (cmmSendToDaemon(daemon_handle,FPP_CMD_TRC_STATUS,NULL,0,rspbuf) < sizeof(unsigned short) ) ||
+      (rc = cmmDaemonCmdRC(rspbuf))
+      )
+    {
+      cmm_print(DEBUG_ERROR, "Error_sending CMD_TRC_SHOW command to fpp\n");
+      return 0;
+    } 
+
+  res = (fpp_trc_stat_cmd_t *)rspbuf;
+/*   cmm_print(DEBUG_STDOUT, */
+  cmm_print(DEBUG_COMMAND,
+	    " CMD_TRC_SHOW response:rc(%d) %04X %04X %04X %04X %08X %08X\n",
+	    rc,
+	    res->pad_in_rc_out, res->state,
+	    res->pmn0, res->pmn1,
+	    res->trc_mask, res->bsycpu_weight);
+  switch(res->state) {
+  case 0:
+    cmm_print(DEBUG_STDOUT, "Tracing is OFF\n");
+    break;
+  case 1:
+    cmm_print(DEBUG_STDOUT, "Tracing is ON\n");
+    break;
+  case 2:
+    cmm_print(DEBUG_STDOUT, "CPU measurement is ON\n");
+    break;
+  }
+  cmm_print(DEBUG_STDOUT,"pmn0:0x%02x pmn1:0x%02x t_mask:0x%04x b_weight 0x%x\n",
+	    res->pmn0, res->pmn1, res->trc_mask, res->bsycpu_weight);
+  return 0;
+}
+
+/* Busy CPU */
+int prfPTBusyCPU(daemon_handle_t daemon_handle, int argc, char **argv) {
+  fpp_trc_cpu_cmd_t cmd, *prsp;
+  unsigned char rspbuf[512];
+  unsigned short len;
+  int cmdrc;
+  unsigned int tmp;
+  if (argc < 1) 
+    goto usage;
+  if (strncmp(argv[0],"start",3) == 0) cmd.on_off = 1;
+  else if (strncmp(argv[0],"stop",3) == 0) cmd.on_off = 0;
+  else goto usage;
+
+  len = 2* sizeof(unsigned short);
+  if (cmd.on_off) {
+    if ((argc <2) || (1 !=  sscanf(argv[1],"%i",&tmp)))
+      tmp = 0;
+    cmd.on_weight_off_pad = tmp;
+    len += 2 * sizeof(unsigned short);
+  }
+
+  prsp = (void*) rspbuf;
+  cmm_print(DEBUG_COMMAND, "Send CMD_TRC_BSYCPU OnOff:%d\n",
+	    cmd.on_off);
+  if ( 
+      ( (cmdrc = cmmSendToDaemon(daemon_handle,  FPP_CMD_TRC_BSYCPU, &cmd, len, rspbuf)) < sizeof(unsigned short)) ||
+      (cmdrc = cmmDaemonCmdRC(rspbuf))
+      ) 
+    {
+      if ( (cmd.on_off) && (cmdrc == FPP_ERR_TRC_SOME_OK) ) {
+	cmm_print(DEBUG_STDOUT,"Only weight_factor value was changed\n");
+      }  else {
+	cmm_print(DEBUG_ERROR, "Error 0x%x sending TRC_BSYCPU OnOff:%d\n", cmdrc, cmd.on_off);
+      }
+    } else {
+      if (cmd.on_off) {
+	cmm_print(DEBUG_STDOUT,"Busy CPU measurement started\n");
+      } else if ( (prsp->off_rsp_busy_count > 0x100) || (prsp->off_rsp_idle_count >0x100 )) {
+	cmm_print(DEBUG_STDOUT,"Busy:0x%llX Idle:0x%llx BusyPart:%5.2f\n",
+		  prsp->off_rsp_busy_count ,
+		  prsp->off_rsp_idle_count,
+		  100.0 * (prsp->off_rsp_busy_count >> 8) / ((prsp->off_rsp_busy_count >> 8) +  (prsp->off_rsp_idle_count >> 8)));
+      }
+      else
+	cmm_print(DEBUG_STDOUT,"System is idle\n");
+    }
+
+  return 0;
+ usage:
+  cmm_print(DEBUG_STDOUT,"Usage: prf busycpu {start|stop} [weight_factor]\n");
+  return 0;
+}
+
+/* Tracing and profiling */
+int prfPTsetmask(daemon_handle_t daemon_handle, int argc, char **argv){
+  unsigned short cmd[2];
+  unsigned int tmp;
+  unsigned char rspbuf[512];
+
+  if ((argc < 1) || (1 !=  sscanf(argv[0],"%i",&tmp)))
+    goto usage;
+  cmd[0] = tmp;
+  cmm_print(DEBUG_COMMAND, "Sending CMD_TRC_SETMASK\n");
+  if ( (cmmSendToDaemon(daemon_handle,FPP_CMD_TRC_SETMASK, cmd, 2, rspbuf) < sizeof(unsigned short)) ||
+      cmmDaemonCmdRC(rspbuf))
+    {
+      cmm_print(DEBUG_ERROR, "Error sending CMD_TRC_SETMASK %s\n",argv[0]);
+    }
+  return 0;
+ usage:
+  cmm_print(DEBUG_STDOUT,"Usage: prf trace setmask MASK_VALUE\n");
+  return 0;
+}
+int prfPTstart(daemon_handle_t daemon_handle, int argc, char **argv){
+  fpp_trc_on_cmd_t cmd ;
+  unsigned int tmp, len;
+  len = 0;
+  if (argc > 0) {
+    if (1 !=  sscanf(argv[0],"%i",&tmp))
+      goto usage;
+    cmd.pmn0_id = (unsigned short) (tmp & 0xff);
+    len = 6 /* (offsetof(cmd.pmn1_id) + sizeof(cmd.pmn1_id)) */;
+    if (argc > 1) {
+      if (1 !=  sscanf(argv[1],"%i",&tmp))
+	goto usage;
+      len += sizeof(cmd.pmn1_id);
+      cmd.pmn1_id = (unsigned short) (tmp & 0xff);      
+    }
+  }
+  cmm_print(DEBUG_COMMAND, "Sending CMD_TRC_ON\n");
+  if (
+      (cmmSendToDaemon(daemon_handle, FPP_CMD_TRC_ON, &cmd, len, &cmd) < sizeof(unsigned short))||
+      cmmDaemonCmdRC(&cmd))
+    {
+      cmm_print(DEBUG_ERROR, "Error sending CMD_TRC_ON to MSP\n");
+    }
+  return 0;
+ usage:
+  cmm_print(DEBUG_STDOUT,"Usage: prf trace start [ctr_id0 [ctrid1]]\n");
+  return 0;
+}
+
+static int cmm_trace_display(daemon_handle_t daemon_handle, fpp_trc_off_cmd_t *pcmd, unsigned int startaddr, unsigned int length, unsigned int offset) {
+
+    /* display offset to the end of trace */
+    msp_dm(daemon_handle, startaddr + offset , length - offset, 0x1);
+    if (offset)
+      msp_dm(daemon_handle, startaddr, offset, 0x1);
+ 
+    return 0;
+}
+
+int prfPTswitch(daemon_handle_t daemon_handle, int argc, char **argv){
+  fpp_trc_off_cmd_t *res; 
+  unsigned int startaddr, offset, length;
+  unsigned char rspbuf[CMM_BUF_SIZE];
+  if (
+      (argc == 0) && 
+      ( 
+       (cmmSendToDaemon(daemon_handle,FPP_CMD_TRC_SWITCH,NULL,0,rspbuf) < sizeof(unsigned short) ) ||
+       cmmDaemonCmdRC(rspbuf)
+       )
+      )
+    {
+      cmm_print(DEBUG_ERROR, "Error_sending CMD_TRC_SWITCH command to fpp\n");
+      return 0;
+    } else if ((argc > 0) && 
+	       (
+		(cmmSendToDaemon(daemon_handle,FPP_CMD_TRC_OFF,NULL,0,&rspbuf)< sizeof(unsigned short) ) || 
+		cmmDaemonCmdRC(rspbuf)
+		)
+	       ) {
+    cmm_print(DEBUG_ERROR, "Error_sending CMD_TRC_OFF command to fpp\n");
+    return 0;
+  }
+  
+  res = (fpp_trc_off_cmd_t *)rspbuf;
+  cmm_print(DEBUG_COMMAND," CMD_TRC_SWITCH/OFF response: %04X %04X %04X %04X  %04X %04X %04X %04X %08X\n",
+	    res->pad_in_rc_out, res->pad_in_ec_out,
+	    res->pmn0_id, res->pmn1_id,
+	    res->trc_module_mask, res->trc_ctr_length,
+	    res->trc_mask_length, res->trc_length,
+	    res->trc_address);
+  startaddr = res->trc_address + res->trc_ctr_length + res->trc_mask_length + 4;
+  length = res->trc_length - res->trc_ctr_length - res->trc_mask_length - 4;
+  
+  offset = res->pad_in_ec_out << 4; /* oldest entry in the trace */
+  cmm_print(DEBUG_STDOUT,"Trace at 0x%08x for 0x%x bytes offset 0x%0x\n",startaddr , length, offset); 
+  return cmm_trace_display(daemon_handle, res, startaddr, length, offset);
+
+  cmm_print(DEBUG_STDOUT,"Usage: prf trace switch [stop]\n");
+  return 0;
+}
+int prfPTshow(daemon_handle_t daemon_handle, int argc, char **argv) {
+  fpp_trc_off_cmd_t *res; 
+  unsigned char rspbuf[CMM_BUF_SIZE];
+  unsigned int startaddr, offset, length;
+  if (
+      (cmmSendToDaemon(daemon_handle,FPP_CMD_TRC_SHOW,NULL,0,rspbuf) < sizeof(unsigned short)) ||
+      cmmDaemonCmdRC(rspbuf)
+      )
+    {
+      cmm_print(DEBUG_ERROR, "Error_sending CMD_TRC_SHOW command to fpp\n");
+      return 0;
+    } 
+  
+  res = (fpp_trc_off_cmd_t *)rspbuf;
+  cmm_print(DEBUG_COMMAND," CMD_TRC_SHOW response: %04X %04X %04X %04X  %04X %04X %04X %04X %08X\n",
+	    res->pad_in_rc_out, res->pad_in_ec_out,
+	    res->pmn0_id, res->pmn1_id,
+	    res->trc_module_mask, res->trc_ctr_length,
+	    res->trc_mask_length, res->trc_length,
+	    res->trc_address);
+
+  startaddr = res->trc_address + res->trc_ctr_length + res->trc_mask_length + 4;
+  length = res->trc_length - res->trc_ctr_length - res->trc_mask_length - 4;
+  offset = res->pad_in_ec_out << 4; /* oldest entry in the trace */
+
+  cmm_print(DEBUG_STDOUT,"Trace at 0x%08x for 0x%x bytes offset 0x%0x\n",startaddr , length, offset);
+  return cmm_trace_display(daemon_handle, res, startaddr, length, offset);
+
+  cmm_print(DEBUG_STDOUT,"Usage: prf trace showtrace\n");  return 0;
+  return 0;
+}
+int cmmPrfMem(int argc,char **argv,int firstarg ,daemon_handle_t daemon_handle)
+{
+  if (argc > firstarg) {
+    if (strncasecmp(argv[firstarg],"bytes",1) == 0)
+      return prfMspMS(daemon_handle, argc - firstarg - 1, &argv[firstarg+1]);
+    else if (strncasecmp(argv[firstarg],"words",1) == 0)
+      return prfMspMSW(daemon_handle, argc - firstarg - 1, &argv[firstarg+1]);
+    else  if (strncasecmp(argv[firstarg],"ct",1) == 0)
+      return prfMspMSW(daemon_handle, argc - firstarg - 1, &argv[firstarg+1]);
+  }
+
+  prfMspMS(daemon_handle, 0, NULL);
+  prfMspMSW(daemon_handle, 0, NULL);
+  prfMspCT(daemon_handle, 0, NULL);
+  return 0;
+}
+
+int cmmPrfNM(int argc,char **argv,int firstarg ,daemon_handle_t daemon_handle)
+{
+  if (argc > firstarg) {
+    if (strncasecmp(argv[firstarg],"status",1) == 0) {
+      return prfStatus(daemon_handle, 0,NULL);
+    }
+    else if (strncasecmp(argv[firstarg],"busycpu",1) == 0) {
+      /* Available CPU measurement */
+      return prfPTBusyCPU(daemon_handle,argc - firstarg - 1, &argv[firstarg+1]); 
+    } else if  (strncasecmp(argv[firstarg],"trace",1) == 0) {
+      /* Tracing command */
+      if (argc > firstarg +1 ) {
+	if (strncasecmp(argv[firstarg+1],"setmask",2) == 0) {
+	  return prfPTsetmask(daemon_handle,argc-firstarg-2,&argv[firstarg+2]);
+	} else if (strncasecmp(argv[firstarg+1],"start",2) == 0) {
+	  return prfPTstart(daemon_handle,argc-firstarg-2,&argv[firstarg+2]);
+	} else if (strncasecmp(argv[firstarg+1],"switch",2) == 0) {
+	  return prfPTswitch(daemon_handle,argc-firstarg-2,&argv[firstarg+2]);
+	} else if (strncasecmp(argv[firstarg+1],"showtrace",2) == 0) {
+	  return prfPTshow(daemon_handle,argc-firstarg-2,&argv[firstarg+2]);
+	}
+      }
+    cmm_print(DEBUG_ERROR,"Usage prf trace {setmask|start|switch|showtrace}\n");
+    }
+  } else
+    cmm_print(DEBUG_ERROR,"Usage: prf {status|trace|busycpu}\n");
+    
+  return 0;
+}
diff --git a/cmm/src/module_prf.h b/cmm/src/module_prf.h
new file mode 100644
index 0000000..744fa25
--- /dev/null
+++ b/cmm/src/module_prf.h
@@ -0,0 +1,40 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_PRF_H__
+#define __MODULE_PRF_H__
+
+/*Function codes*/
+#define FPP_CMD_TRC_MASK                            0xff00
+#define FPP_CMD_TRC_VAL                             0x0f00
+
+int cmmPrfMem(int argc,char **argv,int firstarg ,daemon_handle_t daemon_handle);
+int cmmPrfNM(int argc,char **argv,int firstarg ,daemon_handle_t daemon_handle);
+int prfMspMS(daemon_handle_t daemon_handle, int argc, char **argv);
+int prfMspMSW(daemon_handle_t daemon_handle, int argc, char **argv);
+int prfMspCT(daemon_handle_t daemon_handle, int argc, char **argv);
+int prfStatus(daemon_handle_t daemon_handle, int argc, char **argv);
+int prfPTBusyCPU(daemon_handle_t daemon_handle, int argc, char **argv);
+int prfPTsetmask(daemon_handle_t daemon_handle, int argc, char **argv);
+int prfPTstart(daemon_handle_t daemon_handle, int argc, char **argv);
+int prfPTswitch(daemon_handle_t daemon_handle, int argc, char **argv);
+int prfPTshow(daemon_handle_t daemon_handle, int argc, char **argv);
+
+#endif
+
diff --git a/cmm/src/module_qm.c b/cmm/src/module_qm.c
new file mode 100644
index 0000000..f65ffc7
--- /dev/null
+++ b/cmm/src/module_qm.c
@@ -0,0 +1,1314 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+#include "cmm.h"
+#include "fpp.h"
+#include <ctype.h>
+#include <limits.h>
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+void cmmQmShowPrintHelp()
+{
+	cmm_print(DEBUG_STDOUT, "show qm not yet supported\n");
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+int cmmQmShowProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	
+//help:
+	cmmQmShowPrintHelp();
+	return -1;
+}
+
+int cmmQmExptRateQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	int rcvBytes = 0;
+	char rcvBuffer[256];
+	short rc;
+	fpp_qm_expt_rate_cmd_t *pExptRateCmd = ( fpp_qm_expt_rate_cmd_t *)rcvBuffer;
+
+#ifdef COMCERTO_2000
+	if(!keywords[cpt])
+		goto help;
+
+	if (strcasecmp(keywords[cpt], "eth") == 0)
+		pExptRateCmd->if_type = FPP_EXPT_TYPE_ETH;
+	else if (strcasecmp(keywords[cpt], "wifi") == 0)
+		pExptRateCmd->if_type = FPP_EXPT_TYPE_WIFI;
+	else if (strcasecmp(keywords[cpt], "arp_ndp") == 0)
+		pExptRateCmd->if_type = FPP_EXPT_TYPE_ARP;
+	else if (strcasecmp(keywords[cpt], "pcap") == 0)
+		pExptRateCmd->if_type = FPP_EXPT_TYPE_PCAP;
+	else
+		goto help;
+#endif
+
+   rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_QM_QUERY_EXPT_RATE , 
+                            pExptRateCmd, sizeof(fpp_qm_expt_rate_cmd_t) , rcvBuffer);
+
+   if (rcvBytes < sizeof( fpp_qm_expt_rate_cmd_t)  ) {
+                rc = (rcvBytes < sizeof(unsigned short) ) ? 0 :
+                                            *((unsigned short *) rcvBuffer);
+                if (rc == FPP_ERR_UNKNOWN_ACTION) {
+                    cmm_print(DEBUG_STDERR, "ERROR: doess not support ACTION_QUERY\n");
+                } else {
+                    cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%d\n", rc);
+                }
+                return CLI_OK;
+            }
+
+   cmm_print(DEBUG_STDOUT, "QM Exception RATE (packets/sec): %d\n", 
+					(pExptRateCmd->pkts_per_msec * 1000));
+
+   return CLI_OK;
+help:
+	cmm_print(DEBUG_STDOUT, "Usage: query qmexptrate {eth | wifi}\n");
+
+	return CLI_OK;
+}
+
+
+#define NUM_INTERFACES GEM_PORTS
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+int cmmQmQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+        int rcvBytes = 0,i,j,k,len=0;
+        char rcvBuffer[256];
+        short rc;
+        fpp_qm_query_cmd_t *pQmQuery = ( fpp_qm_query_cmd_t *)rcvBuffer;
+	char output_buf[256];
+
+
+        cmm_print(DEBUG_STDOUT, "QM details:\n");
+        cmm_print(DEBUG_STDOUT, "---------- \n");
+        for (i = 0 ; i < NUM_INTERFACES; i++)
+   	{
+	    char ifname[IFNAMSIZ];
+
+	    memset(rcvBuffer,0,256);
+
+            pQmQuery->port = i;
+            rcvBytes = cmmSendToDaemon(daemon_handle,FPP_CMD_QM_QUERY ,
+                  pQmQuery, sizeof(fpp_qm_query_cmd_t) , rcvBuffer);
+
+            if (rcvBytes != sizeof(fpp_qm_query_cmd_t) ) {
+                rc = (rcvBytes < sizeof(unsigned short) ) ? 0 : 
+                                            *((unsigned short *) rcvBuffer);
+                if (rc == FPP_ERR_UNKNOWN_ACTION) {
+                    cmm_print(DEBUG_STDERR, "ERROR: doess not support ACTION_QUERY\n");
+                } else {
+                    cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%d\n", rc);
+                }
+                return CLI_OK;
+            }
+
+	    cmm_print(DEBUG_STDOUT, "Interface : %s\n", get_port_name(pQmQuery->port, ifname, IFNAMSIZ));
+
+	    if (pQmQuery->queue_qosenable_mask != 0) {
+#ifdef COMCERTO_2000
+            	cmm_print(DEBUG_STDOUT, "QOS: Enabled : \n");
+#else
+            	cmm_print(DEBUG_STDOUT, "QOS: Enabled on queue(s): \n");
+		for (j=0; j < FPP_NUM_QUEUES; j++)
+		{
+			if(pQmQuery->queue_qosenable_mask & (1 << j))
+				len += sprintf(output_buf+len, "%d  ", j);
+		}
+		cmm_print(DEBUG_STDOUT, "%s \n",output_buf);
+#endif
+	    }
+	    else
+            	cmm_print(DEBUG_STDOUT, "QOS: Disabled \n");
+
+
+		cmm_print(DEBUG_STDOUT, "Maximum Tx Depth = %d \n", pQmQuery->max_txdepth);
+
+		cmm_print(DEBUG_STDOUT, "Shaper details:\n");
+        	cmm_print(DEBUG_STDOUT, "---------- \n");
+		for (j =0; j < FPP_NUM_SHAPERS; j++)
+		{
+			len=0;
+			cmm_print(DEBUG_STDOUT, "Shaper %d:\n", j);
+
+			if(pQmQuery->shaper_qmask[j] == 0)
+				cmm_print(DEBUG_STDOUT, "No Queues attached\n");
+			else 
+			{
+				cmm_print(DEBUG_STDOUT, "The following queue(s) are attached: \n");
+				for (k=0; k < FPP_NUM_QUEUES; k++)
+				{
+					if(pQmQuery->shaper_qmask[j] & (1 << k))
+						len += sprintf(output_buf+len, "%d  ", k);  
+				}
+				cmm_print(DEBUG_STDOUT, "%s \n",output_buf);
+			}
+
+			cmm_print(DEBUG_STDOUT, "Tokens Per Clock Period %d \n", pQmQuery->tokens_per_clock_period[j]);
+			cmm_print(DEBUG_STDOUT, "Bucket Size %d \n", pQmQuery->bucket_size[j]);
+
+		}
+		cmm_print(DEBUG_STDOUT, "---------- \n");
+
+		cmm_print(DEBUG_STDOUT, "Scheduler details:\n");
+        	cmm_print(DEBUG_STDOUT, "---------- \n");
+		for (j =0; j < FPP_NUM_SCHEDULERS; j++)
+		{
+			len=0;
+			cmm_print(DEBUG_STDOUT, "Scheduler %d:\n", j);
+
+			if(pQmQuery->sched_qmask[j] == 0)
+				cmm_print(DEBUG_STDOUT, "No Queues attached\n");
+			else 
+			{
+				cmm_print(DEBUG_STDOUT, "The following queue(s) are attached: \n");
+				for (k=0; k < FPP_NUM_QUEUES; k++)
+				{
+					if(pQmQuery->sched_qmask[j] & (1 << k))
+						len += sprintf(output_buf+len, "%d  ", k);  						
+				}
+				cmm_print(DEBUG_STDOUT, "%s \n",output_buf);
+			}
+
+			switch (pQmQuery->sched_alg[j])
+             		{
+	       		case 0:
+		   			cmm_print(DEBUG_STDOUT, "ALG : PQ \n");	
+                   			break;
+	       		case 1:
+		   			cmm_print(DEBUG_STDOUT, "ALG :CBWFQ \n");	
+                   			break;
+	       		case 2:
+		   			cmm_print(DEBUG_STDOUT, "ALG :DWRR \n");	
+                   			break;
+				default:
+		   			cmm_print(DEBUG_STDOUT, "ALG :NONE \n");	
+                   			break;
+	    		}
+
+		}
+		cmm_print(DEBUG_STDOUT, "---------- \n");
+
+		cmm_print(DEBUG_STDOUT, "Queue details:\n");
+        	cmm_print(DEBUG_STDOUT, "---------- \n");
+		for (j =0; j < FPP_NUM_QUEUES; j++)
+		{
+			len=0;
+			len += sprintf(output_buf+len, "Queue %d: ", j);
+			len += sprintf(output_buf+len, "Max Queue Depth %d  ", pQmQuery->max_qdepth[j]);
+			cmm_print(DEBUG_STDOUT, "%s \n",output_buf);
+		}
+		cmm_print(DEBUG_STDOUT, "\n---------- \n");
+
+   
+	    
+	    cmm_print(DEBUG_STDOUT,"--------------------------------------------------\n");
+       }
+
+        return CLI_OK;
+
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+void cmmQmSetPrintHelp()
+{
+	char buf[128];
+
+	print_all_gemac_ports(buf, 128);
+
+	cmm_print(DEBUG_STDOUT, 
+		  "Usage: set qm interface {%s}\n"
+		  "                                  [reset]\n"
+                  "\n"
+		  "                                  [qos]\n"
+                  "                                       [on | off]\n"
+                  "                                       [max_txdepth {bytes}]\n"
+                  "                                       [scheduler {pq|cbwfq|dwrr}] **\n"
+                  "                                       [nhigh_queue {number of queues}] **\n"
+                  "                                       [qweight {queue number} {weight}] **\n"
+                  "                                       [qdepth {queue number} {depth}] **\n"
+                  "\n"
+                  "                                  [shaper {0-7}]\n"
+                  "                                       [on | off]\n"
+                  "                                       [rate {Kbps}]\n"
+                  "                                       [ifg {bytes}]\n"
+                  "                                       [bucket_size {bits}]\n"
+                  "                                       [queue {0-31}] [queue {0-31}] ...\n"                  
+                  "\n"
+                  "                                  [scheduler {0-7}]\n"
+                  "                                       [algorithm {pq|cbwfq|dwrr}]\n"
+                  "                                       [queue {0-31}] [queue {0-31}] ...\n"
+                  "\n"
+                  "                                  [queue {0-31}] [queue {0-31}] ..\n"
+                  "                                       [qos on | off] \n"
+                  "                                       [shaper {0-7}]\n"
+                  "                                       [scheduler {0-7}]\n"
+                  "                                       [qweight {weight}]\n"
+                  "                                       [qdepth {depth}]\n"
+                  "\n"
+                  "                                  [rate_limiting {on|off}] **\n"
+                  "                                       [rate {Kbps}]\n"
+                  "                                       [bucket_size {bits}]\n"
+                  "                                       [queue {0-31}] [queue {0-31}] ...\n"
+                  "\n"
+		  "                                  ** Deprecated\n"
+
+                  "\n"
+#ifdef COMCERTO_2000
+		    "       set qm expt_rate {eth|wifi|arp_ndp|pcap} {1000-5000000 or 0}\n"
+#else
+		    "       set qm expt_rate {1000-5000000 or 0}\n"
+#endif
+                  "\n"
+		    "       set qm dscp_queue\n"
+		    "						[queue {0-31}] \n"
+                  "						[dscp {0-63}-{0-63}]  \n", buf
+
+	          );
+}
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+int cmmQmSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	unsigned int tmp, tmp1;
+	unsigned int cmdToSend = 0; /* bits field*/
+	char * endptr;
+	unsigned char first_dscp = 0, last_dscp = 0, dscp_range = 0;
+	int num_dscp = 0;
+	int i;
+	unsigned char dscp_value[FPP_NUM_DSCP] = {0};
+
+
+	
+	fpp_qm_qos_enable_cmd_t enableCmd;
+	fpp_qm_qos_alg_cmd_t algCmd;
+	fpp_qm_nhigh_cmd_t nHighCmd;
+	fpp_qm_max_qdepth_cmd_t maxQdepthCmd;
+	fpp_qm_max_txdepth_cmd_t maxTxDepthCmd;
+	fpp_qm_max_weight_cmd_t maxWeightCmd;
+	fpp_qm_rate_limit_cmd_t rateLimitCmd;
+	fpp_qm_expt_rate_cmd_t exptRateCmd;
+	fpp_qm_scheduler_cfg_t schedulerCmd;
+	fpp_qm_shaper_cfg_t shaperCmd;
+	fpp_qm_reset_cmd_t resetCmd;
+	fpp_qm_dscp_queue_mod_t dscpCmd;
+    fpp_qm_queue_qos_enable_cmd_t queueenableCmd;
+    
+	char rcvBuffer[256];
+
+	memset(&enableCmd, 0, sizeof(enableCmd));
+	memset(&algCmd, 0, sizeof(algCmd));
+	memset(&nHighCmd, 0, sizeof(nHighCmd));
+	memset(&maxQdepthCmd, 0, sizeof(maxQdepthCmd));
+	memset(&maxTxDepthCmd, 0, sizeof(maxTxDepthCmd));
+	memset(&maxWeightCmd, 0, sizeof(maxWeightCmd));
+	memset(&rateLimitCmd, 0, sizeof(rateLimitCmd));
+	memset(&exptRateCmd, 0, sizeof(exptRateCmd));
+	memset(&schedulerCmd, 0, sizeof(schedulerCmd));
+	memset(&shaperCmd, 0, sizeof(shaperCmd));
+	memset(&resetCmd, 0, sizeof(resetCmd));
+	memset(&dscpCmd, 0, sizeof(dscpCmd));
+	memset(&queueenableCmd, 0, sizeof(queueenableCmd));
+
+
+	if(!keywords[cpt])
+		goto help;
+
+	if(strcasecmp(keywords[cpt], "interface") == 0)
+	{
+		int port_id;
+
+		if(!keywords[++cpt])
+			goto help;
+
+		if ((port_id = get_port_id(keywords[cpt])) >= 0)
+		{
+			enableCmd.interface = port_id;
+			algCmd.interface = port_id;
+			nHighCmd.interface = port_id;
+			maxQdepthCmd.interface = port_id;
+			maxTxDepthCmd.interface = port_id;
+			maxWeightCmd.interface = port_id;
+			rateLimitCmd.interface = port_id;
+			shaperCmd.interface = port_id;
+			schedulerCmd.interface = port_id;
+			resetCmd.interface = port_id;
+			queueenableCmd.interface = port_id;
+		}
+		else
+			goto keyword_error;
+	}
+	else if(strcasecmp(keywords[cpt], "expt_rate") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+		memset(&exptRateCmd, 0, sizeof(exptRateCmd));
+
+#ifdef COMCERTO_2000
+		if(strcasecmp(keywords[cpt], "eth") == 0 )
+			exptRateCmd.if_type = FPP_EXPT_TYPE_ETH;
+		else if (strcasecmp(keywords[cpt], "wifi") == 0 )
+			exptRateCmd.if_type = FPP_EXPT_TYPE_WIFI;
+		else if (strcasecmp(keywords[cpt], "arp_ndp") == 0 )
+			exptRateCmd.if_type = FPP_EXPT_TYPE_ARP;
+		else if (strcasecmp(keywords[cpt], "pcap") == 0 )
+			exptRateCmd.if_type = FPP_EXPT_TYPE_PCAP;
+		else
+			goto help;
+
+		if(!keywords[++cpt])
+			goto help;
+#endif
+
+		/*Get an integer from the string*/
+		endptr = NULL;
+		tmp = strtoul(keywords[cpt], &endptr, 0);
+		if ((keywords[cpt] == endptr) || (tmp != 0 && (tmp < 1000 || tmp > 5000000)))
+		{
+			cmm_print(DEBUG_CRIT, "CMD_QM_EXPT_RATE ERROR: rate must be zero (to disable) or a number between 1000 and 5000000\n");
+			goto help;
+		}
+		if(keywords[++cpt])
+			goto help;
+		exptRateCmd.pkts_per_msec = tmp / 1000;
+		// Send CMD_QM_EXPT_RATE command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_QM_EXPT_RATE, &exptRateCmd, sizeof(exptRateCmd), &rcvBuffer) == 2)
+		{
+			if ( ((unsigned short *)rcvBuffer)[0] != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_QM_EXPT_RATE\n", ((unsigned short *)rcvBuffer)[0]);
+		}
+		return 0;
+	}
+	else if(strcasecmp(keywords[cpt], "dscp_queue") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "queue") == 0)
+		{
+			if(!keywords[++cpt])
+				goto help;
+
+			 /*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_QUEUES))
+			{
+				cmm_print(DEBUG_STDERR, "dscp_queue ERROR: selected queue must be a number between 0 and %d\n", (FPP_NUM_QUEUES-1));
+				goto help;
+			}
+			dscpCmd.queue = tmp;
+			cmm_print(DEBUG_INFO, "dscp_queue - queue %d selected\n", dscpCmd.queue);
+
+			if(!keywords[++cpt])
+				goto help;
+		}
+		else
+		   goto keyword_error;
+
+		if(strcasecmp(keywords[cpt], "dscp") == 0)
+		{
+			/* get list of dscp values assigned to the selected queue */
+			if(!keywords[++cpt])
+				goto help;
+			num_dscp = 0;
+			first_dscp = 0;
+			cmm_print(DEBUG_INFO, "dscp_queue - parsing dscp list for queue %d\n", dscpCmd.queue);
+			while(keywords[cpt] && (num_dscp < FPP_NUM_DSCP))
+			{
+				cmm_print(DEBUG_INFO, "dscp_queue - processing arg '%s' \n", keywords[cpt]);
+				if(strcasecmp(keywords[cpt], "-") == 0)
+				{
+					dscp_range = 1;
+					cmm_print(DEBUG_INFO, "dscp_queue - dscp range detected\n");
+				}
+				else
+				{
+					endptr = NULL;
+					tmp = strtoul(keywords[cpt], &endptr, 0);
+					if ((keywords[cpt] == endptr) || (tmp > FPP_MAX_DSCP))
+					{
+						cmm_print(DEBUG_STDERR, "dscp_queue ERROR: DSCP value out of range\n");
+						goto help;
+					}
+					else
+					{
+						cmm_print(DEBUG_INFO, "dscp_queue - one more dscp added\n");
+						/* save low-end dscp value i.e. the first value specified*/
+						if(num_dscp == 0)
+							first_dscp = tmp;
+						last_dscp = tmp; /* save high end dscp i.e. the last one specified*/
+						dscp_value[num_dscp++] = tmp;
+					}
+				}
+				cpt++;
+			}
+
+			/* no dscp specified means all dscp */
+			if(num_dscp == 0) 
+			{
+				for(i = 0; i < FPP_NUM_DSCP; i++)
+					dscpCmd.dscp[i] = i;
+				dscpCmd.num_dscp = FPP_NUM_DSCP;
+				cmm_print(DEBUG_INFO, "dscp_queue - all dscp assigned\n");
+			}
+			else if (dscp_range)
+			{
+				if(last_dscp <= first_dscp)
+				{
+					cmm_print(DEBUG_STDERR, "dscp_queue: wrong DSCP range\n");
+					goto help;
+				}
+				for(i = first_dscp; i <= last_dscp; i++)
+					dscpCmd.dscp[i - first_dscp] = i;
+				dscpCmd.num_dscp = (last_dscp - first_dscp) + 1; 
+				cmm_print(DEBUG_INFO, "dscp_queue - dscp range %d to %d\n", first_dscp, last_dscp);
+			}
+			else
+			{
+				cmm_print(DEBUG_INFO, "dscp_queue - dscp non-ordered list\n");
+				dscpCmd.num_dscp = num_dscp;
+				for(i = 0; i < dscpCmd.num_dscp; i++)
+					dscpCmd.dscp[i] = dscp_value[i];
+			}
+			cmm_print(DEBUG_INFO, "dscp_queue - %d dscp assigned ->\n", dscpCmd.num_dscp);
+			for(i = 0; i < dscpCmd.num_dscp; i++)
+				cmm_print(DEBUG_INFO, "%d ", dscpCmd.dscp[i]);
+			cmm_print(DEBUG_INFO, "\n");
+
+			if(cmmSendToDaemon(daemon_handle, FPP_CMD_QM_DSCP_MAP, &dscpCmd, sizeof(fpp_qm_dscp_queue_mod_t), rcvBuffer) == 2)
+			{
+				if ( ((unsigned short *)rcvBuffer)[0] != 0)
+					cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_QM_DSCP_MAP\n", ((unsigned short *)rcvBuffer)[0]);
+				return ((unsigned short *)rcvBuffer)[0];
+			}
+		}
+		else {
+			cmm_print(DEBUG_STDERR, "ERROR: Unknown keyword %s\n", keywords[cpt]);
+			goto help;
+		}
+
+		return 0;
+	}
+	else
+		goto keyword_error;
+
+	if(!keywords[++cpt])
+		goto help;
+	
+	if(strcasecmp(keywords[cpt], "qos") == 0)
+	{		
+		if(!keywords[++cpt])
+			goto help;
+		
+		while (keywords[cpt] != NULL)
+		{
+			if(strcasecmp(keywords[cpt], "on") == 0)
+			{
+				cmdToSend |= CMD_BIT(FPP_CMD_QM_QOSENABLE);
+				enableCmd.enable = 1;
+			}
+			else if(strcasecmp(keywords[cpt], "off") == 0)
+			{
+				cmdToSend |= CMD_BIT(FPP_CMD_QM_QOSENABLE);
+				enableCmd.enable = 0;
+			}
+			else if(strcasecmp(keywords[cpt], "scheduler") == 0)
+			{
+				if(!keywords[++cpt])
+					goto help;
+
+
+				cmdToSend |= CMD_BIT(FPP_CMD_QM_QOSALG);
+
+				if(strcasecmp(keywords[cpt], "pq") == 0)
+				{
+					algCmd.scheduler = 0;
+				}
+				else if (strcasecmp(keywords[cpt], "cbwfq") == 0)
+				{
+					algCmd.scheduler = 1;
+				}
+				else if (strcasecmp(keywords[cpt], "dwrr") == 0)
+				{
+					algCmd.scheduler = 2;
+				}
+				else
+					goto keyword_error;
+			}
+			else if(strcasecmp(keywords[cpt], "nhigh_queue") == 0)
+			{
+				if(!keywords[++cpt])
+					goto help;
+
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_QUEUES))
+				{
+					cmm_print(DEBUG_CRIT, "qos ERROR: nhigh_queue must be a number between 0 and %d \n", (FPP_NUM_QUEUES -1));
+					goto help;
+				}
+
+				nHighCmd.number_high_queues = tmp;
+				
+				cmdToSend |= CMD_BIT(FPP_CMD_QM_NHIGH);
+			}
+			else if(strcasecmp(keywords[cpt], "max_txdepth") == 0)
+			{
+				if(!keywords[++cpt])
+					goto help;
+
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) || tmp < 1 || (tmp > USHRT_MAX))
+				{
+					cmm_print(DEBUG_CRIT, "qos ERROR: max_txdepth must be a number between 1 and %d\n", USHRT_MAX);
+					goto help;
+				}
+		
+				maxTxDepthCmd.max_bytes = tmp;
+
+				cmdToSend |= CMD_BIT(FPP_CMD_QM_MAX_TXDEPTH);
+			}
+			else if(strcasecmp(keywords[cpt], "qweight") == 0)
+			{
+				if(!keywords[++cpt])
+					goto help;
+
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_QUEUES))
+				{
+					cmm_print(DEBUG_STDERR, "qos ERROR: queue must be a number between 0 and %d \n", (FPP_NUM_QUEUES -1) );
+					goto help;
+				}
+				
+				if(!keywords[++cpt])
+					goto help;
+				
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp1 = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) || tmp1 < 1 || (tmp1 > USHRT_MAX))
+				{
+					cmm_print(DEBUG_STDERR, "qos ERROR: weight must be a number between 1 and %d\n", USHRT_MAX);
+					goto help;
+				}
+				
+				maxWeightCmd.qxweight[tmp] = tmp1;
+				cmdToSend |= CMD_BIT(FPP_CMD_QM_MAX_WEIGHT);
+			}
+
+			else if(strcasecmp(keywords[cpt], "qdepth") == 0)
+			{
+				if(!keywords[++cpt])
+					goto help;
+
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_QUEUES))
+				{
+					cmm_print(DEBUG_STDERR, "qos ERROR: queue must be a number between 0 and %d \n", (FPP_NUM_QUEUES -1));
+					goto help;
+				}
+				
+				if(!keywords[++cpt])
+					goto help;
+				
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp1 = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) || tmp1 < 1 || (tmp1 > USHRT_MAX))
+				{
+					cmm_print(DEBUG_STDERR, "qos ERROR: depth must be a number between 1 and %d\n", USHRT_MAX);
+					goto help;
+				}
+				
+				maxQdepthCmd.qtxdepth[tmp] = tmp1;
+				cmdToSend |= CMD_BIT(FPP_CMD_QM_MAX_QDEPTH);
+			}
+			else
+				goto keyword_error;
+
+			cpt++;
+		}
+	}
+	else if(strcasecmp(keywords[cpt], "rate_limiting") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+		
+		if(strcasecmp(keywords[cpt], "on") == 0)
+		{
+			cmdToSend |= CMD_BIT(FPP_CMD_QM_RATE_LIMIT);
+			rateLimitCmd.enable = 1;
+	
+			cpt++;
+			while (keywords[cpt] != NULL)
+			{
+				if(strcasecmp(keywords[cpt], "queue") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+
+					/*Get an integer from the string*/
+					endptr = NULL;
+					tmp = strtoul(keywords[cpt], &endptr, 0);
+					if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_QUEUES))
+					{
+						cmm_print(DEBUG_CRIT, "rate_limiting ERROR: queue must be a number between 0 and %d \n", (FPP_NUM_QUEUES -1));
+						goto help;
+					}
+
+					rateLimitCmd.queues |= (1 << tmp);
+				}
+				else if(strcasecmp(keywords[cpt], "rate") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+
+					/*Get an integer from the string*/
+					endptr = NULL;
+					tmp = strtoul(keywords[cpt], &endptr, 0);
+					if ((keywords[cpt] == endptr) || (tmp < 8) || (tmp > ULONG_MAX))
+					{
+						cmm_print(DEBUG_CRIT, "rate_limiting ERROR: rate must be a number between 8 and %d (Kbps)\n", (unsigned int)ULONG_MAX);
+						goto help;
+					}
+
+					rateLimitCmd.rate = tmp;
+				}
+				else if(strcasecmp(keywords[cpt], "bucket_size") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+
+					/*Get an integer from the string*/
+					endptr = NULL;
+					tmp = strtoul(keywords[cpt], &endptr, 0);
+					if ((keywords[cpt] == endptr) || (tmp < 8) || (tmp > ULONG_MAX))
+					{
+						cmm_print(DEBUG_CRIT, "rate_limiting ERROR: bucket_size must be a number between 8 and %d\n", (unsigned int)ULONG_MAX);
+						goto help;
+					}
+
+					rateLimitCmd.bucket_size = tmp;
+				}
+				else
+					goto keyword_error;
+			
+				cpt++;
+			}
+
+			/*Dependencies check*/
+			if (rateLimitCmd.queues == 0)
+			{
+				cmm_print(DEBUG_CRIT, "Rate Limiting ERROR: At least one queue must be specified\n");
+				goto help;
+			}
+			
+			if(rateLimitCmd.rate == 0)
+			{
+				cmm_print(DEBUG_CRIT, "Rate Limiting ERROR: The bandwidth have to be specified\n");
+				goto help;
+			}
+		}
+		else if(strcasecmp(keywords[cpt], "off") == 0)
+		{
+			cmdToSend |= CMD_BIT(FPP_CMD_QM_RATE_LIMIT);
+			rateLimitCmd.enable = 0;
+		}
+		else
+			goto keyword_error;
+		
+	}
+	else if(strcasecmp(keywords[cpt], "shaper") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+
+		/*Get an integer from the string*/
+#ifdef COMCERTO_2000
+		if (strcasecmp(keywords[cpt], "port") == 0)
+		{
+			tmp = FPP_PORT_SHAPER_NUM;
+		}
+		else
+#endif
+		{
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_SHAPERS))
+			{
+				cmm_print(DEBUG_CRIT, "shaper ERROR: shaper number must be between 0 and %d\n", FPP_NUM_SHAPERS);
+				goto help;
+			}
+		}
+
+		shaperCmd.shaper = tmp;
+		
+		if(!keywords[++cpt])
+			goto help;
+
+		cmdToSend |= CMD_BIT(FPP_CMD_QM_SHAPER_CFG);
+
+		while (keywords[cpt] != NULL)
+		{
+			if(strcasecmp(keywords[cpt], "on") == 0)
+			{
+				shaperCmd.enable = 1;
+			}
+			else if(strcasecmp(keywords[cpt], "off") == 0)
+			{
+				shaperCmd.enable = 2;
+			}
+			else if(strcasecmp(keywords[cpt], "queue") == 0)
+			{
+				if(!keywords[++cpt])
+					goto help;
+
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_QUEUES))
+				{
+					cmm_print(DEBUG_CRIT, "shaper ERROR: queue must be a number between 0 and %d \n", (FPP_NUM_QUEUES -1));
+					goto help;
+				}
+
+				shaperCmd.queues |= (1 << tmp);
+			}
+			else if(strcasecmp(keywords[cpt], "ifg") == 0)
+			{
+				if(!keywords[++cpt])
+					goto help;
+
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) || (tmp > 255))
+				{
+					cmm_print(DEBUG_CRIT, "shaper ERROR: ifg must be a number between 0 and 255\n");
+					goto help;
+				}
+
+				shaperCmd.ifg = tmp;
+				shaperCmd.ifg_change_flag = 1;
+			}
+			else if(strcasecmp(keywords[cpt], "rate") == 0)
+			{
+				if(!keywords[++cpt])
+					goto help;
+
+				/* Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+                                if ((keywords[cpt] == endptr) || (tmp < 8) || (tmp > ULONG_MAX))
+                                {
+                                        cmm_print(DEBUG_CRIT, "shaper ERROR: rate must be a number between 8 and %d (Kbps)\n", (unsigned int)ULONG_MAX);
+                                        goto help;
+                                }
+
+
+				shaperCmd.rate = tmp;
+			}
+			else if(strcasecmp(keywords[cpt], "bucket_size") == 0)
+			{
+				if(!keywords[++cpt])
+					goto help;
+
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) || (tmp < 8) || (tmp > ULONG_MAX))
+				{
+					cmm_print(DEBUG_CRIT, "shaper ERROR: bucket_size must be a number between 8 and %d\n", (unsigned int)ULONG_MAX);
+					goto help;
+				}
+
+				shaperCmd.bucket_size = tmp;
+			}
+			else
+				goto keyword_error;
+		
+			cpt++;
+		}
+	}
+	else if(strcasecmp(keywords[cpt], "scheduler") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+
+		/*Get an integer from the string*/
+		endptr = NULL;
+		tmp = strtoul(keywords[cpt], &endptr, 0);
+		if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_SCHEDULERS))
+		{
+			cmm_print(DEBUG_CRIT, "scheduler ERROR: scheduler number must be between 0 and 3\n");
+			goto help;
+		}
+
+		schedulerCmd.scheduler = tmp;
+		
+		if(!keywords[++cpt])
+			goto help;
+
+		cmdToSend |= CMD_BIT(FPP_CMD_QM_SCHED_CFG);
+	
+		while (keywords[cpt] != NULL)
+		{
+			if(strcasecmp(keywords[cpt], "queue") == 0)
+			{
+				if(!keywords[++cpt])
+					goto help;
+
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_QUEUES))
+				{
+					cmm_print(DEBUG_CRIT, "scheduler ERROR: queue must be a number between 0 and %d \n", (FPP_NUM_QUEUES -1));
+					goto help;
+				}
+
+				schedulerCmd.queues |= (1 << tmp);
+			}
+			else if(strcasecmp(keywords[cpt], "algorithm") == 0)
+			{
+				if(!keywords[++cpt])
+					goto help;
+
+				if(strcasecmp(keywords[cpt], "pq") == 0)
+				{
+					schedulerCmd.algo = 0;
+					schedulerCmd.algo_change_flag = 1;
+				}
+				else if (strcasecmp(keywords[cpt], "cbwfq") == 0)
+				{
+					schedulerCmd.algo = 1;
+					schedulerCmd.algo_change_flag = 1;
+				}
+                            else if (strcasecmp(keywords[cpt], "dwrr") == 0)
+				{
+					schedulerCmd.algo = 2;
+					schedulerCmd.algo_change_flag = 1;
+				}
+				else
+					goto keyword_error;
+			}			
+			else
+				goto keyword_error;
+		
+			cpt++;
+		}
+
+	}
+
+	else if(strcasecmp(keywords[cpt], "queue") == 0)
+	{
+		unsigned int qmask=0; /* Bit mask of single or set of queues that are programmed */
+
+		if(!keywords[++cpt])
+			goto help;
+
+		/*Get an integer from the string*/
+		endptr = NULL;
+		tmp = strtoul(keywords[cpt], &endptr, 0);
+		if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_QUEUES))
+		{
+			cmm_print(DEBUG_CRIT, "queue ERROR: queue must be a number between 0 and %d\n", (FPP_NUM_QUEUES-1));
+			goto help;
+		}
+		qmask |= (1<<tmp);
+
+		if(!keywords[++cpt])
+			goto help;
+
+		while (keywords[cpt] != NULL)
+		{
+			if(strcasecmp(keywords[cpt], "queue") == 0)
+			{
+			       if(!keywords[++cpt])
+					goto help;
+
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_QUEUES))
+				{
+					cmm_print(DEBUG_CRIT, "queue ERROR: queue must be a number between 0 and %d \n", (FPP_NUM_QUEUES -1));
+					goto help;
+				}
+
+				qmask |= (1<<tmp);
+			}
+			else if(strcasecmp(keywords[cpt], "qos") == 0)
+			{
+				if (qmask ==0)
+				{
+					cmm_print(DEBUG_CRIT, "queue ERROR: One or more queues need to be specified \n");
+					goto help;
+				}
+				
+				if(!keywords[++cpt])
+					goto help;
+		
+				
+				if(strcasecmp(keywords[cpt], "on") == 0)
+					queueenableCmd.enable_flag = 1;
+				else if(strcasecmp(keywords[cpt], "off") == 0)
+					queueenableCmd.enable_flag = 0;
+				
+				queueenableCmd.queue_qosenable_mask = qmask;
+				cmdToSend |= CMD_BIT(FPP_CMD_QM_QUEUE_QOSENABLE);
+				
+			}
+			else if(strcasecmp(keywords[cpt], "shaper") == 0)
+			{
+				if (qmask ==0)
+				{
+					cmm_print(DEBUG_CRIT, "queue ERROR: One or more queues need to be specified \n");
+					goto help;
+				}
+				
+				if(!keywords[++cpt])
+					goto help;
+
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_SHAPERS))
+				{
+					cmm_print(DEBUG_CRIT, "queue ERROR: shaper number must be between 0 and 4\n");
+					goto help;
+				}
+
+				shaperCmd.shaper = tmp;
+				shaperCmd.queues = qmask;
+				cmdToSend |= CMD_BIT(FPP_CMD_QM_SHAPER_CFG);
+			}
+			else if(strcasecmp(keywords[cpt], "scheduler") == 0)
+			{
+				if (qmask ==0)
+				{
+					cmm_print(DEBUG_CRIT, "queue ERROR: One or more queues need to be specified \n");
+					goto help;
+				}
+				
+				if(!keywords[++cpt])
+					goto help;
+
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_SCHEDULERS))
+				{
+					cmm_print(DEBUG_CRIT, "queue ERROR: scheduler number must be between 0 and 3\n");
+					goto help;
+				}
+
+				schedulerCmd.scheduler = tmp;
+				schedulerCmd.queues = qmask;
+				cmdToSend |= CMD_BIT(FPP_CMD_QM_SCHED_CFG);
+			}
+			else if(strcasecmp(keywords[cpt], "qweight") == 0)
+			{
+				if (qmask ==0)
+				{
+					cmm_print(DEBUG_CRIT, "queue ERROR: One or more queues need to be specified \n");
+					goto help;
+				}
+				
+				if(!keywords[++cpt])
+					goto help;
+
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp1 = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) || tmp1 < 1 || (tmp1 > USHRT_MAX))
+				{
+					cmm_print(DEBUG_STDERR, "queue ERROR: weight must be a number between 1 and %d\n", USHRT_MAX);
+					goto help;
+				}
+
+				for(i=0; i < FPP_NUM_QUEUES; i++) {
+					if(qmask & (1 << i))
+						maxWeightCmd.qxweight[i] = tmp1;
+				}
+				cmdToSend |= CMD_BIT(FPP_CMD_QM_MAX_WEIGHT);
+			}
+
+			else if(strcasecmp(keywords[cpt], "qdepth") == 0)
+			{
+				if (qmask ==0)
+				{
+					cmm_print(DEBUG_CRIT, "queue ERROR: One or more queues need to be specified \n");
+					goto help;
+				}
+				
+				if(!keywords[++cpt])
+					goto help;
+
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp1 = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) || tmp1 < 1 || (tmp1 > USHRT_MAX))
+				{
+					cmm_print(DEBUG_STDERR, "queue ERROR: depth must be a number between 1 and %d\n", USHRT_MAX);
+					goto help;
+				}
+
+				for(i=0; i < FPP_NUM_QUEUES; i++) {
+					if(qmask & (1 << i))
+						maxQdepthCmd.qtxdepth[i] = tmp1;
+				}
+				cmdToSend |= CMD_BIT(FPP_CMD_QM_MAX_QDEPTH);
+			}
+			else
+				goto keyword_error;
+		
+			cpt++;
+		}
+
+	}
+
+	else if(strcasecmp(keywords[cpt], "reset") == 0)
+	{
+		if(keywords[++cpt])
+			goto help;
+
+		cmdToSend |= CMD_BIT(FPP_CMD_QM_RESET);	
+	}
+	else
+		goto keyword_error;
+
+	/*
+	 * Parsing have been performed
+	 * Now send the right commands
+	 */
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_QM_RESET))
+	{
+		// Send CMD_QM_RATE_LIMIT command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_QM_RESET, &resetCmd, sizeof(resetCmd), &rcvBuffer) == 2)
+		{
+			if ( ((unsigned short *)rcvBuffer)[0] != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_QM_RESET\n", ((unsigned short *)rcvBuffer)[0]);
+		}
+	}
+	
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_QM_QOSENABLE))
+	{
+		// Send CMD_QM_QOSENABLE command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_QM_QOSENABLE, & enableCmd, sizeof(enableCmd), &rcvBuffer) == 2)
+		{
+			if (  (((unsigned short*)rcvBuffer)[0]) != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_QM_QOSENABLE\n", ((unsigned short*)rcvBuffer)[0]);
+		}
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_QM_QUEUE_QOSENABLE))
+	{
+		// Send FPP_CMD_QM_QUEUE_QOSENABLE command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_QM_QUEUE_QOSENABLE, &queueenableCmd, sizeof(queueenableCmd), &rcvBuffer) == 2)
+		{
+			if (  (((unsigned short*)rcvBuffer)[0]) != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_QM_QUEUE_QOSENABLE\n", ((unsigned short*)rcvBuffer)[0]);
+		}
+	}
+
+	
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_QM_QOSALG))
+	{
+		// Send CMD_QM_QOSALG command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_QM_QOSALG, & algCmd, sizeof(algCmd), &rcvBuffer) == 2)
+		{
+			if ( ((unsigned short*)rcvBuffer)[0] != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_QM_QOSALG\n", ((unsigned short*)rcvBuffer)[0]);
+		}
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_QM_NHIGH))
+	{
+		// Send CMD_QM_NHIGH command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_QM_NHIGH, & nHighCmd, sizeof(nHighCmd), &rcvBuffer) == 2)
+		{
+			if ( ((unsigned short*)rcvBuffer)[0] != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_QM_NHIGH\n", ((unsigned short*)rcvBuffer)[0]);
+		}
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_QM_MAX_TXDEPTH))
+	{
+		// Send CMD_QM_MAX_TXDEPTH command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_QM_MAX_TXDEPTH, &maxTxDepthCmd, sizeof(maxTxDepthCmd), &rcvBuffer) == 2)
+		{
+			if ( ((unsigned short*)rcvBuffer)[0] != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_QM_MAX_TXDEPTH\n", ((unsigned short*)rcvBuffer)[0]);
+		}
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_QM_MAX_QDEPTH))
+	{
+		// Send CMD_QM_MAX_QDEPTH command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_QM_MAX_QDEPTH, & maxQdepthCmd , sizeof(maxQdepthCmd), &rcvBuffer) == 2)
+		{
+			if ( ((unsigned short*)rcvBuffer)[0] != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_QM_MAX_QDEPTH\n", ((unsigned short*)rcvBuffer)[0]);
+		}
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_QM_MAX_WEIGHT))
+	{
+		// Send CMD_QM_MAX_WEIGHT command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_QM_MAX_WEIGHT, &maxWeightCmd , sizeof(maxWeightCmd), &rcvBuffer) == 2)
+		{
+			if ( ((unsigned short*)rcvBuffer)[0] != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_QM_MAX_WEIGHT\n", ((unsigned short*)rcvBuffer)[0]);
+		}
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_QM_RATE_LIMIT))
+	{
+		// Send CMD_QM_RATE_LIMIT command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_QM_RATE_LIMIT, &rateLimitCmd, sizeof(rateLimitCmd), &rcvBuffer) == 2)
+		{
+			if ( ((unsigned short *)rcvBuffer)[0] != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_QM_RATE_LIMIT\n", ((unsigned short *)rcvBuffer)[0]);
+		}
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_QM_SHAPER_CFG))
+	{
+		// Send CMD_QM_RATE_LIMIT command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_QM_SHAPER_CFG, &shaperCmd, sizeof(shaperCmd), &rcvBuffer) == 2)
+		{
+			if ( ((unsigned short *)rcvBuffer)[0] != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_QM_SHAPER_CFG\n", ((unsigned short *)rcvBuffer)[0]);
+		}
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_QM_SCHED_CFG))
+	{
+		// Send CMD_QM_RATE_LIMIT command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_QM_SCHED_CFG, &schedulerCmd, sizeof(schedulerCmd), &rcvBuffer) == 2)
+		{
+			if ( ((unsigned short *)rcvBuffer)[0] != 0)
+				cmm_print(DEBUG_STDERR, "Error %d received from FPP for CMD_QM_SCHED_CFG\n", ((unsigned short *)rcvBuffer)[0]);
+		}
+	}
+
+
+	return 0;
+
+keyword_error:
+	cmm_print(DEBUG_CRIT, "ERROR: Unknown keyword %s\n", keywords[cpt]);
+
+help:
+	cmmQmSetPrintHelp();
+	return -1;
+}
+
+
+void cmmQmResetQ2Prio(fpp_qm_reset_cmd_t *cmdp, int cmdlen)
+{
+	u_int16_t interface;
+	char fname[128], ifname[IFNAMSIZ];
+	FILE *fp;
+
+	if (cmdlen != sizeof(fpp_qm_reset_cmd_t))
+	{
+		cmm_print(DEBUG_ERROR, "%s: Wrong length for cmd, expected %d, got %d\n", __func__,
+						sizeof(fpp_qm_scheduler_cfg_t), cmdlen);
+		return;
+	}
+
+	interface = cmdp->interface;
+
+	snprintf(fname, 128, "/sys/class/net/%s/q2prio", get_port_name(interface, ifname, IFNAMSIZ));
+	fp = fopen(fname, "w");
+	if (!fp)
+	{
+		cmm_print(DEBUG_WARNING, "%s: Cannot open %s\n", __func__, fname);
+		return;
+	}
+	fprintf(fp, "reset\n");
+	fclose(fp);
+}
+
+
+void cmmQmUpdateQ2Prio(fpp_qm_scheduler_cfg_t *cmdp, int cmdlen)
+{
+	u_int16_t interface;
+        u_int16_t scheduler;
+        u_int32_t queues;
+	char fname[128], ifname[IFNAMSIZ];
+	FILE *fp;
+
+	if (cmdlen != sizeof(fpp_qm_scheduler_cfg_t))
+	{
+		cmm_print(DEBUG_ERROR, "%s: Wrong length for cmd, expected %d, got %d\n", __func__,
+						sizeof(fpp_qm_scheduler_cfg_t), cmdlen);
+		return;
+	}
+
+	interface = cmdp->interface;
+	scheduler = cmdp->scheduler;
+	queues = cmdp->queues;
+
+	snprintf(fname, 128, "/sys/class/net/%s/q2prio", get_port_name(interface, ifname, IFNAMSIZ));
+	fp = fopen(fname, "w");
+	if (!fp)
+	{
+		cmm_print(DEBUG_WARNING, "%s: Cannot open %s\n", __func__, fname);
+		return;
+	}
+	fprintf(fp, "%d 0x%x\n", scheduler, queues);
+	fclose(fp);
+}
diff --git a/cmm/src/module_qm.h b/cmm/src/module_qm.h
new file mode 100644
index 0000000..1298fa2
--- /dev/null
+++ b/cmm/src/module_qm.h
@@ -0,0 +1,32 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_QM_H__
+#define __MODULE_QM_H__
+
+int cmmQmShowProcess(char ** keywords, int tabSize, daemon_handle_t daemon_handle);
+int cmmQmQueryProcess(char ** keywords, int tabSize, daemon_handle_t daemon_handle);
+int cmmQmExptRateQueryProcess(char ** keywords, int tabSize, daemon_handle_t daemon_handle);
+int cmmQmSetProcess(char ** keywords, int tabSize, daemon_handle_t daemon_handle);
+void cmmQmResetQ2Prio(fpp_qm_reset_cmd_t *cmdp, int cmdlen);
+void cmmQmUpdateQ2Prio(fpp_qm_scheduler_cfg_t *cmdp, int cmdlen);
+
+#endif
+
+
diff --git a/cmm/src/module_relay.c b/cmm/src/module_relay.c
new file mode 100644
index 0000000..3b101f0
--- /dev/null
+++ b/cmm/src/module_relay.c
@@ -0,0 +1,462 @@
+#include "cmm.h"
+#include "itf.h"
+#include "ffbridge.h"
+#include "cmmd.h"
+#include "fpp.h"
+#include <sys/ioctl.h>
+ 
+/* Structure representing a pppoe entry (internally to cmm) */
+struct PPPoERelayEntry {
+	struct PPPoERelayEntry *next;
+	int count;
+	fpp_pppoe_relay_cmd_t *pppoe;
+};
+
+struct PPPoERelayEntry *relay_table = NULL;
+pthread_mutex_t RelayMutex = PTHREAD_MUTEX_INITIALIZER;
+
+/************************************************************
+*
+*
+*
+*************************************************************/
+
+#if 1
+
+static int cmmGetIfMac(unsigned char *ifname, unsigned char *mac){
+    struct ifreq ifr;
+    int fd;
+
+    memcpy(ifr.ifr_name,ifname,sizeof(ifr.ifr_name));
+    fd = socket(AF_INET, SOCK_DGRAM,0);
+
+    if ( fd < 0 )
+    {
+        cmm_print(DEBUG_ERROR, "%s::%d:Socket Creation Failed  \n",__func__, __LINE__);
+        return -1;
+    }
+
+    if ( ioctl(fd, SIOCGIFHWADDR, &ifr) < 0 )
+    {
+        cmm_print(DEBUG_ERROR, "%s::%d:Ioctl Call Failed \n",__func__, __LINE__);
+        close(fd);
+        return -1;
+    }
+    memcpy(mac,ifr.ifr_hwaddr.sa_data,IFHWADDRLEN);
+    close(fd);
+    return 0;
+}
+
+static int cmmRelayAdd(FCI_CLIENT * fci_handler, struct fpp_relay_info *sh, u_int16_t *res_buf, u_int16_t *res_len)
+{
+    struct PPPoERelayEntry *temp, *new_relay_entry = NULL;
+    fpp_pppoe_relay_cmd_t *cmd;
+    int ret = 0;
+    int in_ifindex = -1, out_ifindex = -1, phys_in_ifindex = -1, phys_out_ifindex = -1;
+    char in_ifname[IFNAMSIZ], out_ifname[IFNAMSIZ];
+    res_buf[0] = CMMD_ERR_NOT_CONFIGURED;
+    *res_len = 2;
+
+    __pthread_mutex_lock(&RelayMutex);
+    __pthread_mutex_lock(&itf_table.lock);
+    /*Check if we have not already been sent to Forward Engine */
+    temp = relay_table;
+
+    while (temp != NULL) {
+        if (!memcmp(temp->pppoe->peermac1, sh->peermac1, 6)
+            && temp->pppoe->sesID == sh->sesID
+            && !memcmp(temp->pppoe->peermac2, sh->peermac2, 6)
+            && temp->pppoe->relaysesID == sh->relaysesID) {
+            cmm_print(DEBUG_INFO, "Relay Match found\n");
+            break;
+        }
+
+        temp = temp->next;
+    }
+
+    if (temp) {
+        temp->count++;
+        goto end;
+    }
+
+  /* Check the interface names whether they are valid and get the physical interface
+   * names for bridge interfaces */
+
+    memset(in_ifname , 0, IFNAMSIZ);
+    memset(out_ifname , 0, IFNAMSIZ);
+
+    in_ifindex = if_nametoindex(sh->ipifname);
+    if (!in_ifindex)
+    {
+        cmm_print(DEBUG_ERROR, "%s::%d:if_nametoindex Failed  %s\n",__func__, __LINE__, sh->ipifname);
+        goto end;
+    }
+
+    if ( __itf_is_bridge(in_ifindex))
+    {
+
+        cmm_print(DEBUG_INFO, "%s::%d:IP interface name is Bridge interface : %d\n",__func__, __LINE__, in_ifindex);
+        phys_in_ifindex = cmmBrGetPhysItf(in_ifindex, sh->peermac1);
+        if (phys_in_ifindex < 0)
+        {
+        	cmm_print(DEBUG_ERROR, "%s::%d:Error in finding the Physical interface  %d\n",__func__, __LINE__, phys_in_ifindex);
+                goto end;
+        }
+
+        cmm_print(DEBUG_INFO, "%s::%d:Physical interface is : %d\n",__func__, __LINE__, phys_in_ifindex);
+        if (! __itf_is_programmed(phys_in_ifindex))
+        {
+		cmm_print(DEBUG_ERROR, "%s::%d:Interface is not programmed to FPP  %d\n",__func__, __LINE__, phys_in_ifindex);
+        	goto end;
+        }
+
+        if_indextoname(phys_in_ifindex, in_ifname);
+    }
+    else
+    {
+        if (! __itf_is_programmed(in_ifindex))
+        {
+		cmm_print(DEBUG_ERROR, "%s::%d:Interface is not programmed to FPP  %d\n",__func__, __LINE__, in_ifindex);
+        	goto end;
+        }
+    	memcpy(in_ifname,sh->ipifname, 6);
+    }
+
+    out_ifindex = if_nametoindex(sh->opifname);
+    if (!out_ifindex)
+    {
+        cmm_print(DEBUG_ERROR, "%s::%d:if_nametoindex Failed  %s\n",__func__, __LINE__, sh->opifname);
+        goto end;
+    }
+
+    if (  __itf_is_bridge(out_ifindex))
+    {
+        phys_out_ifindex = cmmBrGetPhysItf(out_ifindex, sh->peermac2);
+        if (phys_out_ifindex < 0)
+        {
+        	cmm_print(DEBUG_ERROR, "%s::%d:Error in finding the Physical interface  %d\n",__func__, __LINE__, phys_out_ifindex);
+                goto end;
+        }
+        cmm_print(DEBUG_INFO, "%s::%d:Physical interface is : %d\n",__func__, __LINE__, phys_out_ifindex);
+        if (! __itf_is_programmed(phys_out_ifindex))
+        {
+		cmm_print(DEBUG_ERROR, "%s::%d:Interface is not programmed to FPP  %d\n",__func__, __LINE__, phys_out_ifindex);
+        	goto end;
+        }
+        if_indextoname(phys_out_ifindex, out_ifname);
+    }
+    else
+    {
+        if (! __itf_is_programmed(out_ifindex))
+        {
+		cmm_print(DEBUG_ERROR, "%s::%d:Interface is not programmed to FPP  %d\n",__func__, __LINE__, out_ifindex);
+        	goto end;
+        }
+     	memcpy(out_ifname,sh->opifname, 6);
+    }
+
+    /*No existing entry found, try to create a new one */
+    cmd = (fpp_pppoe_relay_cmd_t *) malloc(sizeof(fpp_pppoe_relay_cmd_t));
+    if (cmd == NULL)
+    {
+        cmm_print(DEBUG_ERROR, "%s::%d:Error while allocating memory for PPPoERelayCommand \n",__func__, __LINE__);
+        ret = -1;
+        goto end;
+    }
+
+    new_relay_entry =  (struct PPPoERelayEntry *) malloc(sizeof(struct PPPoERelayEntry));
+    if (new_relay_entry == NULL)
+    {
+        cmm_print(DEBUG_ERROR, "%s::%d:Error while allocating memory for PPPoERelayEntry \n",__func__, __LINE__);
+        ret = -1;
+        free(cmd);
+        goto end;
+    }
+    
+    
+    /* Getting the input/output interface MAC address from the kernel and copy to cmd structure*/
+    if ( cmmGetIfMac((unsigned char *)sh->ipifname,(unsigned char *)cmd->ipif_mac) < 0 )
+    {
+	cmm_print(DEBUG_ERROR, "%s::%d:Error while getting the input interface mac \n",__func__, __LINE__);
+	goto end;
+    }
+    if ( cmmGetIfMac((unsigned char *)sh->opifname,(unsigned char *)cmd->opif_mac) < 0 )
+    {
+	cmm_print(DEBUG_ERROR, "%s::%d:Error while getting the output interface mac \n",__func__, __LINE__);
+	goto end;
+    }
+
+    cmm_print(DEBUG_INFO, "Send CMD_PPPOE_RELAY_ENTRY ACTION_REGISTER\n");
+    cmd->action = FPP_ACTION_REGISTER;
+    cmd->sesID = sh->sesID;
+    memcpy(cmd->peermac1, sh->peermac1, 6);
+    memcpy(cmd->ipifname, in_ifname, IFNAMSIZ);
+    cmd->relaysesID = sh->relaysesID;
+    memcpy(cmd->peermac2, sh->peermac2, 6);
+    memcpy(cmd->opifname, out_ifname, IFNAMSIZ);
+#if 1
+    cmm_print(DEBUG_INFO,
+              "Sending command %02x:%02x:%02x:%02x:%02x:%02x(%s %d) to %02x:%02x:%02x:%02x:%02x:%02x(%s %d)\n",
+              cmd->peermac1[0], cmd->peermac1[1], cmd->peermac1[2],
+              cmd->peermac1[3], cmd->peermac1[4], cmd->peermac1[5],
+              cmd->ipifname, cmd->sesID, cmd->peermac2[0],
+              cmd->peermac2[1], cmd->peermac2[2], cmd->peermac2[3],
+              cmd->peermac2[4], cmd->peermac2[5], cmd->opifname,
+              cmd->relaysesID);
+#endif
+    ret = fci_cmd(fci_handler, FPP_CMD_PPPOE_RELAY_ENTRY, (unsigned short *) cmd, sizeof(*cmd), res_buf, res_len);
+    if (ret != 0 || res_buf[0] != FPP_ERR_OK)
+    {
+         if (ret != 0) 
+             cmm_print(DEBUG_ERROR, "Error '%s' when sending CMD_PPPOE_RELAY_ENTRY, ACTION_REGISTER\n", strerror(errno));
+         else
+             cmm_print(DEBUG_ERROR, "Error %d when sending CMD_PPPOE_RELAY_ENTRY, ACTION_REGISTER\n", res_buf[0]);
+         free(cmd);
+         free(new_relay_entry);
+         goto end;
+    }
+
+
+    cmm_print(DEBUG_INFO, "Send CMD_PPPOE_RELAY_ENTRY SUCCESS\n");
+    new_relay_entry->count = 1;
+    new_relay_entry->pppoe = cmd;
+
+    new_relay_entry->next = relay_table;
+    relay_table = new_relay_entry;
+
+
+  end:
+    __pthread_mutex_unlock(&itf_table.lock);
+    __pthread_mutex_unlock(&RelayMutex);
+    return ret;
+}
+#endif
+static int cmmRelayRemove(FCI_CLIENT * fci_handler,fpp_relay_info_t *sh, u_int16_t *res_buf, u_int16_t *res_len);
+
+int cmmRelayProcessClientCmd(FCI_CLIENT * fci_handle, int function_code,
+                             u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len)
+{
+    cmmd_relay_info_t *sh;
+    int rc = 0;
+
+    sh = (cmmd_relay_info_t *) cmd_buf;
+    switch (function_code) {
+    case CMMD_CMD_PPPOE_RELAY_ADD:
+#if 0
+        cmm_print(DEBUG_INFO,
+                  "Received CMD_PPPOE_RELAY_ENTRY command from RP-PPPoE...\n");
+        cmm_print(DEBUG_INFO, "size:%d\n", buffer_size);
+        cmm_print(DEBUG_INFO,
+                  "Received the peers %02x:%02x:%02x:%02x:%02x:%02x(%s %d) to %02x:%02x:%02x:%02x:%02x:%02x(%s %d)\n",
+                  sh->peermac1[0], sh->peermac1[1], sh->peermac1[2],
+                  sh->peermac1[3], sh->peermac1[4], sh->peermac1[5],
+                  sh->ipifname, sh->sesID, sh->peermac2[0],
+                  sh->peermac2[1], sh->peermac2[2], sh->peermac2[3],
+                  sh->peermac2[4], sh->peermac2[5], sh->opifname,
+                  sh->relaysesID);
+#endif
+        rc = cmmRelayAdd(fci_handle, sh, res_buf, res_len);
+        break;
+
+    case CMMD_CMD_PPPOE_RELAY_REMOVE:
+        rc = cmmRelayRemove(fci_handle, sh, res_buf, res_len);
+        break;
+
+    default:
+        res_buf[0] = CMMD_ERR_UNKNOWN_COMMAND;
+        *res_len = 2;
+        break;
+
+    }
+    return rc;
+}
+
+/*****************************************************************
+ * * cmmPPPoELocalShow
+ * *
+ * *
+ * ******************************************************************/
+int cmmRelayLocalShow(struct cli_def *cli, char *command, char *argv[],
+                      int argc)
+{
+    struct PPPoERelayEntry *temp;
+
+    __pthread_mutex_lock(&RelayMutex);
+
+    for (temp = relay_table; temp != NULL; temp = temp->next) {
+        if (temp->pppoe) {
+            cli_print(cli, "%02x.%02x.%02x.%02x.%02x.%02x[%s  %d]<==::==>%02x.%02x.%02x.%02x.%02x.%02x[%s  %d]",
+                      temp->pppoe->peermac1[0],temp->pppoe->peermac1[1],
+                      temp->pppoe->peermac1[2],temp->pppoe->peermac1[3],
+                      temp->pppoe->peermac1[4],temp->pppoe->peermac1[5],
+            	      temp->pppoe->ipifname,temp->pppoe->sesID,
+                      temp->pppoe->peermac2[0],temp->pppoe->peermac2[1],
+                      temp->pppoe->peermac2[2],temp->pppoe->peermac2[3],
+                      temp->pppoe->peermac2[4],temp->pppoe->peermac2[5],
+		      temp->pppoe->opifname,temp->pppoe->relaysesID);
+        } else
+            cli_print(cli, "Internal Error");
+    }
+
+    __pthread_mutex_unlock(&RelayMutex);
+
+    return CLI_OK;
+}
+
+
+/*****************************************************************
+ * * cmmRelayRemove
+ * *
+ * *
+ * ******************************************************************/
+static int cmmRelayRemove(FCI_CLIENT * fci_handler,fpp_relay_info_t *sh, u_int16_t *res_buf, u_int16_t *res_len)
+{
+    struct PPPoERelayEntry *temp = NULL, *prevEntry = NULL;
+    fpp_pppoe_relay_cmd_t *cmd;
+    int ret = 0;
+    res_buf[0] = CMMD_ERR_NOT_CONFIGURED;
+    *res_len = 2;
+
+    __pthread_mutex_lock(&RelayMutex);
+
+    temp = relay_table;
+    if (temp == NULL) {
+        cmm_print(DEBUG_ERROR, "relay_table is NULL\n");
+        goto end;
+    }
+    // Do a test on the first of the list
+    while ((temp != NULL)) {
+        if (!memcmp(temp->pppoe->peermac1, sh->peermac1, 6)
+            && temp->pppoe->sesID == sh->sesID
+            &&!memcmp(temp->pppoe->peermac2, sh->peermac2, 6)
+            && temp->pppoe->relaysesID == sh->relaysesID) {
+            cmm_print(DEBUG_ERROR, "An entry has been found to remove\n");
+            break;
+        } else {
+            prevEntry = temp;
+            temp = temp->next;
+        }
+    }
+    // The entry have not been found, should not happen
+    if (temp == NULL) {
+        cmm_print(DEBUG_ERROR,
+                  "An entry have been removed already on localtable or the delete command for same entry\n");
+        goto end;
+    }
+
+
+    cmd = temp->pppoe;
+    cmd->action = FPP_ACTION_DEREGISTER;
+
+#if 1
+    cmm_print(DEBUG_INFO,
+              "Removing Entry %02x:%02x:%02x:%02x:%02x:%02x(%s %d) to %02x:%02x:%02x:%02x:%02x:%02x(%s %d)\n",
+              cmd->peermac1[0], cmd->peermac1[1], cmd->peermac1[2],
+              cmd->peermac1[3], cmd->peermac1[4], cmd->peermac1[5],
+              cmd->ipifname, cmd->sesID, cmd->peermac2[0],
+              cmd->peermac2[1], cmd->peermac2[2], cmd->peermac2[3],
+              cmd->peermac2[4], cmd->peermac2[5], cmd->opifname,
+              cmd->relaysesID);
+#endif
+
+    ret = fci_cmd(fci_handler, FPP_CMD_PPPOE_RELAY_ENTRY, (unsigned short *) cmd, sizeof(fpp_pppoe_relay_cmd_t), res_buf, res_len);
+    if (ret != 0 || (res_buf[0] != FPP_ERR_OK && res_buf[0] != FPP_ERR_PPPOE_ENTRY_NOT_FOUND))	
+    {
+        if (ret != 0)
+            cmm_print(DEBUG_ERROR, "Error '%s' while sending CMD_PPPOE_RELAY_ENTRY, ACTION_DEREGISTER\n", strerror(errno));
+        else
+            cmm_print(DEBUG_ERROR, "Error %d while sending CMD_PPPOE_RELAY_ENTRY, ACTION_DEREGISTER\n", res_buf[0]);
+        goto end;
+    }
+
+    if (prevEntry == NULL)
+        relay_table = temp->next;
+    else
+        prevEntry->next = temp->next;
+
+    free(temp->pppoe);
+    free(temp);
+  end:
+    __pthread_mutex_unlock(&RelayMutex);
+    return ret;
+}
+
+static int relay_print_usage()
+{
+	cmm_print(DEBUG_ERROR,
+		 "Usage: relay <add|del> <MAC1> <MAC2> <IN iface> <OUT iface> <session ID> <relay session ID>\n"
+		 "\n"
+		 "\n"
+		 "       Ex:  relay add 00:00:00:00:00:01 00:00:00:00:00:02 eth2 eth1 1 1\n"
+		 "            relay del 00:00:00:00:00:01 00:00:00:00:00:02 eth2 eth1 1 1\n"
+		);
+	return -1;
+}
+
+static int relay_parse_cmd(int argc, char ** keywords, daemon_handle_t daemon_handle)
+{
+	cmmd_relay_info_t cmd;
+	char res_buf[CMM_BUF_SIZE];
+	int fc;
+	int rc;
+	unsigned long tmp;
+
+	if (argc < 7)
+		return relay_print_usage();
+
+	if (strcmp(*keywords, "add") == 0)
+		fc = CMMD_CMD_PPPOE_RELAY_ADD;
+	else if (strcmp(*keywords, "del") == 0)
+		fc = CMMD_CMD_PPPOE_RELAY_REMOVE;
+	else
+		return relay_print_usage();
+
+	keywords++;
+	if (!parse_macaddr(*keywords, cmd.peermac1))
+		return relay_print_usage();
+
+	keywords++;
+	if (!parse_macaddr(*keywords, cmd.peermac2))
+		return relay_print_usage();
+	
+	keywords++;
+	strncpy(cmd.ipifname, *keywords, sizeof(cmd.ipifname));
+
+	keywords++;
+	strncpy(cmd.opifname, *keywords, sizeof(cmd.opifname));
+
+	keywords++;
+	tmp = strtoul(*keywords, NULL, 0);
+	if(tmp > UINT_MAX)
+		return relay_print_usage();
+	cmd.sesID = tmp;
+
+	keywords++;
+	tmp = strtoul(*keywords, NULL, 0);
+	if(tmp > UINT_MAX)
+		return relay_print_usage();
+	cmd.relaysesID = tmp;
+
+	rc = cmmSendToDaemon(daemon_handle, fc, &cmd, sizeof(cmd), res_buf);
+	if (rc != 2) /* we expect 2 bytes in response */
+	{
+		cmm_print(DEBUG_STDERR, "unexpected response length %d\n", rc);
+		return -1;
+	}
+	else if ((((u_int16_t*)res_buf)[0]) != CMMD_ERR_OK)
+	{
+		cmm_print(DEBUG_STDERR, "Error %d received from CMM Deamon\n", ((u_int16_t*)res_buf)[0]);
+		return -1;
+	}
+
+	return 0;
+}
+
+int cmmRelayParseCmd(int argc, char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+        if (tabStart < argc)
+                return relay_parse_cmd(argc - tabStart, &keywords[tabStart], daemon_handle);
+        else
+                return relay_print_usage();
+}
+
diff --git a/cmm/src/module_relay.h b/cmm/src/module_relay.h
new file mode 100644
index 0000000..fd4d540
--- /dev/null
+++ b/cmm/src/module_relay.h
@@ -0,0 +1,14 @@
+#ifndef __MODULE_RELAY_H__
+#define __MODULE_RELAY_H__
+
+#include "cmm.h"
+
+void cmmRelayShowPrintHelp();
+
+int cmmRelayProcessClientCmd(FCI_CLIENT * fciMsgHandler, int function_code,
+                             u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len);
+
+int cmmRelayLocalShow(struct cli_def *cli, char *command, char *argv[],
+                      int argc);
+int cmmRelayParseCmd(int argc, char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+#endif
diff --git a/cmm/src/module_route.c b/cmm/src/module_route.c
new file mode 100644
index 0000000..5ac4619
--- /dev/null
+++ b/cmm/src/module_route.c
@@ -0,0 +1,626 @@
+/*
+ *
+ *	Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+#include "cmm.h"
+#include "cmmd.h"
+#include <sys/ioctl.h>
+#include <net/if.h>
+
+
+static void cmmRouteDumpTable(char *output_device);
+
+struct route_list {
+	struct route_list *next;
+	cmmd_route_entry_t route;
+};
+struct route_list *route_table = NULL;
+pthread_mutex_t RouteMutex = PTHREAD_MUTEX_INITIALIZER;
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+void cmmRouteShowPrintHelp()
+{
+	cmmRouteSetPrintHelp();
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+int cmmRouteShowProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{	
+	return 0;
+}
+/************************************************************
+ *
+ *
+ *
+ *************************************************************/
+int cmmRouteQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	cmmRouteSetPrintHelp();
+		return -1;
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+void cmmRouteSetPrintHelp()
+{
+	cmm_print(DEBUG_STDOUT, "Usage: set route interface {if_name} {add | del | query}\n"
+									"	[type {ip type} ]\n"
+									"	[prio {priority} ]\n"
+									"	[mtu {mtu} ]\n"
+									"	[dstip {ipv4_dst_addr_min-ipv4_dst_addr_max } ]\n"
+									"	[srcip {ipv4_src_addr_min-ipv4_dst_addr_max } ]\n"
+									"	[input {interface name} ]\n"
+									"	[proto {proto} ]\n"
+									"	[dstport {port_dst_min-port_dst_max} ]\n"
+									"	[srcport {port_src_min-port_src_max} ]\n");
+}
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+int cmmRouteSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	unsigned int tmp;
+	char * endptr;
+	int rc;
+	
+	char sndBuffer[256];
+	char rcvBuffer[256];
+	cmmd_route_entry_t * entryCmd = (cmmd_route_entry_t *) sndBuffer;
+
+	memset(sndBuffer, 0, sizeof(sndBuffer));
+	cmm_print(DEBUG_INFO, "Entered Route Set Process\n");
+
+	if(!keywords[cpt])
+		goto help;
+
+	if(strcasecmp(keywords[cpt], "interface") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+
+		if (strlen(keywords[cpt]) > 10) {
+			cmm_print(DEBUG_STDERR, "Error : interface name %s limited to 10 characters %d \n", 
+				keywords[cpt], strlen(keywords[cpt]));
+			goto help;
+		}
+		strcpy(entryCmd->output_device_str, keywords[cpt]);
+	}
+	else
+		goto keyword_error;
+
+	if(!keywords[++cpt])
+		goto help;
+	
+	if(strcasecmp(keywords[cpt], "add") == 0)
+	{		
+		entryCmd->action = CMMD_EXTROUTE_ACTION_ADD;
+	}
+	else if(strcasecmp(keywords[cpt], "del") == 0)
+	{
+		entryCmd->action = CMMD_EXTROUTE_ACTION_REMOVE;
+	}
+	else if(strcasecmp(keywords[cpt], "query") == 0)
+	{
+		entryCmd->action = CMMD_EXTROUTE_ACTION_QUERY;
+		goto send;
+	}
+	else if(strcasecmp(keywords[cpt], "reset") == 0)
+	{
+		entryCmd->action = CMMD_EXTROUTE_ACTION_RESET;
+		goto send;
+	}
+	else
+		goto keyword_error;
+
+	if(!keywords[++cpt])
+		goto help;
+
+	while (keywords[cpt] != NULL)
+	{
+		if (strcasecmp(keywords[cpt], "dstip") == 0)
+		{
+			if(!keywords[++cpt])
+				goto help;
+			
+			/*check that the range form is used*/
+			endptr = strchr(keywords[cpt], '-');
+			if (endptr) {
+				*endptr = '\0';
+			}
+
+			if(inet_pton(AF_INET, keywords[cpt], &entryCmd->dst_addr[0]) != 1)
+				goto help;
+
+			if (endptr) {
+				if(inet_pton(AF_INET, endptr+1, &entryCmd->dst_addr[1]) != 1)
+					goto help;
+			}
+			else {
+				entryCmd->dst_addr[1] = entryCmd->dst_addr[0];
+			}
+		}
+		else if (strcasecmp(keywords[cpt], "srcip") == 0)
+		{
+			if(!keywords[++cpt])
+				goto help;
+			
+			/* check that the range form is used */
+			endptr = strchr(keywords[cpt], '-');
+			if (endptr) {
+				*endptr = '\0';
+			}
+
+			if(inet_pton(AF_INET, keywords[cpt], &entryCmd->src_addr[0]) != 1)
+				goto help;
+
+			if (endptr) {
+				if(inet_pton(AF_INET, endptr+1, &entryCmd->src_addr[1]) != 1)
+					goto help;
+			}
+			else {
+				entryCmd->src_addr[1] = entryCmd->src_addr[0];
+			}
+		}
+		else if (strcasecmp(keywords[cpt], "input") == 0)
+		{
+			if(!keywords[++cpt])
+				goto help;
+			
+			if (strlen(keywords[cpt]) > 10) {
+				cmm_print(DEBUG_STDERR, "Error : interface name %s limited to 10 characters %d \n", 
+					keywords[cpt], strlen(keywords[cpt]));
+				goto help;
+			}
+
+			strcpy(entryCmd->input_device_str, keywords[cpt]);
+		}
+		else if (strcasecmp(keywords[cpt], "proto") == 0)
+		{
+			if(!keywords[++cpt])
+				goto help;
+				
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+
+			if (tmp <= 255)
+				entryCmd->proto = tmp;
+			else 
+				goto help;
+		}
+		else if (strcasecmp(keywords[cpt], "dstport") == 0)
+		{
+			if(!keywords[++cpt])
+				goto help;
+			
+			endptr = strchr(keywords[cpt], '-');
+			if (endptr) {
+				*endptr = '\0';
+			}
+			tmp = strtoul(keywords[cpt], NULL, 0);
+			if (tmp <= 65535)
+				entryCmd->dst_port[0] = tmp;
+			else 
+				goto help;
+
+			if (endptr) {
+				tmp = strtoul(endptr+1, &endptr, 0);
+				if (tmp <= 65535)
+					entryCmd->dst_port[1] = tmp;
+				else 
+					goto help;
+			} else {
+				entryCmd->dst_port[1] = entryCmd->dst_port[0];
+			}
+		}
+		else if (strcasecmp(keywords[cpt], "srcport") == 0)
+		{
+			if(!keywords[++cpt])
+				goto help;
+			
+			endptr = strchr(keywords[cpt], '-');
+			if (endptr) {
+				*endptr = '\0';
+			}
+			tmp = strtoul(keywords[cpt], NULL, 0);
+			if (tmp <= 65535)
+				entryCmd->src_port[0] = tmp;
+			else 
+				goto help;
+
+			if (endptr) {
+				tmp = strtoul(endptr+1, &endptr, 0);
+				if (tmp <= 65535)
+					entryCmd->src_port[1] = tmp;
+				else 
+					goto help;
+			} else {
+				entryCmd->src_port[1] = entryCmd->src_port[0];
+			}
+		}
+		else if (strcasecmp(keywords[cpt], "prio") == 0)
+		{
+			if(!keywords[++cpt])
+				goto help;
+				
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			entryCmd->prio = tmp;
+		}
+		else if (strcasecmp(keywords[cpt], "mtu") == 0)
+		{
+			if(!keywords[++cpt])
+				goto help;
+				
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			entryCmd->mtu = tmp;
+		}
+		else
+			goto help;
+
+		cpt++;
+	}
+send:
+	rc = cmmSendToDaemon(daemon_handle, CMMD_CMD_EXTROUTE, sndBuffer, sizeof(cmmd_route_entry_t), rcvBuffer);
+	if(rc == 2)
+	{
+		if ( ((unsigned short *)rcvBuffer)[0] != CMMD_ERR_OK)
+			cmm_print(DEBUG_STDERR, "Error %d received for CMD_EXTROUTE\n", ((unsigned short *)rcvBuffer)[0]);
+	}
+	else
+		cmm_print(DEBUG_STDERR, "Unexpected size %d received for CMD_EXTROUTE\n", rc);
+
+	return 0;
+
+keyword_error:
+	cmm_print(DEBUG_STDERR, "ERROR: Unknown keyword %s\n", keywords[cpt]);
+
+help:
+	cmmRouteSetPrintHelp();
+	return -1;
+}
+
+static void cmmRouteDumpTable(char *output_device)
+{
+	struct route_list *temp;
+	char s[INET_ADDRSTRLEN], s2[INET_ADDRSTRLEN];
+	char mtu_buf[16];
+	char dstip_buf[40];
+	char srcip_buf[40];
+	char input_buf[16];
+	char proto_buf[16];
+	char dstport_buf[32];
+	char srcport_buf[32];
+
+	cmm_print(DEBUG_INFO, "cmmRouteDumpTable for %s device \n", output_device);
+
+	__pthread_mutex_lock(&RouteMutex);
+
+	for (temp = route_table; temp != NULL; temp = temp->next) {
+		if(!strcasecmp(temp->route.output_device_str, output_device) || !strcasecmp(output_device, "all"))
+		{
+
+			if (temp->route.mtu != 0)
+				sprintf(mtu_buf, "mtu:%d ", temp->route.mtu);
+			else
+				mtu_buf[0] = '\0';
+		
+			if (temp->route.dst_addr[0]) {
+				if (temp->route.dst_addr[1] != temp->route.dst_addr[0]) {
+					sprintf(dstip_buf, "%s-%s",
+						inet_ntop(AF_INET, &temp->route.dst_addr[0], s, sizeof(s)),
+						inet_ntop(AF_INET, &temp->route.dst_addr[1], s2, sizeof(s2))); 
+				} else {
+					sprintf(dstip_buf, "%s",
+						inet_ntop(AF_INET, &temp->route.dst_addr[0], s, sizeof(s)));
+				}
+			} else {
+				strcpy(dstip_buf, "*");
+			}
+		
+			if (temp->route.src_addr[0]) {
+				if (temp->route.src_addr[1] != temp->route.src_addr[0]) {
+					sprintf(srcip_buf, "%s-%s",
+						inet_ntop(AF_INET, &temp->route.src_addr[0], s, sizeof(s)),
+						inet_ntop(AF_INET, &temp->route.src_addr[1], s2, sizeof(s2))); 
+				} else {
+					sprintf(srcip_buf, "%s",
+						inet_ntop(AF_INET, &temp->route.src_addr[0], s, sizeof(s)));
+				}
+			} else {
+				strcpy(srcip_buf, "*");
+			}
+		
+			if (temp->route.input_device_str[0]) {
+				strcpy(input_buf, temp->route.input_device_str);
+			} else {
+				strcpy(input_buf, "*");
+			}
+		
+			if (temp->route.proto) {
+				sprintf(proto_buf, "%d", temp->route.proto);
+			} else {
+				strcpy(proto_buf, "*");
+			}
+		
+			if (temp->route.dst_port[0]) {
+				if (temp->route.dst_port[1] != temp->route.dst_port[0]) {
+					sprintf(dstport_buf, "%d-%d", temp->route.dst_port[0], temp->route.dst_port[1]);
+				} else {
+					sprintf(dstport_buf, "%d", temp->route.dst_port[0]);
+				}
+			} else {
+				strcpy(dstport_buf, "*");
+			}
+		
+			if (temp->route.src_port[0]) {
+				if (temp->route.src_port[1] != temp->route.src_port[0]) {
+					sprintf(srcport_buf, "%d-%d", temp->route.src_port[0], temp->route.src_port[1]);
+				} else {
+					sprintf(srcport_buf, "%d", temp->route.src_port[0]);
+				}
+			} else {
+				strcpy(srcport_buf, "*");
+			}
+		
+			cmm_print(DEBUG_STDOUT, "dev:%s prio:%d %sdstip:%s srcip:%s input:%s proto:%s dstport:%s srcport:%s\n",
+					temp->route.output_device_str, temp->route.prio, mtu_buf, dstip_buf, srcip_buf, input_buf,
+					proto_buf, dstport_buf, srcport_buf);
+		}
+	}
+	__pthread_mutex_unlock(&RouteMutex);
+
+}
+
+int cmmRouteProcessClientCmd(FCI_CLIENT* fciMsgHandler, int function_code, u_int8_t *cmd_buf, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	cmmd_route_entry_t	*entryCmd = (cmmd_route_entry_t *) cmd_buf;
+	struct route_list *temp, *prev, *newentry;
+
+
+	cmm_print(DEBUG_INFO, "cmmRouteProcessClientCmd\n");
+	
+	res_buf[0] = CMMD_ERR_OK;
+	*res_len = 2;
+
+	switch (entryCmd->action) {
+		case CMMD_EXTROUTE_ACTION_ADD:
+			cmm_print(DEBUG_INFO, "cmmRouteProcessClientCmd - EXTROUTE_ACTION_ADD\n");
+			newentry = (struct route_list *)malloc(sizeof(struct route_list));
+			memset(newentry, 0, sizeof(newentry));
+			newentry->route = *entryCmd;
+
+			/* route_table needs to be arranged in order of  priority */
+			__pthread_mutex_lock(&RouteMutex);
+		
+			if (!route_table) {
+				route_table = newentry;
+				__pthread_mutex_unlock(&RouteMutex);
+				break;
+			}
+			
+			prev = NULL;
+			for (temp = route_table; temp != NULL; temp = temp->next) {
+				if (temp->route.prio >= newentry->route.prio) {
+					break;
+				} 
+				prev = temp;
+			}
+			if (prev) {
+				newentry->next = prev->next;
+				prev->next = newentry;
+			} else {
+				newentry->next = route_table;
+				route_table = newentry;
+			}
+			__pthread_mutex_unlock(&RouteMutex);
+			break;
+
+		case CMMD_EXTROUTE_ACTION_REMOVE:
+			cmm_print(DEBUG_INFO, "cmmRouteProcessClientCmd - EXTROUTE_ACTION_REMOVE\n");
+			__pthread_mutex_lock(&RouteMutex);
+			temp = route_table;
+			if (!temp) {
+				__pthread_mutex_unlock(&RouteMutex);
+				break;
+			}
+			prev = NULL;
+
+			while (temp != NULL) {
+				if (!memcmp(temp->route.output_device_str, entryCmd->output_device_str, sizeof(entryCmd->output_device_str))
+					&& !memcmp(temp->route.dst_addr, entryCmd->dst_addr, sizeof(entryCmd->dst_addr))
+					&& !memcmp(temp->route.src_addr, entryCmd->src_addr, sizeof(entryCmd->src_addr))
+					&& (temp->route.proto == entryCmd->proto)
+					&& !memcmp(temp->route.dst_port, entryCmd->dst_port, sizeof(entryCmd->dst_port))
+					&& !memcmp(temp->route.src_port, entryCmd->src_port, sizeof(entryCmd->src_port))) {
+					cmm_print(DEBUG_INFO, "An entry has been found to remove\n");
+					break;
+				} else {
+					prev = temp;
+					temp = temp->next;
+				}
+			}
+			if (temp == NULL) {
+				cmm_print(DEBUG_ERROR,	"An entry have been removed already on localtable or the delete command for same entry\n");
+				goto end;
+			}
+			if (prev == NULL)
+				route_table = temp->next;
+			else
+				prev->next = temp->next;
+
+			free(temp);
+end:
+			__pthread_mutex_unlock(&RouteMutex);
+			break;
+
+		case CMMD_EXTROUTE_ACTION_QUERY:
+			cmm_print(DEBUG_INFO, "cmmRouteProcessClientCmd - EXTROUTE_ACTION_QUERY for %s device\n", entryCmd->output_device_str);
+			cmmRouteDumpTable(entryCmd->output_device_str);
+			break;
+
+		case CMMD_EXTROUTE_ACTION_RESET:
+			cmm_print(DEBUG_INFO, "cmmRouteProcessClientCmd - EXTROUTE_ACTION_RESET\n");
+			__pthread_mutex_lock(&RouteMutex);
+			for (temp = route_table; temp != NULL; temp = route_table) {
+				route_table = temp->next;
+				free(temp);
+			}
+			__pthread_mutex_unlock(&RouteMutex);
+			break;
+
+		default:
+			res_buf[0] = CMMD_ERR_UNKNOWN_ACTION;
+			break;
+	}
+
+	return 0;
+}
+
+struct RtEntry *cmmPolicyRouting(unsigned int srcip, unsigned int dstip, unsigned short proto, unsigned short sport, unsigned short dport)
+{
+	struct route_list *temp;
+	char saddr_buf[INET_ADDRSTRLEN], daddr_buf[INET_ADDRSTRLEN];
+	struct RtEntry *route = NULL;
+	fpp_rt_cmd_t rtCmd;
+	int key;
+
+	cmm_print(DEBUG_INFO, "%s: srcip=%s, dstip=%s, proto=%d, sport=%d, dport=%d\n", __func__,
+					inet_ntop(AF_INET, &srcip, saddr_buf, sizeof(saddr_buf)),
+					inet_ntop(AF_INET, &dstip, daddr_buf, sizeof(daddr_buf)),
+					proto, ntohs(sport), ntohs(dport));
+
+	__pthread_mutex_lock(&RouteMutex);
+
+	rtCmd.output_device[0] = '\0';
+	for (temp = route_table; temp != NULL; temp = temp->next) {
+		if (temp->route.dst_addr[0]) {
+			if ((ntohl(temp->route.dst_addr[0]) > ntohl(dstip)) || (ntohl(temp->route.dst_addr[1]) < ntohl(dstip))) {
+				continue;
+			}
+		}
+		if (temp->route.src_addr[0]) {
+			if ((ntohl(temp->route.src_addr[0]) > ntohl(srcip)) || (ntohl(temp->route.src_addr[1]) < ntohl(srcip))) {
+				continue;
+			}
+		}
+		if (temp->route.input_device_str[0]) {
+			// look up the input interface if we don't already know it
+			if (rtCmd.output_device[0] == '\0') {
+				struct RtEntry *input_route;
+				struct flow flow = {
+							.family = AF_INET,
+							.sAddr = &dstip,
+							.dAddr = &srcip,
+						};
+
+				input_route = __cmmRouteFind(&flow);  // reverse src and dest addrs for input interface
+				if (input_route)
+				{
+					__itf_get_name(input_route->oifindex, rtCmd.output_device, sizeof(rtCmd.output_device) - 1);
+					cmm_print(DEBUG_INFO, "cmmPolicyRouting: ingress interface=%s\n", rtCmd.output_device);
+				}
+				else
+				{
+					cmm_print(DEBUG_WARNING, "cmmPolicyRouting: no ingress interface found\n");
+					continue;
+				}
+			}
+			if (strcmp(rtCmd.output_device, temp->route.input_device_str) != 0) {
+				continue;
+			}
+		}
+		if (temp->route.proto) {
+			if (temp->route.proto != proto) {
+				continue;
+			}
+		}
+		if (temp->route.dst_port[0]) {
+			if ((temp->route.dst_port[0] > ntohs(dport)) || (temp->route.dst_port[1] < ntohs(dport))) {
+				continue;
+			}
+		}
+		if (temp->route.src_port[0]) {
+			if ((temp->route.src_port[0] > ntohs(sport)) || (temp->route.src_port[1] < ntohs(sport))) {
+				continue;
+			}
+		}
+		break;
+	}
+
+	if (!temp)
+		goto out;
+
+	cmm_print(DEBUG_INFO, "%s: route found\n", __func__);
+	route = malloc(sizeof(struct RtEntry));
+	if (!route)
+	{
+		cmm_print(DEBUG_ERROR, "%s: malloc() failed\n", __func__);
+		goto out;
+	}
+	memset(route, 0, sizeof(struct RtEntry));
+
+	route->count++;
+
+	route->family = AF_INET;
+	route->type = RTN_UNICAST;
+
+	route->sAddr[0] = srcip;
+	route->sAddrLen = 4;
+	route->dAddr[0] = dstip;
+	route->dAddrLen = 4;
+	route->gwAddr[0] = dstip;
+	route->gwAddrLen = 4;
+
+	route->oifindex = if_nametoindex(temp->route.output_device_str);
+	if (!route->oifindex)
+		cmm_print(DEBUG_ERROR, "%s: route interface name is not valid\n", __func__);
+
+	route->mtu = temp->route.mtu ? : __itf_get_mtu(route->oifindex);
+
+	route->flags |= RT_POLICY;
+
+	key = HASH_NEIGHBOR(route->family, route->gwAddr);
+
+	list_add(&rt_table_by_gw_ip[key], &route->list_by_gw_ip);
+
+out:
+	__pthread_mutex_unlock(&RouteMutex);
+
+	return route;
+}
diff --git a/cmm/src/module_route.h b/cmm/src/module_route.h
new file mode 100644
index 0000000..514cb15
--- /dev/null
+++ b/cmm/src/module_route.h
@@ -0,0 +1,31 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_ROUTE_H__
+#define __MODULE_ROUTE_H__
+
+	void cmmRouteShowPrintHelp();
+	int cmmRouteShowProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+	void cmmRouteSetPrintHelp();
+	int cmmRouteSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+	int cmmRouteProcessClientCmd(FCI_CLIENT* fciMsgHandler, int function_code, u_int8_t *cmd_buf, u_int16_t *res_buf, u_int16_t *res_len);
+	struct RtEntry *cmmPolicyRouting(unsigned int srcip, unsigned int dstip, unsigned short proto, unsigned short sport, unsigned short dport);
+
+#endif
+
diff --git a/cmm/src/module_rtp.c b/cmm/src/module_rtp.c
new file mode 100755
index 0000000..63be1a4
--- /dev/null
+++ b/cmm/src/module_rtp.c
@@ -0,0 +1,1190 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+#include "cmm.h"
+#include <stdlib.h>
+#include <string.h>
+#include "module_rtp.h"
+#include "fpp.h"
+
+static void cmmRTPSetUsage(void)
+{
+	cmm_print(DEBUG_STDOUT, 
+			"Usage: set rtp \n"
+			"\n"
+			"                                  [open | update]\n"
+			"                                       [ccn {call control number}] \n"
+			"                                       [sock_id_a {socket ID}]\n"
+			"                                       [sock_id_b {socket ID}] \n"
+			"\n"
+			"                                  [takeover]\n"
+			"                                       [ccn {call control number}] \n"
+			"                                       [sock_id {socket ID}]\n"
+			"                                       [seq_nb_base {Sequence number base }]\n"
+			"                                       [rtp_ssrc {RTP SSRC}]\n"
+			"                                       [rtp_time_base {RTP timestamp base}]\n"
+			"                                       [rtp_time_incr {RTP timestamp increment}]\n"
+			"                                       [rtp_time_incr_mode {0:TS value, 1:Freq HZ}]\n"
+			"                                       [ssrc_mode {0: regular, 1: auto}]\n"
+			"\n"
+			"                                  [control]\n"
+			"                                       [ccn {call control number}] \n"
+			"                                       [rtp_media_ctrl {0-3}]\n"           
+			"\n"
+			"                                  [close]\n"
+			"                                       [ccn {call control number}] \n"	  
+			"\n"
+			"                                  [spectx_ctrl]\n"
+			"                                       [ccn {call control number}] \n"	  
+			"                                       [type_tx {0: Transmission start, 1: Reception response, 2: Transmission stop, 3: Transmission single shot}] \n"	  
+			"\n"
+			"                                  [spectx_payload]\n"
+			"                                       [ccn {call control number}] \n"	  
+			"                                       [id {0: special payload 1, 1: special payload 2}] \n"	  
+			"                                       [rtp_payload {Special RTP payload (string)}] \n"
+			"\n"
+	          );
+}
+static void cmmRTCPQueryUsage(void)
+{
+	cmm_print(DEBUG_STDOUT, 
+			"Usage: query rtcp [sock_id {socket ID}] [reset {full | partial}]\n"
+			"\n"
+	          );
+}
+int cmmRTPSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	unsigned int tmp; 
+	unsigned int takeover_mode = 0;
+	char * endptr;
+	char rcvBuffer[256];
+
+
+	if(!keywords[cpt])
+		goto print_help;
+
+	if((strcasecmp(keywords[cpt], "open") == 0)
+	||(strcasecmp(keywords[cpt], "update") == 0))
+	{
+		fpp_rtp_open_cmd_t cmd;
+		unsigned int action;
+
+		if(strcasecmp(keywords[cpt], "open") == 0)
+			action = FPP_CMD_RTP_OPEN;
+		else
+			action = FPP_CMD_RTP_UPDATE;
+		
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "ccn") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: ccn must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.call_id = tmp;
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "sock_id_a") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: sock_id_a parameter must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.socket_a= tmp;
+
+		
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto print_help;
+	
+		if((strcasecmp(keywords[cpt], "sock_id_b") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+		
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: sock_id_b parameter must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.socket_b= tmp;
+		}
+		else
+			goto keyword_error;
+
+		// Send  command
+		if(cmmSendToDaemon(daemon_handle, action, &cmd, sizeof(cmd), &rcvBuffer) == 2)
+		{
+			if ((((unsigned short*)rcvBuffer)[0]) != 0)
+				cmm_print(DEBUG_STDERR, "Error %s (%d) received from FPP \n", getErrorString(((unsigned short*)rcvBuffer)[0]), ((unsigned short*)rcvBuffer)[0]);
+		}
+	}
+	
+
+
+	
+	else if (strcasecmp(keywords[cpt], "takeover") == 0)
+	{
+		fpp_rtp_takeover_cmd_t cmd;
+
+		memset(&cmd,0,sizeof(fpp_rtp_takeover_cmd_t));
+		
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "ccn") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: ccn must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.call_id = tmp;
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "sock_id") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: sock_id parameter must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.socket= tmp;
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto print_help;
+
+		if((strcasecmp(keywords[cpt], "seq_nb_base") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: seq_nb_base parameter must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.seq_number_base= tmp;
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "rtp_ssrc") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+		
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > ULONG_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: sock_id_b parameter must be a number between 0 and %d\n", (unsigned int) ULONG_MAX);
+				goto  print_help;
+			}
+			cmd.ssrc= tmp;
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto print_help;
+
+		if((strcasecmp(keywords[cpt], "rtp_time_base") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+		
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > ULONG_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: rtp_time_base parameter must be a number between 0 and %d\n", (unsigned int) ULONG_MAX);
+				goto  print_help;
+			}
+			cmd.ts_base= tmp;
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto send;
+
+		if((strcasecmp(keywords[cpt], "rtp_time_incr") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+		
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > ULONG_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: rtp_time_incr parameter must be a number between 0 and %d\n", (unsigned int) ULONG_MAX);
+				goto  print_help;
+			}
+			cmd.ts_incr= tmp;
+		}
+		else
+			goto keyword_error;	
+
+		if(!keywords[++cpt])
+			goto send;
+
+		if((strcasecmp(keywords[cpt], "rtp_time_incr_mode") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+		
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > 1))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: rtp_time_incr_mod parameter must be 0 or 1\n");
+				goto  print_help;
+			}
+			if(tmp)
+				takeover_mode = FPP_RTP_TAKEOVER_MODE_TSINCR_FREQ;
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto send;
+
+		if((strcasecmp(keywords[cpt], "ssrc_mode") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+		
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > 1))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: ssrc_mode parameter must be 0 or 1\n");
+				goto  print_help;
+			}
+			if(tmp)
+				takeover_mode |= FPP_RTP_TAKEOVER_MODE_SSRC;
+		}
+		else
+			goto keyword_error;		
+
+		cmd.mode = takeover_mode;
+
+send:
+		// Send  command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_RTP_TAKEOVER, &cmd, sizeof(cmd), &rcvBuffer) == 2)
+		{
+			if ((((unsigned short*)rcvBuffer)[0]) != 0)
+				cmm_print(DEBUG_STDERR, "Error %s (%d) received from FPP \n", getErrorString(((unsigned short*)rcvBuffer)[0]), ((unsigned short*)rcvBuffer)[0]);
+		}
+
+	}
+	else if (strcasecmp(keywords[cpt], "control") == 0)
+	{
+		fpp_rtp_ctrl_cmd_t cmd;
+		
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "ccn") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: ccn must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.call_id = tmp;
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "rtp_media_ctrl") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > 3))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: rtp_media_ctrl parameter must be a number between 0 and 3\n");
+				goto  print_help;
+			}
+			cmd.control_dir= tmp;
+
+		
+		}
+		else
+			goto keyword_error;
+
+		// Send  command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_RTP_CONTROL, &cmd, sizeof(cmd), &rcvBuffer) == 2)
+		{
+			if ((((unsigned short*)rcvBuffer)[0]) != 0)
+				cmm_print(DEBUG_STDERR, "Error %s (%d) received from FPP \n", getErrorString(((unsigned short*)rcvBuffer)[0]), ((unsigned short*)rcvBuffer)[0]);
+		}	
+	}	
+	else if (strcasecmp(keywords[cpt], "close") == 0)
+	{
+		fpp_rtp_close_cmd_t cmd;
+		
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "ccn") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: ccn must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.call_id = tmp;
+		}
+		else
+			goto keyword_error;
+
+		// Send  command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_RTP_CLOSE, &cmd, sizeof(cmd), &rcvBuffer) == 2)
+		{
+			if ((((unsigned short*)rcvBuffer)[0]) != 0)
+				cmm_print(DEBUG_STDERR, "Error %s (%d) received from FPP \n", getErrorString(((unsigned short*)rcvBuffer)[0]), ((unsigned short*)rcvBuffer)[0]);
+		}	
+	}	
+	else if (strcasecmp(keywords[cpt], "spectx_ctrl") == 0)
+	{
+		fpp_rtp_spec_tx_ctrl_cmd_t cmd;
+		
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "ccn") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: ccn must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.call_id = tmp;
+		}
+		else
+			goto keyword_error;
+		
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "type_tx") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+		
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > 3))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: type_tx must be a number between 0 and 3\n");
+				goto  print_help;
+			}
+			cmd.type= tmp;		
+		}
+		else
+			goto keyword_error;
+
+
+		// Send  command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_RTP_SPECTX_CTRL, &cmd, sizeof(cmd), &rcvBuffer) == 2)
+		{
+			if ((((unsigned short*)rcvBuffer)[0]) != 0)
+				cmm_print(DEBUG_STDERR, "Error %s (%d) received from FPP \n", getErrorString(((unsigned short*)rcvBuffer)[0]), ((unsigned short*)rcvBuffer)[0]);
+		}		
+	}
+
+	else if (strcasecmp(keywords[cpt], "spectx_payload") == 0)
+	{
+		fpp_rtp_spec_tx_payload_cmd_t cmd;
+		char *rtp_payload;
+		unsigned short rtp_payload_s;
+		
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "ccn") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: ccn must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.call_id = tmp;
+		}
+		else
+			goto keyword_error;
+		
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "id") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+		
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > 1))
+			{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: id must be a number between 0 and 1\n");
+				goto  print_help;
+			}
+			cmd.payload_id = tmp;		
+		}
+		else
+			goto keyword_error;
+
+
+		if(!keywords[++cpt])
+			goto print_help;
+	
+		if((strcasecmp(keywords[cpt], "rtp_payload") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+	
+			rtp_payload = keywords[cpt];
+		}
+		else
+			goto keyword_error;
+
+		rtp_payload_s = strlen(rtp_payload);
+
+		if(rtp_payload_s > FPP_MAX_SPTX_STRING_SIZE)
+		{
+				cmm_print(DEBUG_CRIT, "rtp ERROR: RTP payload string size must be < %d\n", FPP_MAX_SPTX_STRING_SIZE);
+				goto  print_help;
+		}
+
+		cmd.payload_length = rtp_payload_s;
+		memcpy(cmd.payload, rtp_payload, rtp_payload_s);
+		// Send  command
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_RTP_SPECTX_PLD, &cmd, sizeof(cmd), &rcvBuffer) == 2)
+		{
+			if ((((unsigned short*)rcvBuffer)[0]) != 0)
+				cmm_print(DEBUG_STDERR, "Error %s (%d) received from FPP \n", getErrorString(((unsigned short*)rcvBuffer)[0]), ((unsigned short*)rcvBuffer)[0]);
+		}		
+	}
+	else
+	{
+		goto keyword_error;
+	}
+	
+	return 0;
+
+
+
+keyword_error:
+	cmm_print(DEBUG_STDOUT,"ERR: unknown keyword %s\n", keywords[cpt]);
+print_help:
+	cmmRTPSetUsage();
+	return -1;
+}
+
+int cmmRTCPQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	char rcvBuffer[256] __attribute__ ((aligned (4)));
+	fpp_rtcp_query_cmd_t cmd;
+	fpp_rtcp_query_res_t *rsp = (fpp_rtcp_query_res_t *)(rcvBuffer + 4);
+	unsigned int tmp;
+	char * endptr;
+	int rcvBytes;
+
+	if(!keywords[cpt])
+		goto print_help;
+	
+	if((strcasecmp(keywords[cpt], "sock_id") == 0))
+	{
+		if(!keywords[++cpt])
+			goto print_help;
+
+		memset(&cmd, 0, sizeof(cmd));
+
+		/*Get an integer from the string*/
+		endptr = NULL;
+		tmp = strtoul(keywords[cpt], &endptr, 0);
+		if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+		{
+			cmm_print(DEBUG_CRIT, "rtp ERROR: sock_id must be a number between 0 and %d\n", USHRT_MAX);
+			goto  print_help;
+		}
+		cmd.socket_id = tmp;
+
+		if (keywords[++cpt])
+		{
+			if (strcasecmp(keywords[cpt], "reset") == 0)
+                        {
+                            if(!keywords[++cpt])
+                                cmd.flags = 0x1; //default is full reset
+                            else if(strcasecmp(keywords[cpt], "full") == 0)
+                                cmd.flags = 0x1;
+                            else if(strcasecmp(keywords[cpt], "partial") == 0)
+                                cmd.flags = 0x2;
+                        }
+                        else
+				goto print_help;
+		}
+	}
+	else
+		goto keyword_error;
+
+	// Send  command
+	rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_RTCP_QUERY, &cmd, sizeof(fpp_rtcp_query_cmd_t), rcvBuffer + 2);
+	
+        if (rcvBytes < sizeof(unsigned short))
+        {
+                cmm_print(DEBUG_CRIT, "Short message received from FPP \n");
+                goto out;
+        }
+
+        if ((((unsigned short*)rcvBuffer)[1]) != 0)
+        {
+                cmm_print(DEBUG_CRIT, "Error: %s (%d) received from FPP for CMD_RTCP_QUERY\n", getErrorString(((unsigned short*)rcvBuffer)[1]), ((unsigned short*)rcvBuffer)[1]);
+                goto out;
+        }
+
+        if (rcvBytes < (sizeof(fpp_rtcp_query_res_t) + sizeof(unsigned short)))
+        {
+                cmm_print(DEBUG_CRIT, "Short message received from FPP \n");
+                goto out;
+        }
+
+	cmm_print(DEBUG_STDOUT, 	"RTCP Statistics (sport %u dport %u)\n\n"
+							"prev_reception_period(ms)        : %u\n"
+							"last_reception_period(ms)        : %u\n"
+							"num_tx_pkts                      : %u\n"
+							"num_rx_pkts                      : %u\n"
+							"last_rx_Seq                      : %u\n"
+							"last_rx_TimeStamp                : %u\n"
+							"RTP_header                       : %x %x %x %x %x %x %x %x %x %x %x %x\n"
+							"num_dup_rx                       : %u\n"
+							"num_rx_since_RTCP                : %u\n"
+							"num_tx_bytes                     : %u\n"
+							"min_jitter(us)                   : %u\n"
+							"max_jitter(us)                   : %u\n"
+							"average_jitter(us)               : %u\n"
+							"num_rx_lost_pkts                 : %u\n"
+							"min_reception_period(us)         : %u\n"
+							"max_reception_period(us)         : %u\n"
+							"average_reception_period(us)     : %u\n"
+							"num_malformed_pkts               : %u\n"
+							"num_expected_pkts                : %u\n"
+							"num_late_pkts                    : %u\n"
+							"ssrc_overwrite_value             : %x\n",
+							ntohs(rsp->sport),
+							ntohs(rsp->dport),
+							rsp->prev_reception_period,
+							rsp->last_reception_period,
+							rsp->num_tx_pkts,
+							rsp->num_rx_pkts,
+							rsp->last_rx_seq,
+							rsp->last_rx_timestamp,
+							rsp->rtp_header[0], rsp->rtp_header[1], rsp->rtp_header[2], rsp->rtp_header[3], rsp->rtp_header[4], rsp->rtp_header[5],
+							rsp->rtp_header[6], rsp->rtp_header[7], rsp->rtp_header[8], rsp->rtp_header[9], rsp->rtp_header[10], rsp->rtp_header[11],
+							rsp->num_rx_dup,
+							rsp->num_rx_since_rtcp,
+							rsp->num_tx_bytes,
+							rsp->min_jitter, rsp->max_jitter, rsp->average_jitter,
+							rsp->num_rx_lost_pkts,
+							rsp->min_reception_period,
+							rsp->max_reception_period,
+							rsp->average_reception_period,
+							rsp->num_malformed_pkts,
+							rsp->num_expected_pkts,
+							rsp->num_late_pkts,
+							rsp->ssrc_overwrite_value
+							);
+out:
+	return 0 ;
+	
+keyword_error:
+	cmm_print(DEBUG_STDOUT,"ERR: unknown keyword %s\n", keywords[cpt]);
+print_help:
+	cmmRTCPQueryUsage();
+	return -1;
+}
+
+
+/******************** RTP Statistics for QoS Measurement ********************************/
+static void cmmRTPStatsSetUsage(void)
+{
+	cmm_print(DEBUG_STDOUT, 
+			"Usage: set rtpstats \n"
+			"\n"
+			"                                  [enable]\n"
+			"                                  	[id {RTP stream ID}]\n"
+			"                                  	[type  {connection type: ip4 | ip6 | mc4 | mc6 | relay | relay6}]\n"
+			"                                  	[saddr {ip source}]\n"
+			"                                  	[daddr {ip destination}]\n"
+			"                                  	[sport {port source}]\n"
+			"                                  	[dport {port destination}]\n"
+			"                                  	[proto {layer 3 protocol: udp | tcp}]\n"
+			"                                  	[auto  {udp port discovery mode}]\n"
+			"\n"
+			"                                  [disable]\n"
+			"                                  	[id {RTP stream ID}]\n"
+			"\n"
+			"                                  [dtmf_relay]\n"
+			"                                       [{pt value 1} {pt value 2}]\n"
+			"\n"
+	          );
+}
+
+static void cmmRTPStatsQueryUsage(void)
+{
+	cmm_print(DEBUG_STDOUT, 
+			"Usage: query rtpstats [id {RTP stream ID}] [reset {full | partial}]\n"
+			"\n"
+	          );
+}
+
+int cmmRTPStatsSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	unsigned int tmp;
+	char * endptr;
+	char rcvBuffer[256];
+	fpp_rtp_stat_enable_cmd_t cmd_ena;
+	fpp_rtp_stat_disable_cmd_t cmd_dis;
+	fpp_rtp_stat_dtmf_pt_cmd_t cmd_dtmf_pt;
+	unsigned char pt_low, pt_high;
+	int family;
+	int rcvBytes;
+
+	memset(&cmd_ena, 0 , sizeof(fpp_rtp_stat_enable_cmd_t));
+	memset(&cmd_dis, 0 , sizeof(fpp_rtp_stat_disable_cmd_t));
+	memset(&cmd_dtmf_pt, 0 , sizeof(fpp_rtp_stat_dtmf_pt_cmd_t));
+
+	if(!keywords[cpt])
+		goto print_help;
+
+	if((strcasecmp(keywords[cpt], "enable") == 0))
+	{
+		if(!keywords[++cpt])
+			goto print_help;
+
+		if(strcasecmp(keywords[cpt], "id") == 0)
+		{
+		  	if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "ERROR: stream ID parameter must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd_ena.stream_id= tmp;
+		}
+		else
+			goto keyword_error;
+		
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "type") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			if(strcasecmp(keywords[cpt], "ip4") == 0) {
+				cmd_ena.stream_type = FPP_RTPSTATS_TYPE_IP4;
+				family = AF_INET;
+			}
+			else if(strcasecmp(keywords[cpt], "ip6") == 0) {
+				cmd_ena.stream_type = FPP_RTPSTATS_TYPE_IP6;
+				family = AF_INET6;
+			}
+			else if(strcasecmp(keywords[cpt], "mc4") == 0) {
+				cmd_ena.stream_type = FPP_RTPSTATS_TYPE_MC4;
+				family = AF_INET;
+			}  
+			else if (strcasecmp(keywords[cpt], "mc6") == 0) {
+				cmd_ena.stream_type = FPP_RTPSTATS_TYPE_MC6;
+				family = AF_INET6;
+			}
+			else if (strcasecmp(keywords[cpt], "relay") == 0) {
+				cmd_ena.stream_type = FPP_RTPSTATS_TYPE_RLY;
+				family = AF_INET;
+			}
+			else if (strcasecmp(keywords[cpt], "relay6") == 0) {
+				cmd_ena.stream_type = FPP_RTPSTATS_TYPE_RLY6;
+				family = AF_INET6;
+			}
+
+			else
+				goto keyword_error;
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "saddr") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			if (!inet_pton(family, keywords[cpt], cmd_ena.saddr))
+			{
+				cmm_print(DEBUG_CRIT,"ERROR: reading source address %s\n", keywords[cpt]);
+				goto keyword_error;
+			}
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto print_help;
+	
+		if((strcasecmp(keywords[cpt], "daddr") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			if (!inet_pton(family, keywords[cpt], cmd_ena.daddr))
+			{
+				cmm_print(DEBUG_CRIT,"ERROR:reading destination address %s\n", keywords[cpt]);
+				goto keyword_error;
+			}
+		}
+		else
+			goto keyword_error;
+		
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "sport") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "ERROR: sport must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd_ena.sport =  htons(tmp);
+		}
+		else
+			goto keyword_error;
+		
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "dport") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "ERROR: dport must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd_ena.dport =  htons(tmp);
+		}
+		else
+			goto keyword_error;
+
+		
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if((strcasecmp(keywords[cpt], "proto") == 0))
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			if(strcasecmp(keywords[cpt], "udp") == 0)
+				cmd_ena.proto = IPPROTO_UDP;
+			else if (strcasecmp(keywords[cpt], "tcp") == 0)
+				cmd_ena.proto = IPPROTO_TCP;			
+			else
+				goto keyword_error;
+		}
+		else
+			goto keyword_error;
+		
+		/* auto mode is optional */
+		if(keywords[++cpt])
+		{	
+			if((strcasecmp(keywords[cpt], "auto") == 0))
+			{
+				cmd_ena.mode = 1;			
+			}
+			else
+				goto keyword_error;
+		}
+		
+		// Send  command
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_RTP_STATS_ENABLE, &cmd_ena, sizeof(cmd_ena), &rcvBuffer);
+	
+		if (rcvBytes < sizeof(unsigned short))
+		{
+			cmm_print(DEBUG_CRIT, "Short message received from FPP \n");
+			goto out;
+		}
+
+		if ((((unsigned short*)rcvBuffer)[0]) != 0)
+		{
+			cmm_print(DEBUG_CRIT, "ERROR: %s (%d) received from FPP for CMD_RTP_STATS_ENABLE\n", getErrorString(((unsigned short*)rcvBuffer)[0]), ((unsigned short*)rcvBuffer)[0]);
+			goto out;
+		}
+	}
+	else if((strcasecmp(keywords[cpt], "disable") == 0))
+	{
+		if(!keywords[++cpt])
+			goto print_help;
+
+		if(strcasecmp(keywords[cpt], "id") == 0)
+		{
+		  	if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "ERROR: stream ID parameter must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd_dis.stream_id = tmp;
+		}
+		else
+			goto keyword_error;
+		
+		// Send command
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_RTP_STATS_DISABLE, &cmd_dis, sizeof(cmd_dis), &rcvBuffer);
+		
+		if (rcvBytes < sizeof(unsigned short))
+		{
+			cmm_print(DEBUG_CRIT, "Short message received from FPP \n");
+			goto out;
+		}
+
+		if ((((unsigned short*)rcvBuffer)[0]) != 0)
+		{
+			cmm_print(DEBUG_CRIT, "ERROR: %s (%d) received from FPP for CMD_RTP_STATS_DISABLE\n", getErrorString(((unsigned short*)rcvBuffer)[0]), ((unsigned short*)rcvBuffer)[0]);
+			goto out;
+		}
+	}
+	else if((strcasecmp(keywords[cpt], "dtmf_relay") == 0))
+	{
+		if(!keywords[++cpt])
+		      goto print_help;
+		
+		/*Get an integer from the string*/
+		endptr = NULL;
+		tmp = strtoul(keywords[cpt], &endptr, 0);
+		if ((keywords[cpt] == endptr) ||  (tmp > 255))
+		{
+			cmm_print(DEBUG_CRIT, "ERROR: payload type parameter must be a number between 0 and %d\n", 255);
+			goto  print_help;
+		}
+		pt_low = (0x00FF & tmp);
+		
+		/* if only one parameter specified, re-used first one */
+		if(!keywords[++cpt]) 
+			pt_high = pt_low;
+		else 
+		{
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > 255))
+			{
+				cmm_print(DEBUG_CRIT, "ERROR: payload type parameter must be a number between 0 and %d\n", 255);
+				goto  print_help;
+			}
+			pt_high = (0x00FF & tmp);
+			
+			/* make sure values are ordered */
+			if(pt_high < pt_low) 
+			{
+				pt_high = pt_low;
+				pt_low = (0x00FF & tmp);
+ 			}
+		}
+		
+		cmd_dtmf_pt.pt = (pt_high << 8) | pt_low;
+		
+		// Send command
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_RTP_STATS_DTMF_PT, &cmd_dtmf_pt, sizeof(cmd_dtmf_pt), &rcvBuffer);
+		
+		if (rcvBytes < sizeof(unsigned short))
+		{
+			cmm_print(DEBUG_CRIT, "Short message received from FPP \n");
+			goto out;
+		}
+
+		if ((((unsigned short*)rcvBuffer)[0]) != 0)
+		{
+			cmm_print(DEBUG_CRIT, "ERROR: %s (%d) received from FPP for CMD_RTP_STATS_DTMF_PT\n", getErrorString(((unsigned short*)rcvBuffer)[0]), ((unsigned short*)rcvBuffer)[0]);
+			goto out;
+		}
+	}
+	else
+	{
+		goto keyword_error;
+	}
+out:
+	return 0;
+
+keyword_error:
+	cmm_print(DEBUG_STDOUT,"ERROR: unknown keyword %s\n", keywords[cpt]);
+print_help:
+	cmmRTPStatsSetUsage();
+	return -1;
+}
+
+
+int cmmRTPStatsQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	/* TO CLEAN: Temporary fix for alignment */
+	char rcvBuffer[256] __attribute__ ((aligned (4)));
+	fpp_rtcp_query_cmd_t cmd;
+	fpp_rtcp_query_res_t *rsp = (fpp_rtcp_query_res_t*)(rcvBuffer + 4);
+	unsigned int tmp;
+	char * endptr;
+	int rcvBytes;
+
+	if(!keywords[cpt])
+		goto print_help;
+	
+	if((strcasecmp(keywords[cpt], "id") == 0))
+	{
+		if(!keywords[++cpt])
+			goto print_help;
+
+		memset(&cmd, 0, sizeof(cmd));
+
+		/*Get an integer from the string*/
+		endptr = NULL;
+		tmp = strtoul(keywords[cpt], &endptr, 0);
+		if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+		{
+			cmm_print(DEBUG_CRIT, "rtpstats: stream id must be a number between 0 and %d\n", USHRT_MAX);
+		        goto  print_help;
+		}
+		cmd.socket_id = tmp;
+
+		if(keywords[++cpt]) 
+		{
+		    if(strcasecmp(keywords[cpt++], "reset") == 0)
+                    {
+                        if(!keywords[cpt])
+                            cmd.flags = 0x1; //default is full reset
+                        else if(strcasecmp(keywords[cpt], "full") == 0)
+                            cmd.flags = 0x1;
+                        else if(strcasecmp(keywords[cpt], "partial") == 0)
+                            cmd.flags = 0x2;
+                    }
+		    else
+			goto print_help;
+		}
+	}
+	else
+		goto keyword_error;
+
+	// Send  command
+	rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_RTP_STATS_QUERY, &cmd, sizeof(cmd), rcvBuffer + 2);
+	
+	if (rcvBytes < sizeof(unsigned short))
+	{
+		cmm_print(DEBUG_CRIT, "Short message received from FPP \n");
+		goto out;
+	}
+
+	if ((((unsigned short*)rcvBuffer)[1]) != 0)
+	{
+		cmm_print(DEBUG_CRIT, "Error: %s (%d) received from FPP for CMD_RTP_STATS_QUERY\n", getErrorString(((unsigned short*)rcvBuffer)[1]), ((unsigned short*)rcvBuffer)[1]);
+		goto out;
+	}
+
+	if (rcvBytes < (sizeof(fpp_rtcp_query_res_t) + sizeof(unsigned short)))
+	{
+		cmm_print(DEBUG_CRIT, "Short message received from FPP \n");
+		goto out;
+	}
+
+
+	cmm_print(DEBUG_STDOUT, 	"RTP Statistics (sport %u dport %u)\n\n"
+							"prev_reception_period(ms)        : %u\n"
+							"last_reception_period(ms)        : %u\n"
+							"num_tx_pkts                      : %u\n"
+							"num_rx_pkts                      : %u\n"
+							"last_rx_Seq                      : %u\n"
+							"last_rx_TimeStamp                : %u\n"
+							"RTP_header                       : %x %x %x %x %x %x %x %x %x %x %x %x\n"
+							"num_dup_rx                       : %u\n"
+							"num_rx_since_RTCP                : %u\n"
+							"num_tx_bytes                     : %u\n"
+							"min_jitter(us)                   : %u\n"
+							"max_jitter(us)                   : %u\n"
+							"average_jitter(us)               : %u\n"
+							"num_rx_lost_pkts                 : %u\n"
+							"num_cumulative_rx_lost_pkts      : %u\n"
+							"min_reception_period(us)         : %u\n"
+							"max_reception_period(us)         : %u\n"
+							"average_reception_period(us)     : %u\n"
+							"num_malformed_pkts               : %u\n"
+							"num_expected_pkts                : %u\n"
+		  					"num_late_pkts                    : %u\n",
+							ntohs(rsp->sport),
+							ntohs(rsp->dport),
+							rsp->prev_reception_period,
+							rsp->last_reception_period,
+							rsp->num_tx_pkts,
+							rsp->num_rx_pkts,
+							rsp->last_rx_seq,
+							rsp->last_rx_timestamp,
+							rsp->rtp_header[0], rsp->rtp_header[1], rsp->rtp_header[2], rsp->rtp_header[3], rsp->rtp_header[4], rsp->rtp_header[5],
+							rsp->rtp_header[6], rsp->rtp_header[7], rsp->rtp_header[8], rsp->rtp_header[9], rsp->rtp_header[10], rsp->rtp_header[11],
+							rsp->num_rx_dup,
+							rsp->num_rx_since_rtcp,
+							rsp->num_tx_bytes,
+							rsp->min_jitter, rsp->max_jitter, rsp->average_jitter,
+							rsp->num_rx_lost_pkts,
+							rsp->num_cumulative_rx_lost_pkts,
+							rsp->min_reception_period,
+							rsp->max_reception_period,
+							rsp->average_reception_period,
+							rsp->num_malformed_pkts,
+							rsp->num_expected_pkts,
+		  					rsp->num_late_pkts
+							);
+
+
+out:
+	return 0 ;
+	
+keyword_error:
+	cmm_print(DEBUG_STDOUT,"ERR: unknown keyword %s\n", keywords[cpt]);
+print_help:
+	cmmRTPStatsQueryUsage();
+	return -1;
+}
+
+
+
+
diff --git a/cmm/src/module_rtp.h b/cmm/src/module_rtp.h
new file mode 100755
index 0000000..c126c76
--- /dev/null
+++ b/cmm/src/module_rtp.h
@@ -0,0 +1,32 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_RTP_H__
+#define __MODULE_RTP_H__
+
+int cmmRTPSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+int cmmRTPQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+int cmmRTCPQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+
+/******************************** RTP Stats QoS Measurement **********************/
+
+int cmmRTPStatsSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+int cmmRTPStatsQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+
+#endif
diff --git a/cmm/src/module_rx.c b/cmm/src/module_rx.c
new file mode 100644
index 0000000..ffbe710
--- /dev/null
+++ b/cmm/src/module_rx.c
@@ -0,0 +1,1482 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+#include "cmm.h"
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#define UNKNOWN_CMD	0
+#define ICC_CMD		1
+#define	BRIDGE_CMD	2
+
+#ifdef WIFI_ENABLE
+struct wifi_ff_entry glbl_wifi_ff_ifs[MAX_WIFI_FF_IFS];
+#endif
+
+struct list_head l2flow_table[L2FLOW_HASH_TABLE_SIZE];
+pthread_mutex_t brMutex = PTHREAD_MUTEX_INITIALIZER;		/*mutex to prevent race condition on the route table*/
+
+#ifdef AUTO_BRIDGE
+
+/* This function allocates and add an entry into flow_table */
+static int __cmm_l2flow_del(struct l2flowTable * l2flow_entry)
+{
+	list_del(&l2flow_entry->list);
+	free(l2flow_entry);
+	return 0;  
+}
+
+/* This function allocates and add an entry into flow_table */
+static struct l2flowTable * __cmm_l2flow_add(struct l2flow *l2flowtmp)
+{
+	unsigned int key;
+	struct l2flowTable* l2flow_entry;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	key = l2flow_hash(l2flowtmp);
+	l2flow_entry = malloc(sizeof(*l2flow_entry)); 
+	if(!l2flow_entry){
+		cmm_print(DEBUG_ERROR, "Out of memory\n");
+		goto out;
+	}
+	memset(l2flow_entry, 0, sizeof(*l2flow_entry));
+	memcpy(&l2flow_entry->l2flow, l2flowtmp, sizeof(*l2flowtmp));
+	
+	list_add(&l2flow_table[key], &l2flow_entry->list);
+	
+	cmm_print(DEBUG_INFO, "Entry added, hash = %d \n", key);
+out:
+	return l2flow_entry;
+}
+
+
+static struct l2flowTable * __cmm_l2flow_find(struct l2flow *l2flowtmp)
+{
+	int key;
+	struct list_head *entry;
+	struct l2flowTable *table_entry;
+	
+	key = l2flow_hash(l2flowtmp);
+	
+	entry = list_first(&l2flow_table[key]);
+
+	while (entry != &l2flow_table[key])
+	{
+		table_entry = container_of(entry, struct l2flowTable, list);
+		if(!cmm_l2flow_cmp(&table_entry->l2flow, l2flowtmp))
+			return table_entry; // Found
+
+		entry = list_next(entry);
+	}
+	return NULL; // Not found 
+
+}
+void cmm_l2flow_print(int level, struct l2flow *l2flow_tmp, char nl)
+{
+
+	cmm_print(level, "Saddr=%02x:%02x:%02x:%02x:%02x:%02x ", l2flow_tmp->saddr[0], l2flow_tmp->saddr[1],
+						l2flow_tmp->saddr[2], l2flow_tmp->saddr[3], l2flow_tmp->saddr[4], l2flow_tmp->saddr[5]);
+	cmm_print(level, "Daddr=%02x:%02x:%02x:%02x:%02x:%02x ", l2flow_tmp->daddr[0], l2flow_tmp->daddr[1],
+						l2flow_tmp->daddr[2], l2flow_tmp->daddr[3], l2flow_tmp->daddr[4], l2flow_tmp->daddr[5]);
+	cmm_print(level, "Ethertype=%04x ", ntohs(l2flow_tmp->ethertype));
+	cmm_print(level, "PPPoE session id=%d ", ntohs(l2flow_tmp->session_id));
+
+	cmm_print(level, "Proto=%d ", l2flow_tmp->l3.proto);
+
+	if(l2flow_tmp->l3.proto)
+	{
+		int family = 0;
+		char saddr_buf[INET6_ADDRSTRLEN], daddr_buf[INET6_ADDRSTRLEN];
+
+		if(l2flow_tmp->ethertype == htons(ETH_P_IP))
+			family = AF_INET;
+		else if (l2flow_tmp->ethertype == htons(ETH_P_IPV6))
+			family = AF_INET6;
+
+		if(family)
+			cmm_print(level, "   L3 info src=%s dst=%s sport=%d dport=%d ", 
+				inet_ntop(family, l2flow_tmp->l3.saddr.all, saddr_buf, INET6_ADDRSTRLEN),
+				inet_ntop(family, l2flow_tmp->l3.daddr.all, daddr_buf, INET6_ADDRSTRLEN),
+				ntohs(l2flow_tmp->l4.sport), ntohs(l2flow_tmp->l4.dport));
+	}
+	if(nl)
+		cmm_print(level, "\n");
+}
+
+int __cmm_l2flow_deregister(FCI_CLIENT* fci_handler, struct l2flow *l2flow_tmp)
+{
+	struct l2flowTable *l2flow_entry = NULL;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+	cmm_l2flow_print(DEBUG_INFO, l2flow_tmp, 1);
+	
+	l2flow_entry = __cmm_l2flow_find(l2flow_tmp);
+	if(!l2flow_entry){
+		cmm_print(DEBUG_INFO, "%s Can't find l2flow entry\n", __func__);
+	}
+	else{
+		if(!cmmFeL2FlowUpdate(fci_handler, REMOVE, l2flow_entry))
+			__cmm_l2flow_del(l2flow_entry);
+		
+		cmm_print(DEBUG_INFO, "%s L2 entry successfully deleted\n", __func__);
+	}
+	/* In all case it is needed to ack ABM whatever */
+	cmm_l2flow_abm_notify(L2FLOW_ENTRY_DEL, L2FLOW_ACK, l2flow_tmp);
+
+	return 0;
+}
+
+int __cmm_l2flow_register(FCI_CLIENT* fci_handler, char action, struct l2flow *l2flow_tmp, int iifi_idx, int oifi_idx, int flags, short mark)
+{
+	struct l2flowTable * entry = NULL;
+	char allowed = 0;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+	cmm_l2flow_print(DEBUG_INFO, l2flow_tmp, 0);
+
+	cmm_print(DEBUG_INFO, "Input itf idx = %d ", iifi_idx);
+	cmm_print(DEBUG_INFO, "Output itf idx = %d ", oifi_idx);
+	cmm_print(DEBUG_INFO, "Mark = %0x4\n", mark);
+
+	
+	entry = __cmm_l2flow_find(l2flow_tmp);
+	if(!entry){
+		if((entry = __cmm_l2flow_add(l2flow_tmp)) == NULL){
+			cmm_print(DEBUG_INFO, "%s error l2flow add failed\n", __func__);
+			goto fail;
+		}
+		entry->flags |= FPP_NEEDS_UPDATE;
+	}
+	
+	if(__itf_is_programmed(iifi_idx) && __itf_is_programmed(oifi_idx)){
+		cmm_print(DEBUG_INFO, "L2Flow Entry allowed\n", iifi_idx);
+		allowed = 1;
+	}
+	else{
+		cmm_print(DEBUG_INFO, "L2Flow Entry not allowed\n", iifi_idx);
+		entry->flags &= ~FPP_NEEDS_UPDATE;
+	}
+	
+	if((entry->idev_ifi != iifi_idx) || (entry->odev_ifi  != oifi_idx))
+		entry->flags |= FPP_NEEDS_UPDATE;
+
+	entry->idev_ifi = iifi_idx;
+	entry->odev_ifi = oifi_idx;
+	entry->mark = mark;
+
+	if(allowed){
+		if(!cmmFeL2FlowUpdate(fci_handler, ADD|UPDATE, entry))
+			cmm_l2flow_abm_notify(L2FLOW_ENTRY_UPDATE, L2FLOW_OFFLOADED | L2FLOW_ACK, &entry->l2flow);
+		else
+			cmm_l2flow_abm_notify(L2FLOW_ENTRY_UPDATE, L2FLOW_DENIED | L2FLOW_ACK, &entry->l2flow);
+	}
+	else{
+		cmmFeL2FlowUpdate(fci_handler, REMOVE, entry);
+		cmm_l2flow_abm_notify(L2FLOW_ENTRY_UPDATE, L2FLOW_DENIED, &entry->l2flow);
+	}
+		
+	return 0;
+fail:
+	return -1;
+}
+int __cmm_l2flow_reset(FCI_CLIENT* fci_handler)
+{
+	int i;
+	struct l2flowTable * table_entry = NULL;
+	struct list_head *entry;
+
+	if (fci_write(fci_handler, FPP_CMD_RX_L2BRIDGE_FLOW_RESET, 0, NULL))
+	{
+		cmm_print(DEBUG_ERROR, "Error while trying to reset bridge module\n");
+		goto out;
+	}
+	cmm_print(DEBUG_COMMAND, "Send CMD_RX_L2BRIDGE_FLOW_RESET\n");
+	
+	for(i= 0 ; i < L2FLOW_HASH_TABLE_SIZE; i++)
+		while (!list_empty(&l2flow_table[i]))
+		{
+			entry = list_first(&l2flow_table[i]);
+			table_entry = container_of(entry, struct l2flowTable, list);
+			__cmm_l2flow_del(table_entry);
+		}
+out:
+	return 0;
+}
+
+int cmm_l2flow_abm_notify(char action, int flags, struct l2flow * l2flow)
+{
+	struct rtnl_handle rth;
+	char buf[256] __attribute__ ((aligned (4)));
+	struct nlmsghdr *nlh = (struct nlmsghdr *)buf;
+	struct l2flow_msg *l2m;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	if (cmm_nl_open(&rth, 0, NETLINK_L2FLOW) < 0) {
+		cmm_print(DEBUG_ERROR, "%s::%d: cmm_rtnl_open() failed, %s\n", __func__, __LINE__, strerror(errno));
+		goto err0;
+	}
+
+	cmm_nlh_init(nlh, sizeof(struct l2flow_msg), L2FLOW_MSG_ENTRY, NLM_F_REQUEST);
+
+	l2m = NLMSG_DATA(nlh);
+	memset(l2m, 0, sizeof(struct l2flow_msg));
+
+	l2m->action = action;
+	l2m->flags = flags;
+	memcpy(l2m->saddr, l2flow->saddr, ETH_ALEN);
+	memcpy(l2m->daddr, l2flow->daddr, ETH_ALEN);
+	l2m->ethertype = l2flow->ethertype;
+
+
+	if(l2flow->vlan_tag)
+		cmm_addattr16(nlh, sizeof(buf), L2FLOWA_VLAN_TAG, l2flow->vlan_tag);
+
+	if(l2flow->session_id)
+		cmm_addattr16(nlh, sizeof(buf), L2FLOWA_PPP_S_ID, l2flow->session_id);
+
+	if(l2flow->l3.proto){
+		cmm_addattr_l(nlh, sizeof(buf), L2FLOWA_IP_PROTO, &l2flow->l3.proto, sizeof(l2flow->l3.proto));
+
+		if(l2flow->ethertype == htons(ETH_P_IP)){
+			cmm_addattr32(nlh, sizeof(buf), L2FLOWA_IP_SRC, l2flow->l3.saddr.ip);
+			cmm_addattr32(nlh, sizeof(buf), L2FLOWA_IP_DST, l2flow->l3.daddr.ip);
+		}
+		else if(l2flow->ethertype == htons(ETH_P_IPV6)){
+			cmm_addattr_l(nlh, sizeof(buf), L2FLOWA_IP_SRC, l2flow->l3.saddr.ip6, 16);
+			cmm_addattr_l(nlh, sizeof(buf), L2FLOWA_IP_DST, l2flow->l3.daddr.ip6, 16);
+		}
+		if((l2flow->l3.proto == IPPROTO_UDP) 
+		|| (l2flow->l3.proto == IPPROTO_TCP)){
+			cmm_addattr16(nlh, sizeof(buf), L2FLOWA_SPORT, l2flow->l4.sport);
+			cmm_addattr16(nlh, sizeof(buf), L2FLOWA_DPORT, l2flow->l4.dport);
+		}
+	}
+	if (cmm_rtnl_send(&rth, nlh) < 0)
+		goto err1;
+
+	cmm_rtnl_close(&rth);
+
+	return 0;
+
+err1:
+	cmm_rtnl_close(&rth);
+
+err0:
+	return -1;
+}
+
+int cmm_l2flow_netlink_rcv(const struct sockaddr_nl *who, struct nlmsghdr *nlh, void *arg)
+{
+	struct rtattr *tb[L2FLOWA_MAX + 1];
+	struct cmm_ct *ctx = arg;
+
+
+	switch (nlh->nlmsg_type) {
+	case L2FLOW_MSG_ENTRY:
+	case L2FLOW_MSG_RESET:
+		break;
+
+	default:
+		cmm_print(DEBUG_ERROR, "%s: unsupported ABM netlink message %x\n", __func__, nlh->nlmsg_type);
+		goto out;
+		break;
+	}
+
+	if (nlh->nlmsg_type == L2FLOW_MSG_ENTRY)
+	{
+		struct l2flow l2flow_tmp;
+		struct l2flow_msg * l2msg;
+		int oifi_idx = 0;
+		int iifi_idx = 0;
+		short mark = 0;
+
+		char action;
+		
+
+		memset(&l2flow_tmp, 0, sizeof(l2flow_tmp));
+		l2msg = NLMSG_DATA(nlh);
+
+		memcpy(l2flow_tmp.saddr, l2msg->saddr, ETH_ALEN);
+		memcpy(l2flow_tmp.daddr, l2msg->daddr, ETH_ALEN);
+		l2flow_tmp.ethertype = l2msg->ethertype;
+		action = l2msg->action;
+
+		cmm_parse_rtattr(tb, L2FLOWA_MAX, L2FLOWA_RTA(l2msg),L2FLOWA_PAYLOAD(nlh));
+
+		if(tb[L2FLOWA_IIF_IDX])
+			iifi_idx = *(unsigned int *)RTA_DATA((tb[L2FLOWA_IIF_IDX]));
+
+		if(tb[L2FLOWA_OIF_IDX])
+			oifi_idx = *(unsigned int *)RTA_DATA((tb[L2FLOWA_OIF_IDX]));
+
+		if(tb[L2FLOWA_VLAN_TAG])
+			l2flow_tmp.vlan_tag = *(unsigned short *)RTA_DATA((tb[L2FLOWA_VLAN_TAG]));
+		
+		if(tb[L2FLOWA_PPP_S_ID])
+			l2flow_tmp.session_id = *(unsigned short *)RTA_DATA((tb[L2FLOWA_PPP_S_ID]));
+
+		if(tb[L2FLOWA_MARK])
+			mark = *(unsigned short *)RTA_DATA((tb[L2FLOWA_MARK]));
+
+		if(tb[L2FLOWA_IP_SRC])
+			memcpy(&l2flow_tmp.l3.saddr.all, RTA_DATA(tb[L2FLOWA_IP_SRC]), RTA_PAYLOAD(tb[L2FLOWA_IP_SRC]));
+
+		if(tb[L2FLOWA_IP_DST])
+			memcpy(&l2flow_tmp.l3.daddr.all, RTA_DATA(tb[L2FLOWA_IP_DST]), RTA_PAYLOAD(tb[L2FLOWA_IP_DST]));
+
+		if(tb[L2FLOWA_IP_PROTO])
+			l2flow_tmp.l3.proto=  *(unsigned char *)RTA_DATA(tb[L2FLOWA_IP_PROTO]);
+		
+		if(tb[L2FLOWA_SPORT])
+			l2flow_tmp.l4.sport=  *(unsigned short *)RTA_DATA(tb[L2FLOWA_SPORT]);
+
+		if(tb[L2FLOWA_DPORT])
+			l2flow_tmp.l4.dport=  *(unsigned short *)RTA_DATA(tb[L2FLOWA_DPORT]);	
+
+		if((action == L2FLOW_ENTRY_NEW) || (action == L2FLOW_ENTRY_UPDATE))
+		{
+			__pthread_mutex_lock(&brMutex);
+			__cmm_l2flow_register(ctx->fci_handle, action, &l2flow_tmp, iifi_idx, oifi_idx, l2msg->flags, mark);
+			__pthread_mutex_unlock(&brMutex);
+		}
+		else if (action == L2FLOW_ENTRY_DEL)
+		{
+			__pthread_mutex_lock(&brMutex);
+			__cmm_l2flow_deregister(ctx->fci_handle, &l2flow_tmp); 
+			__pthread_mutex_unlock(&brMutex);
+		}
+	}
+	else if (nlh->nlmsg_type == L2FLOW_MSG_RESET)
+	{
+		__pthread_mutex_lock(&brMutex);
+		__cmm_l2flow_reset(ctx->fci_handle);
+		__pthread_mutex_unlock(&brMutex);
+	}
+out:
+	return RTNL_CB_CONTINUE;
+
+}
+#else
+int cmm_l2flow_netlink_rcv(const struct sockaddr_nl *who, struct nlmsghdr *nlh, void *arg)
+{
+	return RTNL_CB_CONTINUE;
+}
+#endif
+#ifdef AUTO_BRIDGE
+int cmmBridgeInit(struct cmm_ct *ctx)
+{
+	fpp_l2_bridge_control_cmd_t br_cmd;
+
+	if (cmm_nl_open(&ctx->rth_abm, L2FLOW_NL_GRP, NETLINK_L2FLOW) < 0)
+	{
+		cmm_print(DEBUG_CRIT, "%s: Bridge is started in manual mode\n", __func__);
+		br_cmd.mode_timeout = FPP_L2_BRIDGE_MODE_MANUAL;
+		globalConf.auto_bridge = 0;
+		
+	}
+	else{
+		br_cmd.mode_timeout = FPP_L2_BRIDGE_MODE_AUTO;
+		cmm_print(DEBUG_CRIT, "%s: Bridge is started in auto mode\n", __func__);
+		globalConf.auto_bridge = 1;
+	}
+
+	/* Set bridge mode in FPP */
+	cmm_print(DEBUG_COMMAND, "Send FPP_CMD_RX_L2BRIDGE_MODE\n");
+	if (fci_write(ctx->fci_handle, FPP_CMD_RX_L2BRIDGE_MODE, sizeof(br_cmd), (unsigned short *)&br_cmd)){
+		cmm_print(DEBUG_ERROR, "Error while trying to set  bridge mode\n");
+		return -1;
+	}
+	return 0;
+}
+#else
+int cmmBridgeInit(struct cmm_ct *ctx)
+{
+	globalConf.auto_bridge = 0;
+	cmm_print(DEBUG_CRIT, "%s: Bridge is started in manual mode\n", __func__);
+	return 0;
+}
+
+#endif
+int cmmBridgeControlProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	fpp_l2_bridge_control_cmd_t cmd;
+	char rcvBuffer[256];
+	char *endptr;
+	unsigned int  timeout;
+	int rc;
+
+	if(!keywords[cpt])
+		goto usage;
+
+	if (strcasecmp(keywords[cpt], "timeout") != 0)
+		goto usage;
+
+	if(!keywords[++cpt])
+		goto usage;
+
+	/*Get an integer from the string*/
+	endptr = NULL;
+	timeout = strtoul(keywords[cpt], &endptr, 0);
+	if ((keywords[cpt] == endptr) ||  (timeout > UINT16_MAX) || (timeout == 0)){
+		cmm_print(DEBUG_ERROR, "%s Timeout must be > 0 and < %d s \n",__func__, UINT16_MAX);
+		goto usage;
+	}
+
+	cmd.mode_timeout = timeout;
+	
+	// Send message to forward engine
+	cmm_print(DEBUG_COMMAND, "Send FPP_CMD_RX_L2BRIDGE_FLOW_TIMEOUT to FPP\n");
+	rc = cmmSendToDaemon(daemon_handle, FPP_CMD_RX_L2BRIDGE_FLOW_TIMEOUT, (unsigned short *) &cmd, sizeof(fpp_l2_bridge_control_cmd_t), rcvBuffer);
+	if (rc != 2) /* we expect 2 bytes in response */
+	{
+		cmm_print(DEBUG_STDERR, "FPP_CMD_RX_L2BRIDGE_FLOW_TIMEOUT unexpected response length %d\n", rc);
+		return -1;
+	}
+	else if ((((u_int16_t*)rcvBuffer)[0]) != FPP_ERR_OK)
+	{
+		cmm_print(DEBUG_STDERR, "Error %d received from FPP\n", ((u_int16_t*)rcvBuffer)[0]);
+		return -1;
+	}
+
+	return 0;
+usage:
+	cmm_print(DEBUG_STDOUT, "Usage: set bridge timeout {timeout value in seconds}\n");
+	return -1;
+}
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+void cmmRxShowPrintHelp()
+{
+	char buf[128];
+
+
+	print_all_gemac_ports(buf, 128);
+  //	cmm_print(DEBUG_STDOUT, "show rx not yet supported\n");
+	cmm_print(DEBUG_STDOUT, "Usage: show rx interface {%s} icc\n"
+				"       query rx bridge\n", buf);
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+int cmmRxQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	unsigned int cmdToSend = 0; /* bits field*/
+	int rcvBytes = 0;
+ 	char rcvBuffer[256];
+ 	char null_mac[6] = {0,0,0,0,0,0};
+
+	//goto help
+	if(!keywords[cpt])
+		goto help;
+	if(strcasecmp(keywords[cpt], "bridge") == 0)
+	{
+		cmdToSend |= CMD_BIT(FPP_CMD_RX_L2BRIDGE_QUERY_STATUS);
+	}
+	else
+		goto keyword_error;
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_RX_L2BRIDGE_QUERY_STATUS))
+	{
+		int count = 0;
+		char input_interface[IFNAMSIZ];
+		char output_interface[IFNAMSIZ];
+		char pkt_priority[16];
+		char vlan_priority[16];
+		char queue_modifier[16];
+		fpp_l2_bridge_query_status_response_t *pStatusResponse = (fpp_l2_bridge_query_status_response_t *)rcvBuffer;
+		fpp_l2_bridge_query_entry_response_t *pEntryResponse = (fpp_l2_bridge_query_entry_response_t *)rcvBuffer;
+
+		while( 1 )
+		{
+			// Send CMD_RX_L2BRIDGE_QUERY_STATUS command
+			rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_RX_L2BRIDGE_QUERY_STATUS, NULL, 0, rcvBuffer);
+			if ( rcvBytes != sizeof(fpp_l2_bridge_query_status_response_t) )
+			{
+				cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n",
+					  (rcvBytes < sizeof(unsigned short) ) ? 
+								0 : *((unsigned short *) rcvBuffer)
+				  );
+				goto exit;
+			}
+			
+			if (pStatusResponse->eof)
+			    	break;
+
+			cmm_print(DEBUG_STDOUT, "Interface %s Status: %s\n", 
+					pStatusResponse->ifname, pStatusResponse->status ? "ON":"OFF");
+		}
+#if 0
+		// Send CMD_RX_L2BRIDGE_QUERY_STATUS command
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_RX_L2BRIDGE_QUERY_STATUS, NULL, 0, rcvBuffer);
+		if (rcvBytes != sizeof(fpp_l2_bridge_query_status_response_t) + sizeof(unsigned short))
+		{
+			cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n",
+				  (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer)
+			  );
+			goto exit;
+		}
+#ifdef WIFI_ENABLE
+		cmm_print(DEBUG_STDOUT, "Interface %s (WAN) Status: %s\nInterface %s (LAN) Status: %s\nInterface %s (WIFI) Status: %s\nInterface %s (WIFI) Status: %s\n",
+						WAN_INTERFACE_NAME,
+						( pStatusResponse->status & (1 << WAN_PORT_ID))? "ON" : "OFF",
+						LAN_INTERFACE_NAME,
+						( pStatusResponse->status & (1 << LAN_PORT_ID))? "ON" : "OFF",
+						WIFI_INTERFACE_NAME0,
+						( pStatusResponse->status & (1 << WIFI_PORT0)) ? "ON" : "OFF",
+						WIFI_INTERFACE_NAME1,
+						( pStatusResponse->status & (1 << WIFI_PORT1)) ? "ON" : "OFF");
+#else
+		cmm_print(DEBUG_STDOUT, "Interface %s (WAN) Status: %s\nInterface %s (LAN) Status: %s\n",
+						WAN_INTERFACE_NAME,
+						( pStatusResponse->status & (1 << WAN_PORT_ID))? "ON" : "OFF",
+						LAN_INTERFACE_NAME,
+						( pStatusResponse->status & (1 << LAN_PORT_ID))? "ON" : "OFF");
+#endif
+#endif
+		while (1)
+		{
+			char sessionid_buf[32];
+			rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_RX_L2BRIDGE_QUERY_ENTRY, NULL, 0, rcvBuffer);
+			if (rcvBytes != sizeof(fpp_l2_bridge_query_entry_response_t))
+			{
+				cmm_print(DEBUG_STDERR, "ERROR: CMD_RX_L2BRIDGE_QUERY_ENTRY Unexpected result returned from FPP rc:%04x - received %d - expected %d\n",
+				  	(rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer),
+					rcvBytes,
+					sizeof(fpp_l2_bridge_query_entry_response_t)
+			  	);
+				goto exit;
+			}
+			if (pEntryResponse->eof)
+			    	break;
+			if (pEntryResponse->input_interface >= GEM_PORTS)
+				strcpy(input_interface, pEntryResponse->input_name);	
+			else	
+				get_port_name(pEntryResponse->input_interface, input_interface, IFNAMSIZ);
+			
+			if (pEntryResponse->input_vlan != 0xFFFF)
+				sprintf(input_interface + strlen(input_interface), ".%d", pEntryResponse->input_vlan);
+
+			if (pEntryResponse->output_interface >= GEM_PORTS)
+				strcpy(output_interface, pEntryResponse->output_name);	
+			else	
+				get_port_name(pEntryResponse->output_interface, output_interface, IFNAMSIZ);
+			
+			if (pEntryResponse->output_vlan != 0xFFFF)
+				sprintf(output_interface + strlen(output_interface), ".%d", pEntryResponse->output_vlan);
+			if (pEntryResponse->pkt_priority == 0x8000)
+				strcpy(pkt_priority, "vlan");
+			else
+				sprintf(pkt_priority, "%d", pEntryResponse->pkt_priority);
+			if (pEntryResponse->vlan_priority == 0x8000)
+				strcpy(vlan_priority, "copy");
+			else
+				sprintf(vlan_priority, "%d", pEntryResponse->vlan_priority);
+			
+			if (pEntryResponse->session_id != 0)
+				sprintf(sessionid_buf, "SessionId=%d ", pEntryResponse->session_id);
+			else
+				sessionid_buf[0] = '\0';
+
+			if(pEntryResponse->queue_modifier == FPP_BRIDGE_QMOD_DSCP)
+				strcpy(queue_modifier, "dscp");
+			else
+				strcpy(queue_modifier, "none");	
+
+
+			if ((!memcmp(pEntryResponse->srcaddr, null_mac, 6)) && (pEntryResponse->ethertype == 0))
+				cmm_print(DEBUG_STDOUT, "Input=%-6s "
+				                "DA=%02X:%02X:%02X:%02X:%02X:%02X "
+				                "SA=       *          "
+						  "Type=  *  "
+						  "Queue=%-s "
+						  "Qmod=%-s "
+						  "VLANPrio=%-s "
+						  "%s"
+						  "Output=%s\n",
+						    input_interface,
+						    pEntryResponse->destaddr[0], pEntryResponse->destaddr[1], pEntryResponse->destaddr[2],
+						    pEntryResponse->destaddr[3], pEntryResponse->destaddr[4], pEntryResponse->destaddr[5],
+						    pkt_priority, queue_modifier, vlan_priority, sessionid_buf, output_interface);
+			else if (!memcmp(pEntryResponse->srcaddr, null_mac, 6))
+				cmm_print(DEBUG_STDOUT, "Input=%-6s "
+				                "DA=%02X:%02X:%02X:%02X:%02X:%02X "
+				                "SA=       *          "
+						  "Type=%04X "
+						  "Queue=%-s "
+						  "Qmod=%-s "
+						  "VLANPrio=%-s "
+						  "%s"
+						  "Output=%s\n",
+						    input_interface,
+						    pEntryResponse->destaddr[0], pEntryResponse->destaddr[1], pEntryResponse->destaddr[2],
+						    pEntryResponse->destaddr[3], pEntryResponse->destaddr[4], pEntryResponse->destaddr[5],
+						    pEntryResponse->ethertype, pkt_priority, queue_modifier, vlan_priority, sessionid_buf, output_interface);
+			else if (pEntryResponse->ethertype == 0)
+				cmm_print(DEBUG_STDOUT, "Input=%-6s "
+				                "DA=%02X:%02X:%02X:%02X:%02X:%02X "
+				                "SA=%02X:%02X:%02X:%02X:%02X:%02X "
+						  "Type=  *  "
+						  "Queue=%-s "
+						  "Qmod=%-s "
+						  "VLANPrio=%-s "
+						  "%s"
+						  "Output=%s\n",
+						    input_interface,
+						    pEntryResponse->destaddr[0], pEntryResponse->destaddr[1], pEntryResponse->destaddr[2],
+						    pEntryResponse->destaddr[3], pEntryResponse->destaddr[4], pEntryResponse->destaddr[5],
+						    pEntryResponse->srcaddr[0], pEntryResponse->srcaddr[1], pEntryResponse->srcaddr[2],
+						    pEntryResponse->srcaddr[3], pEntryResponse->srcaddr[4], pEntryResponse->srcaddr[5],
+						    pkt_priority, queue_modifier, vlan_priority, sessionid_buf, output_interface);
+
+			else	
+			cmm_print(DEBUG_STDOUT, "Input=%-6s "
+				                "DA=%02X:%02X:%02X:%02X:%02X:%02X "
+				                "SA=%02X:%02X:%02X:%02X:%02X:%02X "
+						  "Type=%04X "
+						  "Queue=%-s "
+						  "Qmod=%-s "
+						  "VLANPrio=%-s "
+						  "%s"
+						  "Output=%s\n",
+						    input_interface,
+						    pEntryResponse->destaddr[0], pEntryResponse->destaddr[1], pEntryResponse->destaddr[2],
+						    pEntryResponse->destaddr[3], pEntryResponse->destaddr[4], pEntryResponse->destaddr[5],
+						    pEntryResponse->srcaddr[0], pEntryResponse->srcaddr[1], pEntryResponse->srcaddr[2],
+						    pEntryResponse->srcaddr[3], pEntryResponse->srcaddr[4], pEntryResponse->srcaddr[5],
+						    pEntryResponse->ethertype, pkt_priority, queue_modifier, vlan_priority, sessionid_buf, output_interface);
+			count++;
+		}
+		cmm_print(DEBUG_STDOUT, "\n%d Bridge Table Entries found\n", count);
+	}
+
+        return 0;
+
+keyword_error:
+	cmm_print(DEBUG_STDERR, "ERROR: Unknown keyword %s\n", keywords[cpt]);
+
+help:
+	cmmRxShowPrintHelp();
+
+exit:
+	return -1;
+}
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+int cmmRxShowProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	unsigned int cmdToSend = 0; /* bits field*/
+	int rcvBytes = 0;
+ 	char rcvBuffer[256];
+
+	fpp_rx_icc_disable_cmd_t showCmd;  // same structure used for show
+	fpp_rx_icc_show_return_cmd_t *iccStatus;
+
+	//goto help
+	if(!keywords[cpt])
+		goto help;
+	if(strcasecmp(keywords[cpt], "interface") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+		
+		if ((showCmd.interface = get_port_id(keywords[cpt])) < 0)
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto help;
+		if(strcasecmp(keywords[cpt], "icc") == 0)
+			cmdToSend |= CMD_BIT(FPP_CMD_RX_CNG_SHOW);
+		else
+			goto keyword_error;
+	}
+	else
+		goto keyword_error;
+
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_RX_CNG_SHOW))
+	{
+		// Send CMD_RX_CNG_SHOW command
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_RX_CNG_SHOW, & showCmd, sizeof(showCmd), rcvBuffer);
+
+		if ( rcvBytes < (sizeof(fpp_rx_icc_show_return_cmd_t) - sizeof(unsigned short)) )
+		{
+			cmm_print(DEBUG_STDERR, "ERROR: Unexpected returned result from FPP rc:%04x\n",
+				  (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer)
+			  );
+			goto exit;
+		}
+		else
+		{
+			iccStatus = (fpp_rx_icc_show_return_cmd_t *)(rcvBuffer);
+			cmm_print(DEBUG_STDOUT, "State: %s\n" "Acc: %d\n" "onThr: %d\n" "offThr: %d\n",
+					(iccStatus->state & 1 )? "Enabled":"Disabled\n", iccStatus->acc_value, iccStatus->on_thr, iccStatus->off_thr);
+			if (iccStatus->state & 0xfe)
+			    cmm_print(DEBUG_STDOUT, "Flags: 0x%02x\n", iccStatus->state & 0xfe);
+			
+		}
+	}
+
+	return 0;
+
+keyword_error:
+	cmm_print(DEBUG_STDERR, "ERROR: Unknown keyword %s\n", keywords[cpt]);
+
+help:
+	cmmRxShowPrintHelp();
+
+exit:
+	return -1;
+
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+void cmmRxSetPrintHelp(int cmd_type)
+{
+	char buf[128];
+
+
+	print_all_gemac_ports(buf, 128);
+
+	if (cmd_type == UNKNOWN_CMD || cmd_type == ICC_CMD)
+	{
+	    cmm_print(DEBUG_STDOUT, 
+                  "Usage: set rx interface {%s} [icc {on|off}]\n"
+                  "                             [acc {acc_value}]\n"
+                  "                             [on_thr {on_thr value}]\n"
+                  "                             [off_thr {off_thr value}]\n"
+                  "                             [flag {flag value}]\n"
+                  "                             [val1 {val1 value}]\n"
+                  "                             [val2 {val2 value}]\n", buf);
+	}
+	if (cmd_type == UNKNOWN_CMD)
+	{
+	    cmm_print(DEBUG_STDOUT, "\n");
+	}
+	if (cmd_type == UNKNOWN_CMD || cmd_type == BRIDGE_CMD)
+	{
+#ifdef WIFI_ENABLE
+	    //FIXME : Now interface names are hardcoded to ath0/ath1. Need to 
+	    //        find solution to get interface names from config file.	
+	    cmm_print(DEBUG_STDOUT, 
+                  "Usage: set rx interface {%s|<wi-fi interface>} [bridge {on|off|add|remove}]\n"
+                  "                add / remove options:\n"
+                  "                                      [da {dest_addr value}]\n"
+                  "                                      [sa {src_addr value}]\n"
+                  "                                      [type {ethertype value}]\n"
+                  "                add options:\n"
+                  "                                      [queue {output queue base value 0-31|vlan}]\n"
+                  "                                      [vlanprio {priority value|copy}]\n"
+                  "                                      [sessionid {session id value}]\n"
+                  "                                      [output {interface}]\n"
+		  "                                      [qmod {output queue modifier dscp|none}]\n", buf);
+#else
+	    cmm_print(DEBUG_STDOUT, 
+                  "Usage: set rx interface {%s} [bridge {on|off|add|remove}]\n"
+                  "                add / remove options:\n"
+                  "                                      [da {dest_addr value}]\n"
+                  "                                      [sa {src_addr value}]\n"
+                  "                                      [type {ethertype value}]\n"
+                  "                add options:\n"
+                  "                                      [queue {output queue base value 0-31|vlan}]\n"
+                  "                                      [vlanprio {priority value|copy}]\n"
+                  "                                      [sessionid {session id value}]\n"
+                  "                                      [output {interface}]\n"
+		  "                                      [qmod {output queue modifier dscp|none}]\n", buf);
+#endif
+	}
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+static int parse_interface(char *pstring, unsigned short *pinterface_number );
+static int parse_interface_vlan(char *pstring, unsigned short *pinterface_number, unsigned short *pvlan_id);
+
+int cmmRxSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cmd_type = UNKNOWN_CMD;
+	int cpt = tabStart;
+	unsigned int cmdToSend = 0; /* bits field*/
+	char * endptr;
+	unsigned int tmp;
+        int rcvBytes = 0;
+	char *pinterface;
+	unsigned short interface;
+
+	fpp_rx_icc_enable_cmd_t enableCmd;
+	fpp_rx_icc_disable_cmd_t disableCmd;
+
+	fpp_l2_bridge_enable_cmd_t bridgeEnableCmd;
+	fpp_l2_bridge_add_entry_cmd_t bridgeAddCmd;
+	fpp_l2_bridge_remove_entry_cmd_t bridgeRemoveCmd;
+
+	char rcvBuffer[256];
+
+	if(!keywords[cpt])
+		goto help;
+
+	if(strcasecmp(keywords[cpt], "interface") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+		pinterface = keywords[cpt];
+	}
+	else
+		goto keyword_error;
+
+	if(!keywords[++cpt])
+		goto help;
+
+   if(strcasecmp(keywords[cpt], "icc") == 0)
+   {		
+       		cmd_type = ICC_CMD;
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "on") == 0)
+		{
+			cmdToSend |= CMD_BIT(FPP_CMD_RX_CNG_ENABLE);
+			memset(&enableCmd, 0, sizeof(enableCmd));
+			if (parse_icc_interface(pinterface, &interface, 2) < 0)
+				goto help;
+			enableCmd.interface = interface;
+
+			cpt++;
+
+			while (keywords[cpt] != NULL)
+			{
+				if(strcasecmp(keywords[cpt], "acc") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+
+				    /*Get an integer from the string*/
+				    endptr = NULL;
+				    tmp = strtoul(keywords[cpt], &endptr, 0);
+				    if ((keywords[cpt] == endptr) || (tmp > USHRT_MAX))
+				    {
+				        cmm_print(DEBUG_CRIT, "icc ERROR: acc must be a number between 1 and %d\n", USHRT_MAX);
+				        goto help;
+				    }
+
+				    enableCmd.acc_value = tmp;
+				}
+				else if(strcasecmp(keywords[cpt], "on_thr") == 0)
+				{
+				    if(!keywords[++cpt])
+				        goto help;
+
+				    /*Get an integer from the string*/
+				    endptr = NULL;
+				    tmp = strtoul(keywords[cpt], &endptr, 0);
+				    if ((keywords[cpt] == endptr) || (tmp > USHRT_MAX))
+				    {
+				        cmm_print(DEBUG_CRIT, "icc ERROR: on_thr must be a number between 1 and %d\n", USHRT_MAX);
+				        goto help;
+				    }
+
+				    enableCmd.on_thr = tmp;
+				}
+				else if(strcasecmp(keywords[cpt], "off_thr") == 0)
+				{
+				    if(!keywords[++cpt])
+				        goto help;
+
+				    /*Get an integer from the string*/
+				    endptr = NULL;
+				    tmp = strtoul(keywords[cpt], &endptr, 0);
+				    if ((keywords[cpt] == endptr) || (tmp > USHRT_MAX))
+				    {
+				        cmm_print(DEBUG_CRIT, "icc ERROR: off_thr must be a number between 1 and %d\n", USHRT_MAX);
+				        goto help;
+				    }
+
+				    enableCmd.off_thr = tmp;
+				}
+				else if (strncasecmp(keywords[cpt],"flag",1) == 0) {
+				    if(!keywords[++cpt])
+				        goto help;
+				    endptr = NULL;
+				    tmp = strtoul(keywords[cpt], &endptr, 0);
+				    enableCmd.flag = tmp;
+				}
+				else if (strcasecmp(keywords[cpt],"val1") == 0) {
+				    if(!keywords[++cpt])
+				        goto help;
+				    endptr = NULL;
+				    tmp = strtoul(keywords[cpt], &endptr, 0);
+				    enableCmd.val1 = tmp;
+				}
+				else if (strcasecmp(keywords[cpt],"val2") == 0) {
+				    if(!keywords[++cpt])
+				        goto help;
+				    endptr = NULL;
+				    tmp = strtoul(keywords[cpt], &endptr, 0);
+				    enableCmd.val1 = tmp;
+				}
+				else
+				    goto help;
+			
+				cpt ++;
+			}
+		}
+		else if(strcasecmp(keywords[cpt], "off") == 0)
+		{
+			cmdToSend |= CMD_BIT(FPP_CMD_RX_CNG_DISABLE);
+			memset(&disableCmd, 0, sizeof(disableCmd));
+			if (parse_icc_interface(pinterface, &interface, 2) < 0)
+				goto help;
+			disableCmd.interface = interface;
+		}
+		else
+			goto keyword_error;
+   }
+   else if(strcasecmp(keywords[cpt], "bridge") == 0)
+   {		
+       		cmd_type = BRIDGE_CMD;
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "on") == 0)
+		{
+			if (keywords[++cpt])
+				goto help;
+			cmdToSend |= CMD_BIT(FPP_CMD_RX_L2BRIDGE_ENABLE);
+			memset(&bridgeEnableCmd, 0, sizeof(bridgeEnableCmd));
+			bridgeEnableCmd.enable_flag = 1;
+			bridgeEnableCmd.interface = 0xffff;
+		
+			strcpy (&bridgeEnableCmd.input_name[0], pinterface);
+				
+		}
+		else if(strcasecmp(keywords[cpt], "off") == 0)
+		{
+			if (keywords[++cpt])
+				goto help;
+			cmdToSend |= CMD_BIT(FPP_CMD_RX_L2BRIDGE_ENABLE);
+			memset(&bridgeEnableCmd, 0, sizeof(bridgeEnableCmd));
+			bridgeEnableCmd.enable_flag = 0;
+			bridgeEnableCmd.interface = 0xffff;
+			strcpy (&bridgeEnableCmd.input_name[0], pinterface);
+		}
+		else if(strcasecmp(keywords[cpt], "add") == 0)
+		{
+			cmdToSend |= CMD_BIT(FPP_CMD_RX_L2BRIDGE_ADD);
+			memset(&bridgeAddCmd, 0, sizeof(bridgeAddCmd));
+			strcpy(bridgeAddCmd.input_name, pinterface);
+			bridgeAddCmd.input_interface = 0xffff;
+			bridgeAddCmd.input_vlan = 0xffff;
+			bridgeAddCmd.output_interface = 0xffff;
+			bridgeAddCmd.output_vlan = 0xFFFF;
+			while (keywords[++cpt] != NULL)
+			{
+				if(strcasecmp(keywords[cpt], "da") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+					if (!parse_macaddr(keywords[cpt], bridgeAddCmd.destaddr))
+					{
+						cmm_print(DEBUG_CRIT, "bridge ERROR: bad MAC address: %s\n", keywords[cpt]);
+						goto help;
+					}
+				}
+				else if(strcasecmp(keywords[cpt], "sa") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+					if (!parse_macaddr(keywords[cpt], bridgeAddCmd.srcaddr))
+					{
+						cmm_print(DEBUG_CRIT, "bridge ERROR: bad MAC address: %s\n", keywords[cpt]);
+						goto help;
+					}
+				}
+				else if(strcasecmp(keywords[cpt], "type") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+					tmp = strtoul(keywords[cpt], &endptr, 0);
+					if ((keywords[cpt] == endptr) || (tmp > 0xFFFF))
+					{
+					    cmm_print(DEBUG_CRIT, "bridge ERROR: bad ETHERTYPE value: %s\n", keywords[cpt]);
+					    goto help;
+					}
+					bridgeAddCmd.ethertype = (unsigned short)tmp;
+				}
+				else if(strcasecmp(keywords[cpt], "prio") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+					if (strcasecmp(keywords[cpt], "vlan") == 0)
+						bridgeAddCmd.pkt_priority = 0x8000;
+					else
+					{
+						tmp = strtoul(keywords[cpt], &endptr, 0);
+						if ((keywords[cpt] == endptr) || (tmp > 7))
+						{
+					    		cmm_print(DEBUG_CRIT, "bridge ERROR: bad PRIORITY value: %s\n", keywords[cpt]);
+					    		goto help;
+						}
+						bridgeAddCmd.pkt_priority = (unsigned short)tmp;
+					}
+				}
+				else if(strcasecmp(keywords[cpt], "queue") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+					if (strcasecmp(keywords[cpt], "vlan") == 0)
+						bridgeAddCmd.pkt_priority = 0x8000;
+					else
+					{
+						tmp = strtoul(keywords[cpt], &endptr, 0);
+						if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_QUEUES))
+						{
+					    		cmm_print(DEBUG_CRIT, "bridge ERROR: bad QUEUE value: %s\n", keywords[cpt]);
+					    		goto help;
+						}
+						bridgeAddCmd.pkt_priority = (unsigned short)tmp;
+					}
+				}
+				else if(strcasecmp(keywords[cpt], "vlanprio") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+					if (strcasecmp(keywords[cpt], "copy") == 0)
+						bridgeAddCmd.vlan_priority = 0x8000;
+					else
+					{
+						tmp = strtoul(keywords[cpt], &endptr, 0);
+						if ((keywords[cpt] == endptr) || (tmp > 7))
+						{
+					    		cmm_print(DEBUG_CRIT, "bridge ERROR: bad VLAN PRIORITY value: %s\n", keywords[cpt]);
+					    		goto help;
+						}
+						bridgeAddCmd.vlan_priority = (unsigned short)tmp;
+					}
+				}
+				else if(strcasecmp(keywords[cpt], "sessionid") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+					tmp = strtoul(keywords[cpt], &endptr, 0);
+					if ((keywords[cpt] == endptr) || (tmp > 0xFFFF))
+					{
+					    cmm_print(DEBUG_CRIT, "bridge ERROR: bad SESSION ID value: %s\n", keywords[cpt]);
+					    goto help;
+					}
+					bridgeAddCmd.session_id = (unsigned short)tmp;
+				}
+				else if(strcasecmp(keywords[cpt], "output") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+					bridgeAddCmd.output_interface = 0xFFFF;
+					bridgeAddCmd.input_interface  = 0xFFFF;
+					bridgeAddCmd.output_vlan = 0xFFFF;
+					strcpy(bridgeAddCmd.output_name, keywords[cpt]);
+					strcpy(bridgeAddCmd.input_name, pinterface);
+				}
+				else if(strcasecmp(keywords[cpt], "qmod") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+					if (strcasecmp(keywords[cpt], "dscp") == 0)
+						bridgeAddCmd.queue_modifier = FPP_BRIDGE_QMOD_DSCP;
+					else if(strcasecmp(keywords[cpt], "none") == 0)
+						bridgeAddCmd.queue_modifier = FPP_BRIDGE_QMOD_NONE;
+					else {
+						bridgeAddCmd.queue_modifier = FPP_BRIDGE_QMOD_NONE;
+						cmm_print(DEBUG_CRIT, "bridge ERROR: bad QUEUE MODIFIER  value: %s\n", keywords[cpt]);
+					    	goto help;
+					}
+				}
+				else
+				    goto help;
+			}
+		}
+		else if(strcasecmp(keywords[cpt], "remove") == 0)
+		{
+			cmdToSend |= CMD_BIT(FPP_CMD_RX_L2BRIDGE_REMOVE);
+			memset(&bridgeRemoveCmd, 0, sizeof(bridgeRemoveCmd));
+			strcpy(bridgeRemoveCmd.input_name, pinterface);
+			bridgeRemoveCmd.input_interface = 0xffff;
+			bridgeRemoveCmd.input_vlan = 0xffff;
+			while (keywords[++cpt] != NULL)
+			{
+				if(strcasecmp(keywords[cpt], "da") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+					if (!parse_macaddr(keywords[cpt], bridgeRemoveCmd.destaddr))
+					{
+						cmm_print(DEBUG_CRIT, "bridge ERROR: bad MAC address: %s\n", keywords[cpt]);
+						goto help;
+					}
+				}
+				else if(strcasecmp(keywords[cpt], "sa") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+					if (!parse_macaddr(keywords[cpt], bridgeRemoveCmd.srcaddr))
+					{
+						cmm_print(DEBUG_CRIT, "bridge ERROR: bad MAC address: %s\n", keywords[cpt]);
+						goto help;
+					}
+				}
+				else if(strcasecmp(keywords[cpt], "type") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+					tmp = strtoul(keywords[cpt], &endptr, 0);
+					if ((keywords[cpt] == endptr) || (tmp > 0xFFFF))
+					{
+					    cmm_print(DEBUG_CRIT, "bridge ERROR: bad ETHERTYPE value: %s\n", keywords[cpt]);
+					    goto help;
+					}
+					bridgeRemoveCmd.ethertype = (unsigned short)tmp;
+				}
+				else if(strcasecmp(keywords[cpt], "sessionid") == 0)
+				{
+					if(!keywords[++cpt])
+						goto help;
+					tmp = strtoul(keywords[cpt], &endptr, 0);
+					if ((keywords[cpt] == endptr) || (tmp > 0xFFFF))
+					{
+					    cmm_print(DEBUG_CRIT, "bridge ERROR: bad SESSION ID value: %s\n", keywords[cpt]);
+					    goto help;
+					}
+					bridgeRemoveCmd.session_id = (unsigned short)tmp;
+				}
+				else
+				    goto help;
+			}
+		}
+		else
+			goto keyword_error;
+   }
+   else
+       goto keyword_error;
+
+	/*
+	 * Parsing have been performed
+	 * Now send the right commands
+	 */
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_RX_L2BRIDGE_ENABLE))
+	{
+		// Send CMD_RX_L2BRIDGE_ENABLE command
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_RX_L2BRIDGE_ENABLE, & bridgeEnableCmd, sizeof(bridgeEnableCmd), rcvBuffer);
+	}
+        
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_RX_L2BRIDGE_ADD))
+	{
+		// Send CMD_RX_L2BRIDGE_ADD command
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_RX_L2BRIDGE_ADD, & bridgeAddCmd, sizeof(bridgeAddCmd), rcvBuffer);
+	}
+        
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_RX_L2BRIDGE_REMOVE))
+	{
+		// Send CMD_RX_L2BRIDGE_REMOVE command
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_RX_L2BRIDGE_REMOVE, & bridgeRemoveCmd, sizeof(bridgeRemoveCmd), rcvBuffer);
+	}
+        
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_RX_CNG_DISABLE))
+	{
+		// Send CMD_RX_CNG_DISABLE command
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_RX_CNG_DISABLE, & disableCmd, sizeof(disableCmd), rcvBuffer);
+	}
+	
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_RX_CNG_ENABLE))
+	{
+		// Send CMD_RX_CNG_ENABLE command
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_RX_CNG_ENABLE, & enableCmd, sizeof(enableCmd), rcvBuffer);
+	}
+        
+	if ((rcvBytes != 2) || *((unsigned short *) rcvBuffer)) {
+	  cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n",
+		    (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer)
+		    );
+          return -1;
+	}
+
+	return 0;
+
+keyword_error:
+	cmm_print(DEBUG_CRIT, "ERROR: Unknown keyword %s\n", keywords[cpt]);
+
+help:
+	cmmRxSetPrintHelp(cmd_type);
+	return -1;
+}
+
+/*********************************************************************************
+ *
+ *
+ *
+ ********************************************************************************/
+int cmmL2BridgeProcessClientCmd(FCI_CLIENT* fci_handle, int fc, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	fpp_l2_bridge_enable_cmd_t *bridgeEnableCmd;
+	fpp_l2_bridge_add_entry_cmd_t *bridgeAddCmd;
+	fpp_l2_bridge_remove_entry_cmd_t *bridgeRemoveCmd;
+	unsigned short vlan_id, interface;
+	
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	res_buf[0] = CMMD_ERR_WRONG_COMMAND_SIZE;
+
+	switch(fc)
+	{
+		case FPP_CMD_RX_L2BRIDGE_ENABLE:
+			cmm_print(DEBUG_INFO, "2 %s\n", __func__);
+			bridgeEnableCmd = (fpp_l2_bridge_enable_cmd_t *)cmd_buf;
+			*res_len = 2;
+			if( cmd_len < sizeof(fpp_l2_bridge_enable_cmd_t) )
+			{
+				cmm_print(DEBUG_ERROR, "%s: Bridge enable command size too small(%d, %d)\n", 
+						__func__, cmd_len, sizeof(fpp_l2_bridge_enable_cmd_t));
+				return 0;
+			}
+			
+			if( parse_interface(bridgeEnableCmd->input_name, &interface) < 0 )
+			{
+				cmm_print(DEBUG_ERROR, "%s: Bridge enable command with unknown interface: %s\n",
+						__func__, bridgeEnableCmd->input_name);
+				res_buf[0] = CMMD_ERR_NOT_CONFIGURED;
+				return 0; 
+			}
+			bridgeEnableCmd->interface = interface;
+			
+			goto FCI_CMD; 
+
+		case FPP_CMD_RX_L2BRIDGE_ADD:
+			bridgeAddCmd = (fpp_l2_bridge_add_entry_cmd_t *)cmd_buf;
+			*res_len = 2;
+			if( cmd_len < sizeof(fpp_l2_bridge_add_entry_cmd_t) )
+			{
+				cmm_print(DEBUG_ERROR, "%s: Bridge add command size too small(%d, %d)\n", 
+						__func__, cmd_len, sizeof(fpp_l2_bridge_add_entry_cmd_t));
+				return 0;
+			}
+			
+			if( parse_interface_vlan(bridgeAddCmd->input_name, &interface, &vlan_id) < 0 )
+			{
+				cmm_print(DEBUG_ERROR, "%s: Bridge add command with unknown interface: %s\n",
+						__func__, bridgeAddCmd->input_name);
+				res_buf[0] = CMMD_ERR_NOT_CONFIGURED;
+				return 0; 
+			}
+			bridgeAddCmd->input_interface = interface;
+			bridgeAddCmd->input_vlan = vlan_id;
+
+		/* FIXME : output interface should be provided by the user */
+		//	bridgeAddCmd->output_interface = interface == GEMAC0_PORT ? GEMAC1_PORT : GEMAC0_PORT;
+		//	bridgeAddCmd->output_vlan = 0xFFFF;
+
+		//	if (!strlen(bridgeAddCmd->output_name))
+		//		goto FCI_CMD;
+
+			if( parse_interface_vlan(bridgeAddCmd->output_name, &interface, &vlan_id) == 0 )
+			{
+				bridgeAddCmd->output_interface = interface;
+				bridgeAddCmd->output_vlan = vlan_id;
+			}
+			else
+			{
+				bridgeAddCmd->output_interface = 0xFFFF;
+				bridgeAddCmd->input_interface  = 0xFFFF;
+				bridgeAddCmd->output_vlan = 0xFFFF;
+			}	
+			goto FCI_CMD;
+ 
+		case FPP_CMD_RX_L2BRIDGE_REMOVE:
+			bridgeRemoveCmd = (fpp_l2_bridge_remove_entry_cmd_t *)cmd_buf;
+			*res_len = 2;
+			if( cmd_len < sizeof(fpp_l2_bridge_remove_entry_cmd_t) )
+			{
+				cmm_print(DEBUG_ERROR, "%s: Bridge remove command size too small(%d, %d)\n", 
+						__func__, cmd_len, sizeof(fpp_l2_bridge_remove_entry_cmd_t));
+				return 0;
+			}
+			
+			if( parse_interface_vlan(bridgeRemoveCmd->input_name, &interface, &vlan_id) < 0 )
+			{
+				cmm_print(DEBUG_ERROR, "%s: Bridge remove command with unknown interface: %s\n",
+						__func__, bridgeRemoveCmd->input_name);
+				res_buf[0] = CMMD_ERR_NOT_CONFIGURED;
+				return 0; 
+			}
+			
+			bridgeRemoveCmd->input_interface = interface;
+			bridgeRemoveCmd->input_vlan = vlan_id;
+					
+			goto FCI_CMD;
+
+		case FPP_CMD_RX_L2BRIDGE_QUERY_STATUS:
+		case FPP_CMD_RX_L2BRIDGE_QUERY_ENTRY:
+			goto FCI_CMD;
+	}
+FCI_CMD:
+	return fci_cmd(fci_handle, fc, (u_int16_t*)cmd_buf, cmd_len, res_buf, res_len);
+	
+}
+  
+int parse_icc_interface(char *pstring, unsigned short *pinterface_number, int num_interfaces)
+{
+	u_int32_t interface;
+
+	if ((short)(*pinterface_number = get_port_id(pstring)) < 0)
+	{
+		if (parse_value(pstring, &interface, num_interfaces - 1) == 0)
+		{
+			*pinterface_number = interface;
+		}
+		else
+		{
+			return -1;
+		}
+	}
+
+	return 0;	
+}
+
+static int parse_interface(char *pstring, unsigned short *pinterface_number)
+{
+	if ((short)(*pinterface_number = get_port_id(pstring)) < 0)
+	{
+#ifdef WIFI_ENABLE
+		int i, ret;
+
+		__pthread_mutex_lock(&itf_table.lock);
+		ret = __itf_is_programmed(if_nametoindex(pstring));
+		__pthread_mutex_unlock(&itf_table.lock);
+
+		if( ret <= 0 )
+			return -1;
+
+		for (i = 0; i < MAX_WIFI_FF_IFS; i++)	
+		{
+			if( !strcmp(pstring, glbl_wifi_ff_ifs[i].ifname) && glbl_wifi_ff_ifs[i].used )
+			{
+				*pinterface_number = WIFI_PORT0 + i;
+				break;
+			}
+		}
+	
+		if( i >= MAX_WIFI_FF_IFS )
+#endif
+			return -1;
+	}
+	return 0;
+}
+
+static int parse_interface_vlan(char *pstring, unsigned short *pinterface_number, unsigned short *pvlan_id)
+{
+	char interface[16];
+	char *pperiod;
+	char *peos;
+	unsigned long vlan_id;
+	strncpy(interface, pstring, sizeof(interface) - 1);
+	pperiod = strchr(interface, '.');
+	if (pperiod)
+	    	*pperiod++ = '\0';
+	if ((short)(*pinterface_number = get_port_id(pstring)) < 0)
+	{
+#ifdef WIFI_ENABLE
+		int i, ret;
+		
+		__pthread_mutex_lock(&itf_table.lock);
+		ret = __itf_is_programmed(if_nametoindex(interface));
+		__pthread_mutex_unlock(&itf_table.lock);
+
+		if( ret <= 0 )
+			return -1;
+
+		for (i = 0; i < MAX_WIFI_FF_IFS; i++)	
+		{
+			if( !strcmp(interface, glbl_wifi_ff_ifs[i].ifname) &&  glbl_wifi_ff_ifs[i].used )
+			{
+				*pinterface_number = WIFI_PORT0 + 1;
+				break;
+			}
+		}
+		
+		if( i >= MAX_WIFI_FF_IFS )
+#endif
+			return -1;
+	}
+
+	if (pperiod)
+	{
+		vlan_id = strtoul(pperiod, &peos, 10);
+		if (peos == pperiod || *peos != '\0' || vlan_id > 4094)
+		{
+			cmm_print(DEBUG_CRIT, "ERROR: Invalid VLAN specification: %s\n", pstring);
+			return -1;
+		}
+		*pvlan_id = (unsigned short)vlan_id;
+	}
+	else
+		*pvlan_id = 0xFFFF;
+
+	return 0;
+}
+
+int parse_macaddr(char *pstring, unsigned char *pmacaddr)
+{
+    int i, n;
+    unsigned long nextbyte;
+    char *endp;
+    for (i = 0; i < 6; i++)
+    {
+	nextbyte = strtoul(pstring, &endp, 16);
+	n = endp - pstring;
+	if (n < 1 || n > 2)
+	    return 0;
+	if ((i < 5 && *endp != ':') || (i == 5 && *endp != '\0'))
+	    return 0;
+	*pmacaddr++ = (unsigned char)nextbyte;
+	pstring = endp + 1;
+    }
+    return 1;
+}
+
diff --git a/cmm/src/module_rx.h b/cmm/src/module_rx.h
new file mode 100644
index 0000000..3c63d32
--- /dev/null
+++ b/cmm/src/module_rx.h
@@ -0,0 +1,95 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_RX_H__
+#define __MODULE_RX_H__
+
+#define L2FLOW_HASH_TABLE_SIZE 1024
+
+/* L2flow definition*/
+struct l2flow
+{
+	unsigned char saddr[ETH_ALEN];
+	unsigned char daddr[ETH_ALEN];
+	unsigned short ethertype;
+	unsigned short session_id;
+	unsigned short vlan_tag; /* TCI */
+	/* L3 info optional */
+	struct{
+		union {
+			unsigned int all[4];
+			unsigned int ip;
+			unsigned int ip6[4];
+		}saddr;
+		union {
+			unsigned int all[4];
+			unsigned int ip;
+			unsigned int ip6[4];
+		}daddr;
+		unsigned char proto;
+	}l3;
+	struct{
+		/* L4 info optional */
+		unsigned short sport;
+		unsigned short dport;
+	}l4;
+};
+
+
+/* L2flow table entry definition*/
+struct l2flowTable
+{
+	struct list_head list;
+	int flags;
+	char status;
+	unsigned int idev_ifi;
+	unsigned int odev_ifi;
+	unsigned short mark;
+	struct l2flow l2flow;
+};
+
+int parse_icc_interface(char *pstring, unsigned short *pinterface_number, int num_interfaces);
+
+int cmmL2BridgeProcessClientCmd(FCI_CLIENT* fci_handle, int fc, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len);
+int cmmRxSetProcess(char ** keywords, int tabSize, daemon_handle_t daemon_handle);
+int cmmRxShowProcess(char ** keywords, int tabSize, daemon_handle_t daemon_handle);
+int cmmRxQueryProcess(char ** keywords, int tabSize, daemon_handle_t daemon_handle);
+int parse_macaddr(char *pstring, unsigned char *pmacaddr);
+
+extern struct list_head l2flow_table[L2FLOW_HASH_TABLE_SIZE];
+extern pthread_mutex_t brMutex;
+
+static inline unsigned int l2flow_hash(struct l2flow *l2flowtmp)
+{	
+	return (jhash(l2flowtmp, sizeof(struct l2flow), 0x12345678) & (L2FLOW_HASH_TABLE_SIZE - 1));
+}
+static inline int cmm_l2flow_cmp(struct l2flow *flow_a, struct l2flow *flow_b)
+{
+	return memcmp(flow_a, flow_b, sizeof(struct l2flow));
+}
+int cmm_l2flow_netlink_rcv(const struct sockaddr_nl *who, struct nlmsghdr *nlh, void *arg);
+int __cmm_l2flow_deregister(FCI_CLIENT* fci_handler, struct l2flow *l2flow_tmp);
+int __cmm_l2flow_register(FCI_CLIENT* fci_handler, char action, struct l2flow *l2flow_tmp, int iifi_idx, int oifi_idx, int flags, short mark);
+int __cmm_l2flow_reset(FCI_CLIENT* fci_handler);
+int cmm_l2flow_abm_notify(char action, int flags, struct l2flow *l2flow);
+void cmm_l2flow_print(int level, struct l2flow *l2flow_tmp, char nl);
+int cmmBridgeInit(struct cmm_ct *ctx);
+int cmmBridgeControlProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+#endif
+
diff --git a/cmm/src/module_socket.c b/cmm/src/module_socket.c
new file mode 100644
index 0000000..a6c2b15
--- /dev/null
+++ b/cmm/src/module_socket.c
@@ -0,0 +1,1661 @@
+ /*
+  *  module_socket.c: Socket module
+  *
+  *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+  *
+  * 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
+  */
+
+
+#include "cmm.h"
+#include "module_socket.h"
+#include "fpp_private.h"
+#include "fpp.h"
+#include "cmmd.h"
+
+struct list_head socket_table[HASH_SOCKET_SIZE];
+struct list_head socket_table_by_addr[HASH_SOCKET_SIZE];
+
+pthread_mutex_t socket_lock = PTHREAD_MUTEX_INITIALIZER;
+
+static u_int32_t internal_sock_ids[ROUTE_MAX_ID / (8 * sizeof(u_int32_t))] = {0, };
+static u_int32_t internal_sock_id = 0;
+
+u_int32_t new_socket_id(void)
+{
+	int offset, mask;
+	int i = 0;
+
+	for ( ;i < NUM_INTERNAL_SOCKET_ID; i++, internal_sock_id++)
+	{
+		if (internal_sock_id >= NUM_INTERNAL_SOCKET_ID)
+			internal_sock_id = 0;
+
+		offset = internal_sock_id / (8 * sizeof(u_int32_t));
+		mask = 1 << (internal_sock_id & 0x1f);
+		if (!(internal_sock_ids[offset] & mask))
+			goto found;
+
+	}
+	/* we're running in circles, return zero, we've exhausted all of our reserved sockets */
+	return 0;
+
+found:
+	internal_sock_ids[offset] |= mask;
+
+	return internal_sock_id + SOCK_ID_PRIVATE_START;
+}
+
+void del_socket_id(u_int32_t sock_id_ext)
+{
+	int sock_id = sock_id_ext - SOCK_ID_PRIVATE_START;
+	int offset = sock_id / (8 * sizeof(u_int32_t));
+	int mask = 1 << (sock_id & 0x1f);
+
+	internal_sock_ids[offset] &= ~mask;
+}
+
+static struct socket *socket_find(u_int16_t id)
+{
+	struct socket *s;
+	int key;
+	struct list_head *entry;
+
+	cmm_print(DEBUG_INFO, "%s: find socket(%d)\n", __func__, id);
+
+	key = HASH_SOCKET(id);
+
+	entry = list_first(&socket_table[key]);
+
+	while (entry != &socket_table[key])
+	{
+		s = container_of(entry, struct socket, list);
+		if (s->id == id)
+			//Entry found
+			goto found;
+		entry = list_next(entry);
+	}
+
+	s = NULL;
+
+found:
+	return s;
+}
+struct socket *socket_find_by_addr(int family, const u_int32_t *saddr, const u_int32_t *daddr, u_int16_t sport, u_int16_t dport, u_int16_t proto)
+{
+	struct socket *s;
+	int key;
+	struct list_head *entry;
+	int ip_len = IPADDRLEN(family);
+
+	cmm_print(DEBUG_INFO, "%s: find socket by address\n", __func__);
+
+	key= HASH_SOCK_ADDR(family, saddr, daddr, sport, dport, proto);
+
+	entry = list_first(&socket_table_by_addr[key]);
+
+	while (entry != &socket_table_by_addr[key])
+	{
+		s = container_of(entry, struct socket, list);
+		if (memcmp(saddr, s->saddr, ip_len) && memcmp(daddr, s->daddr, ip_len) 
+		&& (sport == s->sport) && (dport == s->dport) && (proto == s->proto))
+			goto found;
+
+		entry = list_next(entry);
+	}
+
+	s = NULL;
+
+found:
+	return s;
+}
+void __socket_add(struct socket * s)
+{
+	int key;
+
+	key = HASH_SOCKET(s->id);
+	list_add(&socket_table[key], &s->list);
+
+	key= HASH_SOCK_ADDR(s->family, s->saddr, s->daddr, s->sport, s->dport, s->proto);
+	list_add(&socket_table_by_addr[key], &s->list_by_addr);
+
+#ifdef COMCERTO_2000
+	s->rx_flow = __cmmFlowGet(s->family, s->saddr, s->daddr, s->sport, s->dport, s->proto); /*tx and rx flows are swapped for sockets (L2TP sockets.), this is because unlike RTP Relay, for L2TP a single socket is used, so the socket is created with daddr  as local address and saddr as peer address. This might need revisiting if the flows are extended for other sockets  */ 
+	s->tx_flow = __cmmFlowGet(s->family, s->daddr, s->saddr, s->dport, s->sport, s->proto);
+	if( s->rx_flow || s->tx_flow )
+		s->secure = 1;
+#endif
+
+}
+
+static struct socket *socket_add(cmmd_socket_open_cmd_t *cmd)
+{
+	struct socket *s;
+
+
+	s = malloc(sizeof(struct socket));
+	if (!s)
+	{
+		cmm_print(DEBUG_ERROR, "%s: malloc() failed\n", __func__);
+		goto err;
+	}
+
+	memset(s, 0, sizeof(struct socket));
+
+	s->id = cmd->id;
+	s->family = cmd->family;
+	s->type = cmd->type;
+	s->mode = cmd->mode;
+	memcpy(s->saddr, cmd->saddr, IPADDRLEN(s->family));
+	memcpy(s->daddr, cmd->daddr, IPADDRLEN(s->family));
+	s->sport = cmd->sport;
+	s->dport = cmd->dport;
+	s->proto = cmd->proto;
+	s->queue = cmd->queue;
+	s->dscp = cmd->dscp;
+	s->fwmark = cmd->fwmark;
+
+	__socket_add(s);
+err:
+	return s;
+}
+
+void socket_remove(struct socket *s)
+{
+	list_del(&s->list);
+	list_del(&s->list_by_addr);
+
+	if((s->id >= SOCK_ID_PRIVATE_START) && (s->id <=  SOCK_ID_PRIVATE_END))
+		del_socket_id(s->id);
+
+	free(s);
+}
+
+
+/************************************************************
+ *
+ * socket4_send_cmd
+ * Role: CMM to FPP commands in deamon context
+ ************************************************************/
+static int socket4_send_cmd(FCI_CLIENT *fci_handle, int action, struct socket *s)
+{
+	int ret = CMMD_ERR_OK;
+
+	switch (action)
+	{
+	default:
+		ret = CMMD_ERR_UNKNOWN_ACTION;
+		break;
+
+	case FPP_ACTION_REGISTER:
+	{
+		fpp_socket4_open_cmd_t cmd;
+
+		memset(&cmd, 0, sizeof(cmd));
+
+		cmd.id = s->id;
+		cmd.type = s->type;
+		cmd.mode = s->mode; 
+		cmd.saddr = s->saddr[0];
+		cmd.daddr = s->daddr[0];
+		cmd.sport = s->sport;
+		cmd.dport = s->dport;
+		cmd.proto = s->proto;
+		cmd.queue = s->queue;
+		cmd.dscp = s->dscp;
+		cmd.route_id = s->rt.fpp_route_id;
+#ifdef COMCERTO_2000
+		cmd.secure = s->secure;
+		if (s->rx_flow)
+		{
+			int i;
+			cmd.sa_nr_rx = s->rx_flow->sa_nr;
+			for (i = 0; i < cmd.sa_nr_rx; i++)
+				cmd.sa_handle_rx[i] = s->rx_flow->sa_handle[i];
+		}
+		if (s->tx_flow)
+		{
+			int i;
+			cmd.sa_nr_tx = s->tx_flow->sa_nr;
+			for (i = 0; i < cmd.sa_nr_tx; i++)
+				cmd.sa_handle_tx[i] = s->tx_flow->sa_handle[i];
+		}
+#endif
+
+		//Send message to forward engine
+		cmm_print(DEBUG_COMMAND, "Send CMD_IPV4_SOCK_OPEN\n");
+
+		ret = fci_write(fci_handle, FPP_CMD_IPV4_SOCK_OPEN, sizeof(fpp_socket4_open_cmd_t), (u_int16_t *) &cmd);
+		if (ret == FPP_ERR_OK)
+		{
+			s->flags |= FPP_PROGRAMMED;
+			s->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else
+		{
+			if (ret > 0)
+				cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_IPV4_SOCK_OPEN\n", __func__, ret);
+			else
+				cmm_print(DEBUG_ERROR, "%s: Error '%s' while sending CMD_IPV4_SOCK_OPEN\n", __func__, strerror(errno));
+			break;
+		}
+	}
+
+		break;
+
+	case FPP_ACTION_UPDATE:
+	{
+		fpp_socket4_update_cmd_t cmd;
+
+		memset(&cmd, 0, sizeof(cmd));
+
+		cmd.id = s->id;
+		cmd.saddr = s->saddr[0];
+		cmd.sport = s->sport;
+		cmd.queue = s->queue;
+		cmd.dscp = s->dscp;
+		cmd.route_id = s->rt.fpp_route_id;
+#ifdef COMCERTO_2000
+		cmd.secure = s->secure;
+		if (s->rx_flow)
+		{
+			int i;
+			cmd.sa_nr_rx = s->rx_flow->sa_nr;
+			for (i = 0; i < cmd.sa_nr_rx; i++)
+				cmd.sa_handle_rx[i] = s->rx_flow->sa_handle[i];
+		}
+		if (s->tx_flow)
+		{
+			int i;
+			cmd.sa_nr_tx = s->tx_flow->sa_nr;
+			for (i = 0; i < cmd.sa_nr_tx; i++)
+				cmd.sa_handle_tx[i] = s->tx_flow->sa_handle[i];
+		}
+#endif
+
+		//Send message to forward engine
+		cmm_print(DEBUG_COMMAND, "Send CMD_IPV4_SOCK_UPDATE\n");
+
+		ret = fci_write(fci_handle, FPP_CMD_IPV4_SOCK_UPDATE, sizeof(fpp_socket4_update_cmd_t), (u_int16_t *) &cmd);
+		if (ret == FPP_ERR_OK)
+		{
+			s->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else
+		{
+			if (ret > 0)
+				cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_IPV4_SOCK_UPDATE\n", __func__, ret);
+			else
+				cmm_print(DEBUG_ERROR, "%s: Error '%s' while sending CMD_IPV4_SOCK_UPDATE\n", __func__, strerror(errno));
+			break;
+		}
+	}
+
+		break;
+
+	case FPP_ACTION_DEREGISTER:
+	{
+		fpp_socket4_close_cmd_t cmd;
+
+		memset(&cmd, 0, sizeof(cmd));
+
+		//Send message to forward engine
+		cmm_print(DEBUG_COMMAND, "Send CMD_IPV4_SOCK_CLOSE\n");
+
+		cmd.id = s->id;
+
+		ret = fci_write(fci_handle, FPP_CMD_IPV4_SOCK_CLOSE, sizeof(fpp_socket4_close_cmd_t), (unsigned short *) &cmd);
+		if (ret == FPP_ERR_OK)
+		{
+			s->flags &= ~FPP_PROGRAMMED;
+		}
+		else
+		{
+			if (ret > 0)
+				cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_IPV4_SOCK_CLOSE\n", __func__, ret);
+			else
+				cmm_print(DEBUG_ERROR, "%s: Error '%s' while sending CMD_IPV4_SOCK_CLOSE\n", __func__, strerror(errno));
+			break;
+		}
+	}
+		break;
+	}
+
+	return ret;
+}
+
+/************************************************************
+ *
+ * socket6_send_cmd
+ * Role: CMM to FPP commands in deamon context
+ ************************************************************/
+static int socket6_send_cmd(FCI_CLIENT *fci_handle, int action, struct socket *s)
+{
+	int ret = CMMD_ERR_OK;
+
+	switch (action)
+	{
+	default:
+		ret = CMMD_ERR_UNKNOWN_ACTION;
+		break;
+	case FPP_ACTION_REGISTER:
+	{
+		fpp_socket6_open_cmd_t cmd;
+
+		memset(&cmd, 0, sizeof(cmd));
+
+		cmd.id = s->id;
+		cmd.type = s->type;
+		cmd.mode = s->mode; 
+		memcpy(cmd.saddr, s->saddr, 16);
+		memcpy(cmd.daddr, s->daddr, 16);
+		cmd.sport = s->sport;
+		cmd.dport = s->dport;
+		cmd.proto = s->proto;
+		cmd.queue = s->queue;
+		cmd.dscp = s->dscp;
+		cmd.route_id = s->rt.fpp_route_id;
+#ifdef COMCERTO_2000
+		if (s->rx_flow)
+		{
+			int i;
+			cmd.secure = 1;
+			cmd.sa_nr_rx = s->rx_flow->sa_nr;
+			for (i = 0; i < cmd.sa_nr_rx; i++)
+				cmd.sa_handle_rx[i] = s->rx_flow->sa_handle[i];
+		}
+		if (s->tx_flow)
+		{
+			int i;
+			cmd.secure = 1;
+			cmd.sa_nr_tx = s->tx_flow->sa_nr;
+			for (i = 0; i < cmd.sa_nr_tx; i++)
+				cmd.sa_handle_tx[i] = s->tx_flow->sa_handle[i];
+		}
+#endif
+
+		//Send message to forward engine
+		cmm_print(DEBUG_COMMAND, "Send CMD_IPV6_SOCK_OPEN\n");
+
+		ret = fci_write(fci_handle, FPP_CMD_IPV6_SOCK_OPEN, sizeof(fpp_socket6_open_cmd_t), (u_int16_t *) &cmd);
+		if (ret == FPP_ERR_OK)
+		{
+			s->flags |= FPP_PROGRAMMED;
+			s->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else
+		{
+			if (ret > 0)
+				cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_IPV6_SOCK_OPEN\n", __func__, ret);
+			else
+				cmm_print(DEBUG_ERROR, "%s: Error '%s' while sending CMD_IPV6_SOCK_OPEN\n", __func__, strerror(errno));
+			break;
+		}
+	}
+
+		break;
+
+	case FPP_ACTION_UPDATE:
+	{
+		fpp_socket6_update_cmd_t cmd;
+
+		memset(&cmd, 0, sizeof(cmd));
+
+		cmd.id = s->id;
+		memcpy(cmd.saddr, s->saddr, 16);
+		cmd.sport = s->sport;
+		cmd.queue = s->queue;
+		cmd.dscp = s->dscp;
+		cmd.route_id = s->rt.fpp_route_id;
+#ifdef COMCERTO_2000
+		if (s->rx_flow)
+		{
+			int i;
+			cmd.secure = 1;
+			cmd.sa_nr_rx = s->rx_flow->sa_nr;
+			for (i = 0; i < cmd.sa_nr_rx; i++)
+				cmd.sa_handle_rx[i] = s->rx_flow->sa_handle[i];
+		}
+		if (s->tx_flow)
+		{
+			int i;
+			cmd.secure = 1;
+			cmd.sa_nr_tx = s->tx_flow->sa_nr;
+			for (i = 0; i < cmd.sa_nr_tx; i++)
+				cmd.sa_handle_tx[i] = s->tx_flow->sa_handle[i];
+		}
+#endif
+
+		//Send message to forward engine
+		cmm_print(DEBUG_COMMAND, "Send CMD_IPV6_SOCK_UPDATE\n");
+
+		ret = fci_write(fci_handle, FPP_CMD_IPV6_SOCK_UPDATE, sizeof(fpp_socket6_update_cmd_t), (u_int16_t *) &cmd);
+		if (ret == FPP_ERR_OK)
+		{
+			s->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else
+		{
+			if (ret > 0)
+				cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_IPV6_SOCK_UPDATE\n", __func__, ret);
+			else
+				cmm_print(DEBUG_ERROR, "%s: Error '%s' while sending CMD_IPV6_SOCK_UPDATE\n", __func__, strerror(errno));
+			break;
+		}
+	}
+
+		break;
+	
+	case FPP_ACTION_DEREGISTER:
+	{
+		fpp_socket6_close_cmd_t cmd;
+
+		memset(&cmd, 0, sizeof(cmd));
+
+		//Send message to forward engine
+		cmm_print(DEBUG_COMMAND, "Send CMD_IPV6_SOCK_CLOSE\n");
+
+		cmd.id = s->id;
+
+		ret = fci_write(fci_handle, FPP_CMD_IPV6_SOCK_CLOSE, sizeof(fpp_socket6_close_cmd_t), (unsigned short *) &cmd);
+		if (ret == FPP_ERR_OK)
+		{
+			s->flags &= ~FPP_PROGRAMMED;
+		}
+		else
+		{
+			if (ret > 0)
+				cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_IPV6_SOCK_CLOSE\n", __func__, ret);
+			else
+				cmm_print(DEBUG_ERROR, "%s: Error '%s' while sending CMD_IPV6_SOCK_CLOSE\n", __func__, strerror(errno));
+			break;
+		}
+	}
+		break;
+	}
+
+	return ret;
+}
+
+
+/************************************************************
+ *
+ * socket_send_cmd
+ * Role: CMM to FPP commands in deamon context
+ ************************************************************/
+static int socket_send_cmd(FCI_CLIENT *fci_handle, int request, struct socket *s)
+{
+	int action;
+
+	switch (request)
+	{
+	case (ADD | UPDATE):
+		if ((s->flags & (FPP_PROGRAMMED | FPP_NEEDS_UPDATE)) == FPP_PROGRAMMED)
+			return CMMD_ERR_OK;
+
+		if ((s->flags & (FPP_PROGRAMMED | FPP_NEEDS_UPDATE)) == (FPP_PROGRAMMED | FPP_NEEDS_UPDATE))
+			action = FPP_ACTION_UPDATE;
+		else
+			action = FPP_ACTION_REGISTER;
+
+		break;
+
+	case UPDATE:
+		if (!((s->flags & FPP_PROGRAMMED) && (s->flags & FPP_NEEDS_UPDATE)))
+			return CMMD_ERR_OK;
+
+		action = FPP_ACTION_UPDATE;
+		break;
+	
+	case REMOVE:
+		if (!(s->flags & FPP_PROGRAMMED))
+			return CMMD_ERR_OK;
+
+		action = FPP_ACTION_DEREGISTER;
+
+		break;
+
+	default:
+		cmm_print(DEBUG_ERROR, "%s: Action not supported\n", __func__);
+		return CMMD_ERR_UNKNOWN_ACTION;
+	}
+
+	if (s->family == AF_INET)
+		return socket4_send_cmd(fci_handle, action, s);
+	else if (s->family == AF_INET6)
+		return socket6_send_cmd(fci_handle, action, s);
+	else
+		return CMMD_ERR_UNKNOWN;
+}
+
+int __socket_open(FCI_CLIENT *fci_handle, struct socket *s)
+{
+	int rc;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	if ((s->type == CMMD_SOCKET_TYPE_LANWAN) || (s->type == CMMD_SOCKET_TYPE_L2TP))
+	{
+		struct flow flow = {
+					.family = s->family,
+					.sAddr = s->daddr,
+					.dAddr = s->saddr,
+					.fwmark = s->fwmark,
+				};
+
+		if (__cmmRouteRegister(&s->rt, &flow, 0, "socket") < 0)
+		{
+			goto program;
+		}
+
+		cmmFeRouteUpdate(fci_handle, ADD | UPDATE, s->rt.fpp_route);
+	}
+
+
+program:
+	__cmmCheckFPPRouteIdUpdate(&s->rt, &s->flags);
+
+	if(((s->rx_flow) && (s->rx_flow->flags & FPP_NEEDS_UPDATE ) )
+		|| ((s->tx_flow) && (s->tx_flow->flags & FPP_NEEDS_UPDATE )))
+		s->flags |= FPP_NEEDS_UPDATE;	
+
+	rc = socket_send_cmd(fci_handle, ADD | UPDATE, s);
+
+	return rc;
+}
+
+
+#ifdef COMCERTO_2000
+/************************************************************
+ *
+ * __cmmSocketFindFromFlow
+ *
+ ************************************************************/
+struct socket *__cmmSocketFindFromFlow(int family, unsigned int *saddr, unsigned int *daddr, unsigned char proto, char *orig)
+{
+	struct socket *s;
+	struct list_head *entry;
+	int i;
+
+	for (i = 0; i < HASH_SOCKET_SIZE; i++)
+	{
+		for (entry = list_first(&socket_table[i]); entry != &socket_table[i]; entry = list_next(entry))
+		{
+			s = container_of(entry, struct socket, list);
+			if (s->family == family && s->proto == proto)
+			{
+				if (!memcmp(s->saddr, saddr, IPADDRLEN(family)) && !memcmp(s->daddr, daddr, IPADDRLEN(family)))
+				{
+					*orig = 1;
+					goto found;
+				}
+
+				if (!memcmp(s->saddr, daddr, IPADDRLEN(family)) && !memcmp(s->daddr, saddr, IPADDRLEN(family)))
+				{
+					*orig = 0;
+					goto found;
+				}
+			}
+		}
+	}
+
+	s = NULL;
+
+found:
+	return s;
+}
+#endif	// COMCERTO_2000
+
+/************************************************************
+ *
+ * __cmmSocketUpdateWithRoute
+ *
+ ************************************************************/
+void __cmmSocketUpdateWithRoute(FCI_CLIENT *fci_handle, struct RtEntry *route)
+{
+	struct socket *s;
+	struct list_head *entry;
+	struct fpp_rt *fpp_route;
+	int i;
+	
+	__pthread_mutex_lock(&socket_lock);
+
+	for (i = 0; i < HASH_SOCKET_SIZE; i++)
+	{
+		for (entry = list_first(&socket_table[i]); entry != &socket_table[i]; entry = list_next(entry))
+		{
+			s = container_of(entry, struct socket, list);
+
+			if (s->rt.route == route)
+			{
+				fpp_route = s->rt.fpp_route;
+				s->rt.fpp_route = NULL;
+
+				__socket_open(fci_handle, s);
+
+				__cmmFPPRouteDeregister(fci_handle, fpp_route, "socket");
+			}
+		}
+	}
+
+	__pthread_mutex_unlock(&socket_lock);
+}
+
+
+int __socket_close(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, struct socket *s)
+{
+	int rc = socket_send_cmd(fci_handle, REMOVE, s);
+	if (rc != CMMD_ERR_OK)
+		return rc;
+
+	__cmmRouteDeregister(fci_handle, &s->rt, "socket");
+
+#ifdef COMCERTO_2000
+	if (s->rx_flow)
+		if (!cmmFlowKeyEngineRemove(fci_key_handle, s->rx_flow))
+		{
+			__cmmFlowPut(s->rx_flow);
+			s->rx_flow = NULL;
+		}
+	if (s->tx_flow)
+		if (!cmmFlowKeyEngineRemove(fci_key_handle, s->tx_flow))
+		{
+			__cmmFlowPut(s->tx_flow);
+			s->tx_flow = NULL;
+		}
+#endif
+
+	/* In case of error the socket may still be programmed in fpp,
+	   so don't remove it */
+	if (s->flags & FPP_PROGRAMMED)
+		goto err;
+
+	socket_remove(s);
+
+err:
+	return rc;
+}
+
+static int socket_open(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, cmmd_socket_open_cmd_t *cmd)
+{
+	struct socket *s;
+	unsigned short rc = 0; // rc=2 OK, rc=0 KO, cmm_client error code hack 
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+	__pthread_mutex_lock(&socket_lock);
+
+	s = socket_find(cmd->id);
+	if (!s)
+	{
+		s = socket_add(cmd);
+		if (!s)
+		{
+			rc = -1;
+			goto exit;
+		}
+	}
+	else
+		goto exit;
+
+	rc = __socket_open(fci_handle, s);
+	if(rc != CMMD_ERR_OK)
+		__socket_close(fci_handle, fci_key_handle, s);
+
+exit:
+	__pthread_mutex_unlock(&socket_lock);
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	return rc;
+}
+
+
+static int socket_update(FCI_CLIENT *fci_handle, cmmd_socket_update_cmd_t *cmd)
+{
+	struct socket *s;
+	unsigned short rc = 0; // rc=2 OK, rc=0 KO, cmm_client error code hack 
+	struct ct_route old_route;
+	u_int8_t del_old_route=0;
+	u_int32_t null_addr[4] = {0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff};
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+	__pthread_mutex_lock(&socket_lock);
+
+	s = socket_find(cmd->id);
+	if (!s)
+	{
+		cmm_print(DEBUG_ERROR, "invalid socket ID %d \n", cmd->id);
+		rc = CMMD_ERR_NOT_FOUND;
+		goto exit;
+	}
+
+	if (s->family != cmd->family)
+	{
+		cmm_print(DEBUG_ERROR, "invalid socket family %d \n", cmd->family);
+		rc = CMMD_ERR_WRONG_COMMAND_PARAM;
+		goto exit;
+	}
+
+	if (memcmp(cmd->saddr, null_addr, IPADDRLEN(s->family)) && memcmp(cmd->saddr, s->saddr, IPADDRLEN(s->family))) // source has changed -> new route
+	{
+		old_route = s->rt;
+		memcpy(s->saddr, cmd->saddr, IPADDRLEN(s->family));
+		s->rt.route = NULL;
+		s->rt.fpp_route = NULL;
+		del_old_route = 1;
+	}
+
+	if (cmd->sport != 0xffff)
+		s->sport = cmd->sport;
+	if (cmd->queue != 0xff)
+		s->queue = cmd->queue;
+	if (cmd->dscp != 0xffff)	
+		s->dscp = cmd->dscp;
+
+	s->secure = 0;
+#ifdef COMCERTO_2000
+	s->rx_flow = __cmmFlowGet(s->family, s->saddr, s->daddr, s->sport, s->dport, s->proto);
+	s->tx_flow = __cmmFlowGet(s->family, s->daddr, s->saddr, s->dport, s->sport, s->proto);
+	if(s->rx_flow || s->tx_flow)
+		s->secure = 1;
+#endif
+
+	s->flags |= FPP_NEEDS_UPDATE;
+
+	rc = __socket_open(fci_handle, s);
+
+exit:
+
+	if (del_old_route)	
+	{
+		cmm_print(DEBUG_INFO, "Removing old socket route entry\n");
+
+		__cmmRouteDeregister(fci_handle, &old_route, "socket");
+	}
+
+	__pthread_mutex_unlock(&socket_lock);
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	return rc;
+}
+
+
+static int socket_close(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, cmmd_socket_close_cmd_t *cmd)
+{
+	struct socket *s;
+	int ret = 0;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+	__pthread_mutex_lock(&socket_lock);
+
+	s = socket_find(cmd->id);
+	if (!s)
+	{
+		cmm_print(DEBUG_ERROR, "%s: socket_find(%d) failed\n", __func__, cmd->id);
+		ret = CMMD_ERR_NOT_FOUND;
+		goto out;
+	}
+
+	ret = __socket_close(fci_handle, fci_key_handle, s);
+	
+out:
+	__pthread_mutex_unlock(&socket_lock);
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	return ret;
+}
+
+
+
+/* CMM server side socket control */
+int socket_daemon(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, int fc, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	int rc = 0; 
+	
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	res_buf[0] = CMMD_ERR_WRONG_COMMAND_SIZE;
+
+	switch (fc)
+	{
+	case CMMD_CMD_SOCKET_OPEN:
+	{
+		cmmd_socket_open_cmd_t *cmd = (cmmd_socket_open_cmd_t *)cmd_buf;
+		*res_len = 2;
+
+		if (cmd_len < sizeof(*cmd))
+		{
+			cmm_print(DEBUG_ERROR, "%s: socket open command size too small(%d, %d)\n", __func__, cmd_len, sizeof(*cmd));
+			break;
+		}
+		if(( cmd->id >= SOCK_ID_PRIVATE_START) && ( cmd->id <= (SOCK_ID_PRIVATE_END)) )
+		{
+			rc = res_buf[0] = CMMD_ERR_WRONG_SOCKID;
+			break;
+		}
+
+		rc = socket_open(fci_handle, fci_key_handle, cmd);
+		if (rc >= 0)
+		{
+			res_buf[0] = rc;
+			rc = 0;
+		}
+
+		break;
+	}
+
+	case CMMD_CMD_SOCKET_UPDATE:
+	{
+		cmmd_socket_update_cmd_t *cmd = (cmmd_socket_update_cmd_t *)cmd_buf;
+		*res_len = 2;
+
+		if (cmd_len < sizeof(*cmd))
+		{
+			cmm_print(DEBUG_ERROR, "%s: socket update command size too small(%d, %d)\n", __func__, cmd_len, sizeof(*cmd));
+			break;
+		}
+		if(( cmd->id >= SOCK_ID_PRIVATE_START) && ( cmd->id <= (SOCK_ID_PRIVATE_END)) )
+		{
+			rc = res_buf[0] = CMMD_ERR_WRONG_SOCKID;
+			break;
+		}
+
+
+		rc = socket_update(fci_handle, cmd);
+		if (rc >= 0)
+		{
+			res_buf[0] = rc;
+			rc = 0;
+		}
+
+		break;
+	}
+
+	case CMMD_CMD_SOCKET_CLOSE:
+	{
+		cmmd_socket_close_cmd_t *cmd = (cmmd_socket_close_cmd_t *)cmd_buf;
+		*res_len = 2;
+
+		if (cmd_len < sizeof(*cmd))
+		{
+			cmm_print(DEBUG_ERROR, "%s: socket close command size too small(%d, %d)\n", __func__, cmd_len, sizeof(*cmd));
+			break;
+		}
+
+		if(( cmd->id >= SOCK_ID_PRIVATE_START) && ( cmd->id <= (SOCK_ID_PRIVATE_END)) )
+		{
+			rc = res_buf[0] = CMMD_ERR_WRONG_SOCKID;
+			break;
+		}
+
+		rc = socket_close(fci_handle, fci_key_handle, cmd);
+		if (rc >= 0)
+		{
+			res_buf[0] = rc;
+			rc = 0;
+		}
+
+		break;
+	}
+
+	case CMMD_CMD_SOCKET_SHOW:
+	{
+		int i;
+		struct socket *s;
+		cmmd_socket_show_cmd_t *cmd = (cmmd_socket_show_cmd_t *)cmd_buf;
+
+		cmm_print(DEBUG_INFO, "reserve start and end(%d, %d)\n", SOCK_ID_PRIVATE_START, SOCK_ID_PRIVATE_END);
+
+		__pthread_mutex_lock(&socket_lock);
+		if (!cmd->dump_all)
+		{
+			s = socket_find(cmd->id);
+			if(!s)
+			{
+				res_buf[0] = CMMD_ERR_NOT_FOUND;
+				*res_len = 2;
+			}
+			else
+			{
+				memcpy(res_buf, s,sizeof(struct socket));
+				res_buf[0] = CMMD_ERR_OK; /* XXX: overwrite first 2 bytes with return code.
+							   * This is a hack. Should be fixed by defining correct response
+							   * structure.
+							   */
+				*res_len = sizeof(struct socket);
+			}
+		}
+		else
+		{
+			struct list_head *entry;
+			cmmd_socket_show_res_t *res = (cmmd_socket_show_res_t*)(res_buf);
+			res->rc = CMMD_ERR_OK;
+			res->nb_socket = 0;
+
+			for (i = 0; i < HASH_SOCKET_SIZE; i++)
+			{
+				for (entry = list_first(&socket_table[i]); entry != &socket_table[i]; entry = list_next(entry), res->nb_socket++)
+				{
+					if ((res->nb_socket + 1) * sizeof(res->sockets[0]) + sizeof(cmmd_socket_show_res_t) > CMM_BUF_SIZE) 
+						/* no room for next entry */
+						goto end;
+
+					s = container_of(entry, struct socket, list);
+					res->sockets[res->nb_socket].sock_id = s->id;
+					res->sockets[res->nb_socket].flags = s->flags;
+				}
+			}
+
+end:
+			*res_len = res->nb_socket * sizeof(res->sockets[0]) + sizeof(cmmd_socket_show_res_t);
+		}
+
+		__pthread_mutex_unlock(&socket_lock);
+	}
+		break;
+
+	default:
+		res_buf[0] = CMMD_ERR_UNKNOWN_COMMAND;
+		*res_len = 2;
+		break;
+	}
+
+	return rc;
+}
+
+
+static void cmmSocketSetUsage(unsigned char family)
+{
+	if (family == AF_INET)
+	cmm_print(DEBUG_STDOUT, 
+			"Usage: set socket \n"
+			"\n"
+			"                                  [open]\n"
+			"                                       [sock_id {socket_id}] \n"
+			"                                       [type {acp | fpp | msp}]\n"
+			"                                       [saddr {IPv4 addr}] \n"
+			"                                       [daddr {IPv4 addr}] \n"
+			"                                       [sport {port number}] \n"
+			"                                       [dport {port number}] \n"
+			"                                       [proto {udp | tcp}] \n"
+			"                                       [queue {0-19}] \n"
+			"                                       [dscp {0-63}]  (Optional parameter, if not set ToS inherited from packet)\n"
+			"                                       [fwmark {unsigned int}]  (Optional parameter)\n"
+			"                                       [mode {connected | unconnected}] (Optional parameter default unconnected)\n"
+
+
+			"                                  [update]\n"
+			"                                       [sock_id {socket_id}] \n"
+			"                                       [saddr {IPv4 addr}] \n"
+			"                                       [sport {port number}] \n"
+			"                                       [queue {0-19}] \n"
+			"                                       [dscp {0-63}]  \n"
+			"                                       [fwmark {unsigned int}]\n"
+
+
+
+			"\n"
+			"                                  [close]\n"
+			"                                       [sock_id {socket_id}] \n"
+	          );
+	else
+	cmm_print(DEBUG_STDOUT, 
+			"Usage: set socket6 \n"
+			"\n"
+			"                                  [open]\n"
+			"                                       [sock_id {socket_id}] \n"
+			"                                       [type {acp | fpp}]\n"
+			"                                       [saddr {IPv6 addr}] \n"
+			"                                       [daddr {IPv6 addr}] \n"
+			"                                       [sport {port number}] \n"
+			"                                       [dport {port number}] \n"
+			"                                       [proto {udp | tcp}] \n"
+			"                                       [queue {0-19}] \n"
+			"                                       [dscp {0-63}]  (Optional parameter, if not set Traffic Class inherited from packet)\n"
+			"                                       [fwmark {unsigned int}]  (Optional parameter)\n"
+			"                                       [mode {connected | unconnected}] (Optional parameter default unconnected)\n"
+
+
+			"                                  [update]\n"
+			"                                       [sock_id {socket_id}] \n"
+			"                                       [saddr {IPv6 addr}] \n"
+			"                                       [sport {port number}] \n"
+			"                                       [queue {0-19}] \n"
+			"                                       [dscp {0-63}]  \n"
+			"                                       [fwmark {unsigned int}]\n"
+
+
+			"\n"
+			"                                  [close]\n"
+			"                                       [sock_id {socket_id}] \n"
+	          );
+}
+
+static void cmmSocketShowUsage(void)
+{
+	cmm_print(DEBUG_STDOUT, 
+			"Usage: show socket  [sock_id {socket ID} | all]\n"
+			"\n"
+	          );
+}
+
+int cmmSocketSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	unsigned int tmp;
+	char * endptr;
+	char rcvBuffer[CMM_BUF_SIZE];
+	int family;
+	int rc;
+
+	if (!strcasecmp(keywords[cpt - 1], "socket6"))
+		family = AF_INET6;
+	else
+		family = AF_INET;
+
+	if (!keywords[cpt])
+		goto print_help;
+
+	if (strcasecmp(keywords[cpt], "open") == 0)
+	{
+		cmmd_socket_open_cmd_t cmd;
+		memset(&cmd, 0, sizeof(cmmd_socket_open_cmd_t));
+		
+		if (!keywords[++cpt])
+			goto print_help;
+
+		cmd.family = family;
+
+		if (strcasecmp(keywords[cpt], "sock_id") == 0)
+		{
+			if (!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "ERROR: sock_id must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.id = tmp;
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto print_help;
+	
+		if(strcasecmp(keywords[cpt], "type") == 0)
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+		
+			if(strcasecmp(keywords[cpt], "fpp") == 0)
+			{
+				cmd.type = CMMD_SOCKET_TYPE_LANWAN; 
+			}
+			else if(strcasecmp(keywords[cpt], "acp") == 0)
+			{
+				cmd.type = CMMD_SOCKET_TYPE_ACP;
+			}
+			else if(strcasecmp(keywords[cpt], "msp") == 0)
+			{
+				cmd.type = CMMD_SOCKET_TYPE_MSP;
+			}
+			else
+			{
+				cmm_print(DEBUG_CRIT, "socket ERROR: type must be either acp, fpp or msp \n");
+				goto  print_help;
+			}
+		}
+		else
+			goto keyword_error;
+
+		if (!keywords[++cpt])
+			goto print_help;
+	
+		if (strcasecmp(keywords[cpt], "saddr") == 0)
+		{
+			if (!keywords[++cpt])
+				goto print_help;
+		
+			if (!inet_pton(family, keywords[cpt], &cmd.saddr))
+			{
+				cmm_print(DEBUG_CRIT,"%s: error reading source address %s\n", __func__, keywords[cpt]);
+				goto keyword_error;
+			}
+		}
+		else
+			goto keyword_error;
+	
+		if (!keywords[++cpt])
+			goto print_help;
+	
+		if (strcasecmp(keywords[cpt], "daddr") == 0)
+		{
+			if (!keywords[++cpt])
+				goto print_help;
+		
+			if (!inet_pton(family, keywords[cpt], cmd.daddr))
+			{
+				cmm_print(DEBUG_CRIT,"%s: error reading destination address %s\n", __func__,keywords[cpt]);
+				goto keyword_error;
+			}
+		}
+		else
+			goto keyword_error;
+
+		if (!keywords[++cpt])
+			goto print_help;
+	
+		if (strcasecmp(keywords[cpt], "sport") == 0)
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+				
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "ERROR: sport must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.sport= htons(tmp);
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto print_help;
+	
+		if(strcasecmp(keywords[cpt], "dport") == 0)
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+				
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "ERROR: dport must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.dport= htons(tmp);
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto print_help;
+	
+		if(strcasecmp(keywords[cpt], "proto") == 0)
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+	
+			if(strcasecmp(keywords[cpt], "udp") == 0)
+			{
+				cmd.proto= 17; 
+			}
+			else if(strcasecmp(keywords[cpt], "tcp") == 0)
+			{
+				cmd.proto = 6;
+			}
+			else
+			{
+				cmm_print(DEBUG_CRIT, "socket ERROR: proto must be either udp or tcp\n");
+				goto  print_help;
+			}
+		}
+		else
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto print_help;
+	
+		if(strcasecmp(keywords[cpt], "queue") == 0)
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > (FPP_NUM_QUEUES - 1) ))
+			{
+				cmm_print(DEBUG_CRIT, "ERROR: queue number must be a number between 0 and %d\n", FPP_NUM_QUEUES - 1);
+				goto  print_help;
+			}
+			cmd.queue= tmp;
+		}
+		else
+			goto keyword_error;
+
+		while (keywords[++cpt] != NULL)
+		{
+			if(strcasecmp(keywords[cpt], "dscp") == 0)
+			{
+				if(!keywords[++cpt])
+					goto print_help;
+			
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) ||  (tmp > 63))
+				{
+					cmm_print(DEBUG_CRIT, "ERROR: dscp number must be a number between 0 and 63\n");
+					goto  print_help;
+				}
+				cmd.dscp= tmp;
+			}
+			else if(strcasecmp(keywords[cpt], "fwmark") == 0)
+			{
+				if(!keywords[++cpt])
+					goto print_help;
+				
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) ||  (tmp > UINT_MAX))
+				{
+					cmm_print(DEBUG_CRIT, "ERROR: dscp number must be a number between 0 and %d\n", UINT_MAX);
+					goto  print_help;
+				}
+				cmd.fwmark= tmp;
+			}
+			else if(strcasecmp(keywords[cpt], "mode") == 0)
+			{
+				if(!keywords[++cpt])
+					goto print_help;
+			
+				if(strcasecmp(keywords[cpt], "connected") == 0)
+				{
+					cmd.mode = SOCKET_CONNECTED; 
+				}
+				else if(strcasecmp(keywords[cpt], "unconnected") == 0)
+				{
+					cmd.mode = SOCKET_UNCONNECTED;
+				}
+				else
+				{
+					cmm_print(DEBUG_CRIT, "socket ERROR: mode  must be either connected or unconnected \n");
+					goto  print_help;
+				}
+			}
+#ifdef COMCERTO_2000
+			else if(strcasecmp(keywords[cpt], "ipsec") == 0)
+			{
+				if(!keywords[++cpt])
+					goto print_help;
+				
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) ||  (tmp > 1))
+				{
+					cmm_print(DEBUG_CRIT, "ERROR: ipsec flag must be 0 or 1\n");
+					goto  print_help;
+				}
+				cmd.secure = tmp;
+			}
+#endif
+			else
+				goto keyword_error;
+		}
+
+		if (!cmd.dscp)
+			cmd.dscp = 0xFFFF;
+
+		rc = cmmSendToDaemon(daemon_handle, CMMD_CMD_SOCKET_OPEN, &cmd, sizeof(cmd), rcvBuffer);
+		if (rc == 2)
+		{
+			if (((u_int16_t*)rcvBuffer)[0] != CMMD_ERR_OK)
+				cmm_print(DEBUG_CRIT,  "%s: error %d when sending CMD_SOCKET_OPEN\n", __func__, ((u_int16_t*)rcvBuffer)[0]);
+		}
+		else if (rc > 0)
+			cmm_print(DEBUG_CRIT,  "%s: wrong response size %d received\n", __func__, rc);
+
+	}
+	else if(strcasecmp(keywords[cpt], "update") == 0)
+	{
+		cmmd_socket_update_cmd_t cmd;
+
+		cmd.saddr[0] = 0xffffffff;
+		cmd.saddr[1] = 0xffffffff;
+		cmd.saddr[2] = 0xffffffff;
+		cmd.saddr[3] = 0xffffffff;
+		cmd.sport = 0xffff;
+		cmd.dscp = 0xffff;
+		cmd.queue = 0xff;
+		cmd.fwmark = 0xffffffff;
+#ifdef COMCERTO_2000
+		cmd.secure = 0xffff;
+#endif
+
+		if(!keywords[++cpt])
+			goto print_help;
+
+		cmd.family = family;
+
+		if(strcasecmp(keywords[cpt], "sock_id") == 0)
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "ERROR: sock_id must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.id = tmp;
+		}
+		else
+			goto keyword_error;
+		
+	
+		while (keywords[++cpt] != NULL)
+		{
+			if(strcasecmp(keywords[cpt], "saddr") == 0)
+			{
+				if(!keywords[++cpt])
+					goto print_help;
+			
+				if (!inet_pton(family, keywords[cpt], cmd.saddr))
+				{
+					cmm_print(DEBUG_CRIT,"%s: error reading source address %s\n", __func__, keywords[cpt]);
+					goto keyword_error;
+				}
+			}
+		
+			else if(strcasecmp(keywords[cpt], "sport") == 0)
+			{
+				if(!keywords[++cpt])
+					goto print_help;
+					
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+				{
+					cmm_print(DEBUG_CRIT, "ERROR: sport must be a number between 0 and %d\n", USHRT_MAX);
+					goto  print_help;
+				}
+				cmd.sport= htons(tmp);
+			}
+			else if(strcasecmp(keywords[cpt], "queue") == 0)
+			{
+				if(!keywords[++cpt])
+					goto print_help;
+				
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) ||  (tmp > (FPP_NUM_QUEUES - 1) ))
+				{
+					cmm_print(DEBUG_CRIT, "ERROR: queue number must be a number between 0 and %d\n", FPP_NUM_QUEUES - 1);
+					goto  print_help;
+				}
+				cmd.queue= tmp;
+			}
+			else if(strcasecmp(keywords[cpt], "dscp") == 0)
+			{
+				if(!keywords[++cpt])
+					goto print_help;
+				
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) ||  (tmp > 63))
+				{
+					cmm_print(DEBUG_CRIT, "ERROR: dscp number must be a number between 0 and 63\n");
+					goto  print_help;
+				}
+				cmd.dscp= tmp;
+			}
+			else if(strcasecmp(keywords[cpt], "fwmark") == 0)
+			{
+				if(!keywords[++cpt])
+					goto print_help;
+				
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) ||  (tmp > UINT_MAX))
+				{
+					cmm_print(DEBUG_CRIT, "ERROR: dscp number must be a number between 0 and %d\n", UINT_MAX);
+					goto  print_help;
+				}
+				cmd.fwmark= tmp;
+			}
+#ifdef COMCERTO_2000
+			else if(strcasecmp(keywords[cpt], "ipsec") == 0)
+			{
+				if(!keywords[++cpt])
+					goto print_help;
+				
+				/*Get an integer from the string*/
+				endptr = NULL;
+				tmp = strtoul(keywords[cpt], &endptr, 0);
+				if ((keywords[cpt] == endptr) ||  (tmp > 1))
+				{
+					cmm_print(DEBUG_CRIT, "ERROR: ipsec flag must be 0 or 1\n");
+					goto  print_help;
+				}
+				cmd.secure = tmp;
+			}
+#endif
+			else
+				goto keyword_error;
+
+		}
+		rc = cmmSendToDaemon(daemon_handle, CMMD_CMD_SOCKET_UPDATE, &cmd, sizeof(cmd), rcvBuffer);
+		if (rc == 2)
+		{
+			if (((u_int16_t*)rcvBuffer)[0] != CMMD_ERR_OK)
+				cmm_print(DEBUG_CRIT,  "%s: error %d when sending CMD_SOCKET_UPDATE\n", __func__, ((u_int16_t*)rcvBuffer)[0]);
+		}
+		else if (rc > 0)
+			cmm_print(DEBUG_CRIT,  "%s: wrong response size %d received\n", __func__, rc);
+	}
+
+	
+	else if(strcasecmp(keywords[cpt], "close") == 0)
+	{
+		cmmd_socket_close_cmd_t cmd;
+		
+		if(!keywords[++cpt])
+			goto print_help;
+		
+		if(strcasecmp(keywords[cpt], "sock_id") == 0)
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+			
+			/*Get an integer from the string*/
+			endptr = NULL;
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+			if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+			{
+				cmm_print(DEBUG_CRIT, "ERROR: sock_id must be a number between 0 and %d\n", USHRT_MAX);
+				goto  print_help;
+			}
+			cmd.id = tmp;
+		}
+		else
+			goto keyword_error;
+		
+		rc = cmmSendToDaemon(daemon_handle, CMMD_CMD_SOCKET_CLOSE, &cmd, sizeof(cmd), rcvBuffer);
+		if (rc == 2)
+		{
+			if (((u_int16_t*)rcvBuffer)[0] != CMMD_ERR_OK)
+				cmm_print(DEBUG_CRIT,  "%s: error %d when sending CMD_SOCKET_CLOSE\n", __func__, ((u_int16_t*)rcvBuffer)[0]);
+		}
+		else if (rc > 0)
+			cmm_print(DEBUG_CRIT,  "%s: wrong response size %d received\n", __func__, rc);
+	}
+	else
+		goto keyword_error;
+	
+	return 0;
+
+
+
+keyword_error:
+	cmm_print(DEBUG_STDOUT,"ERR: unknown keyword %s\n", keywords[cpt]);
+
+print_help:
+	cmmSocketSetUsage(family);
+
+	return -1;
+}
+
+int cmmSocketShowProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	char rcvBuffer[CMM_BUF_SIZE];
+	int cpt = tabStart;
+	cmmd_socket_show_cmd_t cmd;
+	struct socket *s;
+	int rc;
+	unsigned int tmp;
+	char * endptr;
+
+	if (!keywords[cpt])
+		goto print_help;
+
+	if (strcasecmp(keywords[cpt], "sock_id") == 0)
+	{
+		if (!keywords[++cpt])
+			goto print_help;
+		
+		/*Get an integer from the string*/
+		endptr = NULL;
+		tmp = strtoul(keywords[cpt], &endptr, 0);
+
+		if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+		{
+			cmm_print(DEBUG_CRIT, "ERROR: sock_id must be a number between 0 and %d\n", USHRT_MAX);
+			goto print_help;
+		}
+
+		cmd.id = tmp;
+		cmd.dump_all = 0;
+	}
+	else if(strcasecmp(keywords[cpt], "all") == 0)
+	{
+		if(keywords[++cpt])
+			goto print_help;
+			
+		cmd.id = 0;
+		cmd.dump_all = 1;	
+	}
+	else
+		goto keyword_error;
+
+	rc = cmmSendToDaemon(daemon_handle, CMMD_CMD_SOCKET_SHOW, &cmd, sizeof(cmd), rcvBuffer);
+	if (rc >= 2)
+	{
+		if (((u_int16_t*)rcvBuffer)[0] != CMMD_ERR_OK)
+		{
+			cmm_print(DEBUG_CRIT,  "%s: error %d when sending CMD_SOCKET_SHOW\n", __func__, ((u_int16_t*)rcvBuffer)[0]);
+			return -1;
+		}
+	}
+	else
+	{
+		if (rc > 0)
+			cmm_print(DEBUG_CRIT,  "%s: wrong response size %d received\n", __func__, rc);
+		return -1;
+	}
+
+	if (!cmd.dump_all)
+	{
+
+		char saddr_buf[INET6_ADDRSTRLEN], daddr_buf[INET6_ADDRSTRLEN];
+		s = (struct socket *)(rcvBuffer);
+
+		cmm_print(DEBUG_STDOUT,	"socket id   : %d\n"
+									"saddr       : %s\n"
+									"daddr       : %s\n"
+									"sport       : %d\n"
+									"dport       : %d\n"
+									"proto       : %d\n"
+									"queue       : %d\n"
+									"dscp        : %d\n"
+#ifdef COMCERTO_2000
+									"ipsec       : %d\n"
+#endif
+									"flags       : %d\n",
+						s->id,
+						inet_ntop(s->family, s->saddr, saddr_buf, sizeof(saddr_buf)),
+						inet_ntop(s->family, s->daddr, daddr_buf, sizeof(daddr_buf)),
+						ntohs(s->sport),
+						ntohs(s->dport),
+						s->proto,
+						s->queue,
+						s->dscp,
+#ifdef COMCERTO_2000
+						s->secure,
+#endif
+						s->flags);
+			return 0;
+	}
+	else
+	{
+		cmmd_socket_show_res_t *res = (cmmd_socket_show_res_t*)(rcvBuffer);
+		int i = 0;
+		cmm_print(DEBUG_STDOUT, "%d socket(s) programmed\n", res->nb_socket);
+		for(i = 0; i < res->nb_socket; i++)
+			cmm_print(DEBUG_STDOUT, "socket id : %d, flags: %d\n", res->sockets[i].sock_id, res->sockets[i].flags);
+		return 0;
+	}
+	
+	keyword_error:
+		cmm_print(DEBUG_STDOUT,"ERR: unknown keyword %s\n", keywords[cpt]);
+
+	print_help:
+		cmmSocketShowUsage();
+		
+	return 0;
+}
diff --git a/cmm/src/module_socket.h b/cmm/src/module_socket.h
new file mode 100644
index 0000000..2fa685d
--- /dev/null
+++ b/cmm/src/module_socket.h
@@ -0,0 +1,94 @@
+#ifndef __MODULE_SOCKET_H
+#define __MODULE_SOCKET_H
+
+#include <sys/types.h>
+#include "list.h"
+#include "forward_engine.h"
+
+#define HASH_SOCKET_SIZE	32
+#define HASH_SOCKET(id)		((id) & (HASH_SOCKET_SIZE - 1))
+
+static __inline u_int32_t HASH_SOCK_ADDR(int family, const u_int32_t *Saddr, const u_int32_t *Daddr, u_int16_t Sport, u_int16_t Dport, u_int16_t Proto)
+{
+	unsigned int a, b;
+
+	if (family == AF_INET)
+	{
+		a = jhash((void *)Saddr, 4, (Proto << 16) | Proto);
+		b = jhash((void *)Daddr, 4, (Sport << 16) | Dport);
+	}
+	else
+	{
+        	a = jhash((void *)Saddr, 16, (Proto << 16) | Proto);
+        	b = jhash((void *)Daddr, 16, (Sport << 16) | Dport);
+	}
+
+	return jhash_2words(a, b, 0x48375934) % HASH_SOCKET_SIZE;
+}
+
+#define SOCKET_UNCONNECTED	0
+#define SOCKET_CONNECTED		1
+
+#define SOCK_ID_PRIVATE_START	1
+#define SOCK_ID_PRIVATE_END	255
+
+#if (SOCK_ID_PRIVATE_START > SOCK_ID_PRIVATE_END)
+         #error SOCK_ID_PRIVATE_START cannot be greater than SOCK_ID_PRIVATE_END
+#endif
+
+#if (SOCK_ID_PRIVATE_START == 0)
+	#error SOCK_ID_PRIVATE_START cannot be zero
+#endif
+
+#if (SOCK_ID_PRIVATE_END > 65535)
+	#error SOCK_ID_PRIVATE_END cannot be greater than 65535
+#endif
+#define NUM_INTERNAL_SOCKET_ID	(SOCK_ID_PRIVATE_END - SOCK_ID_PRIVATE_START + 1)
+#define SOCK_MAX_ID			0x7FFF
+
+struct socket {
+	struct list_head list;
+	struct list_head list_by_addr;
+	u_int8_t family;
+	u_int16_t id;
+	u_int8_t type;
+	u_int8_t mode;
+	u_int32_t saddr[4];
+	u_int32_t daddr[4];
+	u_int16_t sport;
+	u_int16_t dport;
+	u_int8_t proto;
+	u_int8_t queue;
+	u_int16_t dscp;
+	struct ct_route rt;
+	int flags;
+	unsigned int fwmark;
+#ifdef COMCERTO_2000
+	u_int16_t secure;
+	struct FlowEntry *rx_flow;
+	struct FlowEntry *tx_flow;
+#endif
+};
+
+extern struct list_head socket_table[HASH_SOCKET_SIZE];
+extern struct list_head socket_table_by_addr[HASH_SOCKET_SIZE];
+extern pthread_mutex_t socket_lock;
+
+int socket_daemon(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, int fc, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len);
+int cmmSocketSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+int cmmSocketShowProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+int __socket_open(FCI_CLIENT *fci_handle, struct socket *s);
+void socket_remove(struct socket *s);
+void __cmmSocketUpdateWithRoute(FCI_CLIENT *fci_handle, struct RtEntry *route);
+struct socket *socket_find_by_addr(int family, const u_int32_t *saddr, const u_int32_t *daddr, u_int16_t sport, u_int16_t dport, u_int16_t proto);
+int __socket_close(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, struct socket *s);
+void __socket_add(struct socket * s);
+u_int32_t new_socket_id(void);
+void del_socket_id(u_int32_t sock_id_ext);
+
+#ifdef COMCERTO_2000
+struct socket *__cmmSocketFindFromFlow(int family, unsigned int *saddr, unsigned int *daddr, unsigned char proto, char *orig);
+#endif
+
+
+#endif
diff --git a/cmm/src/module_stat.c b/cmm/src/module_stat.c
new file mode 100644
index 0000000..d671bf8
--- /dev/null
+++ b/cmm/src/module_stat.c
@@ -0,0 +1,904 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+#include "cmm.h"
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include "module_stat.h"
+
+static int parse_interface(char *pstring, unsigned short *pinterface_number);
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+void cmmStatShowPrintHelp()
+{
+	char buf[128];
+
+	print_all_gemac_ports(buf, 128);
+	cmm_print(DEBUG_STDOUT, "Usage: show stat queue {queue_no} interface {%s} query|query_reset\n"
+				"       show stat interface {%s} query|query_reset\n"
+				"       show stat vlan query|query_reset\n"
+				"       show stat connection query\n"
+				"       show stat pppoe query|query_reset\n"
+				"       show stat bridge query|query_reset\n"
+				"       show stat ipsec query|query_reset\n", buf, buf);
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+int cmmStatShowProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	unsigned int cmdToSend = 0; /* bits field*/
+	int rcvBytes = 0;
+ 	char rcvBuffer[256];
+	char * endptr;
+	unsigned int tmp;
+	char *pinterface;
+	unsigned short interface;
+
+	fpp_stat_queue_cmd_t queueShowCmd;  
+	fpp_stat_interface_cmd_t interfaceShowCmd;
+	fpp_stat_connection_cmd_t connShowCmd;
+	fpp_stat_pppoe_status_cmd_t pppoeStatusCmd;
+	fpp_stat_bridge_status_cmd_t bridgeStatusCmd;
+	fpp_stat_ipsec_status_cmd_t ipsecStatusCmd;
+	fpp_stat_vlan_status_cmd_t vlanStatusCmd;
+	fpp_stat_queue_response_t *queueStatRsp;
+	fpp_stat_interface_pkt_response_t *interfacePktStatRsp;
+	fpp_stat_conn_response_t *connStatRsp;
+
+	uint64_t total_bytes_received_0;
+	uint64_t total_bytes_received_1;
+	uint64_t total_bytes_received;
+	uint64_t total_bytes_transmitted_0;
+	uint64_t total_bytes_transmitted_1;
+	uint64_t total_bytes_transmitted;
+
+	//goto help
+	if(!keywords[cpt])
+		goto help;
+
+	if(strcasecmp(keywords[cpt], "queue") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+
+		/*Get an integer from the string*/
+		endptr = NULL;
+		tmp = strtoul(keywords[cpt], &endptr, 0);
+		if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_QUEUES))
+		{
+			cmm_print(DEBUG_CRIT, "Stat ERROR: Queue Number must be a number between 0 and %d\n", FPP_NUM_QUEUES - 1);
+			goto help;
+		}
+		queueShowCmd.queue = tmp;
+
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "interface") != 0) 
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto help;
+
+		pinterface = keywords[cpt];
+		if (parse_interface(pinterface, &interface) < 0)
+			goto help;
+
+		queueShowCmd.interface = interface;
+
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "query") == 0) 
+		{
+			queueShowCmd.action = FPP_CMM_STAT_QUERY;
+		}
+		else if(strcasecmp(keywords[cpt], "query_reset") == 0) 
+		{
+			queueShowCmd.action = FPP_CMM_STAT_QUERY_RESET;
+		}
+		else
+			goto keyword_error;
+
+		cmdToSend |= CMD_BIT(FPP_CMD_STAT_QUEUE);
+	}
+	else if(strcasecmp(keywords[cpt], "interface") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+									
+		pinterface = keywords[cpt];
+		if (parse_interface(pinterface, &interface) < 0)
+			goto help;
+
+		interfaceShowCmd.interface = interface;
+
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "query") == 0) 
+		{
+			interfaceShowCmd.action = FPP_CMM_STAT_QUERY;
+		}
+		else if(strcasecmp(keywords[cpt], "query_reset") == 0) 
+		{
+			interfaceShowCmd.action = FPP_CMM_STAT_QUERY_RESET;
+ 		}
+		else
+			goto keyword_error;
+
+		cmdToSend |= CMD_BIT(FPP_CMD_STAT_INTERFACE_PKT);
+	}
+	else if(strcasecmp(keywords[cpt], "connection") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+									
+		if(strcasecmp(keywords[cpt], "query") != 0) 
+			goto keyword_error;
+		
+		connShowCmd.action = FPP_CMM_STAT_QUERY;
+
+		cmdToSend |= CMD_BIT(FPP_CMD_STAT_CONNECTION);
+	}
+        else if(strcasecmp(keywords[cpt], "pppoe") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "query") == 0) 
+		{
+			pppoeStatusCmd.action = FPP_CMM_STAT_QUERY;
+		}
+		else if(strcasecmp(keywords[cpt], "query_reset") == 0) 
+		{
+			pppoeStatusCmd.action = FPP_CMM_STAT_QUERY_RESET;
+ 		}
+		else
+			goto keyword_error;
+
+ 		cmdToSend |= CMD_BIT(FPP_CMD_STAT_PPPOE_STATUS);
+	}
+	else if(strcasecmp(keywords[cpt], "bridge") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "query") == 0) 
+		{
+			bridgeStatusCmd.action = FPP_CMM_STAT_QUERY;
+		}
+		else if(strcasecmp(keywords[cpt], "query_reset") == 0) 
+		{
+			bridgeStatusCmd.action = FPP_CMM_STAT_QUERY_RESET;
+ 		}
+		else
+			goto keyword_error;
+
+ 		cmdToSend |= CMD_BIT(FPP_CMD_STAT_BRIDGE_STATUS);
+	}
+	else if(strcasecmp(keywords[cpt], "ipsec") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+
+ 		if((strcasecmp(keywords[cpt], "query") == 0) || (strcasecmp(keywords[cpt], "query_reset") == 0)) {
+			if(strcasecmp(keywords[cpt], "query") == 0) 
+			{
+				ipsecStatusCmd.action = FPP_CMM_STAT_QUERY;
+			}
+			else if(strcasecmp(keywords[cpt], "query_reset") == 0) 
+			{
+				ipsecStatusCmd.action = FPP_CMM_STAT_QUERY_RESET;
+	 		}
+			else
+				goto keyword_error;
+
+			cmdToSend |= CMD_BIT(FPP_CMD_STAT_IPSEC_STATUS);
+		}
+		else
+		 	goto help;
+	}
+    else if(strcasecmp(keywords[cpt], "vlan") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "query") == 0) 
+		{
+			vlanStatusCmd.action = FPP_CMM_STAT_QUERY;
+		}
+		else if(strcasecmp(keywords[cpt], "query_reset") == 0) 
+		{
+			vlanStatusCmd.action = FPP_CMM_STAT_QUERY_RESET;
+ 		}
+		else
+			goto keyword_error;
+
+ 		cmdToSend |= CMD_BIT(FPP_CMD_STAT_VLAN_STATUS);
+	}	
+	else
+		goto keyword_error;
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_QUEUE))
+	{
+		/* Send CMD_STAT_QUEUE command */
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_QUEUE, & queueShowCmd, sizeof(queueShowCmd), rcvBuffer);
+
+		if ( rcvBytes != sizeof(fpp_stat_queue_response_t))
+		{
+			cmm_print(DEBUG_STDERR, "ERROR: Unexpected returned result from FPP rc:%04x\n",
+						  (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer));
+  			goto exit;
+                }
+		else
+		{
+			queueStatRsp = (fpp_stat_queue_response_t *)(rcvBuffer);
+			cmm_print(DEBUG_STDOUT, "Emitted Pkts: 0x%0x \n" "Dropped Packets: 0x%0x\n" "Peak Queue Occupancy: 0x%0x \n",
+						queueStatRsp->emitted_pkts, queueStatRsp->dropped_pkts, queueStatRsp->peak_queue_occ);
+		}
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_INTERFACE_PKT))
+	{
+		/* Send CMD_STAT_INTERFACE_PKT command */
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_INTERFACE_PKT, & interfaceShowCmd, sizeof(interfaceShowCmd), rcvBuffer);
+
+		if ( rcvBytes != sizeof(fpp_stat_interface_pkt_response_t)  )
+		{
+			cmm_print(DEBUG_STDERR, "ERROR: Unexpected returned result from FPP rc:%04x\n",
+					  (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer));
+			goto exit;
+		}
+		else
+		{
+			interfacePktStatRsp = (fpp_stat_interface_pkt_response_t *)(rcvBuffer);
+
+			total_bytes_transmitted_0 = interfacePktStatRsp->total_bytes_transmitted[0];
+			total_bytes_transmitted_1 = interfacePktStatRsp->total_bytes_transmitted[1];
+			total_bytes_transmitted_1 <<= 32;
+
+			total_bytes_transmitted = total_bytes_transmitted_0 | total_bytes_transmitted_1;
+
+			total_bytes_received_0 = interfacePktStatRsp->total_bytes_received[0];
+			total_bytes_received_1 = interfacePktStatRsp->total_bytes_received[1];
+			total_bytes_received_1 <<= 32;
+
+			total_bytes_received = total_bytes_received_0 | total_bytes_received_1;
+
+
+			cmm_print(DEBUG_STDOUT, "Total Bytes Received: %llu \n"
+						"Total Bytes Transmitted: %llu \n"
+						"Total Packets Received: %u \n"
+						"Total Packets Transmitted: %u \n",
+						total_bytes_received, total_bytes_transmitted, 
+						interfacePktStatRsp->total_pkts_received, interfacePktStatRsp->total_pkts_transmitted);
+		}
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_CONNECTION))
+	{
+		/* Send CMD_STAT_CONNECTION command */
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_CONNECTION, & connShowCmd, sizeof(connShowCmd), rcvBuffer);
+
+		if ( rcvBytes != sizeof(fpp_stat_conn_response_t) )
+		{
+			cmm_print(DEBUG_STDERR, "ERROR: Unexpected returned result from FPP rc:%04x\n",
+					  (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer));
+  			goto exit;
+		}
+		else
+		{
+			connStatRsp = (fpp_stat_conn_response_t *)(rcvBuffer);
+#if !defined(COMCERTO_2000)
+			cmm_print(DEBUG_STDOUT, "Maximum Active Connections: %u \n"
+						"Number of Active Connections: %u \n",
+				connStatRsp->max_active_connections, connStatRsp->num_active_connections);
+#else
+			cmm_print(DEBUG_STDOUT, "Maximum connections supported in FE: %u \n"
+						"Maximum Active Connections: %s \n"
+						"Number of Active Connections: %u \n"
+						"Configured FE DDR Memory available for connections: %s \n"
+						"FE DDR Memory used by connections: %s \n",
+				connStatRsp->max_active_connections,
+				"N/A",
+				connStatRsp->num_active_connections,
+				"N/A",
+				"N/A");
+#endif
+		}
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_PPPOE_STATUS))
+	{
+		int count = 0;
+		char interface[IFNAMSIZ];
+		fpp_stat_pppoe_entry_response_t *pEntryResponse = (fpp_stat_pppoe_entry_response_t *)rcvBuffer;
+		/* Send CMD_STAT_PPPOE_STATUS command */
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_PPPOE_STATUS, &pppoeStatusCmd, sizeof(pppoeStatusCmd), rcvBuffer);
+		if (rcvBytes != 2)
+		{
+			cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n",
+				  (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer)
+			  );
+			goto exit;
+		}
+
+		while (1)
+		{
+			rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_PPPOE_ENTRY, NULL, 0, rcvBuffer);
+			if (rcvBytes != sizeof(fpp_stat_pppoe_entry_response_t))
+			{
+				cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n",
+				  	(rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer)
+			  	);
+				goto exit;
+			}
+			if (pEntryResponse->eof)
+			    	break;
+
+			get_port_name(pEntryResponse->interface_no, interface, IFNAMSIZ);
+
+			cmm_print(DEBUG_STDOUT, "Session ID = 0x%0x "
+			                        "Interface=%-6s "
+						"Packets Received = 0x%0x "
+						"Packets Transmitted = 0x%0x\n",
+						    pEntryResponse->sessionid,
+						    interface,
+						    pEntryResponse->total_packets_received,
+						    pEntryResponse->total_packets_transmitted);
+			count++;
+		}
+		cmm_print(DEBUG_STDOUT, "\n Statistics of %d PPPoE Sessions displayed \n", count);
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_BRIDGE_STATUS))
+	{
+		int count = 0;
+		char input_interface[IFNAMSIZ];
+		char output_interface[IFNAMSIZ];
+		fpp_stat_bridge_entry_response_t *pEntryResponse = (fpp_stat_bridge_entry_response_t *)rcvBuffer;
+		/* Send CMD_STAT_BRIDGE_STATUS command */
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_BRIDGE_STATUS, &bridgeStatusCmd, sizeof(bridgeStatusCmd), rcvBuffer);
+		if (rcvBytes != 2)
+		{
+			cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n",
+				  (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer)
+			  );
+			goto exit;
+		}
+
+		while (1)
+		{
+			rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_BRIDGE_ENTRY, NULL, 0, rcvBuffer);
+			if (rcvBytes != sizeof(fpp_stat_bridge_entry_response_t))
+			{
+				cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n",
+				  	(rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer)
+			  	);
+				goto exit;
+			}
+			if (pEntryResponse->eof)
+			    	break;
+
+			if (pEntryResponse->input_interface >= GEM_PORTS)
+				strcpy(input_interface, pEntryResponse->input_name);
+			else
+				get_port_name(pEntryResponse->input_interface, input_interface, IFNAMSIZ);
+
+			if (pEntryResponse->input_vlan != 0xFFFF)
+				sprintf(input_interface + strlen(input_interface), ".%d", pEntryResponse->input_vlan);
+
+			if (pEntryResponse->output_interface >= GEM_PORTS)
+				strcpy(output_interface, pEntryResponse->output_name);	
+			else	
+				get_port_name(pEntryResponse->output_interface, output_interface, IFNAMSIZ);
+
+			if (pEntryResponse->output_vlan != 0xFFFF)
+				sprintf(output_interface + strlen(output_interface), ".%d", pEntryResponse->output_vlan);
+			cmm_print(DEBUG_STDOUT, "Input=%-6s "
+				                "DA=%02X:%02X:%02X:%02X:%02X:%02X "
+				                "SA=%02X:%02X:%02X:%02X:%02X:%02X "
+						"Type=%04X "
+						"Output=%s "
+						"SessionId=%d "
+						"Packets Transmitted = 0x%0x\n",
+						    input_interface,
+						    pEntryResponse->dst_mac[0], pEntryResponse->dst_mac[1], pEntryResponse->dst_mac[2],
+						    pEntryResponse->dst_mac[3], pEntryResponse->dst_mac[4], pEntryResponse->dst_mac[5],
+						    pEntryResponse->src_mac[0], pEntryResponse->src_mac[1], pEntryResponse->src_mac[2],
+						    pEntryResponse->src_mac[3], pEntryResponse->src_mac[4], pEntryResponse->src_mac[5],
+						    pEntryResponse->ether_type, output_interface,pEntryResponse->session_id,
+						    pEntryResponse->total_packets_transmitted);
+			count++;
+		}
+		cmm_print(DEBUG_STDOUT, "\n Statistics of %d Bridge Table Entries displayed \n", count);
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_IPSEC_STATUS))
+	{
+		int count = 0;
+		fpp_stat_ipsec_entry_response_t *pEntryResponse = (fpp_stat_ipsec_entry_response_t *)rcvBuffer;
+		/* Send CMD_STAT_IPSEC_STATUS command */
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_IPSEC_STATUS, &ipsecStatusCmd, sizeof(ipsecStatusCmd), rcvBuffer);
+		if (rcvBytes != 2)
+		{
+			cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n",
+				  (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer)
+			  );
+			goto exit;
+		}
+
+		while (1)
+		{
+			rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_IPSEC_ENTRY, NULL, 0, rcvBuffer);
+			if (rcvBytes != sizeof(fpp_stat_ipsec_entry_response_t))
+			{
+				cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n",
+				  	(rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer)
+			  	);
+				goto exit;
+			}
+			if (pEntryResponse->eof)
+			    	break;
+
+			total_bytes_transmitted_0 = pEntryResponse->total_bytes_processed[0];
+			total_bytes_transmitted_1 = pEntryResponse->total_bytes_processed[1];
+			total_bytes_transmitted_1 <<= 32;
+
+			total_bytes_transmitted = total_bytes_transmitted_0 | total_bytes_transmitted_1;
+
+			cmm_print(DEBUG_STDOUT, "\nSPI: %x \n",  pEntryResponse->spi);
+			if(pEntryResponse->family == FPP_PROTO_IPV4){
+				cmm_print(DEBUG_STDOUT, "Dst IP: %d.%d.%d.%d \n", (pEntryResponse->dst_ip[0] & 0x000000ff), 
+						    				((pEntryResponse->dst_ip[0] >> 8) & 0x000000ff),
+						    				((pEntryResponse->dst_ip[0] >> 16) & 0x000000ff),
+						    				((pEntryResponse->dst_ip[0] >> 24) & 0x000000ff));
+			}
+			else{
+				char addr[64];
+			
+				inet_ntop(AF_INET6, pEntryResponse->dst_ip, addr, sizeof(addr));
+				cmm_print(DEBUG_STDOUT,"Dst IP: %s\n", addr);
+			}
+			cmm_print(DEBUG_STDOUT, "IPsec proto: %d \n",  pEntryResponse->proto);
+			cmm_print(DEBUG_STDOUT, "Total Packets Processed: %u \n"
+						"Total Bytes Processed: %llu \n \n",
+						 pEntryResponse->total_pkts_processed, total_bytes_transmitted);
+			count++;
+		}
+		cmm_print(DEBUG_STDOUT, "\n Statistics of %d SA Entries displayed \n", count);
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_VLAN_STATUS))
+	{
+		int count = 0;
+		fpp_stat_vlan_entry_response_t *pEntryResponse = (fpp_stat_vlan_entry_response_t *)rcvBuffer;
+		/* Send FPP_CMD_STAT_VLAN_STATUS command */
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_VLAN_STATUS, &vlanStatusCmd, sizeof(vlanStatusCmd), rcvBuffer);
+		if (rcvBytes != 2)
+		{
+			cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n",
+				  (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer)
+			  );
+			goto exit;
+		}
+
+		while (1)
+		{
+			rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_VLAN_ENTRY, NULL, 0, rcvBuffer);
+			if (rcvBytes != sizeof(fpp_stat_vlan_entry_response_t))
+			{
+				cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n",
+				  	(rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer)
+			  	);
+				goto exit;
+			}
+			if (pEntryResponse->eof)
+			    	break;
+
+			total_bytes_transmitted_0 = pEntryResponse->total_bytes_transmitted[0];
+			total_bytes_transmitted_1 = pEntryResponse->total_bytes_transmitted[1];
+			total_bytes_transmitted_1 <<= 32;
+
+			total_bytes_transmitted = total_bytes_transmitted_0 | total_bytes_transmitted_1;
+
+			total_bytes_received_0 = pEntryResponse->total_bytes_received[0];
+			total_bytes_received_1 = pEntryResponse->total_bytes_received[1];
+			total_bytes_received_1 <<= 32;
+
+			total_bytes_received = total_bytes_received_0 | total_bytes_received_1;
+			
+			cmm_print(DEBUG_STDOUT, "VLAN ID = %4d "
+			                        "VLAN Interface Name = %s "
+			                        "VLAN Physical Interface Name = %s "			                        
+						"Packets Received = %u "
+						"Packets Transmitted = %u "
+						"Bytes Received = %llu "
+						"Bytes Transmitted = %llu\n",
+						    pEntryResponse->vlanID,
+						    pEntryResponse->vlanifname,
+						    pEntryResponse->phyifname,						    
+						    pEntryResponse->total_packets_received,
+						    pEntryResponse->total_packets_transmitted, total_bytes_received, total_bytes_transmitted);
+
+			count++;
+		}
+		cmm_print(DEBUG_STDOUT, "\n Statistics of %d VLAN Entries displayed \n", count);
+	}
+
+
+	return 0;
+
+keyword_error:
+	cmm_print(DEBUG_STDERR, "ERROR: Unknown keyword %s\n", keywords[cpt]);
+
+help:
+	cmmStatShowPrintHelp();
+
+exit:
+	return -1;
+
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+void cmmStatSetPrintHelp(int cmd_type)
+{
+	if (cmd_type == FPP_STAT_UNKNOWN_CMD || cmd_type == FPP_STAT_ENABLE_CMD)
+	{
+	    cmm_print(DEBUG_STDOUT, "Usage: set stat enable {queue|interface|vlan|pppoe|bridge|ipsec} \n"
+		                     "      set stat disable {queue|interface|vlan|pppoe|bridge|ipsec} \n");
+	}
+	if (cmd_type == FPP_STAT_UNKNOWN_CMD || cmd_type == FPP_STAT_QUEUE_CMD)
+	{
+	    cmm_print(DEBUG_STDOUT, 
+                      "Usage: set stat queue {queue_no} interface {wan|lan|eth0|eth2} reset \n");
+      	}
+	if (cmd_type == FPP_STAT_UNKNOWN_CMD || cmd_type == FPP_STAT_INTERFACE_PKT_CMD)
+	{
+	    cmm_print(DEBUG_STDOUT, 
+                      "Usage: set stat interface {wan|lan|eth0|eth2} reset\n");
+      	}
+	if (cmd_type == FPP_STAT_UNKNOWN_CMD || cmd_type == FPP_STAT_VLAN_CMD)
+	{
+	    cmm_print(DEBUG_STDOUT, 
+                  "Usage: set stat vlan reset\n");
+	}      	
+	if (cmd_type == FPP_STAT_UNKNOWN_CMD || cmd_type == FPP_STAT_PPPOE_CMD)
+	{
+	    cmm_print(DEBUG_STDOUT, 
+                  "Usage: set stat pppoe reset\n");
+	}
+	if (cmd_type == FPP_STAT_UNKNOWN_CMD || cmd_type == FPP_STAT_BRIDGE_CMD)
+	{
+	    cmm_print(DEBUG_STDOUT, 
+                  "Usage: set stat bridge reset\n");
+	}
+	if (cmd_type == FPP_STAT_UNKNOWN_CMD || cmd_type == FPP_STAT_IPSEC_CMD)
+	{
+	    cmm_print(DEBUG_STDOUT, 
+                  "Usage: set stat ipsec reset\n");
+	}
+	if (cmd_type == FPP_STAT_UNKNOWN_CMD || cmd_type == FPP_STAT_CONNECTION_CMD)
+	{
+	    cmm_print(DEBUG_STDOUT, "Usage: set stat connection { maxconn <no.of connections> } \n"
+				    "                           { memconn <Value of FPP DDR memory available for connections specified in bytes> }\n");
+	}
+
+	if (cmd_type == FPP_STAT_UNKNOWN_CMD)
+	{
+	    cmm_print(DEBUG_STDOUT, "\n");
+	}
+
+}
+
+
+/************************************************************
+ *
+ *
+ *
+ ************************************************************/
+int cmmStatSetProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cmd_type = FPP_STAT_UNKNOWN_CMD;
+	int cpt = tabStart;
+	unsigned int cmdToSend = 0; /* bits field*/
+	char * endptr;
+	unsigned int tmp;
+        int rcvBytes = 0;
+	char *pinterface;
+	unsigned short interface;
+
+
+	fpp_stat_enable_cmd_t statEnableCmd;
+	fpp_stat_queue_cmd_t queueResetCmd;  
+	fpp_stat_interface_cmd_t interfaceResetCmd;
+	fpp_stat_pppoe_status_cmd_t pppoeResetCmd;
+	fpp_stat_bridge_status_cmd_t bridgeResetCmd;
+	fpp_stat_ipsec_status_cmd_t ipsecResetCmd;
+	fpp_stat_vlan_status_cmd_t vlanResetCmd;
+	fpp_stat_connection_cmd_t connectionSetCmd;
+
+	char rcvBuffer[256];
+
+	if(!keywords[cpt])
+		goto help;
+
+	if( (strcasecmp(keywords[cpt], "enable") == 0) ||
+	    (strcasecmp(keywords[cpt], "disable") == 0) )
+	{
+		cmd_type = FPP_STAT_ENABLE_CMD;
+
+		if(strcasecmp(keywords[cpt], "enable") == 0)
+			statEnableCmd.action = FPP_CMM_STAT_ENABLE;
+		else
+			statEnableCmd.action = FPP_CMM_STAT_DISABLE;
+
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "queue") == 0)
+			statEnableCmd.bitmask = FPP_STAT_QUEUE_BITMASK;
+		else if(strcasecmp(keywords[cpt], "interface") == 0)
+			statEnableCmd.bitmask = FPP_STAT_INTERFACE_BITMASK;
+		else if(strcasecmp(keywords[cpt], "pppoe") == 0)
+			statEnableCmd.bitmask = FPP_STAT_PPPOE_BITMASK;
+		else if(strcasecmp(keywords[cpt], "bridge") == 0)
+			statEnableCmd.bitmask = FPP_STAT_BRIDGE_BITMASK;
+		else if(strcasecmp(keywords[cpt], "ipsec") == 0)
+			statEnableCmd.bitmask = FPP_STAT_IPSEC_BITMASK;
+		else if(strcasecmp(keywords[cpt], "vlan") == 0)
+			statEnableCmd.bitmask = FPP_STAT_VLAN_BITMASK;			
+		else
+			goto keyword_error;
+
+		cmdToSend |= CMD_BIT(FPP_CMD_STAT_ENABLE);
+	
+	}
+	else if(strcasecmp(keywords[cpt], "queue") == 0)
+	{
+		cmd_type = FPP_STAT_QUEUE_CMD;
+		if(!keywords[++cpt])
+			goto help;
+
+		/*Get an integer from the string*/
+		endptr = NULL;
+		tmp = strtoul(keywords[cpt], &endptr, 0);
+		if ((keywords[cpt] == endptr) || (tmp >= FPP_NUM_QUEUES))
+		{
+			cmm_print(DEBUG_CRIT, "Stat ERROR: Queue Number must be a number between 0 and %d\n", FPP_NUM_QUEUES - 1);
+			goto help;
+		}
+
+		memset(&queueResetCmd, 0, sizeof(queueResetCmd));
+		queueResetCmd.queue= tmp;
+
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "interface") != 0)
+			goto keyword_error;
+
+		if(!keywords[++cpt])
+			goto help;
+
+		pinterface = keywords[cpt];
+		if (parse_interface(pinterface, &interface) < 0)
+			goto help;
+
+		queueResetCmd.interface = interface;
+
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "reset") != 0)
+			goto help;
+
+		queueResetCmd.action = FPP_CMM_STAT_RESET;
+		cmdToSend |= CMD_BIT(FPP_CMD_STAT_QUEUE);
+	}
+	else if(strcasecmp(keywords[cpt], "interface") == 0)
+	{
+		cmd_type = FPP_STAT_INTERFACE_PKT_CMD;
+		if(!keywords[++cpt])
+			goto help;
+		pinterface = keywords[cpt];
+
+		memset(&interfaceResetCmd, 0, sizeof(interfaceResetCmd));
+		if (parse_interface(pinterface, &interface) < 0)
+			goto help;
+
+		interfaceResetCmd.interface = interface;
+
+		if(!keywords[++cpt])
+			goto help;
+
+
+		if(strcasecmp(keywords[cpt], "reset") != 0)
+				goto help;
+
+		interfaceResetCmd.action = FPP_CMM_STAT_RESET;
+		cmdToSend |= CMD_BIT(FPP_CMD_STAT_INTERFACE_PKT);
+	}
+	else if(strcasecmp(keywords[cpt], "pppoe") == 0)
+	{
+		cmd_type = FPP_STAT_PPPOE_CMD;
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "reset") != 0)
+			goto help;
+
+		pppoeResetCmd.action = FPP_CMM_STAT_RESET;
+		cmdToSend |= CMD_BIT(FPP_CMD_STAT_PPPOE_STATUS);
+	}
+	else if(strcasecmp(keywords[cpt], "bridge") == 0)
+	{
+		cmd_type = FPP_STAT_BRIDGE_CMD;
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "reset") != 0)
+			goto help;
+
+		bridgeResetCmd.action = FPP_CMM_STAT_RESET;
+		cmdToSend |= CMD_BIT(FPP_CMD_STAT_BRIDGE_STATUS);
+	}
+	else if(strcasecmp(keywords[cpt], "ipsec") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "reset") == 0) 
+		{
+			cmd_type = FPP_STAT_IPSEC_CMD;
+
+			ipsecResetCmd.action = FPP_CMM_STAT_RESET;
+			cmdToSend |= CMD_BIT(FPP_CMD_STAT_IPSEC_STATUS);
+
+		}
+		else
+			goto help;
+	}
+	else if(strcasecmp(keywords[cpt], "vlan") == 0)
+	{
+		cmd_type = FPP_STAT_VLAN_CMD;
+		if(!keywords[++cpt])
+			goto help;
+
+		if(strcasecmp(keywords[cpt], "reset") != 0)
+			goto help;
+
+		vlanResetCmd.action = FPP_CMM_STAT_RESET;
+		cmdToSend |= CMD_BIT(FPP_CMD_STAT_VLAN_STATUS);
+	}		
+	else if(strcasecmp(keywords[cpt], "connection") == 0)
+	{
+		if(!keywords[++cpt])
+			goto help;
+		if((strcasecmp(keywords[cpt], "maxconn") != 0) &&
+			(strcasecmp(keywords[cpt], "memconn") != 0) )
+			goto help;
+		if(strcasecmp(keywords[cpt], "maxconn") == 0)
+		{
+			if(!keywords[++cpt])
+				goto help;
+
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+		}
+		else if ( strcasecmp(keywords[cpt], "memconn") == 0 )
+		{
+			if(!keywords[++cpt])
+				goto help;
+
+			tmp = strtoul(keywords[cpt], &endptr, 0);
+		}
+		/* Just Positively acknowledge the command & return without programming FE */
+		goto ack_return;
+	}
+	else
+		goto keyword_error;
+
+
+	/*
+	 * Parsing have been performed
+	 * Now send the right commands
+	 */
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_ENABLE))
+	{
+		/* Send CMD_STAT_ENABLE command */
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_ENABLE, &statEnableCmd, sizeof(statEnableCmd), rcvBuffer);
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_QUEUE))
+	{
+		/* Send CMD_STAT_QUEUE command */
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_QUEUE, &queueResetCmd, sizeof(queueResetCmd), rcvBuffer);
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_INTERFACE_PKT))
+	{
+		/* Send CMD_STAT_INTERFACE_PKT command */
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_INTERFACE_PKT, &interfaceResetCmd, sizeof(interfaceResetCmd), rcvBuffer);
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_PPPOE_STATUS))
+	{
+		// Send CMD_STAT_PPPOE_STATUS command
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_PPPOE_STATUS, &pppoeResetCmd, sizeof(pppoeResetCmd), rcvBuffer);
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_BRIDGE_STATUS))
+	{
+		// Send CMD_STAT_BRIDGE_STATUS command
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_BRIDGE_STATUS, &bridgeResetCmd, sizeof(bridgeResetCmd), rcvBuffer);
+	}
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_IPSEC_STATUS))
+        {
+                /* Send CMD_STAT_IPSEC_STATUS command */
+                 rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_IPSEC_STATUS, &ipsecResetCmd, sizeof(ipsecResetCmd), rcvBuffer);
+        }
+
+	if(TEST_CMD_BIT(cmdToSend, FPP_CMD_STAT_VLAN_STATUS))
+	{
+		// Send FPP_CMD_STAT_VLAN_STATUS command
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_STAT_VLAN_STATUS, &vlanResetCmd, sizeof(vlanResetCmd), rcvBuffer);
+	}
+
+	if ( (rcvBytes == 2) && ( ((unsigned short *)rcvBuffer)[0] != 0))
+	  cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n", ((unsigned short *)rcvBuffer)[0]);        
+
+ack_return:
+	return 0;
+
+keyword_error:
+	cmm_print(DEBUG_CRIT, "ERROR: Unknown keyword %s\n", keywords[cpt]);
+
+help:
+	cmmStatSetPrintHelp(cmd_type);
+	return -1;
+
+}
+
+static int parse_interface(char *pstring, unsigned short *pinterface_number)
+{
+	if ((short)(*pinterface_number = get_port_id(pstring)) < 0)
+	{
+		/*cmm_print(DEBUG_CRIT, "ERROR: Invalid interface specification: %s\n", pstring);*/
+		return -1;
+	}
+	return 0;
+}
+
diff --git a/cmm/src/module_stat.h b/cmm/src/module_stat.h
new file mode 100644
index 0000000..7881f55
--- /dev/null
+++ b/cmm/src/module_stat.h
@@ -0,0 +1,27 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_STAT_H__
+#define __MODULE_STAT_H__
+
+int cmmStatSetProcess(char ** keywords, int tabSize, daemon_handle_t daemon_handle);
+int cmmStatShowProcess(char ** keywords, int tabSize, daemon_handle_t daemon_handle);
+
+#endif
+
diff --git a/cmm/src/module_tunnel.c b/cmm/src/module_tunnel.c
new file mode 100644
index 0000000..800ccbd
--- /dev/null
+++ b/cmm/src/module_tunnel.c
@@ -0,0 +1,1584 @@
+ /*
+  *  module_tunnel.c: Tunnel module
+  *
+  *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+  *
+  * 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
+  */
+#include <sys/ioctl.h>
+#include <linux/sockios.h>
+#include <net/if.h>
+#include <net/if_arp.h>
+
+#include "cmm.h"
+#include "fpp.h"
+#include "cmmd.h"
+#include "module_tunnel.h"
+#include <linux/if_tun.h>
+
+#ifdef SAM_LEGACY
+extern int rt_mw_sam_make_dst_ipv6( struct in_addr *sam_dst_ipv4_addr, ushort sam_port, struct in6_addr *sam_dst_ipv6_addr );
+extern int rt_mw_sam_get_ipv6( struct in6_addr *sam_ipv6_addr );
+extern int rt_mw_sam_get_portsetid( rt_mw_ipstack_sam_port_t *sam_psid );
+unsigned short TunMtu = DEFAULT_SAM_FRAG_MTU;
+#endif
+
+extern  void __itf_update_connection(FCI_CLIENT *fci_handle, int ifindex);
+
+/************************************************************
+ *
+ * tunnel_print_usage
+ * Role : Get tunnel info from kernel
+ ************************************************************/
+static int tunnel_print_usage()
+{
+	cmm_print(DEBUG_ERROR, 
+			  "Usage: tunnel <name> add [ethipoip6] [ipsec {0|1}]\n"
+		  "       tunnel <name> del\n"
+                  "       tunnel <name> show \n"
+                  "\n"
+                  "\n"
+		  "       Ex:  set tunnel tnl0 add ethipoip6 ipsec 1\n"
+		  "            del tunnel tnl0\n"
+	          );
+	#ifdef SAM_LEGACY
+		cmm_print(DEBUG_ERROR,
+		  "       tunnel <name> set <sam_enable/sam_disable> [sam-frag-mtu <mtu>] \n");
+	#endif
+	return 0;
+}
+
+/************************************************************
+ *
+ * tunnel_print_info
+ *
+ ************************************************************/
+static int tunnel_print_info(struct interface *itf)
+{
+	if (itf->tunnel_family == AF_INET6)
+	{
+		char remote[INET6_ADDRSTRLEN];
+		char local[INET6_ADDRSTRLEN];
+		char ifname[IFNAMSIZ];
+
+		inet_ntop(AF_INET6, itf->tunnel_parm6.raddr.s6_addr, remote, INET6_ADDRSTRLEN);
+		inet_ntop(AF_INET6, itf->tunnel_parm6.laddr.s6_addr, local, INET6_ADDRSTRLEN);
+
+		cmm_print(DEBUG_STDOUT, "Tunnel name        : %s\n", if_indextoname(itf->ifindex, ifname));
+		if( itf->tunnel_parm6.proto == IPPROTO_IPIP)
+			cmm_print(DEBUG_STDOUT, "Protocol           : ip 4 over 6 (%d)\n", itf->tunnel_parm6.proto);
+		else
+			cmm_print(DEBUG_STDOUT, "Protocol           : etherip over ip6 (%d)\n", itf->tunnel_parm6.proto);
+		cmm_print(DEBUG_STDOUT, "Local address      : %s\n", local);
+		cmm_print(DEBUG_STDOUT, "Remote address     : %s\n", remote);
+		cmm_print(DEBUG_STDOUT, "Output device      : %s\n", if_indextoname(itf->phys_ifindex, ifname));
+		cmm_print(DEBUG_STDOUT, "Flags              : %x\n", itf->tunnel_flags);
+
+		if(itf->tunnel_flags & TNL_IPSEC)
+			cmm_print(DEBUG_STDOUT, "Secure          : yes\n");
+		else
+			cmm_print(DEBUG_STDOUT, "Secure          : no\n");
+			
+		if (itf->tunnel_parm6.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)
+			cmm_print(DEBUG_STDOUT, "Encap limit     : none\n");
+		else
+			cmm_print(DEBUG_STDOUT, "Encap limit     : %d\n", itf->tunnel_parm6.encap_limit);
+			
+		if (itf->flags & FPP_PROGRAMMED)
+			cmm_print(DEBUG_STDOUT, "Status             : running\n");
+		else 
+		{
+			cmm_print(DEBUG_STDOUT, "Status             : not complete\n");
+
+			if (!itf->rt.route)
+				cmm_print(DEBUG_STDOUT, "                -> Waiting for neigh info\n");
+
+			if (!itf->flow_rep || ! itf->flow_orig)
+				cmm_print(DEBUG_STDOUT, "                -> Waiting for ipsec info\n");
+		}
+	}
+	else if (itf->tunnel_family == AF_INET)
+	{
+		char remote[INET_ADDRSTRLEN];
+		char local[INET_ADDRSTRLEN];
+		char ifname[IFNAMSIZ];
+		char prefix[INET6_ADDRSTRLEN];
+		char relayprefix[INET_ADDRSTRLEN];
+
+		inet_ntop(AF_INET, &itf->tunnel_parm4.iph.daddr, remote, INET_ADDRSTRLEN);
+		inet_ntop(AF_INET, &itf->tunnel_parm4.iph.saddr, local, INET_ADDRSTRLEN);
+
+		cmm_print(DEBUG_STDOUT, "Tunnel name        : %s\n", if_indextoname(itf->ifindex, ifname));
+		cmm_print(DEBUG_STDOUT, "Protocol           : 6o4 (%d)\n", itf->tunnel_parm4.iph.protocol);
+		cmm_print(DEBUG_STDOUT, "Local address      : %s\n", local);
+		cmm_print(DEBUG_STDOUT, "Remote address     : %s\n", remote);
+		cmm_print(DEBUG_STDOUT, "Output device      : %s\n", if_indextoname(itf->phys_ifindex, ifname));
+		cmm_print(DEBUG_STDOUT, "Flags              : %x\n", itf->tunnel_flags);
+
+		if (itf->flags & FPP_PROGRAMMED)
+			cmm_print(DEBUG_STDOUT, "Status          : running\n");
+		else 
+		{
+			cmm_print(DEBUG_STDOUT, "Status          : not complete\n");
+
+			if (!itf->rt.route)
+				cmm_print(DEBUG_STDOUT, "                -> Waiting for neigh info\n");
+
+		}
+
+		if (itf->tunnel_flags & TNL_6RD)
+		{
+			cmm_print(DEBUG_STDOUT, "6rd-prefix         : %s\n", inet_ntop(AF_INET6, &itf->tunnel_parm6rd.prefix, prefix, INET6_ADDRSTRLEN));
+			cmm_print(DEBUG_STDOUT, "6rd-prefixlen      : %d\n", itf->tunnel_parm6rd.prefixlen);
+			cmm_print(DEBUG_STDOUT, "6rd-relayprefix    : %s\n", inet_ntop(AF_INET, &itf->tunnel_parm6rd.relay_prefix, relayprefix, INET_ADDRSTRLEN));
+			cmm_print(DEBUG_STDOUT, "6rd-relayprefixlen : %d\n", itf->tunnel_parm6rd.relay_prefixlen);
+		}			
+	}
+
+	return 0;
+}
+
+/************************************************************
+ *
+ * tunnel_parse_cmd
+ *
+ ************************************************************/
+static int tunnel_parse_cmd(int argc, char ** keywords, daemon_handle_t daemon_handle)
+{	
+	char *tnl_name;
+	char tnl_type;
+	char ipsec = 0;
+	cmmd_tunnel_t cmmtd_cmd; /* CMM to Deamon command */
+       	char rcvBuffer[1024];
+	int rc;
+	
+	if (argc < 2)
+		return tunnel_print_usage();
+	
+	memset(&cmmtd_cmd,0,sizeof cmmtd_cmd);
+	tnl_name = *keywords++;
+
+	if (strncmp(*keywords, "add", strlen(*keywords)) == 0)
+	{	
+		keywords++;	
+
+		if((argc != 3) && (argc != 5))
+			return tunnel_print_usage();
+
+		if (strcmp(*keywords, "ethipoip6") == 0)
+			tnl_type = TNL_ETHIPOIP6;
+		else
+		{
+			return tunnel_print_usage();
+		}
+
+		if (argc == 5)
+		{
+			keywords++;
+
+			if ((strncmp(*keywords, "ipsec", strlen(*keywords)) == 0))
+			{
+				keywords++;
+
+				if ((strncmp(*keywords, "0", strlen(*keywords)) == 0)
+				|| (strncmp(*keywords, "1", strlen(*keywords)) == 0))
+				{
+					ipsec = atoi(*keywords);
+				}
+				else
+				{
+					return tunnel_print_usage();
+				}
+			}
+			else
+			{
+				return tunnel_print_usage();
+			}
+		}
+		strcpy(cmmtd_cmd.name, tnl_name);
+		cmmtd_cmd.ipsec = ipsec;
+		cmmtd_cmd.tunnel_type = tnl_type;
+
+		/* Send CMD_CMMTD_TUNNEL_ADD to Deamon !*/
+		rc = cmmSendToDaemon(daemon_handle, CMMD_CMD_TUNNEL_ADD, &cmmtd_cmd, sizeof(cmmtd_cmd), &rcvBuffer);
+		if (rc != 2) /* we expect 2 bytes in response */
+		{
+			if (rc >= 0)
+				cmm_print(DEBUG_STDERR, "CMD_TUNNEL_ADD unexpected response length %d\n", rc);
+			return -1;
+		}
+		else if ((((u_int16_t*)rcvBuffer)[0]) != CMMD_ERR_OK) 
+		{
+			cmm_print(DEBUG_STDERR, "Error %d received from CMM Deamon for CMD_TUNNEL_ADD\n", ((u_int16_t*)rcvBuffer)[0]);
+			return -1;
+		}
+
+		return 0;
+	}
+	else if(strncmp(*keywords, "show", strlen(*keywords)) == 0)
+	{
+		if(argc != 2)
+			return tunnel_print_usage();
+		else
+		{
+			struct interface *itf;
+
+ 			cmm_print(DEBUG_STDOUT, "Details for tunnel %s\n", tnl_name);
+			strcpy(cmmtd_cmd.name, tnl_name);
+
+			/* Send CMD_CMMTD_TUNNEL_SHOW to Deamon !*/
+			rc = cmmSendToDaemon(daemon_handle, CMMD_CMD_TUNNEL_SHOW, &cmmtd_cmd, sizeof(cmmtd_cmd), rcvBuffer);
+			if (rc != (sizeof(struct interface) + 4))
+			{
+				if(rc >= 0)
+					cmm_print(DEBUG_STDERR, "ERROR: CMD_TUNNEL_SHOW Unexpected result returned from FPP rc:%04x - received %d - expected %d\n",
+						  (rc < sizeof(unsigned short) ) ? 0 : *((unsigned short *) rcvBuffer),
+						  rc,
+ 						  sizeof(struct interface) + 4
+			  			  );
+				return -1;
+			}
+			else if ((((unsigned short*)rcvBuffer)[0]) != CMMD_ERR_OK)
+			{
+				cmm_print(DEBUG_STDERR, "Error %d received from CMM Deamon for CMD_TUNNEL_DEL\n", ((unsigned short*)rcvBuffer)[0]);
+				return -1;
+			}
+
+ 			itf = (struct interface *)(rcvBuffer + 4);
+			tunnel_print_info(itf);
+		}
+	}
+	else if(strncmp(*keywords, "del", strlen(*keywords)) == 0)
+	{
+		if(argc != 2)
+			return tunnel_print_usage();
+		else
+		{
+			strcpy(cmmtd_cmd.name, tnl_name);
+
+			/* Send CMD_CMMTD_TUNNEL_DEL to Deamon !*/
+			rc = cmmSendToDaemon(daemon_handle, CMMD_CMD_TUNNEL_DEL, &cmmtd_cmd, sizeof(cmmtd_cmd), &rcvBuffer);
+			if (rc != 2)
+			{
+				if (rc >= 0)
+					cmm_print(DEBUG_STDERR, "CMD_TUNNEL_DEL unexpected response length %d\n", rc);
+				return -1;
+			}
+			else if ((((unsigned short*)rcvBuffer)[0]) != CMMD_ERR_OK)
+			{
+				cmm_print(DEBUG_STDERR, "Error %d received from CMM Deamon for CMD_TUNNEL_DEL\n", ((unsigned short*)rcvBuffer)[0]);
+				return -1;
+			}
+		}	
+	}
+#ifdef SAM_LEGACY
+	else if (strncmp(*keywords, "set",  strlen(*keywords)) ==0)
+       {
+               unsigned int tmp;
+               char * endptr = NULL;
+               keywords++;
+	       if((argc < 3) ||((argc >3) && (argc <5)))
+                       return tunnel_print_usage();
+               strcpy(cmmtd_cmd.name, tnl_name);
+               cmmtd_cmd.tunnel_type = TNL_4O6;
+               if(strncasecmp(*keywords,"sam_enable", strlen(*keywords)) == 0)
+                       cmmtd_cmd.sam_enable = 1;
+               else if(strncasecmp(*keywords,"sam_disable", strlen(*keywords)) == 0)
+                       cmmtd_cmd.sam_enable = 0;
+               else
+                       return tunnel_print_usage();
+               cmmtd_cmd.tun_mtu = DEFAULT_SAM_FRAG_MTU;
+               if( argc >3 )
+               {
+                       keywords++;
+                       if(strncasecmp(*keywords,"sam-frag-mtu",strlen(*keywords))==0)
+                       {
+                               keywords++;
+                               tmp = strtoul(*keywords, &endptr, 0);
+                               cmmtd_cmd.tun_mtu= tmp;
+                       }
+               }
+
+               if(cmmSendToDaemon(daemon_handle, CMMD_CMD_TUNNEL_SAMREADY, &cmmtd_cmd, sizeof(cmmtd_cmd), &rcvBuffer) == 1)
+               {
+                       if ((((unsigned short*)rcvBuffer)[0]) != 0)
+                       {
+                               cmm_print(DEBUG_STDERR, "error %d received from cmm deamon for cmmd_cmd_cmmtd_tunnel_samready\n", ((unsigned short*)rcvBuffer)[0]);
+                               return -1;
+                       }
+               }
+
+       }
+#endif
+	else
+		return tunnel_print_usage();
+
+	return 0;
+}
+
+/************************************************************
+ *
+ * cmm_tunnel_parse_cmd
+ *
+ ************************************************************/
+int cmm_tunnel_parse_cmd(int argc, char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	if (tabStart < argc)
+		return tunnel_parse_cmd(argc - tabStart, &keywords[tabStart], daemon_handle);
+	else
+		return tunnel_print_usage();
+}
+
+/************************************************************
+ *
+ * tunnel_send_cmd
+ * Role: CMM to FPP commands in deamon context
+ ************************************************************/
+int tunnel_send_cmd(FCI_CLIENT *fci_handle, int request, struct interface *itf)
+{
+	cmmd_tunnel_create_cmd_t cmd;
+	int action;
+	int ret = CMMD_ERR_OK;
+
+	switch (request)
+	{
+	case (ADD | UPDATE):
+		if ((itf->flags & (FPP_PROGRAMMED | FPP_NEEDS_UPDATE)) == FPP_PROGRAMMED)
+			goto out;
+
+		if ((itf->flags & (FPP_PROGRAMMED | FPP_NEEDS_UPDATE)) == (FPP_PROGRAMMED | FPP_NEEDS_UPDATE))
+			action = FPP_ACTION_UPDATE;
+		else
+			action = FPP_ACTION_REGISTER;
+
+		break;
+
+	case UPDATE:
+		if (!((itf->flags & FPP_PROGRAMMED) && (itf->flags & FPP_NEEDS_UPDATE)))
+			goto out;
+
+		action = FPP_ACTION_UPDATE;
+		break;
+
+	default:
+		cmm_print(DEBUG_ERROR, "%s: Command not supported\n", __func__);
+		ret = CMMD_ERR_UNKNOWN_COMMAND;
+		goto out;
+		break;
+	}
+
+	memset(&cmd, 0, sizeof(cmd));
+
+	if (itf->tunnel_family == AF_INET6)
+	{
+		if (itf->tunnel_parm6.proto == IPPROTO_ETHERIP)
+		{
+			cmd.mode = TNL_ETHIPOIP6;
+		}
+		else if (itf->tunnel_parm6.proto == IPPROTO_IPIP)
+		{
+			cmd.mode = TNL_4O6;
+		}
+
+		memcpy(cmd.local, itf->tunnel_parm6.laddr.s6_addr, 16);
+		if(!(itf->tunnel_flags & TNL_4RD))
+		{
+			memcpy(cmd.remote, itf->tunnel_parm6.raddr.s6_addr, 16);
+		}
+
+		if (itf->tunnel_parm6.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)
+			cmd.encap_limit = 0;
+		else
+			cmd.encap_limit = itf->tunnel_parm6.encap_limit;
+
+		cmd.hop_limit = itf->tunnel_parm6.hop_limit;
+
+		/* Flowinfo : flowclass / traffic class will need to be detailed */
+		cmd.flow_info = itf->tunnel_parm6.flowinfo;
+
+		if (itf->tunnel_flags & TNL_IPSEC)
+			cmd.secure = 1;
+		else
+			cmd.secure = 0;
+
+	}
+	else
+	{
+		if (itf->type == ARPHRD_SIT)
+			cmd.mode = TNL_6O4;
+
+		memcpy(cmd.local, &itf->tunnel_parm4.iph.saddr, 4);
+		memcpy(cmd.remote, &itf->tunnel_parm4.iph.daddr, 4);
+
+		cmd.hop_limit = itf->tunnel_parm4.iph.ttl;
+		cmd.flow_info = itf->tunnel_parm4.iph.tos;
+		cmd.frag_off = itf->tunnel_parm4.iph.frag_off;
+			
+		/* For now not supported */
+		cmd.secure = 0;
+	}
+
+	cmd.route_id = itf->rt.fpp_route_id;
+
+	cmd.enabled = itf->tunnel_enabled;
+
+	if (____itf_get_name(itf, cmd.name, sizeof(cmd.name)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: ____itf_get_name(%d) failed\n", __func__, itf->ifindex);
+		ret = CMMD_ERR_WRONG_COMMAND_PARAM;
+		goto out;
+	}
+
+#if 0
+	if (__itf_get_name(itf->phys_ifindex, cmd.output_device, sizeof(cmd.output_device)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: __itf_get_name(%d) failed\n", __func__, itf->phys_ifindex);
+		goto err;
+	}
+#endif
+
+	if (action == FPP_ACTION_REGISTER)
+	{
+		//Send message to forward engine
+		cmm_print(DEBUG_COMMAND, "Send CMD_TUNNEL_ADD\n");
+
+		ret = fci_write(fci_handle, FPP_CMD_TUNNEL_ADD, sizeof(fpp_tunnel_create_cmd_t), (unsigned short *)&cmd);
+		if ((ret == FPP_ERR_OK) || (ret == FPP_ERR_TNL_ALREADY_CREATED))
+		{
+			itf->flags |= FPP_PROGRAMMED;
+			itf->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_TUNNEL_ADD\n", __func__, ret);
+			goto out;
+		}
+	}
+	else
+	{
+		//Send message to forward engine
+		cmm_print(DEBUG_COMMAND, "Send CMD_TUNNEL_UPDATE\n");
+
+		ret = fci_write(fci_handle, FPP_CMD_TUNNEL_UPDATE, sizeof(fpp_tunnel_create_cmd_t), (unsigned short *)&cmd);
+		if (ret == FPP_ERR_OK)
+		{
+			itf->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_TUNNEL_UPDATE\n", __func__, ret);
+			goto out;
+		}
+	}
+
+out:
+	return ret;
+}
+
+
+static int tunnel_send_del(FCI_CLIENT *fci_handle, struct interface *itf)
+{
+	fpp_tunnel_del_cmd_t cmd;
+	int ret = 0;
+
+	if (!(itf->flags & FPP_PROGRAMMED))
+		return CMMD_ERR_OK;
+
+	memset(&cmd, 0, sizeof(cmd));
+
+	if (____itf_get_name(itf, cmd.name, sizeof(cmd.name)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: ____itf_get_name(%d) failed\n", __func__, itf->ifindex);
+		return CMMD_ERR_WRONG_COMMAND_PARAM;
+	}
+
+	//Send message to forward engine
+	cmm_print(DEBUG_COMMAND, "Send CMD_TUNNEL_DEL\n");
+
+	ret = fci_write(fci_handle, FPP_CMD_TUNNEL_DEL, sizeof(fpp_tunnel_del_cmd_t), (unsigned short *) &cmd);
+	if (ret == FPP_ERR_TNL_ENTRY_NOT_FOUND || ret == FPP_ERR_OK)
+		itf->flags &= ~FPP_PROGRAMMED;
+	else
+	{
+		if(ret > 0)
+			cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_TUNNEL_DEL\n", __func__, ret);
+		else
+			cmm_print(DEBUG_ERROR, "%s: Error '%s' while sending CMD_TUNNEL_DEL\n", __func__, strerror(errno));
+	}
+
+	return ret;
+}
+/************************************************************
+ *
+ * tunnel_update_sa
+ * Role : Update FPP tunnel SA and local cmm copy
+ ************************************************************/
+static int tunnel_update_sa(FCI_CLIENT *fci_handle, struct interface *itf, unsigned char orig)
+{
+	fpp_tunnel_sec_cmd_t cmd;
+	int ret;
+
+	if (!(itf->flags & FPP_PROGRAMMED))
+		goto out;
+
+	memset(&cmd, 0, sizeof(cmd));
+
+	if (____itf_get_name(itf, cmd.name, sizeof(cmd.name)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: ____itf_get_name(%d) failed\n", __func__, itf->ifindex);
+		goto err;
+	}
+
+	if (orig)
+	{
+		cmd.sa_nr = itf->flow_orig->sa_nr;
+		memcpy(cmd.sa_handle, itf->flow_orig->sa_handle, itf->flow_orig->sa_nr * sizeof(unsigned short));
+	}
+	else
+	{
+		cmd.sa_reply_nr = itf->flow_rep->sa_nr;
+		memcpy(cmd.sa_reply_handle, itf->flow_rep->sa_handle, itf->flow_rep->sa_nr * sizeof(unsigned short));
+	}
+
+	//Send message to forward engine
+	cmm_print(DEBUG_COMMAND, "Send CMD_TUNNEL_SEC\n");
+
+	if ((ret = fci_write(fci_handle, FPP_CMD_TUNNEL_SEC, sizeof(fpp_tunnel_sec_cmd_t), (unsigned short *) &cmd)))
+	{
+		cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_TUNNEL_SEC\n", __func__, ret);
+		goto err;
+	}
+
+out:
+	return 0;
+
+err:
+	return -1;
+}
+
+
+/************************************************************
+ *
+ * __tunnel_add
+ * 
+ ************************************************************/
+int __tunnel_add(FCI_CLIENT *fci_handle, struct interface *itf)
+{
+	unsigned int *sAddr, *dAddr;
+	unsigned char proto;
+	int enabled = itf->tunnel_enabled;
+	int rc = CMMD_ERR_NOT_CONFIGURED;
+
+	if (!__itf_is_up(itf))
+		goto err;
+
+	if (!(itf->flags & USER_ADDED))
+		goto err;
+
+	if (itf->tunnel_family == AF_INET6)
+	{
+		dAddr = itf->tunnel_parm6.raddr.s6_addr32;
+		proto = itf->tunnel_parm6.proto;
+#ifdef SAM_LEGACY
+		if(proto == IPPROTO_IPIP)
+		{
+			if ((!itf->sam_enable) && (!rt_mw_sam_get_ipv6(&itf->tunnel_parm6.laddr)) )
+			{
+				cmm_print(DEBUG_INFO,"Tunnel %s is up but SAM is not yet Ready", itf->ifname );
+				goto err;
+			}
+		}
+#endif
+
+		sAddr = itf->tunnel_parm6.laddr.s6_addr32;
+	}
+	else
+	{
+		sAddr = &itf->tunnel_parm4.iph.saddr;
+		dAddr = &itf->tunnel_parm4.iph.daddr;
+		proto = itf->tunnel_parm4.iph.protocol;
+	}
+
+	if (((itf->type != ARPHRD_SIT) && (itf->tunnel_parm6.proto != IPPROTO_IPIP)) || dAddr[0])
+	{
+		struct flow flow;
+
+		if (itf->tunnel_flags & TNL_IPSEC)
+		{
+			if (!itf->flow_orig)
+			{
+				itf->flow_orig = __cmmFlowGet(itf->tunnel_family, sAddr, dAddr, 0, 0, proto);
+			}
+
+			if (!itf->flow_rep)
+			{
+				itf->flow_rep = __cmmFlowGet(itf->tunnel_family, dAddr, sAddr, 0, 0, proto);
+			}
+		}
+
+		flow.family = itf->tunnel_family;
+		flow.sAddr = sAddr;
+		flow.dAddr = dAddr;
+		flow.fwmark = 0;
+		flow.iifindex = 0;
+
+		rc = __cmmRouteRegister(&itf->rt, &flow, 0, "tunnel");
+
+		if (itf->rt.route)
+			itf->phys_ifindex = itf->rt.route->oifindex;
+
+		if (rc < 0)
+		{
+			enabled = 0;
+			goto program;
+		}
+
+		enabled = 1;
+
+		cmmFeRouteUpdate(fci_handle, ADD | UPDATE, itf->rt.fpp_route);
+	}
+	else
+		enabled = 1;
+
+program:
+	if (itf->tunnel_enabled != enabled)
+	{
+		itf->flags |= FPP_NEEDS_UPDATE;
+		itf->tunnel_enabled = enabled;
+	}
+
+	__cmmCheckFPPRouteIdUpdate(&itf->rt, &itf->flags);
+
+	rc = tunnel_send_cmd(fci_handle, ADD | UPDATE, itf);
+
+	if (rc != CMMD_ERR_OK)
+		goto err;
+
+	if (itf->tunnel_flags & TNL_IPSEC)
+	{
+		if (itf->flow_orig)
+			tunnel_update_sa(fci_handle, itf, 1);
+
+		if (itf->flow_rep)
+			tunnel_update_sa(fci_handle, itf, 0);
+	}
+
+err:
+	return rc;
+}
+
+
+/************************************************************
+ *
+ * tunnel_add
+ * 
+ ************************************************************/
+static int tunnel_add(FCI_CLIENT *fci_handle, char *name, unsigned char ipsec, char tnl_type, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	int ifindex;
+	struct interface *itf;
+	int rc = 0;
+	int update_connections = 0;
+
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&ctMutex);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+
+	ifindex = if_nametoindex(name);
+
+	itf = __itf_get(ifindex);
+	if (!itf)
+	{
+		cmm_print(DEBUG_ERROR, "%s: interface %s not found\n", __func__, name);
+		res_buf[0] = CMMD_ERR_NOT_FOUND;
+		goto err0;
+	}
+
+	if (!__itf_is_tunnel(itf))
+	{
+		cmm_print(DEBUG_ERROR, "%s: interface %s is not a tunnel\n", __func__, name);
+		res_buf[0] = CMMD_ERR_WRONG_COMMAND_PARAM;
+		goto err1;
+	}
+
+	switch (tnl_type)
+	{
+	case TNL_ETHIPOIP6:
+		if (itf->tunnel_family != AF_INET6)
+		{
+			cmm_print(DEBUG_ERROR, "%s: tunnel type %x can't have family %d\n", __func__, tnl_type, itf->tunnel_family);
+			res_buf[0] = CMMD_ERR_WRONG_COMMAND_PARAM;
+			goto err1;
+		}
+
+		if (itf->tunnel_parm6.proto != IPPROTO_ETHERIP) 
+		{
+			cmm_print(DEBUG_ERROR, "%s: tunnel type %x can't have proto %d\n", __func__, tnl_type, itf->tunnel_parm6.proto);
+			res_buf[0] = CMMD_ERR_WRONG_COMMAND_PARAM;
+			goto err1;
+		}
+
+		if (ipsec)
+			itf->tunnel_flags |= TNL_IPSEC;
+		else
+			itf->tunnel_flags &= ~TNL_IPSEC;
+
+
+		break;
+
+#ifdef SAM_LEGACY
+	case TNL_4O6:
+		if (itf->tunnel_family != AF_INET6)
+		{
+			cmm_print(DEBUG_ERROR, "%s: tunnel type %x can't have family %d\n", __func__, tnl_type, itf->tunnel_family);
+			res_buf[0] = CMMD_ERR_WRONG_COMMAND_PARAM;
+			goto err1;
+		}
+		if ((itf->tunnel_parm6.proto != IPPROTO_ETHERIP) && (itf->tunnel_parm6.proto != IPPROTO_IPIP))
+		{
+			cmm_print(DEBUG_ERROR, "%s: tunnel type %x can't have proto %d\n", __func__, tnl_type, itf->tunnel_parm6.proto);
+			res_buf[0] = CMMD_ERR_WRONG_COMMAND_PARAM;
+			goto err1;
+		}
+
+                if(tnl_type == TNL_4O6)
+                {
+                        if(! itf->sam_enable)
+                        {
+                               update_connections = 1;
+                               itf->sam_enable = 1;
+		  	       itf->tunnel_flags |= TNL_4RD;
+                        }
+                }
+		break;
+#endif
+
+	default:
+		cmm_print(DEBUG_ERROR, "%s: unsupported tunnel type %x\n", __func__, tnl_type);
+		res_buf[0] = CMMD_ERR_WRONG_COMMAND_PARAM;
+		goto err1;
+	}
+#ifndef SAM_LEGACY
+	if (!is_wan_port_ifindex(itf->phys_ifindex))
+	{
+		cmm_print(DEBUG_ERROR, "%s: Fast forward tunneling only supported on WAN interface\n", __func__);
+		res_buf[0] = CMMD_ERR_WRONG_COMMAND_PARAM;
+		goto err1;
+	}
+#endif
+
+	itf->flags |= USER_ADDED;
+
+	rc  = __tunnel_add(fci_handle, itf);
+	if (rc >= 0)
+	{
+		res_buf[0] = rc;
+		rc = 0;
+	}
+        if(update_connections)
+               __itf_update_connection(fci_handle, itf->ifindex);
+
+err1:
+	__itf_put(itf);
+
+err0:
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	*res_len = 2;
+	return rc;
+}
+/************************************************************
+ *
+ * __tunnel_del
+ *
+ ************************************************************/
+int __tunnel_del(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, struct interface *itf)
+{
+	int rc = tunnel_send_del(fci_handle, itf);
+
+
+	__cmmRouteDeregister(fci_handle, &itf->rt, "tunnel");
+
+	if (itf->flow_orig)
+		if (!cmmFlowKeyEngineRemove(fci_key_handle, itf->flow_orig))
+		{
+			__cmmFlowPut(itf->flow_orig);
+
+			itf->flow_orig = NULL;
+		}
+
+	if (itf->flow_rep)
+		if (!cmmFlowKeyEngineRemove(fci_key_handle, itf->flow_rep))
+		{
+			__cmmFlowPut(itf->flow_rep);
+
+			itf->flow_rep = NULL;
+		}
+
+	return rc;
+}
+
+
+/************************************************************
+ *
+ * tunnel_del
+ *
+ ************************************************************/
+static int tunnel_del(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, char *name, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	int ifindex;
+	struct interface *itf;
+	int rc = 0;
+
+	*res_len = 2;
+
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&ctMutex);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+
+	ifindex = if_nametoindex(name);
+
+	itf = __itf_find(ifindex);
+	if (!itf)
+	{
+		res_buf[0] = CMMD_ERR_NOT_FOUND;
+		goto err;
+	}
+
+	if (!__itf_is_tunnel(itf))
+	{
+		res_buf[0] = CMMD_ERR_WRONG_COMMAND_PARAM;
+		goto err;
+	}
+
+	#ifdef SAM_LEGACY
+	itf->tunnel_flags &= ~TNL_4RD;
+	#endif
+	rc = __tunnel_del(fci_handle, fci_key_handle, itf);
+	if (rc >= 0)
+	{
+		res_buf[0] = rc;
+		rc = 0;
+	}
+err:
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	return rc;
+}
+
+
+/************************************************************
+ *
+ * tunnel_show
+ *
+ ************************************************************/
+static int tunnel_show(FCI_CLIENT *fci_handle, char *name, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	int ifindex;
+	struct interface *itf;
+
+	__pthread_mutex_lock(&itf_table.lock);
+
+	ifindex = if_nametoindex(name);
+
+	itf = __itf_find(ifindex);
+	if (!itf)
+	{
+		res_buf[0] = CMMD_ERR_NOT_FOUND;
+		*res_len = 2;
+		goto err;
+	}
+
+	if (!__itf_is_tunnel(itf))
+	{
+		res_buf[0] = CMMD_ERR_NOT_CONFIGURED;
+		*res_len = 2;
+		goto err;
+	}
+
+	/* +4 is for making the structure 4-byte aligned in memory
+	 * to boost access performance. It's not +0 because we need to put response code
+	 * in there.
+	 * TODO: this should be refactored (a response structure should be introduced)
+	 */
+	if (sizeof(struct interface) < *res_len)
+	{
+		res_buf[0] = CMMD_ERR_OK;
+		memcpy((u_int8_t*)res_buf + 4, itf, sizeof(struct interface));
+		*res_len = sizeof(struct interface) + 4;
+	}
+
+	tunnel_print_info(itf);
+
+err:
+	__pthread_mutex_unlock(&itf_table.lock);
+	return 0;
+}
+
+#ifdef SAM_LEGACY
+
+int tunnel_conv_id_set(FCI_CLIENT *fci_handle, char *name,  char *buffer, int buffer_size)
+{
+       int ifindex;
+       struct interface *itf;
+       int rc = 0;
+
+       pthread_mutex_lock(&itf_table.lock);
+
+       ifindex = if_nametoindex(name);
+
+       itf = __itf_find(ifindex);
+       if (!itf)
+               goto err;
+
+       if (!____itf_is_4o6_tunnel(itf))
+               goto err;
+
+       rc = fci_write(fci_handle, FPP_CMD_TUNNEL_4rd_ID_CONV_psid, sizeof(fpp_tunnel_id_conv_cmd_t),(unsigned short *)buffer);
+       if(rc != 0)
+               cmm_print(DEBUG_ERROR, "%s: Error %d while sending FPP_CMD_TUNNEL_4rd_ID_CONV\n", __func__, rc);
+
+err:
+       pthread_mutex_unlock(&itf_table.lock);
+       return rc;
+
+}
+
+#endif
+
+/************************************************************
+ * 
+ * tunnel_daemon_msg_recv
+ * Role: Parse CMM to deamon messages
+ ************************************************************/
+int tunnel_daemon_msg_recv(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, int function_code, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	cmmd_tunnel_t *tnl = (cmmd_tunnel_t *) cmd_buf;
+	#ifdef SAM_LEGACY
+	fpp_tunnel_id_conv_cmd_t *tnl_IdConv = (fpp_tunnel_id_conv_cmd_t*) cmd_buf;
+	#endif
+
+	switch (function_code)
+	{
+	case CMMD_CMD_TUNNEL_ADD:
+		return tunnel_add(fci_handle, tnl->name, tnl->ipsec, tnl->tunnel_type, res_buf, res_len);
+		
+	case CMMD_CMD_TUNNEL_DEL:
+		return tunnel_del(fci_handle, fci_key_handle, tnl->name, res_buf, res_len);
+	
+	case CMMD_CMD_TUNNEL_SHOW:
+		return tunnel_show(fci_handle, tnl->name, res_buf, res_len);
+#ifdef SAM_LEGACY
+	case CMMD_CMD_TUNNEL_SAMREADY:
+	{
+               if(tnl->tun_mtu > __itf_get_mtu(if_nametoindex(tnl->name)))
+               {
+                       cmm_print(DEBUG_STDERR,"\n ERROR : configured MTU cannot be greater than tunnel interface's MTU");
+                       return 0;
+               }
+               TunMtu = tnl->tun_mtu;
+	
+	       if(tnl->sam_enable)
+                     return tunnel_add(fci_handle, tnl->name, tnl->ipsec, tnl->tunnel_type , res_buf, res_len);
+               else
+                     return tunnel_del(fci_handle, fci_key_handle, tnl->name,res_buf, res_len);
+	}
+        case CMMD_CMD_TUNNEL_IDCONV_psid:
+	{
+		res_buf[0] = CMMD_ERR_OK;
+		*res_len = 2;
+		
+               return tunnel_conv_id_set(fci_handle, (char*)tnl_IdConv->name,(char*)cmd_buf, sizeof(fpp_tunnel_id_conv_cmd_t));
+	}
+#endif
+	default:
+		res_buf[0] = CMMD_ERR_UNKNOWN_COMMAND;
+		*res_len = 2;
+	}
+
+	return 0;
+}
+
+static u_int32_t try_6rd(const u_int32_t *daddr, struct interface *itf)
+{
+	u_int32_t dst = 0;
+
+	if (itf->tunnel_flags & TNL_6RD)
+	{
+		if (cmmPrefixEqual(daddr, itf->tunnel_parm6rd.prefix.s6_addr32, itf->tunnel_parm6rd.prefixlen)) {
+			unsigned pbw0, pbi0;
+			int pbi1;
+			u_int32_t d;
+
+			pbw0 = itf->tunnel_parm6rd.prefixlen >> 5;
+			pbi0 = itf->tunnel_parm6rd.prefixlen & 0x1f;
+
+			d = (ntohl(daddr[pbw0]) << pbi0) >> itf->tunnel_parm6rd.relay_prefixlen;
+
+			pbi1 = pbi0 - itf->tunnel_parm6rd.relay_prefixlen;
+			if (pbi1 > 0)
+				d |= ntohl(daddr[pbw0 + 1]) >> (32 - pbi1);
+
+			dst = (itf->tunnel_parm6rd.relay_prefix & ((1 << itf->tunnel_parm6rd.relay_prefixlen) - 1)) | htonl(d);
+		}
+	}
+	else
+	{
+		if (((u_int16_t *)daddr)[0] == htons(0x2002)) {
+			/* 6to4 v6 addr has 16 bits prefix, 32 v4addr, 16 SLA, ... */
+			memcpy(&dst, &((u_int16_t *)daddr)[1], 4);
+		}
+	}
+
+	return dst;
+}
+
+unsigned int tunnel_get_ipv4_dst(struct RtEntry *route, struct interface *itf)
+{
+	unsigned int dst;
+
+#if defined(PROPRIETARY_6RD)
+	dst = try_6rd(route->dAddr, itf);
+
+	if (!dst)
+		dst = try_6rd(route->gwAddr, itf);
+
+	if (!dst)
+		dst = itf->tunnel_parm6rd.relay_prefix;
+
+#else
+	dst = try_6rd(route->dAddr, itf);
+
+	/* FIXME this doesn't match exactly the Linux ipv6->ipv4 address mapping */
+	if (!dst)
+	{
+		/* ipv6 addr compatible v4 */
+		if ((route->gwAddr[0] == 0) && (route->gwAddr[1] == 0) && (route->gwAddr[2] == 0) &&
+			route->gwAddr[3] && (route->gwAddr[3] != htonl(0x00000001)))
+			dst = route->gwAddr[3];
+	}
+#endif
+
+	return dst;
+}
+
+/************************************************************
+ *
+ * __cmmGetTunnel6rd
+ * Role : Check if interface is a 6rd tunnel and retrieve info from kernel
+ ************************************************************/
+static void __cmmGetTunnel6rd(int fd, struct interface *itf)
+{
+	struct ifreq ifr;
+	int rc;
+
+	itf->tunnel_flags &= ~TNL_6RD;
+	memset(&itf->tunnel_parm6rd, 0, sizeof(struct ip_tunnel_6rd));
+
+	if (____itf_get_name(itf, ifr.ifr_name, sizeof(ifr.ifr_name)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: ____itf_get_name(%d) failed\n", __func__, itf->ifindex);
+
+		goto out;
+	}
+
+	ifr.ifr_ifru.ifru_data = (void *)&itf->tunnel_parm6rd;
+
+	rc = ioctl(fd, SIOCGET6RD, &ifr);
+	if (rc < 0)
+		goto out;
+
+	itf->tunnel_flags |= TNL_6RD;
+
+out:
+	return;
+}
+
+/************************************************************
+ *
+ * __cmmGetTunnel
+ * Role : Check if interface is a tunnel and retrieve info from kernel
+ ************************************************************/
+int __cmmGetTunnel(int fd, struct interface *itf)
+{
+	struct ifreq ifr;
+	int rc;
+
+	itf->itf_flags &= ~ITF_TUNNEL;
+	memset(&itf->tunnel_parm4, 0, sizeof(struct ip6_tnl_parm));
+	memset(&itf->tunnel_parm6, 0, sizeof(struct ip_tunnel_parm));
+
+	if (____itf_get_name(itf, ifr.ifr_name, sizeof(ifr.ifr_name)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: ____itf_get_name(%d) failed\n", __func__, itf->ifindex);
+
+		goto out;
+	}
+
+	switch (itf->type)
+	{
+	case ARPHRD_ETHER:
+		if (itf->phys_ifindex == itf->ifindex)
+			goto out;
+
+		if (!__itf_is_pointopoint(itf))
+			goto out;
+
+		ifr.ifr_ifru.ifru_data = (void *)&itf->tunnel_parm6;
+
+		rc = ioctl(fd, SIOCGETTUNNEL, &ifr);
+		if (rc < 0)
+			goto out;
+
+		/* In case this is not a real tunnel interface these should not match */
+		if (itf->phys_ifindex != itf->tunnel_parm6.link)
+			goto out;
+
+		if (itf->tunnel_parm6.proto == IPPROTO_ETHERIP)
+		{
+			itf->itf_flags |= ITF_TUNNEL;
+			itf->tunnel_family = AF_INET6;
+			goto out;
+		}
+
+		break;
+
+	case ARPHRD_TUNNEL:
+		cmm_print(DEBUG_ERROR, "%s: itf(%d) unsupported tunnel type (%x)\n", __func__, itf->ifindex, itf->type);
+		goto out;
+
+		itf->itf_flags |= ITF_TUNNEL;
+		itf->tunnel_family = AF_INET;
+		break;
+
+	case ARPHRD_TUNNEL6:
+		cmm_print(DEBUG_INFO, "%s: itf(%d) supported tunnel type (%x)\n", __func__, itf->ifindex, itf->type);
+
+/*		 if (!__itf_is_pointopoint(itf))
+		 {
+			cmm_print(DEBUG_ERROR, "%s: itf(%d) is not point to point and tunnel's remote address is not configured\n", __func__, itf->ifindex);
+                        goto out;
+		 }*/
+
+                ifr.ifr_ifru.ifru_data = (void *)&itf->tunnel_parm6;
+
+                rc = ioctl(fd, SIOCGETTUNNEL, &ifr);
+                if (rc < 0)
+                        goto out;
+
+		cmm_print(DEBUG_INFO, "%s: itf(%d) tunnel flag is set (%x)\n", __func__, itf->ifindex, itf->flags);
+		itf->itf_flags |= ITF_TUNNEL;
+		itf->tunnel_family = AF_INET6;
+		/* Add this type of tunnel automatically */
+		itf->flags |= USER_ADDED;
+		break;
+
+	case ARPHRD_SIT:
+		ifr.ifr_ifru.ifru_data = (void *)&itf->tunnel_parm4;
+
+		rc = ioctl(fd, SIOCGETTUNNEL, &ifr);
+		if (rc < 0)
+			goto out;
+
+		__cmmGetTunnel6rd(fd, itf);
+
+		itf->itf_flags |= ITF_TUNNEL;
+		itf->tunnel_family = AF_INET;
+
+		/* Add this type of tunnel automatically */
+		itf->flags |= USER_ADDED;
+
+		break;
+
+	case ARPHRD_IPGRE:
+		cmm_print(DEBUG_ERROR, "%s: itf(%d) unsupported tunnel type (%x)\n", __func__, itf->ifindex, itf->type);
+		goto out;
+
+		itf->itf_flags |= ITF_TUNNEL;
+		itf->tunnel_family = AF_INET;
+		break;
+
+#ifndef ARPHRD_NONE
+#define ARPHRD_NONE    0xFFFE
+#endif
+       case ARPHRD_NONE: /* As is the case for tun/tap interfaces */
+               cmm_print(DEBUG_ERROR, "%s: itf(%d) supported tunnel type (%x)\n", __func__, itf->ifindex, itf->type);
+                ifr.ifr_ifru.ifru_data = (void *)&itf->tunnel_parm6;
+
+                 rc = ioctl(fd, SIOCGIFFLAGS, &ifr);
+                cmm_print(DEBUG_ERROR, "%s: itf(%d) rc is %d \n", __func__, itf->ifindex, rc);
+                 if (rc < 0)
+                        goto out;
+                if(!(ifr.ifr_flags & IFF_TUN))
+               {
+                       cmm_print(DEBUG_ERROR, "%s: itf(%d) is not a TUN interface \n", __func__, itf->ifindex);
+                       goto out;
+               }
+
+                itf->itf_flags |= ITF_TUNNEL;
+                itf->tunnel_family = globalConf.tun_family;
+                itf->tunnel_parm6.proto = globalConf.tun_proto;
+		cmm_print(DEBUG_INFO,"%s: tun family is %d,tun proto is %d\n",__func__, globalConf.tun_family,globalConf.tun_proto);
+                /* Add this type of tunnel automatically */
+                itf->flags |= USER_ADDED;
+                break;
+
+
+	default:
+		break;
+	}
+
+out:
+	return 0;
+}
+
+/************************************************************
+ *
+ * __cmmTunnelUpdateWithRoute
+ *
+ ************************************************************/
+void __cmmTunnelUpdateWithRoute(FCI_CLIENT *fci_handle, struct RtEntry *route)
+{
+	struct interface *itf;
+	struct list_head *entry;
+	struct fpp_rt *fpp_route;
+	int i;
+
+	for (i = 0; i < ITF_HASH_TABLE_SIZE; i++)
+	{
+		for (entry = list_first(&itf_table.hash[i]); entry != &itf_table.hash[i]; entry = list_next(entry))
+		{
+			itf = container_of(entry, struct interface, list);
+
+			if (!__itf_is_tunnel(itf))
+				continue;
+
+			if (itf->rt.route == route)
+			{
+				fpp_route = itf->rt.fpp_route;
+				itf->rt.fpp_route = NULL;
+
+				__tunnel_add(fci_handle, itf);
+
+				__cmmFPPRouteDeregister(fci_handle, fpp_route, "tunnel");
+			}
+		}
+	}
+}
+
+/************************************************************
+ *
+ * __cmmTunnelFindFromFlow
+ * Role : Finds tunnel entry that matches flow
+ ************************************************************/
+struct interface *__cmmTunnelFindFromFlow(int family, unsigned int *saddr, unsigned int *daddr, unsigned char proto, char *orig)
+{
+	struct interface *itf;
+	struct list_head *entry;
+	int i;
+
+	for (i = 0; i < ITF_HASH_TABLE_SIZE; i++)
+	{
+		for (entry = list_first(&itf_table.hash[i]); entry != &itf_table.hash[i]; entry = list_next(entry))
+		{
+			itf = container_of(entry, struct interface, list);
+
+			if (!__itf_is_tunnel(itf))
+				continue;
+
+			if (itf->tunnel_family != family)
+				continue;
+
+			if (!(itf->tunnel_flags & TNL_IPSEC))
+				continue;
+
+			if (family == AF_INET6)
+			{
+				if (!memcmp(saddr, itf->tunnel_parm6.laddr.s6_addr, 16)
+				    && !memcmp(daddr, itf->tunnel_parm6.raddr.s6_addr, 16)
+				    && (proto == itf->tunnel_parm6.proto))
+				{
+					*orig = 1;
+					goto found;
+				}
+
+				if (!memcmp(daddr, itf->tunnel_parm6.laddr.s6_addr, 16)
+				    && !memcmp(saddr, itf->tunnel_parm6.raddr.s6_addr, 16)
+				    && (proto == itf->tunnel_parm6.proto))
+				{
+					*orig = 0;
+					goto found;
+				}
+			}
+			else
+			{
+			}
+		}
+	}
+
+	itf = NULL;
+
+found:
+	return itf;
+}
+
+
+#ifdef SAM_LEGACY
+
+int cmm4rdIdConvSetProcess(char ** keywords, int tabStart, int argc, daemon_handle_t daemon_handle)
+{
+       int rcvBytes = 0;
+       char SndBuffer[256];
+       if(argc < 3)
+               goto usage;
+
+       fpp_tunnel_id_conv_cmd_t *pIdConvCmd = (fpp_tunnel_id_conv_cmd_t* )SndBuffer;
+       memset(pIdConvCmd,0, sizeof(fpp_tunnel_id_conv_cmd_t));
+       if(strcasecmp(keywords[tabStart++],"interface") != 0)
+               goto usage;
+
+       strncpy((char*)pIdConvCmd->name, keywords[tabStart++],IFNAMSIZ);
+       if(strcasecmp(keywords[tabStart++],"enable") == 0)
+               pIdConvCmd->IdConvStatus = 1;
+       if(rt_mw_sam_get_portsetid(&pIdConvCmd->sam_port_info))
+       {
+               cmm_print(DEBUG_STDOUT,"\t Third party shared library failed \n");
+               goto usage;
+       }
+       rcvBytes = cmmSendToDaemon(daemon_handle,CMMD_CMD_TUNNEL_IDCONV_psid, pIdConvCmd, sizeof(fpp_tunnel_id_conv_cmd_t), SndBuffer);
+       if (rcvBytes >=2)/* we expect 2 bytes in response */
+       {
+               if ((((u_int16_t*)SndBuffer)[0]) != CMMD_ERR_OK)
+               {
+                       cmm_print(DEBUG_STDERR, "Error %d received from CMM Deamon for CMMD_CMD_CMMTD_TUNNEL_IDCONV\n", ((u_int16_t*)SndBuffer)[0]);
+                       return -1;
+               }
+       }
+
+
+       return 0;
+usage:
+       cmm_print(DEBUG_STDOUT,"\tset 4rd-id-conversion interface <4o6 Interface name> <enable/disable>\n");
+       return -1;
+
+}
+
+#else
+int cmm4rdIdConvSetProcess(char ** keywords, int tabStart, int argc, daemon_handle_t daemon_handle)
+{
+       int rcvBytes = 0,rc =0;
+       char SndBuffer[256];
+       fpp_tunnel_id_conv_cmd_t *pIdConvCmd = (fpp_tunnel_id_conv_cmd_t* )SndBuffer;
+
+       if(!keywords[tabStart])
+               goto usage;
+       memset(pIdConvCmd,0, sizeof(fpp_tunnel_id_conv_cmd_t));
+       if(strcasecmp(keywords[tabStart],"enable") == 0)
+               pIdConvCmd->IdConvStatus = 1;
+       rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_TUNNEL_4rd_ID_CONV_dport, pIdConvCmd, sizeof(fpp_tunnel_id_conv_cmd_t), SndBuffer);
+       rc =  (rcvBytes < sizeof(unsigned short) ) ? 0 : *((unsigned short *) SndBuffer);
+       if (rcvBytes !=  sizeof(unsigned short) || (rc))
+               cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%04x\n",rc );
+       return  rc;
+usage:
+       cmm_print(DEBUG_STDOUT,"\tset 4rd-id-conversion <enable/disable>\n");
+       return -1;
+
+}
+#endif
+
+int cmmTnlQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+        int rcvBytes = 0;
+        char rcvBuffer[256];
+        short rc;
+        int count = 0;
+        char local[INET6_ADDRSTRLEN], remote[INET6_ADDRSTRLEN];
+        cmmd_tunnel_query_cmd_t* pTnlCmd = (cmmd_tunnel_query_cmd_t*) rcvBuffer;
+
+        rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_TUNNEL_QUERY, pTnlCmd,
+                                  sizeof(cmmd_tunnel_query_cmd_t) , rcvBuffer);
+
+        if (rcvBytes != sizeof(cmmd_tunnel_query_cmd_t) ) {
+                rc = (rcvBytes < sizeof(unsigned short) ) ? 0 :
+                                               *((unsigned short *) rcvBuffer);
+                if (rc == FPP_ERR_UNKNOWN_ACTION) {
+                    cmm_print(DEBUG_STDERR,
+                         "ERROR: FPP Tunnel does not support ACTION_QUERY\n");
+                } else if (rc == FPP_ERR_TNL_ENTRY_NOT_FOUND) {
+                    cmm_print(DEBUG_STDERR, "ERROR: FPP Tunnel table empty\n");
+                } else {
+                    cmm_print(DEBUG_STDERR,
+                            "ERROR: Unexpected result returned from FPP rc:%d\n", rc);
+                }
+                return CLI_OK;
+            }
+
+            cmm_print(DEBUG_STDOUT, "Tunnel interfaces:\n");
+            do {
+                        if (pTnlCmd->mode == TNL_4O6)
+                        {
+                                cmm_print(DEBUG_STDOUT,
+                        "%d: Mode: 4o6  Interface name: %s local: %s remote :%s ",count, pTnlCmd->name, inet_ntop(AF_INET6 , &pTnlCmd->local , local, INET6_ADDRSTRLEN), inet_ntop(AF_INET6 , &pTnlCmd->remote , remote, INET6_ADDRSTRLEN) );
+                        }
+                        else if (pTnlCmd->mode == TNL_6O4)
+                        {
+                                cmm_print(DEBUG_STDOUT,
+                        "%d: Mode: 6o4  Interface name: %s local: %s remote :%s ", count, pTnlCmd->name, inet_ntop(AF_INET , &pTnlCmd->local , local, INET6_ADDRSTRLEN), inet_ntop(AF_INET , &pTnlCmd->remote , remote, INET6_ADDRSTRLEN) );
+                        }
+                        else
+                        {
+                                cmm_print(DEBUG_STDOUT,
+                        "%d: Mode: Etherip  Interface name: %s local: %s remote :%s ",count, pTnlCmd->name, inet_ntop(AF_INET6 , &pTnlCmd->local , local, INET6_ADDRSTRLEN), inet_ntop(AF_INET6 , &pTnlCmd->remote , remote, INET6_ADDRSTRLEN) );
+                        }
+                        cmm_print(DEBUG_STDOUT, "enabled: %d secure : %d fl :%x encap_limit: %x hop_limit:%x" , pTnlCmd->enabled, pTnlCmd->secure, pTnlCmd->flow_info , pTnlCmd->encap_limit, pTnlCmd->hop_limit);
+                        cmm_print(DEBUG_STDOUT,"\n");
+
+                        count++;
+                        rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_TUNNEL_QUERY_CONT, pTnlCmd, sizeof(cmmd_tunnel_query_cmd_t) , rcvBuffer);
+           }while (rcvBytes == sizeof(cmmd_tunnel_query_cmd_t) );
+           cmm_print(DEBUG_STDOUT, "Total Tunnel Entries:%d\n", count);
+
+        return CLI_OK;
+}
+
+#ifdef SAM_LEGACY
+
+int getTunnel4rdAddress(struct interface* itf, u_int32_t * Daddrv6,  unsigned int Daddr, unsigned short Dport)
+{
+       int i =0;
+       for (i = 0; i< 4;i++)
+               Daddrv6[i] = itf->tunnel_parm6.raddr.s6_addr32[i];
+       rt_mw_sam_make_dst_ipv6( (struct in_addr *)&Daddr , Dport, (struct in6_addr *)Daddrv6 );
+       return 0;
+}
+#else
+
+static int
+__getTunnel4rdAddress(__u32 *daddr6, __u32 daddr4, __u16 dport4, struct ip6_4rd_map_msg *mr)
+{
+
+       int i, pbw0, pbi0, pbi1;
+       __u32 daddr[4];
+       __u32 port_set_id = 0;
+       __u32 mask;
+       __u32 da = ntohl(daddr4);
+       __u16 dp = ntohs(dport4);
+       __u32 diaddr[4];
+       int port_set_id_len = ( mr->eabit_len ) - ( 32 - mr->prefixlen ) ;
+
+       if ( port_set_id_len < 0) {
+               cmm_print(DEBUG_STDOUT," %s:  PSID length ERROR %d\n",__func__, port_set_id_len);
+               return -1;
+       }
+
+       if ( port_set_id_len > 0) {
+               mask = 0xffffffff >> (32 - port_set_id_len);
+               port_set_id = ( dp >> (16 - mr->psid_offsetlen - port_set_id_len ) & mask ) ;
+       }
+
+       for (i = 0; i < 4; ++i)
+               daddr[i] = ntohl(mr->relay_prefix.s6_addr32[i])
+                       | ntohl(mr->relay_suffix.s6_addr32[i]);
+
+       if( port_set_id_len != 0 ) {
+               pbw0 = mr->relay_prefixlen >> 5;
+               pbi0 = mr->relay_prefixlen & 0x1f;
+               daddr[pbw0] |= (da << mr->prefixlen) >> pbi0;
+               pbi1 = pbi0 - mr->prefixlen;
+               if (pbi1 > 0)
+                       daddr[pbw0+1] |= da << (32 - pbi1);
+
+               if ( port_set_id_len > 0) {
+                       pbw0 = (mr->relay_prefixlen + 32 - mr->prefixlen) >> 5;
+                       pbi0 = (mr->relay_prefixlen + 32 - mr->prefixlen) & 0x1f;
+                       daddr[pbw0] |= (port_set_id << (32 - port_set_id_len)) >> pbi0;
+                       pbi1 = pbi0 - (32 - port_set_id_len);
+                       if (pbi1 > 0)
+                               daddr[pbw0+1] |= port_set_id << (32 - pbi1);
+               }
+       }
+
+       memset(diaddr, 0, sizeof(diaddr));
+
+       diaddr[2] = ( da >> 8 ) ;
+       diaddr[3] = ( da << 24 ) ;
+       diaddr[3] |= ( port_set_id << 8 ) ;
+
+       for (i = 0; i < 4; ++i)
+               daddr[i] = daddr[i] | diaddr[i] ;
+
+       for (i = 0; i < 4; ++i)
+               daddr6[i] = htonl(daddr[i]);
+
+	/* DBG */
+	cmm_print(DEBUG_INFO," %s : %08x %08x %08x %08x  PSID:%04x\n",__func__ ,daddr[0], daddr[1], daddr[2], daddr[3], port_set_id);
+	/* DBG */
+
+	return 0;
+}
+
+
+
+int getTunnel4rdAddress(struct interface* itf, u_int32_t * Daddrv6,  unsigned int Daddr, unsigned short Dport)
+{
+
+	struct list_head *entry, *next_entry;
+	struct map_rule *mr = NULL, *mr_tmp = NULL;
+	unsigned int mask  = 0;
+	int mr_prefixlen = 0;	
+	int count = 0;
+	int err = 0;
+	int i = 0;
+	// set default daddr as that of tunnel remote address will be used for  all 4o6 tunnels and when packets are intended for BR/ P-SAM.
+	for (i = 0; i< 4;i++)
+		Daddrv6[i] = itf->tunnel_parm6.raddr.s6_addr32[i];
+	
+
+	cmm_print(DEBUG_INFO, "%s: mapping rule match \n", __func__);
+
+	for (entry = list_first(&itf->mr_list); next_entry = list_next(entry), entry != &itf->mr_list; entry = next_entry)
+	{
+
+		mr = container_of(entry, struct map_rule, list);
+		mask = 0xffffffff << (32 - mr->rule.prefixlen) ;
+		cmm_print(DEBUG_INFO,"Prefix %d prefixlen %d daddr %d ",htonl(mr->rule.prefix), mr->rule.prefixlen, htonl(Daddr));
+		if( (htonl(Daddr) & mask ) == htonl( mr->rule.prefix) ) {
+	                if ( mr->rule.prefixlen >= mr_prefixlen ){
+                                       mr_prefixlen = mr->rule.prefixlen ;
+                                       mr_tmp = mr;
+                                       count++;
+			}
+		}
+	}
+	if(count)
+		err =__getTunnel4rdAddress(Daddrv6, Daddr, Dport, &mr_tmp->rule );
+	return err;
+}
+
+
+#endif
diff --git a/cmm/src/module_tunnel.h b/cmm/src/module_tunnel.h
new file mode 100644
index 0000000..175002f
--- /dev/null
+++ b/cmm/src/module_tunnel.h
@@ -0,0 +1,56 @@
+ /*
+  *  module_tunnel.h: Tunnel module header file
+  *
+  *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+  *
+  * 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
+  */
+
+#include "client_daemon.h"
+
+#ifndef __MODULE_TUNNEL_H__
+#define __MODULE_TUNNEL_H__
+
+#ifdef SAM_LEGACY
+#define DEFAULT_SAM_FRAG_MTU 1460 /* This is the value that will be used for all fragmentation
+decisions on packets intended for the tunnel MTU. This is a cumulative fix on an ACP fix where
+the tunnel interface MTU is configured as 1500(instead of the real 1460 (1500 - IPv6hdr size))
+Bytes in order to force IPv6 fragmentation */
+#endif
+
+#ifndef SAM_LEGACY
+struct map_rule {
+	struct list_head list;
+	struct ip6_4rd_map_msg rule;
+ };
+#endif
+
+/* Functions prototypes */
+int tunnel_daemon_msg_recv(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, int function_code, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len);
+int cmm_tunnel_parse_cmd(int argc, char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+int __tunnel_add(FCI_CLIENT *fci_handle, struct interface *itf);
+int __tunnel_del(FCI_CLIENT *fci_handle, FCI_CLIENT *fci_key_handle, struct interface *itf);
+unsigned int tunnel_get_ipv4_dst(struct RtEntry *route, struct interface *itf);
+
+struct interface *__cmmTunnelFindFromFlow(int family, unsigned int *saddr, unsigned int *daddr, unsigned char proto, char *orig);
+
+void __cmmTunnelUpdateWithRoute(FCI_CLIENT *fci_handle, struct RtEntry *route);
+int __cmmGetTunnel(int fd, struct interface *itf);
+int cmmTnlQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+int cmm4rdIdConvSetProcess(char ** keywords, int tabStart, int argc, daemon_handle_t daemon_handle);
+int getTunnel4rdAddress(struct interface* itf, u_int32_t * Daddrv6,  unsigned int Daddr, unsigned short Dport);
+
+#endif /* __MODULE_TUNNEL_H__ */
+
diff --git a/cmm/src/module_vlan.c b/cmm/src/module_vlan.c
new file mode 100644
index 0000000..8a81ec7
--- /dev/null
+++ b/cmm/src/module_vlan.c
@@ -0,0 +1,566 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+#include "cmm.h"
+#include "itf.h"
+#include "fpp.h"
+#include "cmmd.h"
+
+#include <net/if.h>
+#include <linux/if_vlan.h>
+#include <linux/sockios.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+
+
+void __cmmGetVlan(int fd, struct interface *itf)
+{
+	struct vlan_ioctl_args if_request;
+
+	itf->itf_flags &= ~ITF_VLAN;
+
+	if (itf->phys_ifindex == itf->ifindex)
+		goto out;
+
+	memset(&if_request, 0, sizeof(if_request));
+
+	if_request.cmd = GET_VLAN_VID_CMD;
+	if (____itf_get_name(itf, if_request.device1, sizeof(if_request.device1)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: ____itf_get_name(%d) failed\n", __func__, itf->ifindex);
+		goto out;
+	}
+
+	if (ioctl(fd, SIOCGIFVLAN, &if_request) < 0)
+		goto out;
+
+	itf->itf_flags |= ITF_VLAN;
+	itf->vlan_id = if_request.u.VID;
+
+out:
+	return;
+}
+/*****************************************************************
+* cmmFeVLANUpdate
+*
+*
+******************************************************************/
+int cmmFeVLANUpdate(FCI_CLIENT *fci_handle, int request, struct interface *itf)
+{
+	fpp_vlan_cmd_t cmd;
+	short ret = CMMD_ERR_OK;
+	int action;
+
+	switch (request)
+	{
+	default:
+	case ADD:
+		if ((itf->flags & (FPP_PROGRAMMED | FPP_NEEDS_UPDATE)) == FPP_PROGRAMMED)
+			goto out;
+
+		if ((itf->flags & (FPP_PROGRAMMED | FPP_NEEDS_UPDATE)) == (FPP_PROGRAMMED | FPP_NEEDS_UPDATE))
+		{
+			cmm_print(DEBUG_ERROR, "%s: trying to update vlan interface(%d)\n", __func__, itf->ifindex);
+			ret = CMMD_ERR_NOT_CONFIGURED;
+			goto out;
+		}
+
+		action = FPP_ACTION_REGISTER;
+
+		break;
+
+	case REMOVE:
+		if (!(itf->flags & FPP_PROGRAMMED))
+			goto out;
+
+		action = FPP_ACTION_DEREGISTER;
+
+		break;
+	}
+
+	memset(&cmd, 0, sizeof(cmd));
+
+	cmd.action = action;
+
+	if (____itf_get_name(itf, cmd.vlan_ifname, sizeof(cmd.vlan_ifname)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: ____itf_get_name(%d) failed\n", __func__, itf->ifindex);
+		ret = CMMD_ERR_WRONG_COMMAND_PARAM;
+		goto out;
+	}
+
+	cmd.vlan_id = itf->vlan_id;
+
+	switch (action)
+	{
+	case FPP_ACTION_REGISTER:
+		cmm_print(DEBUG_COMMAND, "Send CMD_VLAN_ENTRY ACTION_REGISTER\n");
+
+		if (__itf_get_name(itf->phys_ifindex, cmd.vlan_phy_ifname, sizeof(cmd.vlan_phy_ifname)) < 0)
+		{
+			cmm_print(DEBUG_ERROR, "%s: __itf_get_name(%d) failed\n", __func__, itf->phys_ifindex);
+			ret = CMMD_ERR_WRONG_COMMAND_PARAM;
+			goto out;
+		}
+
+		ret = fci_write(fci_handle, FPP_CMD_VLAN_ENTRY, sizeof(fpp_vlan_cmd_t), (unsigned short *) &cmd);
+		if ((ret == FPP_ERR_OK) || (ret == FPP_ERR_VLAN_ENTRY_ALREADY_REGISTERED))
+		{
+			itf->flags |= FPP_PROGRAMMED;
+			itf->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_VLAN_ENTRY, ACTION_REGISTER\n", __func__, ret);
+			goto out;
+		}
+
+		break;
+#if 0
+	case ACTION_UPDATE:
+		cmm_print(DEBUG_COMMAND, "Send CMD_VLAN_ENTRY ACTION_UPDATE\n");
+
+		ret = fci_write(fci_handle, CMD_VLAN_ENTRY, sizeof(struct VlanCmd), (unsigned short *) &cmd);
+		if (ret == NO_ERR)
+		{
+			itf->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_VLAN_ENTRY, ACTION_UPDATE\n", __func__, ret);
+			goto err;
+		}
+
+		break;
+#endif
+	case FPP_ACTION_DEREGISTER:
+	
+		cmm_print(DEBUG_COMMAND, "Send CMD_VLAN_ENTRY ACTION_DEREGISTER\n");
+
+		ret = fci_write(fci_handle, FPP_CMD_VLAN_ENTRY, sizeof(fpp_vlan_cmd_t), (unsigned short *) &cmd);
+		if ((ret == FPP_ERR_OK) || (ret == FPP_ERR_VLAN_ENTRY_NOT_FOUND))
+		{
+			itf->flags &= ~FPP_PROGRAMMED;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_VLAN_ENTRY, ACTION_DEREGISTER\n", __func__, ret);
+			goto out;
+		}
+
+		break;
+
+	default:
+		cmm_print(DEBUG_ERROR, "%s: unknown CMD_VLAN_ENTRY action %x\n", __func__, action);
+		ret = CMMD_ERR_UNKNOWN_ACTION;
+		break;
+	}
+
+out:
+	return ret;
+}
+
+/*****************************************************************
+* cmmVlanReset
+* 
+*
+*
+******************************************************************/
+void cmmVlanReset(FCI_CLIENT *fci_handle)
+{
+	struct list_head *entry;
+	struct interface *itf;
+	short ret;
+	int i;
+
+	// Send message to forward engine
+	cmm_print(DEBUG_COMMAND, "Send CMD_VLAN_RESET\n");
+
+	__pthread_mutex_lock(&itf_table.lock);
+
+	ret = fci_write(fci_handle, FPP_CMD_VLAN_RESET, 0, NULL); 
+	if (ret == FPP_ERR_OK)
+	{
+		for (i = 0; i < ITF_HASH_TABLE_SIZE; i++)
+		{
+			for (entry = list_first(&itf_table.hash[i]); entry != &itf_table.hash[i]; entry = list_next(entry))
+			{
+				itf = container_of(entry, struct interface, list);
+
+				if (!__itf_is_vlan(itf))
+					continue;
+
+				itf->flags &= ~FPP_PROGRAMMED;
+			}
+		}
+	}
+	else
+	{
+		cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_VLAN_RESET\n", __func__, ret);
+	}
+
+	__pthread_mutex_unlock(&itf_table.lock);
+}
+
+/*****************************************************************
+* cmmVlanCheckPolicy
+* check if it is allowable to create device with given name
+* 0 means prohibited
+* non-zero means allowed
+******************************************************************/
+int cmmVlanCheckPolicy(struct interface *itf)
+{
+	// Full implementation will query allow list for prohibit policy
+	// and allow list for prohibit policy here
+	if (globalConf.vlan_policy != MANUAL) 
+		return 1;
+
+	return 0;
+}
+
+/*****************************************************************
+* cmmVlanLocalShow
+*
+*
+******************************************************************/
+int cmmVlanLocalShow(struct cli_def *cli, char *command, char *argv[], int argc)
+{
+	struct list_head *entry;
+	struct interface *itf;
+	char ifname[IFNAMSIZ], phys_ifname[IFNAMSIZ];
+	int i;
+
+	for (i = 0; i < ITF_HASH_TABLE_SIZE; i++)
+	{
+		__pthread_mutex_lock(&itf_table.lock);
+
+		for (entry = list_first(&itf_table.hash[i]); entry != &itf_table.hash[i]; entry = list_next(entry))
+		{
+			itf = container_of(entry, struct interface, list);
+
+			if (!__itf_is_vlan(itf))
+				continue;
+
+			cli_print(cli, "Interface: %s, VLAN Id: %4d, physical Interface: %s, Flags: %x", if_indextoname(itf->ifindex, ifname), itf->vlan_id, if_indextoname(itf->phys_ifindex, phys_ifname), itf->flags);
+
+		}
+
+		__pthread_mutex_unlock(&itf_table.lock);
+	}
+
+	return CLI_OK;
+}
+
+int vlanAddProcess(daemon_handle_t daemon_handle, int argc, char *argv[])
+{
+	unsigned char rspbuf[512];
+	unsigned short rsplen;
+	cmmd_vlan_cmd_t cmd;
+
+	if (argc < 1)
+		goto usage;
+
+	cmd.action = CMMD_ACTION_REGISTER;
+	cmd.vlan_id = 0;
+	strncpy(cmd.vlan_ifname, argv[0], 12);
+	cmd.vlan_phy_ifname[0] = 0;
+
+	if (((rsplen = cmmSendToDaemon(daemon_handle, CMMD_CMD_VLAN_ENTRY, &cmd, sizeof(cmd), rspbuf)) < sizeof(unsigned short)) ||
+	     cmmDaemonCmdRC(rspbuf))
+	{
+		cmm_print(DEBUG_ERROR, "Error sending CMD_VLAN_ENTRY Register\n");
+		/*  break; */ return 0;
+	}
+
+	return 0;
+
+usage:
+	cmm_print(DEBUG_ERROR, "Usage: vlan add ifname.vlanid\n");
+	return 0;
+}
+
+int vlanDeleteProcess(daemon_handle_t daemon_handle, int argc, char *argv[])
+{
+	unsigned char rspbuf[512];
+	unsigned short rsplen;
+	cmmd_vlan_cmd_t cmd;
+
+	if (argc < 1)
+		goto usage;
+
+	cmd.action = CMMD_ACTION_DEREGISTER;
+	cmd.vlan_id = 0;
+	strncpy(cmd.vlan_ifname, argv[0], 12);
+	cmd.vlan_phy_ifname[0] = 0;
+
+	if (((rsplen = cmmSendToDaemon(daemon_handle, CMMD_CMD_VLAN_ENTRY, &cmd, sizeof(cmd), rspbuf)) < sizeof(unsigned short)) ||
+	     cmmDaemonCmdRC(rspbuf))
+	{
+		cmm_print(DEBUG_ERROR, "Error sending CMD_VLAN_ENTRY DeRegister\n");
+		return 0;
+	}
+
+	return 0;
+
+usage:
+	cmm_print(DEBUG_ERROR, "Usage: vlan delete ifname.vlanid\n");
+	return 0;
+}
+
+static int vlanShowProcess(daemon_handle_t daemon_handle, int argc, char *argv[])
+{
+	unsigned char rspbuf[512]; 
+	int rsplen;
+	cmmd_vlan_cmd_t cmd;
+	cmmd_vlan_response_t *pqrsp;
+	int skipcount = 0;
+  
+	do {
+		memset(&cmd, 0, sizeof(cmd));
+		cmd.action = CMMD_ACTION_QUERY_LOCAL;
+		cmd.vlan_id = skipcount;
+
+		pqrsp = (cmmd_vlan_response_t *) (rspbuf + 4);
+
+		if (((rsplen = cmmSendToDaemon(daemon_handle, CMMD_CMD_VLAN_ENTRY, &cmd, sizeof(cmd), rspbuf)) < sizeof(unsigned short)) ||
+		    cmmDaemonCmdRC(rspbuf))
+		{
+			cmm_print(DEBUG_STDOUT, "No vlans defined.\n");
+			break;
+		}
+
+		rsplen -= 4;
+
+		while (rsplen >= sizeof(*pqrsp))
+		{
+			cmm_print(DEBUG_STDOUT, "Interface: %s, VLAN Id: %d, physical Interface: %s\n",
+				pqrsp->vlan_ifname,
+				pqrsp->vlan_id,
+				pqrsp->vlan_phy_if_name);
+
+			rsplen -= sizeof(*pqrsp);
+			pqrsp += 1;
+			skipcount += 1;
+		}
+
+		if ((rsplen & 1) == 0)
+			break;
+	} while(1);
+
+	return 0;
+}
+
+/*
+** cmmVlanClient
+** Client side demux - check input and find client side processor for it
+*/
+int cmmVlanClient(int argc, char **argv, int firstarg, daemon_handle_t daemon_handle)
+{
+	if (argc <= firstarg)
+		goto usage;
+
+	if (strncasecmp(argv[firstarg], "add", 1) == 0)
+		return vlanAddProcess(daemon_handle, argc - firstarg - 1, &argv[firstarg + 1]);
+	else if (strncasecmp(argv[firstarg], "delete", 1) == 0)
+		return vlanDeleteProcess(daemon_handle, argc - firstarg - 1, &argv[firstarg + 1]);
+	else if (strncasecmp(argv[firstarg], "show", 1) == 0)
+		return vlanShowProcess(daemon_handle, argc - firstarg - 1, &argv[firstarg + 1]);
+
+	return 0;
+
+usage:
+	cmm_print(DEBUG_ERROR, "Usage:\n\tvlan [add|delete] ifname.vlanid\n\tvlan show\n");
+	return 0;  
+}
+
+/*
+** cmmVlanProcessClientCmd
+** Daemon side demux.
+** receives command from client side, processes it and sends response back.
+** Return code is a length of a response in bytes, not including 2 bytes of command rc.
+** To prevent daemon issuing commands to fpp - return code must be greater then 1
+*/
+int cmmVlanProcessClientCmd(FCI_CLIENT *fci_handle, int function_code, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	cmmd_vlan_cmd_t *pcmd = (fpp_vlan_cmd_t *) cmd_buf;
+	cmmd_vlan_response_t *pqrsp;
+	struct interface *itf;
+	struct list_head *entry;
+	int skipcount, len, i;
+	int rc = 0;
+
+	res_buf[0] = CMMD_ERR_OK;
+
+	__pthread_mutex_lock(&itf_table.lock);
+
+	switch (pcmd->action)
+	{
+	case CMMD_ACTION_REGISTER:
+		*res_len = 2;
+
+		itf = __itf_find(if_nametoindex(pcmd->vlan_ifname));
+		if (!itf)
+		{
+			res_buf[0] = CMMD_ERR_WRONG_COMMAND_PARAM;
+			break;
+		}
+
+		if (!__itf_is_vlan(itf) || !__itf_is_up(itf))
+		{
+			res_buf[0] = CMMD_ERR_NOT_CONFIGURED;
+			break;
+		}
+
+		rc = cmmFeVLANUpdate(fci_handle, ADD, itf);
+		if (rc > 0)
+		{
+			res_buf[0] = rc;
+			rc = 0;
+		}
+
+		break;
+
+	case CMMD_ACTION_DEREGISTER:
+		*res_len = 2;
+
+		itf = __itf_find(if_nametoindex(pcmd->vlan_ifname));
+		if (!itf)
+		{
+			res_buf[0] = CMMD_ERR_WRONG_COMMAND_PARAM;
+			break;
+		}
+
+		if (!__itf_is_vlan(itf))
+		{
+			res_buf[0] = CMMD_ERR_NOT_CONFIGURED;
+			break;
+		}
+
+		rc = cmmFeVLANUpdate(fci_handle, REMOVE, itf);
+		if (rc > 0)
+		{
+			res_buf[0] = rc;
+			rc = 0;
+		}
+
+		break;
+
+	case CMMD_ACTION_QUERY_LOCAL:
+
+		skipcount = pcmd->vlan_id;
+		len = 4;
+		pqrsp = (cmmd_vlan_response_t *)((char*)res_buf + 4);
+
+		for (i = 0; i < ITF_HASH_TABLE_SIZE; i++)
+		{
+			for (entry = list_first(&itf_table.hash[i]); entry != &itf_table.hash[i]; entry = list_next(entry))
+			{
+				itf = container_of(entry, struct interface, list);
+
+				if (!__itf_is_vlan(itf))
+					continue;
+
+				if (skipcount <= 0)
+				{
+					if_indextoname(itf->ifindex, pqrsp->vlan_ifname);
+					pqrsp->vlan_id = itf->vlan_id;
+					if_indextoname(itf->phys_ifindex, pqrsp->vlan_phy_if_name);
+					len += sizeof(*pqrsp);
+					pqrsp += 1;
+
+					if (len + sizeof(*pqrsp) >= *res_len)
+					{
+						
+						len += 1; // odd length means that there are more entries to report
+
+						goto out;
+					}
+				} else {
+					skipcount--;
+				}
+			}
+		}
+
+	out:
+		*res_len = len;
+
+		break;
+ 	case CMMD_ACTION_QUERY:
+  	case CMMD_ACTION_QUERY_CONT:
+       		 rc = fci_cmd(fci_handle, function_code, (u_int16_t*)cmd_buf, cmd_len, res_buf, res_len);
+		 break;
+
+	default:
+		res_buf[0] = CMMD_ERR_UNKNOWN_ACTION;
+		*res_len = 2;
+		break;
+	}
+
+	__pthread_mutex_unlock(&itf_table.lock);
+	return rc;
+}
+
+/*****************************************************************
+ * * cmmVlanQuery
+ * *
+ * *
+ * ******************************************************************/
+int cmmVlanQuery(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+        int rcvBytes = 0;
+        char rcvBuffer[256];
+        short rc;
+        int count = 0;
+        cmmd_vlan_cmd_t* pVlanCmd = (cmmd_vlan_cmd_t *) rcvBuffer;
+
+        pVlanCmd->action = CMMD_ACTION_QUERY;
+        rcvBytes = cmmSendToDaemon(daemon_handle, CMMD_CMD_VLAN_ENTRY, pVlanCmd, 
+                                  sizeof(cmmd_vlan_cmd_t) , rcvBuffer);
+
+        if (rcvBytes < sizeof(cmmd_vlan_cmd_t) + sizeof(unsigned short)) {
+                rc = (rcvBytes < sizeof(unsigned short) ) ? 0 : 
+                                               *((unsigned short *) rcvBuffer);
+                if (rc == CMMD_ERR_UNKNOWN_ACTION) {
+                    cmm_print(DEBUG_STDERR, 
+                         "ERROR: FPP VLANP does not support ACTION_QUERY\n");
+                } else if (rc == CMMD_ERR_VLAN_ENTRY_NOT_FOUND) {
+                    cmm_print(DEBUG_STDERR, "ERROR: FPP VLAN table empty\n");
+                } else {
+                    cmm_print(DEBUG_STDERR, 
+                            "ERROR: Unexpected result returned from FPP rc:%d\n", rc);
+                }
+                return CLI_OK;
+            }
+            cmm_print(DEBUG_STDOUT, "VLAN interfaces:\n");
+            do {
+			cmm_print(DEBUG_STDOUT, 
+                         "Interface: %s, VLAN Id  : %4d,  physical Interface: %s \n",
+                          pVlanCmd->vlan_ifname, pVlanCmd->vlan_id,
+			pVlanCmd->vlan_phy_ifname);
+                	count++;
+                	pVlanCmd->action = CMMD_ACTION_QUERY_CONT;
+			rcvBytes = cmmSendToDaemon(daemon_handle, CMMD_CMD_VLAN_ENTRY, pVlanCmd,
+                       		           sizeof(cmmd_vlan_cmd_t) , rcvBuffer);
+           }while (rcvBytes >= sizeof(cmmd_vlan_cmd_t) + sizeof(unsigned short));
+           cmm_print(DEBUG_STDOUT, "Total VLAN Entries:%d\n", count);
+
+        return CLI_OK;
+} 
diff --git a/cmm/src/module_vlan.h b/cmm/src/module_vlan.h
new file mode 100644
index 0000000..9e8f815
--- /dev/null
+++ b/cmm/src/module_vlan.h
@@ -0,0 +1,38 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_VLAN_H__
+#define __MODULE_VLAN_H__
+
+	#include "itf.h"
+
+	void __cmmGetVlan(int fd, struct interface *itf);
+	int cmmFeVLANUpdate(FCI_CLIENT *fci_handle, int request, struct interface *itf);
+	void cmmVlanReset(FCI_CLIENT *fci_handle);
+	int cmmVlanLocalShow(struct cli_def *cli, char *command, char *argv[], int argc);
+	int cmmVlanCheckPolicy(struct interface *itf);
+
+/* remote command processing */
+	int vlanAddProcess(daemon_handle_t daemon_handle, int argc, char *argv[]);
+	int vlanDeleteProcess(daemon_handle_t daemon_handle, int argc, char *argv[]);
+	int cmmVlanClient(int argc, char **argv, int firstarg, daemon_handle_t daemon_handle);
+	int cmmVlanProcessClientCmd(FCI_CLIENT *fci_handle, int function_code, u_int8_t *cmd_buf, u_int16_t cmd_len, u_int16_t *res_buf, u_int16_t *res_len);
+	int cmmVlanQuery(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+#endif
+
diff --git a/cmm/src/module_wifi.c b/cmm/src/module_wifi.c
new file mode 100644
index 0000000..e957bd2
--- /dev/null
+++ b/cmm/src/module_wifi.c
@@ -0,0 +1,410 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 WIFI_ENABLE
+#include "cmm.h"
+#include "itf.h"
+
+//#include <net/if.h>
+#include <linux/sockios.h>
+//#include <linux/wireless.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <module_wifi.h>
+
+#define WIFI_FF_SYSCTL_PATH "/proc/sys/net/"
+#define WIFI_FF_SYSCTL_ENTRY "wifi_fast_path_enable"
+
+static int cmmFeWiFiGetBridge( FCI_CLIENT *fci_handle, int fd, struct interface *witf );
+
+//static unsigned char wifi_sysctl[128];	
+#define SIOCVAPUPDATE (0x6401)
+#define WIFI_FF_MASTER_IF "/dev/vwd0"
+
+extern struct wifi_ff_entry glbl_wifi_ff_ifs[MAX_WIFI_FF_IFS];
+void __cmmGetWiFi(int fd, struct interface *itf)
+{
+	//struct iwreq       pwrq;
+	char ifname[IFNAMSIZ];	
+	int ii;
+		
+	itf->itf_flags &= ~ITF_WIFI;
+	____itf_get_name(itf, ifname, IFNAMSIZ);
+
+	cmm_print(DEBUG_INFO, "%s: %s  index:%d\n", __func__, ifname, itf->ifindex);
+	//strncpy(pwrq.ifr_name, ifname, IFNAMSIZ);
+	
+	//if( ioctl(fd, SIOCGIWMODE, &pwrq) < 0 )
+	//{
+	//	return;
+	//}
+
+	for( ii = 0; ii < MAX_WIFI_FF_IFS; ii++ )
+	{
+		if ( glbl_wifi_ff_ifs[ii].used  )
+			if( !strcmp(glbl_wifi_ff_ifs[ii].ifname, ifname) )
+			{
+				cmm_print(DEBUG_INFO, "%s: wifi if is up %s \n", __func__, itf->ifname);
+				cmm_print(DEBUG_INFO, "%s: mac:%s:%d %x:%x:%x:%x:%x:%x \n", __func__, 
+					itf->ifname, itf->macaddr_len, itf->macaddr[0], itf->macaddr[1], 
+					itf->macaddr[2],itf->macaddr[3],itf->macaddr[4],itf->macaddr[5]  );
+
+				itf->itf_flags |= ITF_WIFI;
+				itf->wifi_if = &glbl_wifi_ff_ifs[ii];
+				memcpy(glbl_wifi_ff_ifs[ii].macaddr, itf->macaddr, 6);
+			}
+	}
+	
+	return;		
+}
+
+static int cmmResetVWD()
+{
+        vwd_cmd_t cmd;
+	int sfd;
+
+        memset(&cmd, 0, sizeof(cmd));
+	sfd = open(WIFI_FF_MASTER_IF, O_RDONLY);
+
+	if ( sfd <= 0 )
+	{
+		cmm_print(DEBUG_ERROR, "%s: failed to open vwd device: %s\n", __func__, strerror(errno));
+		return -1;
+	}
+
+        cmd.action = FPP_VWD_VAP_RESET;
+
+        if ( ioctl(sfd, SIOCVAPUPDATE, &cmd) < 0)
+        {
+		close(sfd);
+		cmm_print(DEBUG_ERROR, "%s::%d: ioctl() %s\n", __func__, __LINE__, strerror(errno));
+                return -1;
+        }
+
+	close(sfd);
+
+        return 0;
+}
+
+static int cmmUpdateVWD(struct interface *itf, int req)
+{
+        vwd_cmd_t cmd;
+       // struct ifreq ifr;
+	int sfd;
+
+        memset(&cmd, 0, sizeof(cmd));
+
+	sfd = open(WIFI_FF_MASTER_IF, O_RDONLY);
+	
+	if ( sfd <= 0 )
+	{
+        	cmm_print(DEBUG_ERROR, "%s: failed to open vwd device: %s\n", __func__, strerror(errno));
+		return -1;
+	}
+
+        cmd.action = req;
+        cmd.ifindex = itf->ifindex;
+        memcpy( cmd.ifname, itf->ifname, 12);
+        memcpy( cmd.macaddr, itf->macaddr, 6);
+	
+	cmd.vap_id = itf->wifi_if->vapid;	
+	cmd.direct_path_rx = itf->wifi_if->direct_path_rx;	
+        cmm_print(DEBUG_INFO, "%s: mac:%s:%d %x:%x:%x:%x:%x:%x \n", __func__,
+                                        itf->ifname, itf->ifindex, itf->macaddr[0], itf->macaddr[1],
+                                       itf->macaddr[2],itf->macaddr[3],itf->macaddr[4],itf->macaddr[5]  );
+
+        if ( ioctl(sfd, SIOCVAPUPDATE, &cmd) < 0)
+        {
+		close(sfd);
+                cmm_print(DEBUG_ERROR, "%s::%d: ioctl() %s\n", __func__, __LINE__, strerror(errno));
+                return -1;
+        }
+
+	close(sfd);
+
+        return 0;
+}
+
+
+
+
+int cmmFeWiFiUpdate(FCI_CLIENT *fci_handle, int fd, int request, struct interface *itf)
+{
+	struct fpp_wifi_cmd cmd;
+        short ret = 0;
+        int action;
+
+	switch (request)
+	{
+	default:
+	case ADD:
+		if ((itf->flags & (FPP_PROGRAMMED | FPP_NEEDS_UPDATE)) == FPP_PROGRAMMED)
+			goto out;
+
+		if ((itf->flags & (FPP_PROGRAMMED | FPP_NEEDS_UPDATE)) == (FPP_PROGRAMMED | FPP_NEEDS_UPDATE))
+		{
+			cmm_print(DEBUG_ERROR, "%s: trying to update wifi interface(%d)\n", __func__, itf->ifindex);
+			ret = -1;
+			goto out;
+		}
+		cmmFeWiFiGetBridge( fci_handle,  fd, itf );
+
+		action = FPP_VWD_VAP_ADD;
+
+		break;
+
+	case UPDATE:
+		if (!(itf->flags & FPP_PROGRAMMED))
+		{
+			cmm_print(DEBUG_ERROR, "%s: trying to update non FF iface(%s)\n", __func__, itf->ifname);
+			goto out;
+		}            
+
+		action = FPP_VWD_VAP_UPDATE;
+
+		break;
+
+	case REMOVE:
+		if (!(itf->flags & FPP_PROGRAMMED))
+		{
+			cmm_print( DEBUG_ERROR, "%s: Called remove, but not programmed\n", __func__);
+			goto out;
+		}
+
+		action = FPP_VWD_VAP_REMOVE;
+		
+		break;
+	}
+	
+	cmd.action = action;
+	cmd.vap_id = itf->wifi_if->vapid;	
+	
+	if (____itf_get_name(itf, cmd.ifname, sizeof(cmd.ifname)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: ____itf_get_name(%d) failed\n", __func__, itf->ifindex);
+
+		goto out;
+	}
+        
+	memcpy( cmd.mac_addr, itf->macaddr, 6);
+	
+        //cmm_print(DEBUG_ERROR, "%s: mac:%s:%d %x:%x:%x:%x:%x:%x \n", __func__,
+        //                                cmd.ifname, cmd.vap_id,cmd.mac_addr[0], cmd.mac_addr[1],
+        //                                cmd.mac_addr[2],cmd.mac_addr[3],cmd.mac_addr[4],cmd.mac_addr[5]  );
+	//Send VAP entry command to FPP
+	ret = fci_write(fci_handle, FPP_CMD_WIFI_VAP_ENTRY, 
+				sizeof(fpp_wifi_cmd_t), (unsigned short *) &cmd); 
+
+	if ( ret != FPP_ERR_OK )
+	{	
+		cmm_print(DEBUG_ERROR, "%s: Failed command FPP_CMD_WIFI_VAP_ENTRY, action:error %d:%d\n",
+                         __func__, action, ret);
+		goto out;
+	}
+
+
+	if( ! cmmUpdateVWD(itf, action) )
+	{
+		switch (action)
+		{
+			case FPP_VWD_VAP_UPDATE:
+			case FPP_VWD_VAP_ADD:
+				itf->flags |= FPP_PROGRAMMED;
+				itf->flags &= ~FPP_NEEDS_UPDATE;
+				break;
+
+			case FPP_VWD_VAP_REMOVE:
+				itf->flags &= ~FPP_PROGRAMMED;
+				itf->flags &= ~FPP_NEEDS_UPDATE;
+				break;
+			
+	
+		}
+	}
+ 	
+
+out:
+	return ret;
+	
+}
+
+
+int cmmFeWiFiBridgeUpdate( FCI_CLIENT *fci_handle, int fd, int request, struct interface *bitf)
+{
+	struct list_head *entry;
+	struct interface *itf;
+	short ret = 0;
+	int i, j;
+	/* Search through interface table if there are any
+ 	 * WiFi interface and they are part of bridge then 
+ 	 * update the WiFi interfce in FPP with bridge MAC 
+ 	 * MAC address.
+ 	 */    
+
+	for (i = 0; i < ITF_HASH_TABLE_SIZE; i++)
+	{
+		for (entry = list_first(&itf_table.hash[i]); entry != &itf_table.hash[i]; entry = list_next(entry))
+		{
+			itf = container_of(entry, struct interface, list);
+
+			if (!__itf_is_wifi(itf))
+				continue;
+		
+			for( j = 0; j < MAX_PORTS; j++ )
+			{
+				//cmm_print(DEBUG_ERROR, "%s: index: %d:%d\n ", __func__, 
+				//bitf->ifindices[j], itf->ifindex );	 
+				if(bitf->ifindices[j] == itf->ifindex )	 
+					break;
+			}
+		
+			
+			if( (j < MAX_PORTS) && (itf->flags & FPP_PROGRAMMED) && __itf_is_up(itf) )
+			{
+				cmm_print(DEBUG_INFO, "%s: wifi mac: %x:%x:%x:%x:%x:%x  bridge mac: %x:%x:%x:%x:%x:%x\n ", __func__, 
+					itf->macaddr[0], itf->macaddr[1], itf->macaddr[2],
+                                        itf->macaddr[3],itf->macaddr[4],itf->macaddr[5],
+					bitf->macaddr[0], bitf->macaddr[1], bitf->macaddr[2],
+                                        bitf->macaddr[3],bitf->macaddr[4],bitf->macaddr[5]
+					  );
+				
+				if ( (itf->macaddr[0] ^  bitf->macaddr[0]) ||
+					(itf->macaddr[1] ^  bitf->macaddr[1]) ||
+					(itf->macaddr[2] ^  bitf->macaddr[2]) ||
+					(itf->macaddr[3] ^  bitf->macaddr[3]) ||
+					(itf->macaddr[4] ^  bitf->macaddr[4]) ||
+					(itf->macaddr[5] ^  bitf->macaddr[5]) ) 
+				{
+					memcpy( itf->macaddr, bitf->macaddr, 6 );
+					ret = cmmFeWiFiUpdate(fci_handle, fd, UPDATE, itf);
+					
+				}
+			}
+		}
+	}
+
+	return ret;
+}
+
+static int cmmFeWiFiGetBridge( FCI_CLIENT *fci_handle, int fd, struct interface *witf )
+{
+	struct list_head *entry;
+	struct interface *itf;
+	int i, j;
+
+	/* Search through interface table if there are any
+ 	 * bridge interface and it has given WiFi interface 
+ 	 * as one of its port and they are part of bridge then 
+ 	 * update the WiFi interfce in FPP with bridge MAC 
+ 	 * MAC address.
+ 	 */    
+
+	for (i = 0; i < ITF_HASH_TABLE_SIZE; i++)
+	{
+		for (entry = list_first(&itf_table.hash[i]); entry != &itf_table.hash[i]; entry = list_next(entry))
+		{
+			itf = container_of(entry, struct interface, list);
+
+			if (!__itf_is_bridge(itf->ifindex))
+				continue;
+		
+			for( j = 0; j < MAX_PORTS; j++ )
+			{
+				//cmm_print(DEBUG_ERROR, "%s: index: %d:%d\n ", __func__, 
+				//bitf->ifindices[j], itf->ifindex );	 
+				if(itf->ifindices[j] == witf->ifindex )	 
+					break;
+			}
+		
+			
+			if( (j < MAX_PORTS) &&  __itf_is_up(witf) )
+			{
+				cmm_print(DEBUG_INFO, "%s: wifi mac: %x:%x:%x:%x:%x:%x  bridge mac: %x:%x:%x:%x:%x:%x\n ", __func__, 
+					witf->macaddr[0], witf->macaddr[1], witf->macaddr[2],
+                                        witf->macaddr[3],witf->macaddr[4],witf->macaddr[5],
+					itf->macaddr[0], itf->macaddr[1], itf->macaddr[2],
+                                        itf->macaddr[3],itf->macaddr[4],itf->macaddr[5]
+					  );
+				
+				if ( (itf->macaddr[0] ^  witf->macaddr[0]) ||
+					(itf->macaddr[1] ^  witf->macaddr[1]) ||
+					(itf->macaddr[2] ^  witf->macaddr[2]) ||
+					(itf->macaddr[3] ^  witf->macaddr[3]) ||
+					(itf->macaddr[4] ^  witf->macaddr[4]) ||
+					(itf->macaddr[5] ^  witf->macaddr[5]) ) 
+				{
+					memcpy( witf->macaddr, itf->macaddr, 6 );
+					
+				}
+			}
+
+		}
+	}
+
+	return 0;
+}
+
+/*****************************************************************
+* cmmWiFiReset
+* 
+*
+*
+******************************************************************/
+void cmmWiFiReset(FCI_CLIENT *fci_handle)
+{
+	struct list_head *entry;
+	struct interface *itf;
+	short ret;
+	int i;
+
+	// Send message to forward engine
+	cmm_print(DEBUG_COMMAND, "Send CMD_WIFI_VAP_RESET\n");
+
+	__pthread_mutex_lock(&itf_table.lock);
+
+	ret = fci_write(fci_handle, FPP_CMD_WIFI_VAP_RESET, 0, NULL); 
+	if (ret == FPP_ERR_OK)
+	{
+		if (cmmResetVWD())
+			cmm_print(DEBUG_ERROR, "%s: Failed to reset VAPs with VWD\n", __func__);
+
+		for (i = 0; i < ITF_HASH_TABLE_SIZE; i++)
+		{
+			for (entry = list_first(&itf_table.hash[i]); entry != &itf_table.hash[i]; entry = list_next(entry))
+			{
+				itf = container_of(entry, struct interface, list);
+
+				if (!__itf_is_wifi(itf))
+					continue;
+
+				itf->flags &= ~FPP_PROGRAMMED;
+			}
+		}
+	}
+	else
+	{
+		cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_WIFI_VAP_RESET\n", __func__, ret);
+	}
+
+	__pthread_mutex_unlock(&itf_table.lock);
+}
+
+#endif //WIFI_ENABLE
diff --git a/cmm/src/module_wifi.h b/cmm/src/module_wifi.h
new file mode 100644
index 0000000..c1b73f3
--- /dev/null
+++ b/cmm/src/module_wifi.h
@@ -0,0 +1,45 @@
+
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __MODULE_WIFI__
+#define __MODULE_WIFI__
+#include "itf.h"
+
+#define WIFI_FF_SYSCTL_PATH "/proc/sys/net/"
+#define WIFI_FF_SYSCTL_ENTRY "wifi_fast_path_enable"
+
+typedef struct vwd_cmd_s {
+	int32_t		action;
+	int32_t		ifindex;
+	int16_t		vap_id;
+	int16_t		direct_path_rx;
+	char		ifname[12];
+	u_int8_t	macaddr[6];
+} __attribute__((__packed__)) vwd_cmd_t;
+
+void __cmmGetWiFi(int fd, struct interface *itf);
+struct interface *cmmFeWiFiGetRootIf();
+int cmmFeWiFiUpdate(FCI_CLIENT *fci_handle, int fd, int request, struct interface *itf);
+int cmmFeWiFiEnable( FCI_CLIENT *fci_handle, int fd, struct interface *witf );
+int cmmFeWiFiDisable( FCI_CLIENT *fci_handle, int fd, struct interface *itf );
+int cmmFeWiFiBridgeUpdate( FCI_CLIENT *fci_handle, int fd, int request, struct interface *bitf);
+void cmmWiFiReset(FCI_CLIENT *fci_handle);
+
+#endif //__MODULE_WIFI__
diff --git a/cmm/src/neighbor_resolution.c b/cmm/src/neighbor_resolution.c
new file mode 100755
index 0000000..d6d57b8
--- /dev/null
+++ b/cmm/src/neighbor_resolution.c
@@ -0,0 +1,947 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
+#include <libnetfilter_conntrack/libnetfilter_conntrack_tcp.h>
+
+
+#undef NLMSG_TAIL
+#include <net/if.h>
+#include <net/if_arp.h>
+#include <linux/if_packet.h>
+#include <linux/if_ether.h>
+#include <netinet/icmp6.h>
+
+#include "cmm.h"
+#include "itf.h"
+#include "forward_engine.h"
+#include "neighbor_resolution.h"
+
+extern pthread_mutex_t tnlMutex;
+
+struct list_head neigh_table[2 * NEIGHBOR_HASH_TABLE_SIZE];
+struct list_head neigh_table_by_mac[NEIGHBOR_HASH_TABLE_SIZE];
+struct list_head neigh_state_table;
+
+pthread_mutex_t neighMutex = PTHREAD_MUTEX_INITIALIZER;
+
+static struct neighReq *neighReqHead = NULL;
+
+
+static int cmmNeighborNetlinkLookupAllFilter(const struct sockaddr_nl *nladdr, struct nlmsghdr *nlh, void *arg)
+{
+	int ifindex = *(int *)arg;
+	struct NeighborEntry *neigh;
+	struct ndmsg *ndm;
+	struct rtattr *attr;
+
+	if (nlh->nlmsg_type != RTM_NEWNEIGH) {
+		cmm_print(DEBUG_ERROR, "%s::%d: unexpected netlink message(%d)\n",
+					 __func__, __LINE__, nlh->nlmsg_type);
+
+		goto out;
+	}
+
+	ndm = NLMSG_DATA(nlh);
+
+	if (ndm->ndm_state & NUD_NOARP)
+		goto out;
+
+	if (ndm->ndm_ifindex != ifindex)
+		goto out;
+
+	attr = cmm_get_rtattr(NDA_RTA(ndm), NDA_PAYLOAD(nlh), NDA_DST);
+	if (!attr) {
+		cmm_print(DEBUG_ERROR, "%s::%d: rtnetlink message missing daddr\n", __func__, __LINE__);
+		goto out;
+	}
+
+	/* If an entry already exists then skip update,
+	it will be done through the listner thread. This is to avoid calling the ARP/Neighbor state machine from here */
+	neigh = __cmmNeighFind(ndm->ndm_family, RTA_DATA(attr), ifindex);
+	if (!neigh) {
+		neigh = __cmmNeighAdd(ndm->ndm_family, RTA_DATA(attr), ifindex);
+		if (!neigh) {
+			cmm_print(DEBUG_ERROR, "%s::%d: __cmmNeighAdd() failed\n", __func__, __LINE__);
+			goto out;
+		}
+	}
+	else
+		goto out;
+
+	/* Putting data in ArpEntry */
+	neigh->state = ndm->ndm_state;
+
+	if (neigh->state & NUD_VALID) {
+		int key;
+
+		attr = cmm_get_rtattr(NDA_RTA(ndm), NDA_PAYLOAD(nlh), NDA_LLADDR);
+
+		memcpy(neigh->macAddr, RTA_DATA(attr), RTA_PAYLOAD(attr));
+
+		key = HASH_MAC(neigh->macAddr);
+		list_add(&neigh_table_by_mac[key], &neigh->list_by_mac);
+	}
+	else
+		memset(neigh->macAddr, 0, ETH_ALEN);
+
+out:
+	return RTNL_CB_CONTINUE;
+}
+
+static int cmmNeighborNetlinkLookupAll(int family, int ifindex)
+{
+	struct rtnl_handle rth;
+	struct ndmsg ndm = {
+		.ndm_family = family,
+		.ndm_ifindex = 0,
+		.ndm_state = 0,
+		.ndm_flags = 0,
+		.ndm_type = 0,
+	};
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	if (cmm_rtnl_open(&rth, 0) < 0) {
+		cmm_print(DEBUG_ERROR, "%s::%d: netlink socket() %s\n", __func__, __LINE__, strerror(errno));
+		goto err0;
+	}
+
+	if (cmm_rtnl_dump_request(&rth, RTM_GETNEIGH, &ndm, sizeof(struct ndmsg)) < 0)
+		goto err1;
+
+	cmm_rtnl_listen(&rth, cmmNeighborNetlinkLookupAllFilter, &ifindex);
+
+	cmm_rtnl_close(&rth);
+
+	return 0;
+
+err1:
+	cmm_rtnl_close(&rth);
+
+err0:
+	return -1;
+}
+
+
+
+
+int cmmNeighAddSolicitQ(int family, int ifindex, unsigned int *dst_ip, unsigned char *dst_mac)
+{
+	struct neighReq *n;
+
+	n = (struct neighReq *)malloc(sizeof(struct neighReq));
+	if (!n) {
+		return -1;
+	}
+	
+	n->family = family;
+	n->ifindex = ifindex;
+	if (family == AF_INET)
+		n->dst_ip[0] = *dst_ip;
+	else
+		memcpy((unsigned char *)n->dst_ip, (unsigned char *)dst_ip, 16);
+	
+	if (dst_mac != NULL) {
+		memcpy(n->dst_mac, dst_mac, 6);
+		n->dst_mac_null=0;
+	}
+	else {
+		n->dst_mac_null=1;
+	}
+
+	if (neighReqHead != NULL)
+		n->next = neighReqHead;
+	else
+		n->next = NULL;
+
+	neighReqHead = n;
+	
+	return 0;
+}
+
+void cmmNeighSendSolicitQ(void)
+{
+	struct neighReq *n, *next;
+
+	if (neighReqHead == NULL)
+		return;
+	 
+	for(n = neighReqHead; n != NULL; n = next) {
+
+		if (n->family == AF_INET) {
+			cmmArpRequest(n->ifindex, n->dst_ip[0], 
+						n->dst_mac_null ? NULL : n->dst_mac);
+		}
+		else  {
+			cmmNeighborSolicitation(n->ifindex, n->dst_ip, 
+						n->dst_mac_null ? NULL : n->dst_mac);
+		}
+		
+		next = n->next;
+		free(n);
+	}
+	neighReqHead = NULL;
+
+	return;
+}
+
+
+
+
+
+#define MULTICAST_SOLICITED_NODE "FF02::1:FF00:0000"
+
+int cmmNeighborSolicitation(int ifindex, unsigned int *dst_ip, unsigned char *dst_mac)
+{
+	struct sockaddr_in6 sockaddr;
+	struct __attribute__((packed)) {
+		struct nd_neighbor_solicit hdr;
+		uint8_t nd_opt_type;
+		uint8_t nd_opt_len;
+		unsigned char src_mac[ETH_ALEN];
+	} neighbor;
+	int sockopt;
+	unsigned int multi_addr[4];
+	int fd;
+	int len;
+	int rc = -1;
+
+	/* dst_mac is NULL for multicast solicitations */
+	if(dst_mac == NULL)
+		inet_pton(AF_INET6, MULTICAST_SOLICITED_NODE, multi_addr);
+
+	fd = socket (AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
+	if (fd < 0) {
+		cmm_print(DEBUG_ERROR, "%s::%d: socket() %s\n", __func__, __LINE__, strerror(errno));
+		goto out;
+	}
+
+	memset(&sockaddr, 0, sizeof(struct sockaddr_in6));
+
+	sockaddr.sin6_family = AF_INET6;
+	sockaddr.sin6_scope_id = ifindex;
+
+	if (itf_get_ipaddr(ifindex, AF_INET6, RT_SCOPE_LINK, (unsigned int *)&sockaddr.sin6_addr.s6_addr32, dst_ip) < 0) {
+		cmm_print(DEBUG_ERROR, "%s::%d: itf_get_ipaddr(%d) failed\n", __func__, __LINE__, ifindex);
+		goto close;
+	}
+	
+
+	if (bind(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) < 0) {
+		cmm_print(DEBUG_ERROR, "%s::%d: bind() %s\n", __func__, __LINE__, strerror(errno));
+		goto close;
+	}
+
+	memset(&sockaddr, 0, sizeof(struct sockaddr_in6));
+	sockaddr.sin6_family = AF_INET6;
+	if(dst_mac == NULL)	{
+		memcpy(sockaddr.sin6_addr.s6_addr, multi_addr, sizeof(multi_addr));
+		memcpy(sockaddr.sin6_addr.s6_addr + 13, (unsigned char *)dst_ip + 13, 3);
+	}
+	else {
+		memcpy(sockaddr.sin6_addr.s6_addr, (unsigned char *)dst_ip, 16);
+	}
+	
+	memset(&neighbor.hdr, 0, sizeof(struct nd_neighbor_solicit));
+	neighbor.hdr.nd_ns_type = ND_NEIGHBOR_SOLICIT;
+	memcpy(&neighbor.hdr.nd_ns_target, dst_ip, 16);
+
+	neighbor.nd_opt_type = ND_OPT_SOURCE_LINKADDR;
+	neighbor.nd_opt_len = 1; /* 8 bytes */
+
+	if (itf_get_macaddr(ifindex, neighbor.src_mac) < 0) {
+		cmm_print(DEBUG_ERROR, "%s::%d: itf_get_macaddr(%d) failed\n", __func__, __LINE__, ifindex);
+		goto close;
+	}
+
+	sockopt = 255;
+	if(dst_mac == NULL)	{
+		if (setsockopt(fd, SOL_IPV6, IPV6_MULTICAST_HOPS, (char *) &sockopt, sizeof(sockopt)) < 0) {
+			cmm_print(DEBUG_ERROR, "%s::%d: setsockopt() %s\n", __func__, __LINE__, strerror(errno));
+			goto close;
+		}
+	}
+	else {
+		if (setsockopt(fd, SOL_IPV6, IPV6_UNICAST_HOPS, (char *) &sockopt, sizeof(sockopt)) < 0) {
+			cmm_print(DEBUG_ERROR, "%s::%d: setsockopt() %s\n", __func__, __LINE__, strerror(errno));
+			goto close;
+		}
+	}
+
+	len = sizeof(neighbor);
+	if (sendto(fd, &neighbor, len, 0, (struct sockaddr *) &sockaddr, sizeof(sockaddr)) < len) {
+		cmm_print(DEBUG_ERROR, "%s::%d: sendto() %s\n", __func__, __LINE__, strerror(errno));
+		goto close;
+	}
+
+	rc = 0;
+
+close:
+	close(fd);
+out:
+	return rc;
+}
+
+int cmmArpRequest(int ifindex, unsigned int dst_ip, unsigned char *dst_mac)
+{
+	struct sockaddr_ll sockaddr;
+	struct __attribute__((packed)) {
+		struct arphdr ah;
+		unsigned char src_mac[ETH_ALEN];
+		unsigned int src_ip;
+		unsigned char dst_mac[ETH_ALEN];
+		unsigned int dst_ip;
+	} arp;
+	unsigned int src_ip;
+	unsigned char src_mac[ETH_ALEN];
+	int fd;
+	int len;
+	int rc = -1;
+
+	fd = socket(PF_PACKET, SOCK_DGRAM, 0);
+	if (fd < 0) {
+		cmm_print(DEBUG_ERROR, "%s::%d: socket() %s\n", __func__, __LINE__, strerror(errno));
+		goto out;
+	}
+
+	memset(&sockaddr, 0, sizeof(struct sockaddr_ll));
+	sockaddr.sll_family = AF_PACKET;
+	sockaddr.sll_ifindex = ifindex;
+	sockaddr.sll_protocol = htons(ETH_P_ARP);
+
+	if (bind(fd, (struct sockaddr *) &sockaddr, sizeof(struct sockaddr_ll)) < 0) {
+		cmm_print(DEBUG_ERROR, "%s::%d: bind() %s\n", __func__, __LINE__, strerror(errno));
+		goto close;
+	}
+
+	memset(&sockaddr, 0, sizeof(struct sockaddr_ll));
+	sockaddr.sll_family = AF_PACKET;
+	sockaddr.sll_ifindex = ifindex;
+	sockaddr.sll_protocol = htons(ETH_P_ARP);
+	sockaddr.sll_halen = ETH_ALEN;
+
+	if (itf_get_ipaddr(ifindex, AF_INET, RT_SCOPE_UNIVERSE, &src_ip, &dst_ip) < 0) {
+		cmm_print(DEBUG_ERROR, "%s::%d: itf_get_ipaddr(%d) failed\n", __func__, __LINE__, ifindex);
+		goto close;
+	}
+
+	if (itf_get_macaddr(ifindex, src_mac) < 0) {
+		cmm_print(DEBUG_ERROR, "%s::%d: itf_get_macaddr(%d) failed\n", __func__, __LINE__, ifindex);
+		goto close;
+	}
+
+	if (!dst_mac)
+		/* broadcast */
+		memset(sockaddr.sll_addr, 0xFF, ETH_ALEN);
+	else
+		/* unicast */
+		memcpy(sockaddr.sll_addr, dst_mac, ETH_ALEN);
+
+	arp.ah.ar_hrd = htons(ARPHRD_ETHER);
+	arp.ah.ar_pro = htons(ETH_P_IP);
+	arp.ah.ar_hln = ETH_ALEN;
+	arp.ah.ar_pln = 4;
+	arp.ah.ar_op = htons(ARPOP_REQUEST);
+
+	memcpy(arp.src_mac, src_mac, ETH_ALEN);
+	memcpy(&arp.src_ip, &src_ip, 4);
+
+	if (!dst_mac)
+		memset(arp.dst_mac, 0, ETH_ALEN);
+	else
+		memcpy(arp.dst_mac, sockaddr.sll_addr, ETH_ALEN);
+
+	memcpy(&arp.dst_ip, &dst_ip, 4);
+
+	len = sizeof(arp);
+	if (sendto(fd, &arp, len, 0, (struct sockaddr *) &sockaddr, sizeof(struct sockaddr_ll)) < len) {
+		cmm_print(DEBUG_ERROR, "%s::%d: sendto() %s\n", __func__, __LINE__, strerror(errno));
+		goto close;
+	}
+
+	rc = 0;
+
+close:
+	close(fd);
+out:
+	return rc;
+}
+
+/*****************************************************************
+* __cmmNeighUpdateAllMacs
+*
+*
+******************************************************************/
+void __cmmNeighUpdateAllMacs(int ifindex, unsigned char *macAddr, int port)
+{
+	struct NeighborEntry *neigh;
+	struct list_head *entry;
+	int key;
+
+	key = HASH_MAC(macAddr);
+
+	entry = list_first(&neigh_table_by_mac[key]);
+
+	while (entry != &neigh_table_by_mac[key])
+	{
+		neigh = container_of(entry, struct NeighborEntry, list_by_mac);
+
+		if ((neigh->ifindex == ifindex) &&
+		    !memcmp(neigh->macAddr, macAddr, ETH_ALEN))
+			neigh->port = port;
+
+		entry = list_next(entry);
+	}
+}
+
+/*****************************************************************
+* __cmmNeighFind
+*
+*
+******************************************************************/
+struct NeighborEntry *__cmmNeighFind(int family, const unsigned int *ipAddr, int ifindex)
+{
+	struct NeighborEntry *neigh;
+	struct list_head *entry;
+	char buf[INET6_ADDRSTRLEN];
+	int key;
+	int ipAddrLen = IPADDRLEN(family);
+
+	cmm_print(DEBUG_INFO, "%s: Neighbor(%d, %s)\n", __func__, ifindex, inet_ntop(family, ipAddr, buf, sizeof(buf)));
+
+	key = HASH_NEIGHBOR(family, ipAddr);
+
+	entry = list_first(&neigh_table[key]);
+
+	while (entry != &neigh_table[key])
+	{
+		neigh = container_of(entry, struct NeighborEntry, list);
+		if (!memcmp(neigh->ipAddr, ipAddr, ipAddrLen) && neigh->ifindex == ifindex)
+			goto found;
+
+		entry = list_next(entry);
+	}
+
+	neigh = NULL;
+
+found:
+
+	return neigh;
+}
+
+
+/*****************************************************************
+* __cmmNeighRemove
+*
+*
+******************************************************************/
+
+/* NOTE: The neighMutex must be locked by the caller of this routine. */
+
+void __cmmNeighRemove(struct NeighborEntry *neigh)
+{
+	char buf[INET6_ADDRSTRLEN];
+
+	list_del(&neigh->list);
+
+	if (neigh->state & NUD_VALID)
+		list_del(&neigh->list_by_mac);
+
+	if (neigh->flags & NEEDS_SOLICIT)
+		list_del(&neigh->list_by_state);
+		
+	cmm_print(DEBUG_INFO, "%s: Neighbor(%d, %s) removed\n", __func__, neigh->ifindex, inet_ntop(neigh->family, neigh->ipAddr, buf, sizeof(buf)));
+
+	free(neigh);
+}
+
+/*****************************************************************
+* __cmmNeighPut
+*
+*
+******************************************************************/
+void __cmmNeighPut(struct NeighborEntry *neigh)
+{
+	char buf[INET6_ADDRSTRLEN];
+
+	cmm_print(DEBUG_INFO, "%s: Neighbor(%d, %s) put\n", __func__, neigh->ifindex, inet_ntop(neigh->family, neigh->ipAddr, buf, sizeof(buf)));
+
+	neigh->count--;
+
+	if (neigh->count <= 0)
+	{
+		__cmmNeighRemove(neigh);
+	}
+}
+
+
+/*****************************************************************
+* __cmmNeighAdd
+*
+*
+******************************************************************/
+struct NeighborEntry *__cmmNeighAdd(int family, const unsigned int *ipAddr, int ifindex)
+{
+	struct NeighborEntry *neigh;
+	char buf[INET6_ADDRSTRLEN];
+	int key;
+
+	neigh = malloc(sizeof(struct NeighborEntry));
+	if (!neigh)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: malloc() failed\n", __func__, __LINE__);
+		goto err0;
+	}
+
+	memset(neigh, 0, sizeof(struct NeighborEntry));
+
+	neigh->count = 0;
+	neigh->port = -1;
+	neigh->nr_probes = 0;
+	neigh->ifindex = ifindex;
+	neigh->ipAddrLen = IPADDRLEN(family);
+	neigh->family = family;
+	memcpy(neigh->ipAddr, ipAddr, neigh->ipAddrLen);
+
+	key = HASH_NEIGHBOR(family, ipAddr);
+
+	list_add(&neigh_table[key], &neigh->list);
+
+	cmm_print(DEBUG_INFO, "%s: Neighbor(%d, %s) added\n", __func__, ifindex, inet_ntop(family, ipAddr, buf, sizeof(buf)));
+
+	return neigh;
+
+err0:
+	return NULL;
+}
+
+
+/*****************************************************************
+* __cmmNeighGet
+*
+*
+******************************************************************/
+struct NeighborEntry *__cmmNeighGet(int family, const unsigned int *ipAddr, int ifindex)
+{
+	struct NeighborEntry *neigh;
+
+	neigh = __cmmNeighFind(family, ipAddr, ifindex);
+	if (!neigh)
+	{
+		if (cmmNeighborNetlinkLookupAll(family, ifindex) < 0)
+		{
+			cmm_print(DEBUG_ERROR, "%s::%d: cmmNeighborNetlinkLookupAll() failed\n", __func__, __LINE__);
+			goto err;
+		}
+
+		neigh = __cmmNeighFind(family, ipAddr, ifindex);
+		if (!neigh)
+			goto err;
+	}
+
+	neigh->count++;
+
+	return neigh;
+
+err:
+	return NULL;
+}
+
+
+/*****************************************************************
+* cmmNeighShow
+*
+*
+******************************************************************/
+int cmmNeighShow(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	int i;
+	struct NeighborEntry *temp;
+	struct list_head *entry;
+	char addr_buf[INET6_ADDRSTRLEN];
+	char mac_buf[MAC_ADDRSTRLEN];
+	char ifname[IFNAMSIZ];
+	int count;
+
+	cli_print(cli, "IPv4 ARP:");
+
+	count = 0;
+
+	for (i = 0; i < NEIGHBOR_HASH_TABLE_SIZE; i++)
+	{
+		__pthread_mutex_lock(&neighMutex);
+
+		for (entry = list_first(&neigh_table[i]); entry != &neigh_table[i]; entry = list_next(entry))
+		{
+			temp = container_of(entry, struct NeighborEntry, list);
+
+			cli_print(cli, "IP addr: %s --> MAC addr: %s If: %s, Port:%d, state: %x, Count: %d",
+				inet_ntop(AF_INET, temp->ipAddr, addr_buf, sizeof(addr_buf)),
+				mac_ntop(temp->macAddr, mac_buf, sizeof(mac_buf)),
+				if_indextoname(temp->ifindex, ifname),
+				temp->port,
+				temp->state,
+				temp->count);
+
+			count++;
+		}
+		__pthread_mutex_unlock(&neighMutex);
+	}
+
+	cli_print(cli, "Total ARP Entries: %d\n", count);
+
+	cli_print(cli, "IPv6 Neighbor:");
+
+	count = 0;
+
+	for (i = NEIGHBOR_HASH_TABLE_SIZE; i < 2 * NEIGHBOR_HASH_TABLE_SIZE; i++)
+	{
+		__pthread_mutex_lock(&neighMutex);
+		for (entry = list_first(&neigh_table[i]); entry != &neigh_table[i]; entry = list_next(entry))
+		{
+
+			temp = container_of(entry, struct NeighborEntry, list);
+
+			cli_print(cli, "IP addr: %s --> MAC addr: %s If: %s, Port: %d, state: %x, Count: %d",
+				inet_ntop(AF_INET6, temp->ipAddr, addr_buf, sizeof(addr_buf)),
+				mac_ntop(temp->macAddr, mac_buf, sizeof(mac_buf)),
+				if_indextoname(temp->ifindex, ifname),
+				temp->port,
+				temp->state,
+				temp->count);
+
+				count++;
+		}
+		__pthread_mutex_unlock(&neighMutex);
+	}
+
+	cli_print(cli, "Total Neighbor Entries: %d\n", count);
+
+	return CLI_OK;
+}
+
+
+/*****************************************************************
+* cmmNeighborResolved
+* 
+*
+******************************************************************/
+static void __cmmNeighborResolved(FCI_CLIENT *fci_handle, struct NeighborEntry *neigh)
+{
+	/* Process conntrack entries that use this neighbor */
+	struct RtEntry *route;
+	struct list_head *entry;
+	int key;
+
+	/* Force lookup of bridge port */
+	neigh->port = -1;
+
+	key = HASH_MAC(neigh->macAddr);
+	list_add(&neigh_table_by_mac[key], &neigh->list_by_mac);
+
+	key = HASH_NEIGHBOR(neigh->family, neigh->ipAddr);
+
+	entry = list_first(&rt_table_by_gw_ip[key]);
+	while (entry != &rt_table_by_gw_ip[key])
+	{
+		route = container_of(entry, struct RtEntry, list_by_gw_ip);
+		entry = list_next(entry);
+
+		if (route->neighEntry != neigh)
+			continue;
+
+		/* Force lookup of bridge port */
+		route->flags |= CHECK_BRIDGE_PORT;
+
+		__cmmCtUpdateWithRoute(fci_handle, route);
+
+		__cmmTunnelUpdateWithRoute(fci_handle, route);
+
+		__cmmSocketUpdateWithRoute(fci_handle, route);
+	}
+}
+
+/*****************************************************************
+* cmmNeighborUnresolved
+* 
+*
+******************************************************************/
+static void __cmmNeighborUnresolved(FCI_CLIENT *fci_handle, struct NeighborEntry *neigh)
+{
+	/* Process conntrack entries that use this neighbor */
+	struct RtEntry *route;
+	struct list_head *entry;
+	int key;
+
+	cmm_print(DEBUG_INFO, "%s: Remove ARP/Neighbor entry\n", __func__);
+
+	list_del(&neigh->list_by_mac);
+
+	/* Reset bridge port information, if any */
+	neigh->port = -1;
+
+	key = HASH_NEIGHBOR(neigh->family, neigh->ipAddr);
+
+	entry = list_first(&rt_table_by_gw_ip[key]);
+	while (entry != &rt_table_by_gw_ip[key])
+	{
+		route = container_of(entry, struct RtEntry, list_by_gw_ip);
+		entry = list_next(entry);
+
+		if (route->neighEntry != neigh)
+			continue;
+
+		/* Force lookup of bridge port */
+		route->flags |= CHECK_BRIDGE_PORT;
+
+		__cmmCtUpdateWithRoute(fci_handle, route);
+
+		__cmmTunnelUpdateWithRoute(fci_handle, route);
+
+		__cmmSocketUpdateWithRoute(fci_handle, route);
+	}
+}
+
+/*****************************************************************
+* cmmNeighborUpdate
+* 
+*
+******************************************************************/
+static int cmmNeighborUpdate(struct cmm_ct *ctx, const struct sockaddr_nl *who, struct nlmsghdr *n)
+{
+	char buf[INET6_ADDRSTRLEN];
+	struct ndmsg *r = NLMSG_DATA(n);
+	struct rtattr * tb [NDA_MAX + 1];
+	struct NeighborEntry *neigh;
+	unsigned int *ipAddr;
+	unsigned char *macAddr;
+	unsigned int macAddrLen;
+	unsigned short old_state;
+
+	/*Parse the message*/
+	cmm_parse_rtattr(tb, NDA_MAX, NDA_RTA(r), NDA_PAYLOAD(n));
+
+	/* Check if the event can interrest us*/
+	if (!tb[NDA_DST])
+		return 0;
+
+	if (r->ndm_state & NUD_NOARP)
+		return 0;
+
+	ipAddr = RTA_DATA(tb[NDA_DST]);
+
+	if (tb[NDA_LLADDR])
+	{
+		macAddr = RTA_DATA(tb[NDA_LLADDR]);
+		macAddrLen = RTA_PAYLOAD(tb[NDA_LLADDR]);
+	}
+	else
+	{
+		macAddr = NULL;
+		macAddrLen = 0;
+	}
+
+	/*Get the IP address in ascii*/
+	inet_ntop(r->ndm_family, ipAddr, buf, INET6_ADDRSTRLEN);
+	cmm_print(DEBUG_INFO, "%s: %s, state=%x\n", __func__, buf, r->ndm_state);
+
+	/*Try to find a corresponding entry in the ARP table*/
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&ctMutex);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+
+	neigh = __cmmNeighFind(r->ndm_family, ipAddr, r->ndm_ifindex);
+	if (!neigh)
+		goto out;
+
+	/* Update local entry */
+	old_state = neigh->state;
+	neigh->state = r->ndm_state;
+	cmm_print(DEBUG_INFO, "%s: old state = 0x%0x new state = 0x%0x\n", __func__, old_state, neigh->state);
+
+	if((r->ndm_state & NUD_REACHABLE) && (neigh->flags & NEEDS_SOLICIT))
+	{
+		neigh->flags &= ~NEEDS_SOLICIT;
+		neigh->nr_probes = 0;
+		list_del(&neigh->list_by_state);
+		cmm_print(DEBUG_INFO, "%s: Deleted Entry in Neighbor by state list \n", __func__);
+	}
+
+	if ((r->ndm_state & NUD_STALE) && (!(neigh->flags & NEEDS_SOLICIT)))
+	{
+		neigh->flags |= NEEDS_SOLICIT;
+		list_add(&neigh_state_table, &neigh->list_by_state);
+		cmm_print(DEBUG_INFO, "%s: Added Entry in Neighbor by state list \n", __func__);
+	}
+
+	/*In those states, the MAC address is usable*/
+	if (r->ndm_state & NUD_VALID)
+	{
+		cmm_print(DEBUG_INFO, "%s: Update ARP/Neighbor entry\n", __func__);
+
+		if (!(old_state & NUD_VALID))
+		{
+			memcpy(neigh->macAddr, macAddr, macAddrLen);
+
+			__cmmNeighborResolved(ctx->fci_handle, neigh);
+		}
+		else
+		{
+			if (memcmp(neigh->macAddr, macAddr, macAddrLen))
+			{
+				memcpy(neigh->macAddr, macAddr, macAddrLen);
+
+				list_del(&neigh->list_by_mac);
+
+				__cmmNeighborResolved(ctx->fci_handle, neigh);
+			}
+		}
+	}
+	else
+	{
+		memset(neigh->macAddr, 0, ETH_ALEN);
+
+		if (old_state & NUD_VALID)
+			__cmmNeighborUnresolved(ctx->fci_handle, neigh);
+	}
+
+out:
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+	return 0;
+}
+
+
+/*****************************************************************
+* cmmNeighThread
+*
+* Function that sends neighbor soliciations
+*
+******************************************************************/
+int cmmNeighSendSolicit(void)
+{
+	struct NeighborEntry *neigh;
+	struct list_head *entry;
+	struct list_head *next;
+
+	__pthread_mutex_lock(&neighMutex);
+	
+	for (entry = list_first(&neigh_state_table); entry != &neigh_state_table; entry = next)
+	{
+		next = list_next(entry);
+		
+		neigh = container_of(entry, struct NeighborEntry, list_by_state);
+
+		if(neigh->nr_probes < MAX_UCAST_SOLICIT )
+		{
+			if(cmmNeighAddSolicitQ(neigh->family, neigh->ifindex,
+						neigh->ipAddr, neigh->macAddr) == 0)
+				neigh->nr_probes++;
+		}
+		else if ((neigh->nr_probes >= MAX_UCAST_SOLICIT) && 
+				(neigh->nr_probes < (MAX_UCAST_SOLICIT + MAX_MCAST_SOLICIT)))
+		{
+			if(cmmNeighAddSolicitQ(neigh->family, neigh->ifindex,
+						neigh->ipAddr, NULL) == 0)
+				neigh->nr_probes++;
+		}
+		else
+		{
+			neigh->flags &= ~NEEDS_SOLICIT;
+			neigh->nr_probes = 0;
+			list_del(&neigh->list_by_state);
+			cmm_print(DEBUG_INFO, "%s: Deleted Entry in Neighbor by state list \n", __func__);
+		}
+		
+	}
+
+	__pthread_mutex_unlock(&neighMutex);
+
+	cmmNeighSendSolicitQ();
+
+	return 0;
+}
+
+/*****************************************************************
+* cmmNeighborGet
+* 
+*
+******************************************************************/
+static int cmmNeighborGet(struct cmm_ct *ctx, const struct sockaddr_nl *who, struct nlmsghdr *n)
+{
+	struct ndmsg *r = NLMSG_DATA(n);
+	char tab6[INET6_ADDRSTRLEN];
+	char ifname[IFNAMSIZ];
+	struct rtattr * tb [NDA_MAX + 1];
+
+	/* ARP request immediately done by CMM as Kernel waits 1 seconds before sending it */	
+	
+	/*Parse the message*/
+        cmm_parse_rtattr(tb, NDA_MAX, NDA_RTA(r), NDA_PAYLOAD(n));
+
+	inet_ntop(r->ndm_family, RTA_DATA(tb[NDA_DST]), tab6, INET6_ADDRSTRLEN);
+	cmm_print(DEBUG_INFO, "%s: %s(%s), state=%x\n", __func__, tab6, if_indextoname(r->ndm_ifindex, ifname), r->ndm_state);
+
+	/*IPv4 Neighbor*/
+	if (r->ndm_family == AF_INET)
+	{
+		cmmArpRequest(r->ndm_ifindex, *(unsigned int *)(RTA_DATA(tb[NDA_DST])), NULL);
+	}
+	else if(r->ndm_family == AF_INET6)
+	{
+		cmmNeighborSolicitation(r->ndm_ifindex, (unsigned int *)(RTA_DATA(tb[NDA_DST])), NULL);
+	}
+
+	// Return, 
+	return RTNL_CB_CONTINUE;
+}
+
+
+/*****************************************************************
+* cmmRtnlNeigh
+* 
+*
+******************************************************************/
+int cmmRtnlNeigh(const struct sockaddr_nl *who, struct nlmsghdr *nlh, void *arg)
+{
+	struct cmm_ct *ctx = arg;
+
+	switch (nlh->nlmsg_type) {
+	case RTM_GETNEIGH:
+		cmmNeighborGet(ctx, who, nlh);
+		break;
+
+	case RTM_NEWNEIGH:
+	case RTM_DELNEIGH:
+		cmmNeighborUpdate(ctx, who, nlh);
+		break;
+
+	default:
+		cmm_print(DEBUG_ERROR, "%s: unsupported NEIGH netlink message %x\n", __func__, nlh->nlmsg_type);
+		break;
+	}
+
+	return RTNL_CB_CONTINUE;
+}
diff --git a/cmm/src/neighbor_resolution.h b/cmm/src/neighbor_resolution.h
new file mode 100755
index 0000000..687cafb
--- /dev/null
+++ b/cmm/src/neighbor_resolution.h
@@ -0,0 +1,120 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __NEIGHBOR_H__
+#define __NEIGHBOR_H__
+
+#include <net/ethernet.h>
+
+#include "jhash.h"
+
+	#define APP_SOLICIT_IPV4_PATH "/proc/sys/net/ipv4/neigh/default/app_solicit"
+	#define APP_SOLICIT_IPV4_WAN_PATH "/proc/sys/net/ipv4/neigh/" WAN_INTERFACE_NAME "/app_solicit"
+	#define APP_SOLICIT_IPV4_LAN_PATH "/proc/sys/net/ipv4/neigh/" LAN_INTERFACE_NAME "/app_solicit"
+	#define APP_SOLICIT_IPV6_PATH "/proc/sys/net/ipv6/neigh/default/app_solicit"
+	#define APP_SOLICIT_IPV6_WAN_PATH "/proc/sys/net/ipv6/neigh/" WAN_INTERFACE_NAME "/app_solicit"
+	#define APP_SOLICIT_IPV6_LAN_PATH "/proc/sys/net/ipv6/neigh/" LAN_INTERFACE_NAME "/app_solicit"
+
+#ifndef NUD_VALID
+	#define NUD_VALID	(NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE|NUD_PROBE|NUD_STALE|NUD_DELAY)
+#endif
+
+	#define NEIGHBOR_HASH_TABLE_SIZE	2048
+
+	#define MAX_UCAST_SOLICIT 3
+	#define MAX_MCAST_SOLICIT 3
+	extern pthread_mutex_t neighMutex;
+
+	extern struct list_head neigh_table[2 * NEIGHBOR_HASH_TABLE_SIZE];
+	extern struct list_head neigh_table_by_mac[NEIGHBOR_HASH_TABLE_SIZE];
+	extern struct list_head neigh_state_table;
+
+	/*Structure representing  an arp/neighbor entry (internally to cmm)*/
+	struct NeighborEntry {
+		struct list_head list;
+		struct list_head list_by_state;
+
+		int count;						/*Number of time the arp is used*/
+
+		struct list_head list_by_mac;
+
+		unsigned char macAddr[ETH_ALEN];
+		unsigned int ipAddr[4];
+		unsigned short ipAddrLen;
+		unsigned short state;
+		int family;
+		int ifindex;
+		int port;
+		int flags;
+		int nr_probes;
+	};
+
+	struct neighReq {
+		struct neighReq *next;
+		int family;
+		int ifindex;
+		int dst_mac_null;
+		unsigned int dst_ip[4];
+		unsigned char dst_mac[6];
+	}; 
+
+	int cmmNeighborSolicitation(int ifindex, unsigned int *dst_ip, unsigned char *dst_mac);
+
+	int cmmArpRequest(int ifindex, unsigned int dst_ip, unsigned char *dst_mac);
+	
+	void __cmmNeighUpdateAllMacs(int ifindex, unsigned char *macAddr, int port);
+	struct NeighborEntry *__cmmNeighFind(int family, const unsigned int *ipAddr, int ifindex);
+	void __cmmNeighRemove(struct NeighborEntry *neigh);
+	void __cmmNeighPut(struct NeighborEntry *neigh);
+	struct NeighborEntry *__cmmNeighAdd(int family, const unsigned int *ipAddr, int ifindex);
+	struct NeighborEntry *__cmmNeighGet(int family, const unsigned int *ipAddr, int ifindex);
+
+	int cmmRtnlNeigh(const struct sockaddr_nl *who, struct nlmsghdr *nlh, void *arg);
+
+	int cmmNeighShow(struct cli_def * cli, char *command, char *argv[], int argc);
+
+
+static inline u_int32_t HASH_NEIGHBOR(int family, const u_int32_t *ipaddr)
+{
+	u_int32_t key;
+
+	if (family == AF_INET6)
+	{
+		key = ipaddr[0] ^ ipaddr[1] ^ ipaddr[2] ^ ipaddr[3];
+
+		return (jhash_1word(key, 0x12345678) & (NEIGHBOR_HASH_TABLE_SIZE - 1)) + NEIGHBOR_HASH_TABLE_SIZE;
+	}
+	else
+	{
+		key = ipaddr[0];
+
+		return (jhash_1word(key, 0x12345678) & (NEIGHBOR_HASH_TABLE_SIZE - 1));
+	}
+}
+
+static inline u_int32_t HASH_MAC(const u_int8_t *macaddr)
+{
+	u_int32_t key;
+
+	key = ((u_int32_t *)macaddr)[0] ^ ((u_int16_t *)macaddr)[2];
+
+	return (jhash_1word(key, 0x12345678) & (NEIGHBOR_HASH_TABLE_SIZE - 1));
+}
+
+#endif
diff --git a/cmm/src/pppoe.c b/cmm/src/pppoe.c
new file mode 100644
index 0000000..01dbad9
--- /dev/null
+++ b/cmm/src/pppoe.c
@@ -0,0 +1,483 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+#include <net/if.h>
+
+#include "cmm.h"
+#include "pppoe.h"
+#include "fpp.h"
+
+#if PPPOE_AUTO_ENABLE
+#include <sys/ioctl.h>
+#include <linux/ppp_defs.h>
+#include <linux/if_ppp.h>
+#endif
+
+#if PPPOE_AUTO_ENABLE
+	#define DEFAULT_AUTO_TIMEOUT    10  // in secs
+
+	#define PPPOE_AUTO_MODE         0x1
+
+	#define PPPIOCSFPPIDLE  _IOW('t', 53, struct ppp_idle)      /* Set the FPP stats */
+#endif
+
+
+/*****************************************************************
+* __cmmGetPPPoE
+*
+*
+******************************************************************/
+int __cmmGetPPPoESession(FILE *fp, struct interface* ppp_itf)
+{
+	char buf[256];
+	char phys_ifname[IFNAMSIZ];
+	char ifname[IFNAMSIZ];
+	unsigned char macaddr[ETH_ALEN];
+	unsigned int session_id;
+	struct interface *itf;
+	int ifindex;
+
+	if (fseek(fp, 0, SEEK_SET))
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: fseek() failed %s\n", __func__, __LINE__, strerror(errno));
+		goto err;
+	}
+
+	while (fgets(buf, sizeof(buf), fp))
+	{
+		// Id       Address              Device  PPPDevice
+		if (sscanf(buf, "%04X%hhx:%hhx:%hhx:%hhx:%hhx:%hhx%s%s", &session_id, &macaddr[0], &macaddr[1], &macaddr[2], &macaddr[3], &macaddr[4], &macaddr[5], phys_ifname, ifname) == 9)
+		{
+			ifindex = if_nametoindex(ifname);
+
+			itf = __itf_find(ifindex);
+			if (!itf)
+				continue;
+
+			if (!__itf_is_pppoe(itf))
+			{
+				cmm_print(DEBUG_ERROR, "%s::%d: not point to point interface %s\n", __func__, __LINE__, ifname);
+				continue;
+			}
+
+			if (!(itf->itf_flags & ITF_PPPOE_SESSION_UP))
+                        {
+                               itf->itf_flags  |= ITF_PPPOE_SESSION_UP;
+                        }
+
+
+			session_id &= 0xFFFF;
+
+			if (itf->session_id != session_id)
+			{
+				itf->flags |= FPP_NEEDS_UPDATE;
+				itf->session_id = session_id;
+			}
+
+			if (memcmp(itf->dst_macaddr, macaddr, 6))
+			{
+				itf->flags |= FPP_NEEDS_UPDATE;
+				memcpy(itf->dst_macaddr, macaddr, 6);
+			}
+
+			itf->phys_ifindex = if_nametoindex(phys_ifname);
+
+			cmm_print(DEBUG_INFO, "%s::%d: %s is pppoe\n", __func__, __LINE__, if_indextoname(itf->ifindex, ifname));
+		}
+	}
+
+#if PPPOE_AUTO_ENABLE
+        if ( !(ppp_itf->itf_flags & ITF_PPPOE_AUTO_MODE))
+        {
+                if(__itf_is_up(ppp_itf) && (!(ppp_itf->itf_flags & ITF_PPPOE_SESSION_UP)))
+                {
+                        cmm_print(DEBUG_INFO, "%s::%d: Setting PPP interface in auto mode (%d)\n", __func__, __LINE__, itf->ifindex);
+                        ppp_itf->itf_flags |= ITF_PPPOE_AUTO_MODE;
+                }
+        }
+#endif
+
+
+	return 0;
+
+err:
+	return -1;
+}
+
+
+/*****************************************************************
+* cmmFePPPoEUpdate
+*
+*
+******************************************************************/
+int cmmFePPPoEUpdate(FCI_CLIENT *fci_handle, int request, struct interface *itf)
+{
+	fpp_pppoe_cmd_t cmd;
+	short ret;
+	int action;
+
+	switch (request)
+	{
+	default:
+	case ADD:
+		if ((itf->flags & (FPP_PROGRAMMED | FPP_NEEDS_UPDATE)) == FPP_PROGRAMMED)
+			goto out;
+
+		if ((itf->flags & (FPP_PROGRAMMED | FPP_NEEDS_UPDATE)) == (FPP_PROGRAMMED | FPP_NEEDS_UPDATE))
+		{
+			cmm_print(DEBUG_ERROR, "%s: trying to update PPPoE interface(%d)\n", __func__, itf->ifindex);
+			goto err;
+		}
+
+		action = FPP_ACTION_REGISTER;
+
+		break;
+
+	case REMOVE:
+		if (!(itf->flags & FPP_PROGRAMMED))
+			goto out;
+
+		action = FPP_ACTION_DEREGISTER;
+
+		break;
+	}
+
+	memset(&cmd, 0, sizeof(cmd));
+
+	cmd.action = action;
+	memcpy(cmd.macaddr, itf->dst_macaddr, 6);
+	cmd.sessionid = itf->session_id;
+
+#if PPPOE_AUTO_ENABLE
+        if( itf->itf_flags & ITF_PPPOE_AUTO_MODE)
+                cmd.mode |= PPPOE_AUTO_MODE;
+#endif
+
+	if (____itf_get_name(itf, cmd.log_intf, sizeof(cmd.log_intf)) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: ____itf_get_name(%d) failed\n", __func__, itf->ifindex);
+
+		goto err;
+	}
+
+	switch (action)
+	{
+	case FPP_ACTION_REGISTER:
+		cmm_print(DEBUG_COMMAND, "Send CMD_PPPOE_ENTRY ACTION_REGISTER\n");
+
+		if (__itf_get_name(itf->phys_ifindex, cmd.phy_intf, sizeof(cmd.phy_intf)) < 0)
+		{
+			cmm_print(DEBUG_ERROR, "%s: __itf_get_name(%d) failed\n", __func__, itf->phys_ifindex);
+
+			goto err;
+		}
+
+		ret = fci_write(fci_handle, FPP_CMD_PPPOE_ENTRY, sizeof(fpp_pppoe_cmd_t), (unsigned short *) &cmd);
+		if ((ret == FPP_ERR_OK) || (ret == FPP_ERR_PPPOE_ENTRY_ALREADY_REGISTERED))
+		{
+			itf->flags |= FPP_PROGRAMMED;
+			itf->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_PPPOE_ENTRY, ACTION_REGISTER\n", __func__, ret);
+			goto err;
+		}
+
+		break;
+#if 0
+	case ACTION_UPDATE:
+		cmm_print(DEBUG_COMMAND, "Send CMD_PPPOE_ENTRY ACTION_UPDATE\n");
+
+		ret = fci_write(fci_handle, CMD_PPPOE_ENTRY, sizeof(struct PPPoECommand), (unsigned short *) &cmd);
+		if (ret == NO_ERR)
+		{
+			itf->flags &= ~FPP_NEEDS_UPDATE;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_PPPOE_ENTRY, ACTION_UPDATE\n", __func__, ret);
+			goto err;
+		}
+
+		break;
+#endif
+	case FPP_ACTION_DEREGISTER:
+	
+		cmm_print(DEBUG_COMMAND, "Send CMD_PPPOE_ENTRY ACTION_DEREGISTER\n");
+
+		ret = fci_write(fci_handle, FPP_CMD_PPPOE_ENTRY, sizeof(fpp_pppoe_cmd_t), (unsigned short *) &cmd);
+		if ((ret == FPP_ERR_OK) || (ret == FPP_ERR_PPPOE_ENTRY_NOT_FOUND))
+		{
+			itf->flags &= ~FPP_PROGRAMMED;
+		}
+		else
+		{
+			cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_PPPOE_ENTRY, ACTION_DEREGISTER\n", __func__, ret);
+			goto err;
+		}
+
+		break;
+
+	default:
+		cmm_print(DEBUG_ERROR, "%s: unknown CMD_PPPOE_ENTRY action %x\n", __func__, action);
+		break;
+	}
+
+out:
+	return 0;
+
+err:
+	return -1;
+}
+
+/*****************************************************************
+* cmmPPPoELocalShow
+*
+*
+******************************************************************/
+int cmmPPPoELocalShow(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	struct list_head *entry;
+	struct interface *itf;
+	char ifname[IFNAMSIZ], phys_ifname[IFNAMSIZ];
+	int i;
+
+	for (i = 0; i < ITF_HASH_TABLE_SIZE; i++)
+	{
+		__pthread_mutex_lock(&itf_table.lock);
+
+		for (entry = list_first(&itf_table.hash[i]); entry != &itf_table.hash[i]; entry = list_next(entry))
+		{
+			itf = container_of(entry, struct interface, list);
+
+			if (!__itf_is_pppoe(itf))
+				continue;
+
+			cli_print(cli, "PPP Device: %s, Session ID: %d, MAC addr: %02X:%02X:%02X:%02X:%02X:%02X, Physical Device: %s, Flags: %x, itf_flags: %x\n", if_indextoname(itf->ifindex, ifname), itf->session_id,
+				itf->dst_macaddr[0],
+				itf->dst_macaddr[1],
+				itf->dst_macaddr[2],
+				itf->dst_macaddr[3],
+				itf->dst_macaddr[4],
+				itf->dst_macaddr[5],
+				if_indextoname(itf->phys_ifindex, phys_ifname),
+				itf->flags , itf->itf_flags);
+		}
+
+		__pthread_mutex_unlock(&itf_table.lock);
+	}
+
+	return CLI_OK;
+}
+
+/*****************************************************************
+* cmmPPPoEQueryProcess
+*
+*
+******************************************************************/
+int cmmPPPoEQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	fpp_pppoe_cmd_t *command;
+	int count = 0;
+	char rcvBuffer[256];
+	int rcvBytes = 0;
+	short rc;
+
+	command = (fpp_pppoe_cmd_t *)rcvBuffer;
+        
+	command->action = FPP_ACTION_QUERY;
+
+	/* issue command */
+	rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_PPPOE_ENTRY, command, sizeof(fpp_pppoe_cmd_t), rcvBuffer);
+	if (rcvBytes < sizeof(fpp_pppoe_cmd_t)) {
+		rc = (rcvBytes < sizeof(unsigned short)) ? 0 : *((unsigned short *) rcvBuffer);
+		if (rc == FPP_ERR_UNKNOWN_ACTION) {
+			cmm_print(DEBUG_STDERR, "ERROR: FPP CMD_PPPoE_ENTRY does not support ACTION_QUERY\n");
+		} else if (rc == FPP_ERR_PPPOE_ENTRY_NOT_FOUND) {
+			cmm_print(DEBUG_STDERR, "ERROR: FPP PPPoE table empty\n");
+		} else {
+			cmm_print(DEBUG_STDERR, "ERROR: Unexpected result returned from FPP rc:%d\n", rc);
+		}
+
+		return CLI_OK;
+	}
+
+	do {
+		/* display entry received from FPP */
+		cmm_print(DEBUG_STDOUT, "PPP Device: %s, Session ID: %d, MAC addr: %02X:%02X:%02X:%02X:%02X:%02X, Physical Device: %s\n",
+				command->log_intf, command->sessionid,
+				command->macaddr[0],
+				command->macaddr[1],
+				command->macaddr[2],
+				command->macaddr[3],
+				command->macaddr[4],
+				command->macaddr[5],
+				command->phy_intf);
+
+		command->action = FPP_ACTION_QUERY_CONT;
+		count++;
+
+		rcvBytes = cmmSendToDaemon(daemon_handle, FPP_CMD_PPPOE_ENTRY, command, sizeof(fpp_pppoe_cmd_t), rcvBuffer);
+	} while (rcvBytes == sizeof(fpp_pppoe_cmd_t));
+
+	cmm_print(DEBUG_STDOUT, "PPPoE Entry Count: %d\n", count);
+
+	return CLI_OK;
+}
+
+#if PPPOE_AUTO_ENABLE
+
+int cmmPPPoEAutoGetIdle( struct interface* itf , unsigned long* rcv_sec , unsigned long* xmit_sec)
+{
+        struct PPPoEIdleTimeCmd cmd , *rcv_cmd;
+        int ret;
+        unsigned short rcvlen = 0;
+        unsigned char rcvbuf[256];
+
+        if (____itf_get_name(itf, cmd.ppp_if, sizeof(cmd.ppp_if)) < 0)
+        {
+                cmm_print(DEBUG_ERROR, "%s: ____itf_get_name(%d) failed\n", __func__, itf->ifindex);
+
+                goto err;
+        }
+        cmd.xmit_idle = 0;
+        cmd.recv_idle  = 0;
+
+        ret = fci_query(itf_table.fci_handle, CMD_PPPOE_GET_IDLE, sizeof(struct PPPoEIdleTimeCmd), (unsigned short *) &cmd, &rcvlen, (unsigned short*) &rcvbuf[0]);
+
+        if (ret != NO_ERR)
+                goto err;
+
+        rcv_cmd = (struct PPPoEIdleTimeCmd*) &rcvbuf[0];
+        *rcv_sec = rcv_cmd->recv_idle;
+        *xmit_sec = rcv_cmd->xmit_idle;
+        cmm_print(DEBUG_INFO, "%s: Received GET_IDLE time rcv: %d xmit: %d", __func__, rcv_cmd->recv_idle, rcv_cmd->xmit_idle);
+        return 0;
+
+err:
+        cmm_print(DEBUG_ERROR, "%s: Error %d while sending CMD_PPPOE_GET_IDLE\n", __func__, ret);
+
+        return -1;
+
+}
+
+int cmmPPPoEUpdateDriv(struct interface* itf, unsigned long rcv_sec, unsigned long xmit_sec)
+{
+        struct ppp_idle cmd;
+        unsigned char ifname[16];
+        int unit = -1;
+        int fd;
+
+        if (____itf_get_name(itf, ifname, sizeof(ifname)) < 0)
+        {
+                cmm_print(DEBUG_ERROR, "%s: ____itf_get_name(%d) failed\n", __func__, itf->ifindex);
+
+                goto err;
+        }
+
+        sscanf(ifname , "ppp%d", &unit);
+
+        if (unit < 0)
+                goto err;
+
+        cmm_print(DEBUG_INFO, "%s: cmmPPPoEUpdateDriv if unit is %d\n", __func__, unit);
+        fd = open ("/dev/ppp", O_RDWR);
+        if (fd < 0)
+        {
+                cmm_print(DEBUG_ERROR, "%s: ( open failed : %d) %s\n", __func__, unit, strerror(errno));
+                goto err;
+        }
+
+        if (ioctl (fd, PPPIOCATTACH, &unit) < 0)
+        {
+                cmm_print(DEBUG_ERROR, "%s: ioctl(PPPIOCATTACH, %d) %s\n", __func__, unit, strerror(errno));
+                close(fd);
+                goto err;
+        }
+        cmd.recv_idle = rcv_sec;
+        cmd.xmit_idle = xmit_sec;
+
+        if (ioctl (fd, PPPIOCSFPPIDLE, &cmd) < 0)
+        {
+                cmm_print(DEBUG_ERROR, "%s: ioctl(PPPIOCSFPPIDLE, %d) %s\n", __func__, unit, strerror(errno));
+                close(fd);
+                goto err;
+        }
+#if 0
+        if (ioctl (fd, PPPIOCDETACH, &unit) < 0)
+        {
+                cmm_print(DEBUG_ERROR, "%s: Couldn't attach to interface unit %d:\n", __func__, unit);
+                close(fd);
+                goto err;
+        }
+#endif
+
+        close(fd);
+        return 0;
+
+err:
+        return -1;
+}
+
+void cmmPPPoEAutoKeepAlive(void)
+{
+        static unsigned int gPPPoECurrAutoTimeout = 0;
+        struct list_head *entry;
+        static time_t last_pppoe = 0;
+        double dt;
+        time_t now;
+        unsigned long rcv_sec = 0,xmit_sec = 0;
+        struct interface* itf;
+        int i;
+
+        now = time(NULL);
+
+        dt = now - last_pppoe;
+
+        gPPPoECurrAutoTimeout += (unsigned int) dt;
+
+        if (gPPPoECurrAutoTimeout >= DEFAULT_AUTO_TIMEOUT)
+        {
+                __pthread_mutex_lock(&itf_table.lock);
+                for (i = 0; i < ITF_HASH_TABLE_SIZE; i++)
+                {
+                        entry = list_first(&itf_table.hash[i]);
+                        while (entry != &itf_table.hash[i])
+                        {
+                                itf = container_of(entry, struct interface, list);
+                                if ((itf->itf_flags & ITF_PPPOE_AUTO_MODE) && (itf->flags & FPP_PROGRAMMED))
+                                {
+                                        if (cmmPPPoEAutoGetIdle(itf, &rcv_sec, &xmit_sec) == 0)
+                                        {
+                                                cmm_print(DEBUG_INFO, "%s: rcv_sec: %ld: xmit_sec:%ld \n", __func__, rcv_sec, xmit_sec);
+                                                cmmPPPoEUpdateDriv(itf, rcv_sec,xmit_sec);
+                                        }
+
+                                }
+                                 entry = list_next(entry);
+                        }
+                }
+                __pthread_mutex_unlock(&itf_table.lock);
+                gPPPoECurrAutoTimeout = 0;
+
+        }
+        last_pppoe = now;
+}
+#endif
+
diff --git a/cmm/src/pppoe.h b/cmm/src/pppoe.h
new file mode 100644
index 0000000..b69af13
--- /dev/null
+++ b/cmm/src/pppoe.h
@@ -0,0 +1,34 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __PPPOE_H__
+#define __PPPOE_H__
+
+#include "itf.h"
+
+#define PPPOE_PATH "/proc/net/pppoe"
+
+	int __cmmGetPPPoESession(FILE *fp, struct interface* ifp);
+
+	int cmmFePPPoEUpdate(FCI_CLIENT *fci_handler, int action, struct interface *itf);
+	int cmmPPPoELocalShow(struct cli_def * cli, char *command, char *argv[], int argc);
+	int cmmPPPoEQueryProcess(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
+
+#endif
+
diff --git a/cmm/src/route_cache.c b/cmm/src/route_cache.c
new file mode 100644
index 0000000..d3fe968
--- /dev/null
+++ b/cmm/src/route_cache.c
@@ -0,0 +1,1336 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+#include "cmm.h"
+#include "route_cache.h"
+#include "itf.h"
+#include "ffbridge.h"
+#include <net/if.h>
+
+struct list_head rt_table[2 * ROUTE_HASH_TABLE_SIZE];
+struct list_head rt_table_by_gw_ip[2 * NEIGHBOR_HASH_TABLE_SIZE];
+
+struct list_head fpp_rt_table[ROUTE_HASH_TABLE_SIZE];
+
+static u_int32_t route_ids[ROUTE_MAX_ID / (8 * sizeof(u_int32_t))] = {0, };
+static u_int32_t route_id = 0;
+
+pthread_mutex_t rtMutex = PTHREAD_MUTEX_INITIALIZER;		/*mutex to prevent race condition on the route table*/
+extern unsigned short TunMtu;
+
+static int cmmRouteNetlinkLookupFilter(const struct sockaddr_nl *nladdr, struct nlmsghdr *nlh, void *arg)
+{
+	struct RtEntry *route = arg;
+	struct rtmsg *rtm;
+	struct rtattr *attr[RTA_MAX + 1];
+
+	if (nlh->nlmsg_type != RTM_NEWROUTE) {
+			cmm_print(DEBUG_ERROR, "%s::%d: unexpected netlink message(%d)\n",
+						 __func__, __LINE__, nlh->nlmsg_type);
+
+		goto err;
+	}
+
+	rtm = NLMSG_DATA(nlh);
+
+	cmm_parse_rtattr(attr, RTA_MAX, RTM_RTA(rtm), RTM_PAYLOAD(nlh));
+
+	if (!attr[RTA_DST] || !attr[RTA_OIF]) {
+		cmm_print(DEBUG_ERROR, "%s::%d: rtnetlink message missing mandatory attribute\n", __func__, __LINE__);
+		goto err;
+	}
+
+	route->family = rtm->rtm_family;
+	route->table = rtm->rtm_table;
+	route->scope = rtm->rtm_scope;
+	route->type = rtm->rtm_type;
+
+	route->mtu = 0;
+	if (attr[RTA_METRICS]) {
+		struct rtattr *mxrta;
+
+		mxrta = cmm_get_rtattr(RTA_DATA(attr[RTA_METRICS]), RTA_PAYLOAD(attr[RTA_METRICS]), RTAX_MTU);
+		if (mxrta)
+			route->mtu = *(unsigned int *)RTA_DATA(mxrta);
+	}
+
+	route->dAddrLen = RTA_PAYLOAD(attr[RTA_DST]);
+	memcpy(route->dAddr, RTA_DATA(attr[RTA_DST]), route->dAddrLen);
+
+	if (attr[RTA_GATEWAY]) {
+		route->gwAddrLen = RTA_PAYLOAD(attr[RTA_GATEWAY]);
+		memcpy(route->gwAddr, RTA_DATA(attr[RTA_GATEWAY]), route->gwAddrLen);
+	}
+	else
+	{
+		route->gwAddrLen = route->dAddrLen;
+		memcpy(route->gwAddr, route->dAddr, route->dAddrLen);
+	}
+
+	route->oifindex = *(int *)RTA_DATA(attr[RTA_OIF]);
+
+	/* Always stop parsing on first match */
+	return RTNL_CB_STOP;
+
+err:
+	return RTNL_CB_ERROR;
+}
+
+static int cmmRouteNetlinkLookup(struct flow *flow, struct RtEntry *route)
+{
+	struct rtnl_handle rth;
+	int ipAddrLen = IPADDRLEN(flow->family);
+	char iifname[IFNAMSIZ], oifname[IFNAMSIZ];
+	char buf1[INET6_ADDRSTRLEN], buf2[INET6_ADDRSTRLEN], buf3[INET6_ADDRSTRLEN];
+	char buf[256] __attribute__ ((aligned (4)));
+	struct nlmsghdr *nlh = (struct nlmsghdr *)buf;
+	struct rtmsg *rtm;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	if (cmm_rtnl_open(&rth, 0) < 0) {
+		cmm_print(DEBUG_ERROR, "%s::%d: cmm_rtnl_open() failed, %s\n", __func__, __LINE__, strerror(errno));
+		goto err0;
+	}
+
+	cmm_nlh_init(nlh, sizeof(struct rtmsg), RTM_GETROUTE, NLM_F_REQUEST);
+
+	rtm = NLMSG_DATA(nlh);
+	memset(rtm, 0, sizeof(struct rtmsg));
+	rtm->rtm_family = flow->family;
+
+	rtm->rtm_dst_len = ipAddrLen * 8;
+	rtm->rtm_table = RT_TABLE_UNSPEC;
+	rtm->rtm_protocol = RTPROT_UNSPEC;
+	rtm->rtm_scope = RT_SCOPE_UNIVERSE;
+	rtm->rtm_type = RTN_UNSPEC;
+
+	cmm_addattr_l(nlh, sizeof(buf), RTA_DST, flow->dAddr, ipAddrLen);
+
+	if (flow->sAddr)
+	{
+		cmm_addattr_l(nlh, sizeof(buf), RTA_SRC, flow->sAddr, ipAddrLen);
+		rtm->rtm_src_len = ipAddrLen * 8;
+	}
+	else
+		rtm->rtm_src_len = 0;
+
+	if (flow->iifindex)
+		cmm_addattr_l(nlh, sizeof(buf), RTA_IIF, &flow->iifindex, sizeof(int));
+
+        if (flow->fwmark)
+		cmm_addattr_l(nlh, sizeof(buf), RTA_FWMARK, &flow->fwmark, sizeof(unsigned int));
+
+	if (cmm_rtnl_send(&rth, nlh) < 0)
+		goto err1;
+
+	if (cmm_rtnl_listen(&rth, cmmRouteNetlinkLookupFilter, route) < 0)
+		goto err1;
+
+	route->fwmark = flow->fwmark;
+	route->iifindex = flow->iifindex;
+	route->sAddrLen = ipAddrLen;
+	memcpy(route->sAddr, flow->sAddr, route->sAddrLen);
+
+	cmm_print(DEBUG_INFO, "route entry: idev:%s saddr:%s fwmark:%08x daddr:%s gw:%s odev:%s mtu:%d\n",
+						if_indextoname(route->iifindex, iifname),
+						inet_ntop(route->family, route->sAddr, buf1, INET6_ADDRSTRLEN),
+						route->fwmark,
+						inet_ntop(route->family, route->dAddr, buf2, INET6_ADDRSTRLEN),
+						inet_ntop(route->family, route->gwAddr, buf3, INET6_ADDRSTRLEN),
+						if_indextoname(route->oifindex, oifname), route->mtu);
+
+	cmm_rtnl_close(&rth);
+
+	return 0;
+
+err1:
+	cmm_rtnl_close(&rth);
+
+err0:
+	return -1;
+}
+
+/*****************************************************************
+* __cmmRouteFind
+*
+*
+******************************************************************/
+struct RtEntry *__cmmRouteFind(struct flow *flow)
+{
+	struct RtEntry *route;
+	struct list_head *entry;
+	char sbuf[INET6_ADDRSTRLEN], dbuf[INET6_ADDRSTRLEN];
+	int key;
+	int ipAddrLen = IPADDRLEN(flow->family);
+
+	cmm_print(DEBUG_INFO, "%s: Route(%s, %s)\n", __func__, inet_ntop(flow->family, flow->sAddr, sbuf, sizeof(sbuf)),
+								inet_ntop(flow->family, flow->dAddr, dbuf, sizeof(dbuf)));
+
+	key = HASH_RT(flow->family, flow->sAddr, flow->dAddr);
+
+	entry = list_first(&rt_table[key]);
+	while (entry != &rt_table[key])
+	{
+		route = container_of(entry, struct RtEntry, list);
+		if (cmmRouteEqual(route, flow, ipAddrLen))
+		{
+			if (route->flags & INVALID)
+				route = NULL;
+
+			goto found;
+		}
+
+		entry = list_next(entry);
+	}
+
+	route = NULL;
+
+found:
+	return route;
+}
+
+
+static u_int32_t new_route_id(void)
+{
+	int offset, mask;
+
+	for (;;)
+	{
+		if (++route_id >= ROUTE_MAX_ID)
+			route_id = 1;
+
+		offset = route_id / (8 * sizeof(u_int32_t));
+		mask = 1 << (route_id & 0x1f);
+		if (!(route_ids[offset] & mask))
+			break;
+	}
+
+	route_ids[offset] |= mask;
+
+	return route_id;
+}
+
+static void del_route_id(u_int32_t route_id)
+{
+	int offset = route_id / (8 * sizeof(u_int32_t));
+	int mask = 1 << (route_id & 0x1f);
+
+	route_ids[offset] &= ~mask;
+}
+
+
+/*****************************************************************
+* __cmmRouteRemove
+*
+*
+******************************************************************/
+
+/* NOTE: The rtMutex must be locked by the caller of this routine. */
+
+void __cmmRouteRemove(struct RtEntry *route)
+{
+	char sbuf[INET6_ADDRSTRLEN], dbuf[INET6_ADDRSTRLEN];
+
+	cmm_print(DEBUG_INFO, "%s: Route(%s, %s) removed\n", __func__, inet_ntop(route->family, route->sAddr, sbuf, sizeof(sbuf)),
+									inet_ntop(route->family, route->dAddr, dbuf, sizeof(dbuf)));
+
+	if (!(route->flags & RT_POLICY))
+		list_del(&route->list);
+
+	list_del(&route->list_by_gw_ip);
+
+	free(route);
+}
+
+/*****************************************************************
+* __cmmRoutePut
+*
+*
+******************************************************************/
+void __cmmRoutePut(struct RtEntry *route)
+{
+	char sbuf[INET6_ADDRSTRLEN], dbuf[INET6_ADDRSTRLEN];
+
+	cmm_print(DEBUG_INFO, "%s: Route(%s, %s) put\n", __func__, inet_ntop(route->family, route->sAddr, sbuf, sizeof(sbuf)),
+								inet_ntop(route->family, route->dAddr, dbuf, sizeof(dbuf)));
+
+	route->count--;
+
+	if (route->count <= 0)
+	{
+		__cmmRouteRemove(route);
+	}
+}
+
+
+/*****************************************************************
+* __cmmRouteAdd
+*
+*
+******************************************************************/
+struct RtEntry *__cmmRouteAdd(struct flow *flow)
+{
+	struct RtEntry *route;
+	char sbuf[INET6_ADDRSTRLEN], dbuf[INET6_ADDRSTRLEN];
+	int key;
+#ifdef SAM_LEGACY
+	struct interface *itf = NULL;
+#endif
+
+	route = malloc(sizeof(struct RtEntry));
+	if (!route)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: malloc() failed\n", __func__, __LINE__);
+		goto err0;
+	}
+
+	memset(route, 0, sizeof(struct RtEntry));
+
+	route->count = 0;
+
+	/* Get Route information from kernel */
+	if (cmmRouteNetlinkLookup(flow, route) < 0)
+	{
+		cmm_print(DEBUG_WARNING, "%s::%d: cmmRouteNetlinkLookup() failed\n", __func__, __LINE__);
+		goto err1;
+	}
+
+#ifdef SAM_LEGACY
+	if(((itf = __itf_get(route->oifindex)) != NULL) && (____itf_is_4o6_tunnel(itf)))
+               route->mtu = TunMtu;
+#endif
+
+	key = HASH_RT(route->family, route->sAddr, route->dAddr);
+
+	list_add(&rt_table[key], &route->list);
+
+	key = HASH_NEIGHBOR(route->family, route->gwAddr);
+
+	list_add(&rt_table_by_gw_ip[key], &route->list_by_gw_ip);
+
+	cmm_print(DEBUG_INFO, "%s: Route(%s, %s) added\n", __func__, inet_ntop(route->family, route->sAddr, sbuf, sizeof(sbuf)),
+								inet_ntop(route->family, route->dAddr, dbuf, sizeof(dbuf)));
+
+	return route;
+
+err1:
+	free(route);
+
+err0:
+	return NULL;
+}
+
+
+/*****************************************************************
+* __cmmRouteGet
+*
+*
+******************************************************************/
+struct RtEntry *__cmmRouteGet(struct flow *flow)
+{
+	struct RtEntry *route;
+
+	route = __cmmRouteFind(flow);
+	if (!route)
+	{
+		route = __cmmRouteAdd(flow);
+		if (!route)
+			goto err;
+	}
+
+	route->count++;
+
+	return route;
+
+err:
+	return NULL;
+}
+
+/*****************************************************************
+* __cmmFPPRouteFind
+*
+*
+******************************************************************/
+struct fpp_rt *__cmmFPPRouteFind(int oifindex, const unsigned char *dst_mac, int mtu, const unsigned int *dst_addr, int dst_addr_len)
+{
+	struct fpp_rt *route;
+	char mac[MAC_ADDRSTRLEN];
+	struct list_head *entry;
+	int key;
+
+	cmm_print(DEBUG_INFO, "%s: Route(%d, %s)\n", __func__, oifindex, mac_ntop(dst_mac, mac, MAC_ADDRSTRLEN));
+
+	key = HASH_FPP_RT(oifindex, dst_mac);
+
+	entry = list_first(&fpp_rt_table[key]);
+	while (entry != &fpp_rt_table[key])
+	{
+		route = container_of(entry, struct fpp_rt, list);
+		if (!memcmp(route->dst_mac, dst_mac, ETH_ALEN) && (route->oifindex == oifindex) &&
+		    ((dst_addr_len == route->dst_addr_len) && (!dst_addr_len || !memcmp(route->dst_addr, dst_addr, dst_addr_len))))
+		{
+			goto found;
+		}
+
+		entry = list_next(entry);
+	}
+
+	route = NULL;
+
+found:
+	return route;
+}
+
+/*****************************************************************
+* __cmmFPPRouteRemove
+*
+*
+******************************************************************/
+
+/* NOTE: The rtMutex must be locked by the caller of this routine. */
+
+void __cmmFPPRouteRemove(struct fpp_rt *route)
+{
+	char mac[MAC_ADDRSTRLEN];
+
+	cmm_print(DEBUG_INFO, "%s: Route(%d, %s) removed\n", __func__, route->oifindex, mac_ntop(route->dst_mac, mac, MAC_ADDRSTRLEN));
+
+	list_del(&route->list);
+
+	del_route_id(route->id);
+
+	free(route);
+}
+
+/*****************************************************************
+* __cmmFPPRoutePut
+*
+*
+******************************************************************/
+void __cmmFPPRoutePut(struct fpp_rt *route)
+{
+	char mac[MAC_ADDRSTRLEN];
+
+	cmm_print(DEBUG_INFO, "%s: Route(%d, %s) put\n", __func__, route->oifindex, mac_ntop(route->dst_mac, mac, MAC_ADDRSTRLEN));
+
+	route->count--;
+
+	if (route->count <= 0)
+	{
+		__cmmFPPRouteRemove(route);
+	}
+}
+
+
+/*****************************************************************
+* __cmmFPPRouteAdd
+*
+*
+******************************************************************/
+struct fpp_rt *__cmmFPPRouteAdd(int oifindex, const unsigned char *dst_mac, int mtu, const unsigned int *dst_addr, int dst_addr_len)
+{
+	struct fpp_rt *route;
+	char mac[MAC_ADDRSTRLEN];
+	int key;
+
+	route = malloc(sizeof(struct fpp_rt));
+	if (!route)
+	{
+		cmm_print(DEBUG_ERROR, "%s::%d: malloc() failed\n", __func__, __LINE__);
+		goto err0;
+	}
+
+	memset(route, 0, sizeof(struct fpp_rt));
+
+	route->count = 0;
+
+	memcpy(route->dst_mac, dst_mac, ETH_ALEN);
+	route->oifindex = oifindex;
+	route->mtu = mtu;
+	if (dst_addr_len)
+	{
+		route->dst_addr_len = dst_addr_len;
+		memcpy(route->dst_addr, dst_addr, dst_addr_len);
+	}
+
+	/* For now just use the pointer as the unique id, should be improved later */
+	route->id = new_route_id();
+
+	key = HASH_FPP_RT(route->oifindex, route->dst_mac);
+
+	list_add(&fpp_rt_table[key], &route->list);
+
+	cmm_print(DEBUG_INFO, "%s: Route(%d, %s) added\n", __func__, route->oifindex, mac_ntop(route->dst_mac, mac, MAC_ADDRSTRLEN));
+
+	return route;
+
+	free(route);
+
+err0:
+	return NULL;
+}
+
+
+/*****************************************************************
+* __cmmFPPRouteGet
+*
+*
+******************************************************************/
+struct fpp_rt *__cmmFPPRouteGet(int oifindex, const unsigned char *dst_mac, int mtu, const unsigned int *dst_addr, int dst_addr_len)
+{
+	struct fpp_rt *route;
+
+	route = __cmmFPPRouteFind(oifindex, dst_mac, mtu, dst_addr, dst_addr_len);
+	if (!route)
+	{
+		route = __cmmFPPRouteAdd(oifindex, dst_mac, mtu, dst_addr, dst_addr_len);
+		if (!route)
+			goto err;
+	}
+
+	route->count++;
+
+	return route;
+
+err:
+	return NULL;
+}
+
+/*****************************************************************
+* cmmFPPRtShow
+*
+*
+******************************************************************/
+int cmmFPPRtShow(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	struct fpp_rt *route;
+	struct list_head *entry;
+	int i, n;
+	char mac_buf[MAC_ADDRSTRLEN], oifname[IFNAMSIZ];
+
+	cli_print(cli, "FPP Route:");
+
+	n = 0;
+	for (i = 0; i < ROUTE_HASH_TABLE_SIZE; i++)
+	{
+		__pthread_mutex_lock(&rtMutex);
+
+		for (entry = list_first(&fpp_rt_table[i]); entry != &fpp_rt_table[i]; entry = list_next(entry))
+		{
+//			char daddr_buf[INET_ADDRSTRLEN];
+
+			route = container_of(entry, struct fpp_rt, list);
+
+//			inet_ntop(AF_INET, &route->dst_addr, daddr_buf, sizeof(daddr_buf));
+
+			cli_print(cli, "OIf: %s, Mtu: %d, Mac: %s, Id: %d, Count: %d, Flags: %x",
+								if_indextoname(route->oifindex, oifname),
+								route->mtu,
+								mac_ntop(route->dst_mac, mac_buf, sizeof(mac_buf)),
+								route->id,
+								route->count, route->flags);
+
+			n++;
+		}
+
+		__pthread_mutex_unlock(&rtMutex);
+	}
+
+	if (n > 0)
+		cli_print(cli, "%d FPP Routes printed\n", n);
+
+	return CLI_OK;
+}
+
+
+/*****************************************************************
+* cmmRtShow
+*
+*
+******************************************************************/
+int cmmRtShow(struct cli_def * cli, char *command, char *argv[], int argc)
+{
+	struct RtEntry *route;
+	struct list_head *entry;
+	int i, n;
+	char iifname[IFNAMSIZ], oifname[IFNAMSIZ], phys_oifname[IFNAMSIZ];
+
+	cli_print(cli, "IPv4 Route:");
+
+	n = 0;
+	for (i = 0; i < ROUTE_HASH_TABLE_SIZE; i++)
+	{
+		__pthread_mutex_lock(&rtMutex);
+
+		for (entry = list_first(&rt_table[i]); entry != &rt_table[i]; entry = list_next(entry))
+		{
+			char saddr_buf[INET_ADDRSTRLEN], daddr_buf[INET_ADDRSTRLEN], gw_buf[INET_ADDRSTRLEN];
+
+			route = container_of(entry, struct RtEntry, list);
+
+			inet_ntop(AF_INET, &route->sAddr, saddr_buf, sizeof(saddr_buf));
+			inet_ntop(AF_INET, &route->dAddr, daddr_buf, sizeof(daddr_buf));
+			inet_ntop(AF_INET, &route->gwAddr, gw_buf, sizeof(gw_buf));
+
+			cli_print(cli, "IIf: %s, Mark: %08x, Src: %s, Dst: %s --> Gateway: %s, OIf: %s, PhysOif: %s, Count: %d",
+								if_indextoname(route->iifindex, iifname), route->fwmark,
+								saddr_buf, daddr_buf, gw_buf, if_indextoname(route->oifindex, oifname),
+								if_indextoname(route->phys_oifindex, phys_oifname), route->count);
+
+			n++;
+		}
+
+		__pthread_mutex_unlock(&rtMutex);
+	}
+
+	if (n > 0)
+		cli_print(cli, "%d IPv4 Routes printed\n", n);
+
+	cli_print(cli, "IPv6 Route:");
+
+	n = 0;
+	for (i = ROUTE_HASH_TABLE_SIZE; i < 2 * ROUTE_HASH_TABLE_SIZE; i++)
+	{
+		__pthread_mutex_lock(&rtMutex);
+		for (entry = list_first(&rt_table[i]); entry != &rt_table[i]; entry = list_next(entry))
+		{
+			char saddr_buf[INET6_ADDRSTRLEN], daddr_buf[INET6_ADDRSTRLEN], gw_buf[INET6_ADDRSTRLEN];
+
+			route = container_of(entry, struct RtEntry, list);
+
+			inet_ntop(AF_INET6, route->sAddr, saddr_buf, sizeof(saddr_buf));
+			inet_ntop(AF_INET6, route->dAddr, daddr_buf, sizeof(daddr_buf));
+			inet_ntop(AF_INET6, route->gwAddr, gw_buf, sizeof(gw_buf));
+
+			cli_print(cli, "IIf: %s, Mark: %08x, Src: %s, Dst: %s --> Gateway: %s, Oif: %s, PhysOif: %s, Count: %d",
+								if_indextoname(route->iifindex, iifname), route->fwmark,
+								saddr_buf, daddr_buf, gw_buf, if_indextoname(route->oifindex, oifname),
+								if_indextoname(route->phys_oifindex, phys_oifname), route->count);
+
+			n++;
+		}
+
+		__pthread_mutex_unlock(&rtMutex);
+	}
+
+	if (n > 0)
+		cli_print(cli, "%d IPv6 Routes printed\n", n);
+
+	return CLI_OK;
+}
+
+/*****************************************************************
+* __cmmCtTunnelRouteUpdate
+*
+*
+******************************************************************/
+static void __cmmCtTunnelRouteUpdate(FCI_CLIENT *fci_handle, struct ctTable *ctEntry, struct RtEntry *route, int dir)
+{
+	struct ct_route rt;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	if (dir == ORIGINATOR)
+		rt = ctEntry->orig_tunnel;
+	else
+		rt = ctEntry->rep_tunnel;
+
+	if (route->flags & INVALID)
+	{
+		if (dir == ORIGINATOR)
+		{
+			ctEntry->orig_tunnel.route = NULL;
+			ctEntry->orig_tunnel.fpp_route = NULL;
+
+			list_del(&ctEntry->list_by_orig_tunnel_route);
+		}
+		else
+		{
+			ctEntry->rep_tunnel.route = NULL;
+			ctEntry->rep_tunnel.fpp_route = NULL;
+
+			list_del(&ctEntry->list_by_rep_tunnel_route);
+		}
+	}
+	else
+	{
+		rt.route = NULL;
+
+		if (dir == ORIGINATOR)
+			ctEntry->orig_tunnel.fpp_route = NULL;
+		else
+			ctEntry->rep_tunnel.fpp_route = NULL;
+	}
+
+	____cmmCtRegister(fci_handle, ctEntry);
+
+	if (dir == ORIGINATOR)
+	 	__cmmRouteDeregister(fci_handle, &rt, "originator tunnel");
+	else
+		__cmmRouteDeregister(fci_handle, &rt, "replier tunnel");
+}
+
+/*****************************************************************
+* __cmmCtRouteUpdate
+*
+*
+******************************************************************/
+static void __cmmCtRouteUpdate(FCI_CLIENT *fci_handle, struct ctTable *ctEntry, struct RtEntry *route, int dir)
+{
+	struct ct_route rt;
+	struct ct_route tunnel_rt;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	if (dir == ORIGINATOR)
+	{
+		rt = ctEntry->orig;
+		tunnel_rt = ctEntry->orig_tunnel;
+
+		if (ctEntry->orig_tunnel.route)
+		{
+			ctEntry->orig_tunnel.route = NULL;
+			ctEntry->orig_tunnel.fpp_route = NULL;
+			list_del(&ctEntry->list_by_orig_tunnel_route);
+		}
+	}
+	else
+	{
+		rt = ctEntry->rep;
+		tunnel_rt = ctEntry->rep_tunnel;
+
+		if (ctEntry->rep_tunnel.route)
+		{			
+			ctEntry->rep_tunnel.route = NULL;
+			ctEntry->rep_tunnel.fpp_route = NULL;
+			list_del(&ctEntry->list_by_rep_tunnel_route);
+		}
+	}
+
+	if (route->flags & INVALID)
+	{
+		if (dir == ORIGINATOR)
+		{
+			ctEntry->orig.route = NULL;
+			ctEntry->orig.fpp_route = NULL;
+		}
+		else
+		{
+			ctEntry->rep.route = NULL;
+			ctEntry->rep.fpp_route = NULL;
+		}
+	}
+	else
+	{
+		rt.route = NULL;
+
+		if (dir == ORIGINATOR)
+			ctEntry->orig.fpp_route = NULL;
+		else
+			ctEntry->rep.fpp_route = NULL;
+	}
+
+	____cmmCtRegister(fci_handle, ctEntry);
+
+	if (dir == ORIGINATOR)
+	{
+		__cmmRouteDeregister(fci_handle, &rt, "originator");
+		__cmmRouteDeregister(fci_handle, &tunnel_rt, "originator tunnel");
+	}
+	else
+	{
+		__cmmRouteDeregister(fci_handle, &rt, "replier");
+		__cmmRouteDeregister(fci_handle, &tunnel_rt, "replier tunnel");
+	}
+}
+
+/*****************************************************************
+* __cmmTunnelRouteUpdate
+*
+*
+******************************************************************/
+static void __cmmTunnelRouteUpdate(FCI_CLIENT *fci_handle, struct interface *itf, struct RtEntry *route)
+{
+	struct ct_route rt = itf->rt;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	if (route->flags & INVALID)
+	{
+		itf->rt.route = NULL;
+		itf->rt.fpp_route = NULL;
+	}
+	else
+	{
+		rt.route = NULL;
+		itf->rt.fpp_route = NULL;
+	}
+
+	__tunnel_add(fci_handle, itf);
+
+	__cmmRouteDeregister(fci_handle, &rt, "tunnel");
+}
+
+
+/*****************************************************************
+* __cmmSocketRouteUpdate
+*
+*
+******************************************************************/
+static void __cmmSocketRouteUpdate(FCI_CLIENT *fci_handle, struct socket *s, struct RtEntry *route)
+{
+	struct ct_route rt = s->rt;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+	if (route->flags & INVALID)
+	{
+		s->rt.route = NULL;
+		s->rt.fpp_route = NULL;
+	}
+	else
+	{
+		rt.route = NULL;
+		s->rt.fpp_route = NULL;
+	}
+
+	__pthread_mutex_lock(&socket_lock);
+	__socket_open(fci_handle, s);
+	__pthread_mutex_unlock(&socket_lock);
+
+	__cmmRouteDeregister(fci_handle, &rt, "socket");
+}
+
+
+/*****************************************************************
+* __cmmRouteUpdate
+*
+*
+******************************************************************/
+static void __cmmRouteUpdate(FCI_CLIENT *fci_handle, struct RtEntry *route)
+{
+	struct RtEntry route_prev;
+	struct ctTable *ctEntry;
+	struct interface *itf;
+	struct socket *s;
+	struct list_head *entry;
+	struct NeighborEntry *neigh = NULL;
+	struct flow flow = {
+			.family = route->family,
+			.sAddr = route->sAddr,
+			.dAddr = route->dAddr,
+			.fwmark = route->fwmark,
+			.iifindex = route->iifindex,
+		};
+	int key;
+	int i;
+
+	cmm_print(DEBUG_INFO, "%s: Update route entry\n", __func__);
+
+	memcpy(&route_prev, route, sizeof(struct RtEntry));
+
+	if (cmmRouteNetlinkLookup(&flow, route) < 0)
+	{
+		cmm_print(DEBUG_INFO, "%s::%d: route was removed\n", __func__, __LINE__);
+
+		route->flags |= INVALID;
+
+		goto update;
+	}
+
+	if (memcmp(route->gwAddr, route_prev.gwAddr, route->gwAddrLen))
+	{
+		cmm_print(DEBUG_INFO, "%s::%d: route changed gateway address\n", __func__, __LINE__);
+
+		route->phys_oifindex = 0;
+
+		list_del(&route->list_by_gw_ip);
+
+		key = HASH_NEIGHBOR(route->family, route->gwAddr);
+
+		list_add(&rt_table_by_gw_ip[key], &route->list_by_gw_ip);
+
+		neigh = route->neighEntry;
+		route->neighEntry = NULL;
+
+		goto update;
+	}
+
+	if (route->oifindex != route_prev.oifindex)
+	{
+		cmm_print(DEBUG_INFO, "%s::%d: route changed output interface\n", __func__, __LINE__);
+
+		route->phys_oifindex = 0;
+
+		neigh = route->neighEntry;
+		route->neighEntry = NULL;
+
+		goto update;
+	}
+
+	if (route->mtu != route_prev.mtu)
+	{
+		cmm_print(DEBUG_INFO, "%s::%d: route changed mtu\n", __func__, __LINE__);
+
+		goto update;
+	}
+
+	return;
+
+update:
+	key = HASH_RT(route->family, route->sAddr, route->dAddr);
+
+	entry = list_first(&ct_table_by_orig_route[key]);
+	while (entry != &ct_table_by_orig_route[key])
+	{
+		ctEntry = container_of(entry, struct ctTable, list_by_orig_route);
+		entry = list_next(entry);
+		if (ctEntry->orig.route == route)
+			__cmmCtRouteUpdate(fci_handle, ctEntry, route, ORIGINATOR);
+	}
+
+	entry = list_first(&ct_table_by_rep_route[key]);
+	while (entry != &ct_table_by_rep_route[key])
+	{
+		ctEntry = container_of(entry, struct ctTable, list_by_rep_route);
+		entry = list_next(entry);
+		if (ctEntry->rep.route == route)
+			__cmmCtRouteUpdate(fci_handle, ctEntry, route, REPLIER);
+	}
+
+	/* Conntracks pointing to tunnel interface */
+	entry = list_first(&ct_table_by_orig_tunnel_route[key]);
+	while (entry != &ct_table_by_orig_tunnel_route[key])
+	{
+		ctEntry = container_of(entry, struct ctTable, list_by_orig_tunnel_route);
+		entry = list_next(entry);
+		if (ctEntry->orig_tunnel.route == route)
+			__cmmCtTunnelRouteUpdate(fci_handle, ctEntry, route, ORIGINATOR);
+	}
+
+	entry = list_first(&ct_table_by_rep_tunnel_route[key]);
+	while (entry != &ct_table_by_rep_tunnel_route[key])
+	{
+		ctEntry = container_of(entry, struct ctTable, list_by_rep_tunnel_route);
+		entry = list_next(entry);
+		if (ctEntry->rep_tunnel.route == route)
+			__cmmCtTunnelRouteUpdate(fci_handle, ctEntry, route, REPLIER);
+	}
+
+	/* Tunnel interfaces */
+	for (i = 0; i < ITF_HASH_TABLE_SIZE; i++)
+	{
+		for (entry = list_first(&itf_table.hash[i]); entry != &itf_table.hash[i]; entry = list_next(entry))
+		{
+			itf = container_of(entry, struct interface, list);
+
+			if (!__itf_is_tunnel(itf))
+				continue;
+
+			if (itf->rt.route == route)
+				__cmmTunnelRouteUpdate(fci_handle, itf, route);
+		}
+	}
+
+	/* Sockets */
+	for (i = 0; i < HASH_SOCKET_SIZE; i++)
+	{
+		for (entry = list_first(&socket_table[i]); entry != &socket_table[i]; entry = list_next(entry))
+		{
+			s = container_of(entry, struct socket, list);
+
+			if (s->rt.route == route)
+				__cmmSocketRouteUpdate(fci_handle, s, route);
+		}
+	}
+
+	if (neigh)
+		__cmmNeighPut(neigh);
+}
+
+/*****************************************************************
+* cmmRouteFlushCache 
+*
+*
+******************************************************************/
+static void cmmRouteFlushCache(int family)
+{
+	int fd;
+	const char buf[] = "0";
+
+	if (family == AF_INET)
+		fd = open("/proc/sys/net/ipv4/route/flush", O_WRONLY);
+	else
+		fd = open("/proc/sys/net/ipv6/route/flush", O_WRONLY);
+
+	if (fd < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: open() failed %s\n", __func__, strerror(errno));	
+		goto out;
+	}
+
+	write(fd, buf, sizeof(buf));
+
+	close(fd);
+
+out:
+	return;
+}
+
+/*****************************************************************
+* __cmmRouteNew
+*
+*
+******************************************************************/
+static void __cmmRouteNew(FCI_CLIENT *fci_handle, struct rtmsg *rtm, unsigned int *dAddr, int flushed)
+{
+	struct list_head *entry;
+	struct ctTable *ctEntry;
+	struct interface *itf;
+	const unsigned int *ct_daddr;
+	int i;
+
+	/* Look for connections waiting for a route */
+	for (i = 0; i < CONNTRACK_HASH_TABLE_SIZE; i++)
+	{
+		for (entry = list_first(&ct_table[i]); entry != &ct_table[i]; entry = list_next(entry))
+		{
+			unsigned int tunnel_daddr;
+
+			ctEntry = container_of(entry, struct ctTable, list);
+
+			if (ctEntry->family != rtm->rtm_family)
+				goto tunnel_originator;
+
+			if ((ctEntry->dir & ORIGINATOR) && (!ctEntry->orig.route))
+			{
+				if (ctEntry->family == AF_INET)
+					ct_daddr = nfct_get_attr(ctEntry->ct, ATTR_REPL_IPV4_SRC);
+				else
+					ct_daddr = nfct_get_attr(ctEntry->ct, ATTR_REPL_IPV6_SRC);
+
+				if (cmmPrefixEqual(ct_daddr, dAddr, rtm->rtm_dst_len))
+				{
+					if (!flushed)
+					{
+						cmmRouteFlushCache(rtm->rtm_family);
+						flushed = 1;
+					}
+
+					____cmmCtRegister(fci_handle, ctEntry);
+				}
+			}
+
+			if ((ctEntry->dir & REPLIER) && (!ctEntry->rep.route))
+			{
+				if (ctEntry->family == AF_INET)
+					ct_daddr = nfct_get_attr(ctEntry->ct, ATTR_ORIG_IPV4_SRC);
+				else
+					ct_daddr = nfct_get_attr(ctEntry->ct, ATTR_ORIG_IPV6_SRC);
+
+				if (cmmPrefixEqual(ct_daddr, dAddr, rtm->rtm_dst_len))
+				{
+					if (!flushed)
+					{
+						cmmRouteFlushCache(rtm->rtm_family);
+						flushed = 1;
+					}
+
+					____cmmCtRegister(fci_handle, ctEntry);
+				}
+			}
+
+		tunnel_originator:
+			/* Conntracks pointing to a tunnel interface */
+			if ((ctEntry->dir & ORIGINATOR) && ctEntry->orig.route &&
+			    !ctEntry->orig_tunnel.route)
+			{
+				itf = __itf_get(ctEntry->orig.route->oifindex);
+				if (!itf)
+					goto tunnel_replier;
+
+				if (!____itf_is_floating_sit_tunnel(itf))
+					goto tunnel_replier1;
+
+				if (itf->tunnel_family != rtm->rtm_family)
+					goto tunnel_replier1;
+
+				tunnel_daddr = tunnel_get_ipv4_dst(ctEntry->orig.route, itf);
+				if (!tunnel_daddr)
+					goto tunnel_replier1;
+
+				if (cmmPrefixEqual(&tunnel_daddr, dAddr, rtm->rtm_dst_len))
+				{
+					if (!flushed)
+					{
+						cmmRouteFlushCache(rtm->rtm_family);
+						flushed = 1;
+					}
+
+					____cmmCtRegister(fci_handle, ctEntry);
+				}
+
+			tunnel_replier1:
+				__itf_put(itf);
+			}
+
+		tunnel_replier:
+			if ((ctEntry->dir & REPLIER) && ctEntry->rep.route &&
+			    !ctEntry->rep_tunnel.route)
+			{
+				itf = __itf_get(ctEntry->rep.route->oifindex);
+				if (!itf)
+					continue;
+
+				if (!____itf_is_floating_sit_tunnel(itf))
+					goto next;
+
+				if (itf->tunnel_family != rtm->rtm_family)
+					goto next;
+
+				tunnel_daddr = tunnel_get_ipv4_dst(ctEntry->rep.route, itf);
+				if (!tunnel_daddr)
+					goto next;
+
+				if (cmmPrefixEqual(&tunnel_daddr, dAddr, rtm->rtm_dst_len))
+				{
+					if (!flushed)
+					{
+						cmmRouteFlushCache(rtm->rtm_family);
+						flushed = 1;
+					}
+
+					____cmmCtRegister(fci_handle, ctEntry);
+				}
+
+			next:
+				__itf_put(itf);
+			}
+		}
+	}
+	
+	/* Look for tunnels waiting for a route */
+	for (i = 0; i < ITF_HASH_TABLE_SIZE; i++)
+	{
+		for (entry = list_first(&itf_table.hash[i]); entry != &itf_table.hash[i]; entry = list_next(entry))
+		{
+			const unsigned int *tunnel_daddr;
+
+			itf = container_of(entry, struct interface, list);
+
+			if (!__itf_is_tunnel(itf))
+				continue;
+
+			if (itf->rt.route)
+				continue;
+
+			if (itf->tunnel_family != rtm->rtm_family)
+				continue;
+
+			if (itf->tunnel_family == AF_INET)
+				tunnel_daddr = &itf->tunnel_parm4.iph.saddr;
+			else
+				tunnel_daddr = itf->tunnel_parm6.raddr.s6_addr32;
+
+			if (cmmPrefixEqual(tunnel_daddr, dAddr, rtm->rtm_dst_len))
+			{
+				if (!flushed)
+				{
+					cmmRouteFlushCache(rtm->rtm_family);
+					flushed = 1;
+				}
+
+				__tunnel_add(fci_handle, itf);
+			}
+		}
+	}
+}
+
+
+/*****************************************************************
+* cmmRtnlRule
+* 
+*
+******************************************************************/
+int cmmRtnlRule(const struct sockaddr_nl *who, struct nlmsghdr *nlh, void *arg)
+{
+	struct fib_rule_hdr *frh;
+	struct rtattr *tb[FRA_MAX + 1];
+
+	switch (nlh->nlmsg_type) {
+	case RTM_NEWRULE:
+	case RTM_DELRULE:
+		break;
+
+	default:
+		cmm_print(DEBUG_ERROR, "%s: unsupported RULE netlink message %x\n", __func__, nlh->nlmsg_type);
+		goto out;
+		break;
+	}
+
+	frh = NLMSG_DATA(nlh);
+
+	cmm_parse_rtattr(tb, FRA_MAX, FRA_RTA(frh), FRA_PAYLOAD(nlh));
+
+	if (nlh->nlmsg_type == RTM_NEWRULE)
+	{
+		cmm_print(DEBUG_INFO, "%s: RTM_NEWRULE\n", __func__);
+	}
+	else
+	{
+		cmm_print(DEBUG_INFO, "%s: RTM_DELRULE\n", __func__);
+	}
+
+out:
+	return RTNL_CB_CONTINUE;
+}
+
+static unsigned int default_route[4] = { 0, };
+
+/*****************************************************************
+* cmmRtnlRoute
+* 
+*
+******************************************************************/
+int cmmRtnlRoute(const struct sockaddr_nl *who, struct nlmsghdr *nlh, void *arg)
+{
+	struct cmm_ct *ctx = arg;
+	struct rtmsg *rtm;
+	struct rtattr *tb[RTA_MAX + 1];
+	unsigned int *dAddr, *gwAddr;
+	char dst[INET6_ADDRSTRLEN];
+	char gateway[INET6_ADDRSTRLEN];
+	struct list_head *entry, *next_entry;
+	struct RtEntry *route;
+	int flushed = 1;
+	int i;
+
+	switch (nlh->nlmsg_type)
+	{
+	case RTM_NEWROUTE:
+	case RTM_DELROUTE:
+		break;
+
+	default:
+		cmm_print(DEBUG_ERROR, "%s: unsupported ROUTE netlink message %x\n", __func__, nlh->nlmsg_type);
+		goto out;
+		break;
+	}
+
+	rtm = NLMSG_DATA(nlh);
+
+	cmm_print(DEBUG_INFO, "%s: rtmsg family: %x, dst_len: %d, src_len: %d, tos: %x, table: %d, protocol: %d, scope: %d, type: %d, flags: %x\n", __func__,
+					rtm->rtm_family, rtm->rtm_dst_len,
+					rtm->rtm_src_len, rtm->rtm_tos, rtm->rtm_table,
+					rtm->rtm_protocol, rtm->rtm_scope,
+					rtm->rtm_type, rtm->rtm_flags);
+
+	/* Don't process local routes */
+	if (rtm->rtm_table == RT_TABLE_LOCAL)
+		goto out;
+
+	if (rtm->rtm_scope >= RT_SCOPE_HOST)
+		goto out;
+
+	/* Don't process multicast, broadcast routes */
+	if (rtm->rtm_type != RTN_UNICAST)
+		goto out;
+
+	cmm_parse_rtattr(tb, RTA_MAX, RTM_RTA(rtm), RTM_PAYLOAD(nlh));
+
+	if (!tb[RTA_DST])
+	{
+		if (rtm->rtm_dst_len)
+		{
+			cmm_print(DEBUG_ERROR, "%s: route missing destination address\n", __func__);
+			goto out;
+		}
+
+		dAddr = default_route;
+	}
+	else
+		dAddr = RTA_DATA(tb[RTA_DST]);
+
+	if (tb[RTA_GATEWAY])
+		gwAddr = RTA_DATA(tb[RTA_GATEWAY]);
+	else
+		gwAddr = dAddr;
+
+	if (nlh->nlmsg_type == RTM_NEWROUTE)
+	{
+		cmm_print(DEBUG_INFO, "%s: RTM_NEWROUTE %s/%d %s\n", __func__, inet_ntop(rtm->rtm_family, dAddr, dst, sizeof(dst)), rtm->rtm_dst_len, inet_ntop(rtm->rtm_family, gwAddr, gateway, sizeof(gateway)));
+	}
+	else
+	{
+		cmm_print(DEBUG_INFO, "%s: RTM_DELROUTE %s/%d %s\n", __func__, inet_ntop(rtm->rtm_family, dAddr, dst, sizeof(dst)), rtm->rtm_dst_len, inet_ntop(rtm->rtm_family, gwAddr, gateway, sizeof(gateway)));
+	}
+
+	/* Ignore all route cache events */
+	if(rtm->rtm_flags & RTM_F_CLONED)
+		goto out;
+
+	__pthread_mutex_lock(&itf_table.lock);
+	__pthread_mutex_lock(&ctMutex);
+	__pthread_mutex_lock(&rtMutex);
+	__pthread_mutex_lock(&neighMutex);
+	__pthread_mutex_lock(&flowMutex);
+
+	/* Don't flush the route cache if the event is generated by the cache itself  */
+	/* Route cache events are now disabled */
+
+	flushed = 0;
+
+	/* Look for connections/tunnels using this route */
+	for (i = 0; i < ROUTE_HASH_TABLE_SIZE * 2; i++)
+	{
+		for (entry = list_first(&rt_table[i]); next_entry = list_next(entry), entry != &rt_table[i]; entry = next_entry)
+		{
+			route = container_of(entry, struct RtEntry, list);
+
+			if (route->family != rtm->rtm_family)
+				continue;
+
+			if (cmmPrefixEqual(route->dAddr, dAddr, rtm->rtm_dst_len))
+			{
+				if (!flushed)
+				{
+					cmmRouteFlushCache(rtm->rtm_family);
+					flushed = 1;
+				}
+
+				__cmmRouteUpdate(ctx->fci_handle, route);
+			}
+		}
+	}
+
+	if (nlh->nlmsg_type == RTM_DELROUTE)
+		goto unlock;
+
+	__cmmRouteNew(ctx->fci_handle, rtm, dAddr, flushed);
+
+unlock:
+	__pthread_mutex_unlock(&flowMutex);
+	__pthread_mutex_unlock(&neighMutex);
+	__pthread_mutex_unlock(&rtMutex);
+	__pthread_mutex_unlock(&ctMutex);
+	__pthread_mutex_unlock(&itf_table.lock);
+
+out:
+	return RTNL_CB_CONTINUE;
+}
diff --git a/cmm/src/route_cache.h b/cmm/src/route_cache.h
new file mode 100644
index 0000000..87373ff
--- /dev/null
+++ b/cmm/src/route_cache.h
@@ -0,0 +1,168 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __ROUTE_CACHE_H__
+#define __ROUTE_CACHE_H__
+
+#include "jhash.h"
+
+	#define ROUTE_HASH_TABLE_SIZE	2048
+
+	#ifndef RTA_FWMARK
+	#define RTA_FWMARK 16
+	#endif
+
+	#define ROUTE_MAX_ID	0x10000
+
+	struct fpp_rt {
+		struct list_head list;
+
+		int oifindex;
+		unsigned short mtu;
+		unsigned char dst_mac[ETH_ALEN];
+		unsigned int dst_addr[4];
+		int dst_addr_len;
+
+		int count;
+
+		int flags;
+
+		int id;
+	};
+
+	/*Structure representing  a route (internally to cmm)*/
+	struct RtEntry {
+		struct list_head list;
+		struct list_head list_by_gw_ip;
+
+		int count;						/*Number of time the route is used*/
+
+		struct NeighborEntry *neighEntry;
+
+		unsigned int sAddr[4];
+		unsigned short sAddrLen;
+
+		unsigned int dAddr[4];
+		unsigned short dAddrLen;
+
+		int oifindex;
+		int phys_oifindex;
+
+		unsigned int gwAddr[4];
+		unsigned short gwAddrLen;
+
+		unsigned short mtu;
+		int family;
+
+		unsigned char table;
+		unsigned char scope;
+		unsigned char type;
+
+		int flags;
+
+		unsigned int fwmark;
+
+		int iifindex;
+	};
+
+	struct ct_route {
+		struct RtEntry	*route;
+		struct fpp_rt	*fpp_route;
+		int		fpp_route_id;
+	};
+
+	struct flow {
+		int family;
+		const unsigned int *sAddr;
+		const unsigned int *dAddr;
+		unsigned int fwmark;
+		int iifindex;
+	};
+
+	extern struct list_head rt_table[2 * ROUTE_HASH_TABLE_SIZE];
+	extern struct list_head fpp_rt_table[ROUTE_HASH_TABLE_SIZE];
+	extern struct list_head rt_table_by_gw_ip[2 * NEIGHBOR_HASH_TABLE_SIZE];
+	extern pthread_mutex_t rtMutex;
+
+	struct RtEntry *__cmmRouteFind(struct flow *flow);
+	void __cmmRouteRemove(struct RtEntry *route);
+	void __cmmRoutePut(struct RtEntry *route);
+	struct RtEntry *__cmmRouteAdd(struct flow *flow);
+	struct RtEntry *__cmmRouteGet(struct flow *flow);
+
+	void __cmmFFPRouteUpdate(struct fpp_rt *route, int oifindex, const unsigned char *dst_mac, int mtu, const unsigned int *dst_addr, int dst_addr_len);
+	struct fpp_rt *__cmmFPPRouteFind(int oifindex, const unsigned char *dst_mac, int mtu, const unsigned int *dst_addr, int dst_addr_len);
+	void __cmmFPPRouteRemove(struct fpp_rt *route);
+	void __cmmFPPRoutePut(struct fpp_rt *route);
+	struct fpp_rt *__cmmFPPRouteAdd(int oifindex, const unsigned char *dst_mac, int mtu, const unsigned int *dst_addr, int dst_addr_len);
+	struct fpp_rt *__cmmFPPRouteGet(int oifindex, const unsigned char *dst_mac, int mtu, const unsigned int *dst_addr, int dst_addr_len);
+
+	int cmmRtShow(struct cli_def * cli, char *command, char *argv[], int argc);
+	int cmmFPPRtShow(struct cli_def * cli, char *command, char *argv[], int argc);
+
+	int cmmRtnlRoute(const struct sockaddr_nl *who, struct nlmsghdr *nlh, void *arg);
+	int cmmRtnlRule(const struct sockaddr_nl *who, struct nlmsghdr *nlh, void *arg);
+
+#define cmmRouteEqual(route, flow, len) (!memcmp((route)->sAddr, (flow)->sAddr, (len)) && !memcmp((route)->dAddr, (flow)->dAddr, (len)) && ((route)->fwmark == (flow)->fwmark) && ((route)->iifindex == (flow)->iifindex))
+
+static inline int cmmPrefixEqual(const u_int32_t *daddr1, const u_int32_t *daddr2, int lenbits)
+{
+	unsigned pdw, pbi;
+
+	/* check complete u32 in prefix */
+	pdw = lenbits >> 5;
+	if (pdw && memcmp(daddr1, daddr2, pdw << 2))
+		return 0;
+
+	pbi = lenbits & 0x1f;
+	if (pbi && ((daddr1[pdw] ^ daddr2[pdw]) & htonl((0xffffffff) << (32 - pbi))))
+		return 0;
+
+	return 1;
+}
+
+static inline u_int32_t HASH_RT(int family, const unsigned int *sAddr, const unsigned int *dAddr)
+{
+	u_int32_t key1, key2;
+
+	if (family == AF_INET)
+	{
+		key1 = sAddr[0];
+		key2 = dAddr[0];
+
+		return (jhash_2words(key2, key1, 0x12563478) & (ROUTE_HASH_TABLE_SIZE - 1));
+	}
+	else
+	{
+		key1 = sAddr[0] ^ sAddr[1] ^ sAddr[2] ^ sAddr[3];
+		key2 = dAddr[0] ^ dAddr[1] ^ dAddr[2] ^ dAddr[3];
+
+		return (jhash_2words(key2, key1, 0x12563478) & (ROUTE_HASH_TABLE_SIZE - 1)) + ROUTE_HASH_TABLE_SIZE;
+	}
+}
+
+static inline u_int32_t HASH_FPP_RT(u_int32_t ifindex, const u_int8_t *macaddr)
+{
+	u_int32_t key;
+
+	key = ((u_int32_t *)macaddr)[0] ^ ((u_int16_t *)macaddr)[2];
+
+	return (jhash_2words(key, ifindex, 0x12345678) & (ROUTE_HASH_TABLE_SIZE - 1));
+}
+
+#endif
diff --git a/cmm/src/rtnl.c b/cmm/src/rtnl.c
new file mode 100755
index 0000000..8a92206
--- /dev/null
+++ b/cmm/src/rtnl.c
@@ -0,0 +1,336 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+#include "cmm.h"
+
+/*********************************************************************************************/
+
+/*
+The following routines were derived from the libnetlink.c file in the iproute2 package.
+Copyright notice from that file follows...
+*/
+
+/*
+ * libnetlink.c	RTnetlink service routines.
+ *
+ *		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.
+ *
+ * Authors:	Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
+ *
+ */
+
+void cmm_rtnl_close(struct rtnl_handle *rth)
+{
+	close(rth->fd);
+}
+
+int cmm_rtnl_fd(struct rtnl_handle *rth)
+{
+	return rth->fd;
+}
+
+unsigned int cmm_rtnl_rcvbufsiz(struct rtnl_handle *rth, unsigned int size)
+{
+	socklen_t socklen = sizeof(size);
+	unsigned int read_size = 0;
+
+	if (setsockopt(rth->fd, SOL_SOCKET, SO_RCVBUFFORCE, &size, socklen) < 0) {
+		/* if this didn't work, we try at least to get the system
+		 * wide maximum (or whatever the user requested) */
+		setsockopt(rth->fd, SOL_SOCKET, SO_RCVBUF, &size, socklen);
+	}
+
+	getsockopt(rth->fd, SOL_SOCKET, SO_RCVBUF, &read_size, &socklen);
+
+	return read_size;
+}
+
+int cmm_rtnl_set_nonblocking_mode(struct rtnl_handle *rth)
+{
+	if (fcntl(rth->fd, F_SETFL, O_NONBLOCK) < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: fcntl(%d) failed %s\n", __func__, rth->fd, strerror(errno));
+		goto err0;
+	}
+
+	rth->flags = RTNL_NON_BLOCKING_MODE;
+
+	return 0;
+
+err0:
+	return -1;
+}
+int cmm_nl_open(struct rtnl_handle *rth, unsigned subscriptions, unsigned int group)
+{
+	struct sockaddr_nl nladdr;
+
+	memset(rth, 0, sizeof(*rth));
+
+	rth->fd = socket(PF_NETLINK, SOCK_RAW, group);
+	if (rth->fd < 0) {
+		cmm_print(DEBUG_ERROR, "%s::%d: socket() %s\n", __func__, __LINE__, strerror(errno));
+		goto err0;
+	}
+
+	memset(&nladdr, 0, sizeof(nladdr));
+	nladdr.nl_family = AF_NETLINK;
+	nladdr.nl_groups = subscriptions;
+	nladdr.nl_pid = 0;
+
+	if (bind(rth->fd, (struct sockaddr*)&nladdr, sizeof(nladdr)) < 0) {
+		cmm_print(DEBUG_ERROR, "%s::%d: bind() %s\n", __func__, __LINE__, strerror(errno));
+		goto err1;
+	}
+
+	return 0;
+
+err1:
+	close(rth->fd);
+
+err0:
+	return -1;
+
+}
+
+int inline cmm_rtnl_open(struct rtnl_handle *rth, unsigned subscriptions)
+{
+	return cmm_nl_open(rth, subscriptions, NETLINK_ROUTE);
+}
+
+int cmm_rtnl_neigh_dump_request(struct rtnl_handle *rth, int family)
+{
+	struct ndmsg ndm = {
+		.ndm_family = family,
+		.ndm_ifindex = 0,
+		.ndm_state = 0,
+		.ndm_flags = 0,
+		.ndm_type = 0,
+	};
+
+	return cmm_rtnl_dump_request(rth, RTM_GETNEIGH, &ndm, sizeof(struct ndmsg));
+}
+
+void cmm_nlh_init(struct nlmsghdr *nlh, unsigned int len, unsigned short type, unsigned short flags)
+{
+	memset(nlh, 0, sizeof(struct nlmsghdr));
+	nlh->nlmsg_len = NLMSG_SPACE(len);
+	nlh->nlmsg_type = type;
+	nlh->nlmsg_flags = flags;
+	nlh->nlmsg_pid = 0;
+	nlh->nlmsg_seq = 0;
+}
+
+int cmm_rtnl_send(struct rtnl_handle *rth, struct nlmsghdr *nlh)
+{
+	struct sockaddr_nl nladdr;
+	struct iovec iov = {
+		.iov_base = nlh, .iov_len = nlh->nlmsg_len,
+	};
+	struct msghdr msg= {
+                .msg_name = &nladdr,
+                .msg_namelen =  sizeof(nladdr),
+                .msg_iov = &iov,
+                .msg_iovlen = 1,
+        };
+	int rc;
+
+	memset(&nladdr, 0, sizeof(nladdr));
+	nladdr.nl_family = AF_NETLINK;
+	nladdr.nl_groups = 0;
+	nladdr.nl_pid = 0;
+
+	if ((rc = sendmsg(rth->fd, &msg, 0)) < 0) {
+		cmm_print(DEBUG_ERROR, "%s::%d: sendmsg() %s\n", __func__, __LINE__, strerror(errno));
+	}
+
+	return rc;
+}
+
+int cmm_rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len)
+{
+	char buf[NLMSG_SPACE(len)] __attribute__ ((aligned (4)));
+	struct nlmsghdr *nlh = (struct nlmsghdr *)buf;
+
+	cmm_nlh_init(nlh, len, type, NLM_F_REQUEST | NLM_F_DUMP);
+
+	memcpy(NLMSG_DATA(nlh), req, len);
+
+	return cmm_rtnl_send(rth, nlh);
+}
+
+int cmm_rtnl_listen(struct rtnl_handle *rth, rtnl_filter_t handler, void *jarg)
+{
+	int len;
+	struct nlmsghdr *nlh;
+	struct sockaddr_nl nladdr;
+	struct iovec iov;
+	struct msghdr msg = {
+		.msg_name = &nladdr,
+		.msg_namelen = sizeof(nladdr),
+		.msg_iov = &iov,
+		.msg_iovlen = 1,
+	};
+	char buf[64 * 1024] __attribute__ ((aligned (4)));
+	int rc;
+
+	memset(&nladdr, 0, sizeof(nladdr));
+	nladdr.nl_family = AF_NETLINK;
+	nladdr.nl_pid = 0;
+	nladdr.nl_groups = 0;
+
+	iov.iov_base = buf;
+	do {
+		iov.iov_len = sizeof(buf);
+		len = recvmsg(rth->fd, &msg, 0);
+
+		if (len < 0) {
+			if (errno == EINTR)
+				continue;
+
+			if (errno == EAGAIN)
+				goto err;
+
+			cmm_print(DEBUG_ERROR, "%s::%d: recvmsg() %s\n", __func__, __LINE__, strerror(errno));
+
+			goto err;
+		}
+
+		if (len == 0) {
+			cmm_print(DEBUG_ERROR, "%s::%d: EOF on netlink\n", __func__, __LINE__);
+			goto err;
+		}
+
+		if (msg.msg_namelen != sizeof(nladdr)) {
+			cmm_print(DEBUG_ERROR, "%s::%d: wrong sender address len(%d)\n", __func__, __LINE__, msg.msg_namelen);
+			goto err;
+		}
+
+		nlh = (struct nlmsghdr *)buf;
+
+		while (NLMSG_OK(nlh, len)) {
+
+			if (nlh->nlmsg_type == NLMSG_ERROR) {
+				struct nlmsgerr *err = NLMSG_DATA(nlh);
+
+				cmm_print(DEBUG_ERROR, "%s::%d: netlink error %s\n", __func__, __LINE__, strerror(-err->error));
+				goto err;
+			}
+
+			if (nlh->nlmsg_type == NLMSG_DONE)
+				goto out;
+
+			rc = handler(&nladdr, nlh, jarg);
+			if (rc <= RTNL_CB_STOP) {
+				if (rc == RTNL_CB_STOP)
+					goto out;
+ 
+				goto err;
+			}
+
+			nlh = NLMSG_NEXT(nlh, len);
+		}
+
+		if (msg.msg_flags & MSG_TRUNC) {
+			cmm_print(DEBUG_ERROR, "%s::%d: truncated message\n", __func__, __LINE__);
+			goto err;
+		}
+
+	} while (!(rth->flags & RTNL_NON_BLOCKING_MODE));
+
+out:
+	return 0;
+
+err:
+	return -1;
+}
+
+int cmm_parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len)
+{
+	memset(tb, 0, sizeof(struct rtattr *) * (max + 1));
+
+	while (RTA_OK(rta, len)) {
+		if (rta->rta_type <= max)
+			tb[rta->rta_type] = rta;
+
+		rta = RTA_NEXT(rta,len);
+	}
+
+	if (len)
+		cmm_print(DEBUG_ERROR, "%s::%d: payload too long %d %d\n", __func__, __LINE__, len, rta->rta_len);
+
+	return 0;
+}
+
+struct rtattr *cmm_get_rtattr(struct rtattr *rta, int len, int type)
+{
+	while (RTA_OK(rta, len)) {
+
+		if (rta->rta_type == type)
+			goto found;
+
+		rta = RTA_NEXT(rta, len);
+	}
+
+	return NULL;
+
+found:
+	return rta;
+}
+
+
+void cmm_addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, int alen)
+{
+	int len = RTA_LENGTH(alen);
+	struct rtattr *rta;
+
+	rta = NLMSG_TAIL(n);
+	rta->rta_type = type;
+	rta->rta_len = len;
+	memcpy(RTA_DATA(rta), data, alen);
+	n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + RTA_ALIGN(len);
+}
+
+int cmm_addattr16(struct nlmsghdr *n, int maxlen, int type, __u16 data)
+{
+	int len = RTA_LENGTH(2);
+	struct rtattr *rta;
+
+	rta = NLMSG_TAIL(n);
+	rta->rta_type = type;
+	rta->rta_len = len;
+	memcpy(RTA_DATA(rta), &data, 2);
+	n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + len;
+	return 0;
+}
+
+int cmm_addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data)
+{
+	int len = RTA_LENGTH(4);
+	struct rtattr *rta;
+
+	rta = NLMSG_TAIL(n);
+	rta->rta_type = type;
+	rta->rta_len = len;
+	memcpy(RTA_DATA(rta), &data, 4);
+	n->nlmsg_len = NLMSG_ALIGN(n->nlmsg_len) + len;
+	return 0;
+}
+
diff --git a/cmm/src/rtnl.h b/cmm/src/rtnl.h
new file mode 100755
index 0000000..3972cd5
--- /dev/null
+++ b/cmm/src/rtnl.h
@@ -0,0 +1,72 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __RTNL_H__
+#define __RTNL_H__
+
+#include <linux/fib_rules.h>
+
+#ifndef NDA_PAYLOAD
+#define NDA_PAYLOAD(n)	NLMSG_PAYLOAD((n), sizeof(struct ndmsg))
+#endif
+
+#ifndef NDA_RTA
+#define NDA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg))))
+#endif
+
+#ifndef FRA_PAYLOAD
+#define FRA_PAYLOAD(n)	NLMSG_PAYLOAD((n), sizeof(struct fib_rule_hdr))
+#endif
+
+#ifndef FRA_RTA
+#define FRA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct fib_rule_hdr))))
+#endif
+
+#define RTNL_NON_BLOCKING_MODE	(1 << 0)
+
+#define RTNL_CB_CONTINUE	1
+#define RTNL_CB_STOP		0
+#define RTNL_CB_ERROR		-1
+
+struct rtnl_handle
+{
+	int fd;
+	int flags;
+};
+
+typedef int (*rtnl_filter_t)(const struct sockaddr_nl *, struct nlmsghdr *n, void *);
+
+int cmm_nl_open(struct rtnl_handle *rth, unsigned subscriptions, unsigned int group);
+int cmm_rtnl_open(struct rtnl_handle *rth, unsigned subscriptions);
+void cmm_rtnl_close(struct rtnl_handle *rth);
+int cmm_rtnl_fd(struct rtnl_handle *rth);
+unsigned int cmm_rtnl_rcvbufsiz(struct rtnl_handle *rth, unsigned int size);
+int cmm_rtnl_set_nonblocking_mode(struct rtnl_handle *rth);
+void cmm_nlh_init(struct nlmsghdr *nlh, unsigned int len, unsigned short type, unsigned short flags);
+int cmm_rtnl_send(struct rtnl_handle *rth, struct nlmsghdr *nlh);
+int cmm_rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len);
+int cmm_rtnl_neigh_dump_request(struct rtnl_handle *rth, int family);
+int cmm_rtnl_listen(struct rtnl_handle *rtnl, rtnl_filter_t handler, void *jarg);
+int cmm_parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len);
+struct rtattr *cmm_get_rtattr(struct rtattr *rta, int len, int type);
+void cmm_addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, int alen);
+int cmm_addattr16(struct nlmsghdr *n, int maxlen, int type, __u16 data);
+int cmm_addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data);
+
+#endif
diff --git a/cmm/src/third_part.c b/cmm/src/third_part.c
new file mode 100644
index 0000000..b065c25
--- /dev/null
+++ b/cmm/src/third_part.c
@@ -0,0 +1,215 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+#include <net/if.h>
+#include "cmm.h"
+
+int * cmm_third_part_init(void)
+{
+#ifndef CMM_THIRD_PART
+    return NULL;
+#endif
+  
+    cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+    /* perform all required initialization */
+
+    /* define and return private data */
+
+    return NULL;
+}
+
+
+static void cmm_third_part_cb (void *priv, unsigned short type, void *data, unsigned short *resp_length, unsigned short *resp_payload)
+{
+    struct cmm_ct_to_queue_t *msg;
+    char saddr_buf[INET6_ADDRSTRLEN];
+    char daddr_buf[INET6_ADDRSTRLEN];
+    char ifname[IFNAMSIZ];
+
+    cmm_print(DEBUG_INFO, "%s\n", __func__);
+        
+    /* For now the only supported event type has mandatory data. Should be moved to switch-case below if new event are added */
+    if(data == NULL)
+        return;
+    
+    /* Handling of the private data should be done here if needed */
+   
+
+    /* Event type handling */
+    switch(type)
+    {
+	case CMM_CB_CT_TO_QUEUE:
+            /* Retrieve connection information */
+            msg = (struct cmm_ct_to_queue_t *)data;
+
+            cmm_print(DEBUG_INFO, "CMM_CB_CT_TO_QUEUE\nstate %d ipfamily %d proto %d mark 0x%08x\n", msg->state, msg->ip_family, msg->proto, msg->mark);
+                
+            if(msg->state & ORIGINATOR) 
+                cmm_print(DEBUG_INFO, "originate output_itf %s saddr %s daddr %s sport %d dport %d gw mac %02x:%02x:%02x:%02x:%02x:%02x\n", if_indextoname(msg->orig_output, ifname), inet_ntop(msg->ip_family, msg->orig_saddr, saddr_buf, INET6_ADDRSTRLEN), inet_ntop(msg->ip_family, msg->orig_daddr, daddr_buf, INET6_ADDRSTRLEN), ntohs(msg->orig_sport), ntohs(msg->orig_dport), msg->orig_gw_mac[0],msg->orig_gw_mac[1],msg->orig_gw_mac[2],msg->orig_gw_mac[3],msg->orig_gw_mac[4],msg->orig_gw_mac[5]);
+                
+            if(msg->state & REPLIER)
+                cmm_print(DEBUG_INFO, "replier output_itf %s saddr %s daddr %s sport %d dport %d gw mac %02x:%02x:%02x:%02x:%02x:%02x\n", if_indextoname(msg->repl_output, ifname), inet_ntop(msg->ip_family, msg->repl_saddr, saddr_buf, INET6_ADDRSTRLEN), inet_ntop(msg->ip_family, msg->repl_daddr, daddr_buf, INET6_ADDRSTRLEN), ntohs(msg->repl_sport), ntohs(msg->repl_dport), msg->repl_gw_mac[0],msg->repl_gw_mac[1],msg->repl_gw_mac[2],msg->repl_gw_mac[3],msg->repl_gw_mac[4],msg->repl_gw_mac[5]);        
+                
+            /* Define new mark */
+            
+            /* Following lines are for test purpose only (mark change for a given port 1024) */
+        #if 0
+            if(ntohs(msg->orig_sport) == 1024)
+                msg->mark = 0x1;
+        #endif
+            break;
+
+	default:
+            break;
+    }
+}
+
+void cmm_third_part_exit(void *priv_data)
+{
+#ifndef CMM_THIRD_PART
+    return;
+#endif
+  
+    cmm_print(DEBUG_INFO, "%s\n", __func__);
+
+    /* free allocated resources */
+}
+
+
+static void cmm_third_part_dump_ct(struct cmm_ct_to_queue_t * msg)
+{
+    char saddr_buf[INET6_ADDRSTRLEN], daddr_buf[INET6_ADDRSTRLEN];
+    
+    cmm_print(DEBUG_INFO, "orig_saddr %s orig_daddr %s orig_sport %d orig_dport %d\n", 
+              inet_ntop(msg->ip_family, msg->orig_saddr, saddr_buf, INET6_ADDRSTRLEN),
+              inet_ntop(msg->ip_family, msg->orig_daddr, daddr_buf, INET6_ADDRSTRLEN),
+              ntohs(msg->orig_sport),
+              ntohs(msg->orig_dport));                        
+      
+    cmm_print(DEBUG_INFO, "repl_saddr %s repl_daddr %s repl_sport %d repl_dport %d\n", 
+              inet_ntop(msg->ip_family, msg->repl_saddr, saddr_buf, INET6_ADDRSTRLEN),
+              inet_ntop(msg->ip_family, msg->repl_daddr, daddr_buf, INET6_ADDRSTRLEN),
+              ntohs(msg->repl_sport),
+              ntohs(msg->repl_dport));       
+
+    cmm_print(DEBUG_INFO, "mark 0x%08x\n", msg->mark);
+}
+
+
+void cmm_third_part_update(struct ctTable *ctEntry, int dir)
+{
+#ifndef CMM_THIRD_PART
+    return;
+#endif
+  
+    /* Fill a buffer with the information required for CMM_CB_CT_TO_QUEUE event */
+    struct cmm_ct_to_queue_t msg;
+    const unsigned int *dAddrOrig, *dAddrRepl, *sAddrOrig, *sAddrRepl;
+    unsigned short dPortOrig, dPortRepl, sPortOrig, sPortRepl;
+    unsigned char proto;
+    struct nf_conntrack *ct = ctEntry->ct;
+
+    proto = nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO);
+
+    if (ctEntry->family == AF_INET)
+    {
+        sAddrOrig = nfct_get_attr(ct, ATTR_ORIG_IPV4_SRC);
+        sAddrRepl = nfct_get_attr(ct, ATTR_REPL_IPV4_SRC);
+        dAddrOrig = nfct_get_attr(ct, ATTR_ORIG_IPV4_DST);
+        dAddrRepl = nfct_get_attr(ct, ATTR_REPL_IPV4_DST);
+    }
+    else
+    {
+        sAddrOrig = nfct_get_attr(ct, ATTR_ORIG_IPV6_SRC);
+        sAddrRepl = nfct_get_attr(ct, ATTR_REPL_IPV6_SRC);
+        dAddrOrig = nfct_get_attr(ct, ATTR_ORIG_IPV6_DST);
+        dAddrRepl = nfct_get_attr(ct, ATTR_REPL_IPV6_DST);
+    }
+
+    sPortOrig = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC);
+    sPortRepl = nfct_get_attr_u16(ct, ATTR_REPL_PORT_SRC);
+    dPortOrig = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST);
+    dPortRepl = nfct_get_attr_u16(ct, ATTR_REPL_PORT_DST);
+
+    memset(&msg, 0, sizeof(struct cmm_ct_to_queue_t ));
+    
+    msg.ip_family = ctEntry->family;
+    msg.proto = proto;
+    msg.mark = nfct_get_attr_u32(ct, ATTR_MARK);
+    
+    if(dir & ORIGINATOR)
+    {
+        if (ctEntry->family == AF_INET)
+        {
+            msg.orig_saddr[0] = sAddrOrig[0]; 
+            msg.orig_daddr[0] = dAddrOrig[0]; 
+        } 
+        else 
+        {
+            memcpy(msg.orig_saddr, sAddrOrig, 16); 
+            memcpy(msg.orig_daddr, dAddrOrig, 16);
+        }
+
+        msg.orig_sport = sPortOrig; 
+        msg.orig_dport = dPortOrig;
+	 if(ctEntry->orig.route->neighEntry)
+        	memcpy(msg.orig_gw_mac, ctEntry->orig.route->neighEntry->macAddr, 6); 
+        msg.orig_output = ctEntry->orig.route->oifindex;
+    }
+
+    if(dir & REPLIER)
+    {
+        if (ctEntry->family == AF_INET) 
+        {
+            msg.repl_saddr[0] = sAddrRepl[0]; 
+            msg.repl_daddr[0] = dAddrRepl[0]; 
+        } 
+        else 
+        {
+            memcpy(msg.repl_saddr, sAddrRepl, 16); 
+            memcpy(msg.repl_daddr, dAddrRepl, 16);
+        }
+
+        msg.repl_sport = sPortRepl; 
+        msg.repl_dport = dPortRepl;
+	 if(ctEntry->rep.route->neighEntry)
+        	memcpy(msg.repl_gw_mac, ctEntry->rep.route->neighEntry->macAddr, 6); 
+        msg.repl_output = ctEntry->rep.route->oifindex;
+    }
+
+    /* Call 3rd Party callback */
+    if((dir & (ORIGINATOR | REPLIER)) && (ctEntry->flags & FPP_NEEDS_UPDATE))
+    {
+        cmm_print(DEBUG_INFO, "%s: Old connection entry\n",  __func__);
+        cmm_third_part_dump_ct(&msg);
+
+        msg.state = dir;
+        cmm_third_part_cb(globalConf.third_part_data, CMM_CB_CT_TO_QUEUE, (void*)&msg, NULL, NULL);
+
+        cmm_print(DEBUG_INFO, "%s: New connection entry\n",  __func__);
+        cmm_third_part_dump_ct(&msg);
+
+        /* Retrieve modified parameter and apply to the connection */
+        nfct_set_attr_u32(ct, ATTR_MARK, msg.mark);
+    }
+
+}
+
+
diff --git a/cmm/src/third_part.h b/cmm/src/third_part.h
new file mode 100644
index 0000000..d0018b5
--- /dev/null
+++ b/cmm/src/third_part.h
@@ -0,0 +1,53 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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 __THIRD_PART_H__
+#define __THIRD_PART_H__
+
+#define	CMM_CB_CT_TO_QUEUE	0x0001
+
+struct cmm_ct_to_queue_t {
+    /* originate and replier common information */
+    u_int16_t	state;		/* conntrack state bit (bit0=originator, bit1=replier) */
+    u_int16_t	ip_family;	/* IP family (AF_INET=IPv4, AF_INET6 = IPv6) */
+    u_int16_t	proto;		/* IP protocol (17=UDP, 6=TCP) */
+    u_int32_t	mark;		/* connection mark */
+            
+    /* originate side information valid if state bit0 is set */
+    u_int32_t	orig_saddr[4];	/* source IP address */
+    u_int32_t	orig_daddr[4];	/* destination IP address */
+    u_int16_t	orig_sport; 	/* source port */
+    u_int16_t	orig_dport; 	/* destination port */
+    u_int8_t	orig_gw_mac[6]; /* destination MAC address */
+    u_int8_t	orig_output;	/* output interface (0=LAN, 1=WAN) */
+            
+    /* replier side information valid if state bit1 is set */
+    u_int32_t	repl_saddr[4];	/* source IP address */
+    u_int32_t	repl_daddr[4];	/* destination IP address */
+    u_int16_t	repl_sport; 	/* source port */
+    u_int16_t	repl_dport; 	/* destination port */
+    u_int8_t	repl_gw_mac[6]; /* destination MAC address */
+    u_int8_t	repl_output;	/* output interface (0=LAN, 1=WAN) */
+};
+
+void cmm_third_part_update(struct ctTable *ctEntry, int dir);
+void cmm_third_part_exit(void *priv_data);
+int * cmm_third_part_init(void);
+
+#endif
+
diff --git a/cmm/src/timeout.c b/cmm/src/timeout.c
new file mode 100644
index 0000000..3ce900b
--- /dev/null
+++ b/cmm/src/timeout.c
@@ -0,0 +1,267 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+#include "cmm.h"
+#include <ctype.h>
+
+/*****************************************************************
+* cmmSetTimeout
+******************************************************************/
+int timeoutSet(daemon_handle_t daemon_handle, char *argv[], int argc) 
+{
+
+	unsigned short proto;
+	unsigned long long in_val1, in_val2 =0;
+	fpp_timeout_cmd_t cmd;
+	unsigned char rcv_buff[256];
+	int arg =0;
+
+	memset(&cmd, 0, sizeof(fpp_timeout_cmd_t));
+	
+	if ((argc < 2) || (argc > 4))
+		goto usage;
+
+	if(strncmp(argv[arg], "udp", strlen(argv[arg])) == 0)
+		proto = IPPROTO_UDP;
+	else if (strncmp(argv[arg], "tcp", strlen(argv[arg])) == 0) 
+		proto = IPPROTO_TCP;
+	else if (strncmp(argv[arg], "other", strlen(argv[arg])) == 0)
+		proto = 0;
+	else
+		goto usage;
+	
+        in_val1 = strtoll(argv[++arg], NULL, 10);
+	while(++arg < argc) // we need to look for some optional parameters
+	{
+		if(strncmp(argv[arg],"4rd", strlen(argv[arg])) == 0)
+			cmd.sam_4o6_timeout = 1;
+		else
+			in_val2 = strtoll(argv[arg], NULL, 10);
+	}
+ 
+
+	if ((in_val1 <= 0) || (in_val1 >= UINT32_MAX)) // Cover negative, max values, null values and errors
+		goto usage;
+        else if (in_val2 >= UINT32_MAX)
+		goto usage;
+	else 
+	{
+		cmd.protocol = proto;
+		cmd.timeout_value1 = in_val1;
+                cmd.timeout_value2 = in_val2;
+		if(cmmSendToDaemon(daemon_handle, FPP_CMD_IPV4_SET_TIMEOUT, &cmd, sizeof(cmd), &rcv_buff) == 2)
+		{
+			if(((unsigned short *)rcv_buff)[0] != 0)
+				cmm_print(DEBUG_STDERR,"Error %d received from FPP for CMD_IPV4_SET_TIMEOUT\n",((unsigned short *)rcv_buff)[0]);
+		}
+		return 0;
+	}
+
+
+usage:
+	cmm_print(DEBUG_ERROR, "Usage: set timeout <udp tcp other> value [value2] [4rd]\n");
+	return -1;
+}
+/*****************************************************************
+* cmmSetTimeout
+******************************************************************/
+int cmmtimeoutSet(daemon_handle_t daemon_handle, char *argv[], int argc, int tab) 
+{
+	if(argc > tab)
+		return timeoutSet(daemon_handle, &argv[tab], argc - tab);
+	else
+                cmm_print(DEBUG_ERROR, "Usage: set timeout <udp tcp other> value [value2] [4rd]\n");
+
+	return 0;
+}
+
+int cmmFeGetTimeout(FCI_CLIENT *fci_handle, struct ctTable *ctEntry, unsigned int *timeout)
+{
+	unsigned short rcvBuffer[256];
+	unsigned short rcvBytes = 0;
+	fpp_timeout_cmd_t *conntime;
+	fpp_ct_cmd_t cmd;
+	fpp_ct6_cmd_t cmd6;
+	int rc;
+
+	if (ctEntry->family == AF_INET)
+	{
+		memset(&cmd, 0, sizeof(fpp_ct_cmd_t));
+
+		cmd.protocol = nfct_get_attr_u8(ctEntry->ct, ATTR_ORIG_L4PROTO);
+
+		cmd.saddr = nfct_get_attr_u32(ctEntry->ct, ATTR_ORIG_IPV4_SRC);
+		cmd.daddr = nfct_get_attr_u32(ctEntry->ct, ATTR_ORIG_IPV4_DST);
+		cmd.saddr_reply = nfct_get_attr_u32(ctEntry->ct, ATTR_REPL_IPV4_SRC);
+		cmd.daddr_reply = nfct_get_attr_u32(ctEntry->ct, ATTR_REPL_IPV4_DST);
+
+		cmd.sport = nfct_get_attr_u16(ctEntry->ct, ATTR_ORIG_PORT_SRC);
+		cmd.dport = nfct_get_attr_u16(ctEntry->ct, ATTR_ORIG_PORT_DST);
+		cmd.sport_reply = nfct_get_attr_u16(ctEntry->ct, ATTR_REPL_PORT_SRC);
+		cmd.dport_reply = nfct_get_attr_u16(ctEntry->ct, ATTR_REPL_PORT_DST);
+		cmd.fwmark = nfct_get_attr_u32(ctEntry->ct, ATTR_MARK);
+
+		rc = fci_query(fci_handle, FPP_CMD_IPV4_GET_TIMEOUT, sizeof(fpp_ct_cmd_t), (unsigned short *)&cmd, &rcvBytes, rcvBuffer);
+	}
+	else
+	{
+		memset(&cmd6, 0, sizeof(fpp_ct6_cmd_t));
+
+		cmd6.protocol = nfct_get_attr_u8(ctEntry->ct, ATTR_ORIG_L4PROTO);
+
+		memcpy(cmd6.saddr, nfct_get_attr(ctEntry->ct, ATTR_ORIG_IPV6_SRC), 16);
+		memcpy(cmd6.daddr, nfct_get_attr(ctEntry->ct, ATTR_ORIG_IPV6_DST), 16);
+		memcpy(cmd6.saddr_reply, nfct_get_attr(ctEntry->ct, ATTR_REPL_IPV6_SRC), 16);
+		memcpy(cmd6.daddr_reply, nfct_get_attr(ctEntry->ct, ATTR_REPL_IPV6_DST), 16);
+	
+		cmd6.sport = nfct_get_attr_u16(ctEntry->ct, ATTR_ORIG_PORT_SRC);
+		cmd6.dport = nfct_get_attr_u16(ctEntry->ct, ATTR_ORIG_PORT_DST);
+		cmd6.sport_reply = nfct_get_attr_u16(ctEntry->ct, ATTR_REPL_PORT_SRC);
+		cmd6.dport_reply = nfct_get_attr_u16(ctEntry->ct, ATTR_REPL_PORT_DST);
+		cmd6.fwmark = nfct_get_attr_u32(ctEntry->ct, ATTR_MARK);
+
+		rc = fci_query(fci_handle, FPP_CMD_IPV6_GET_TIMEOUT, sizeof(fpp_ct6_cmd_t), (unsigned short *)&cmd6, &rcvBytes, rcvBuffer);
+	}
+
+	if (rc != 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: error %d received from FPP for CMD_IPV4/IPV6_GET_TIMEOUT\n", __func__, rc);
+		goto err;
+	}
+
+
+	if (rcvBytes != sizeof(fpp_timeout_cmd_t))
+	{
+		cmm_print(DEBUG_ERROR, "%s: wrong response length %d received from FPP for CMD_IPV4/IPV6_GET_TIMEOUT\n", __func__, rcvBytes);
+		goto err;
+	}
+
+	conntime = (fpp_timeout_cmd_t *)rcvBuffer;
+	*timeout = conntime->timeout_value1;
+
+	return 0;
+
+err:
+	return -1;
+}
+
+static void FragTimeoutSetUsage()
+{
+	cmm_print(DEBUG_STDOUT, 
+			"Usage: set frag  \n"
+			"\n"
+			"                                  [ipv4 | ipv6 |  sam-ipv4]\n"
+			"                                  [timeout {0-65536} (in ms)] \n"
+			"                                  [mode {acp | drop} (not supported for sam-ipv4)]\n"
+		);
+}
+
+int cmmFragTimeoutSet(char ** keywords, int tabStart, daemon_handle_t daemon_handle)
+{
+	int cpt = tabStart;
+	unsigned int tmp;
+	char * endptr;
+	char rcvBuffer[256];
+	int command;	
+	fpp_frag_timeout_cmd_t cmd;
+
+
+        if(!keywords[cpt])
+               goto keyword_error;
+
+	if (!strcasecmp(keywords[cpt], "ipv6"))
+		command = FPP_CMD_IPV6_FRAGTIMEOUT;
+	else if (!strcasecmp(keywords[cpt], "ipv4"))
+		command = FPP_CMD_IPV4_FRAGTIMEOUT;
+        else if(!strcasecmp(keywords[cpt], "sam-ipv4"))
+               command = FPP_CMD_IPV4_SAMFRAGTIMEOUT;
+	else
+		goto keyword_error;
+
+
+	if (!keywords[++cpt])
+			goto print_help;
+
+	if (strcasecmp(keywords[cpt], "timeout") == 0)
+	{
+		if (!keywords[++cpt])
+			goto print_help;
+		
+		/*Get an integer from the string*/
+		endptr = NULL;
+		tmp = strtoul(keywords[cpt], &endptr, 0);
+		if ((keywords[cpt] == endptr) ||  (tmp > USHRT_MAX))
+		{
+			cmm_print(DEBUG_CRIT, "ERROR: timeout must be a number between 0 and %d\n", USHRT_MAX);
+			goto  print_help;
+		}
+		cmd.timeout = tmp;
+	}
+	else
+		goto keyword_error;
+
+
+	if(command == FPP_CMD_IPV4_SAMFRAGTIMEOUT)
+	{
+		if(keywords[++cpt])
+		{
+			cmm_print(DEBUG_CRIT,"ERROR: %s not supported for type sam-ipv4 \n",keywords[cpt]);
+			goto keyword_error;
+		}
+	}
+	else 
+	{
+		if(!keywords[++cpt])
+			goto print_help;
+		if(strcasecmp(keywords[cpt], "mode") == 0) 
+		{
+			if(!keywords[++cpt])
+				goto print_help;
+
+			if(strcasecmp(keywords[cpt], "drop") == 0)
+			{
+				cmd.mode = 1; 
+			}
+			else if(strcasecmp(keywords[cpt], "acp") == 0)
+			{
+				cmd.mode = 0;
+			}
+			else
+			{
+				cmm_print(DEBUG_CRIT, "frag ERROR: mode must be either drop or acp \n");
+				goto print_help;
+			}
+		}
+		else
+			goto keyword_error;
+	}
+
+	if (cmmSendToDaemon(daemon_handle, command, &cmd, sizeof(cmd), rcvBuffer) < sizeof(unsigned short) || cmmDaemonCmdRC(rcvBuffer))
+		cmm_print(DEBUG_CRIT,  "%s: error sending message to daemon\n", __func__);
+	
+	return 0;
+
+
+
+keyword_error:
+	cmm_print(DEBUG_STDOUT,"ERR: unknown keyword %s\n", keywords[cpt]);
+
+print_help:
+	FragTimeoutSetUsage();
+	return -1;
+}
diff --git a/cmm/src/timeout.h b/cmm/src/timeout.h
new file mode 100644
index 0000000..f622354
--- /dev/null
+++ b/cmm/src/timeout.h
@@ -0,0 +1,24 @@
+/*
+ *
+ *  Copyright (C) 2007 Mindspeed Technologies, Inc.
+ *
+ * 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
+ */
+
+/* Function prototypes */ 
+int timeoutSet(daemon_handle_t daemon_handle, char *argv[], int argc);
+int cmmtimeoutSet(daemon_handle_t daemon_handle, char *argv[], int argc, int tab);
+int cmmFeGetTimeout(FCI_CLIENT *fci_handle, struct ctTable *ctEntry, unsigned int *timeout);
+int cmmFragTimeoutSet(char ** keywords, int tabStart, daemon_handle_t daemon_handle);
diff --git a/cmm/src/version.h b/cmm/src/version.h
new file mode 100644
index 0000000..6a5b925
--- /dev/null
+++ b/cmm/src/version.h
@@ -0,0 +1,7 @@
+/* Auto-generated file. Do not edit cmm_3_01_2 */
+#ifndef VERSION_H
+#define VERSION_H
+
+#define CMM_VERSION "cmm_3_01_2"
+
+#endif /* VERSION_H */
diff --git a/cmm/src/voicebuf.c b/cmm/src/voicebuf.c
new file mode 100644
index 0000000..399b9b9
--- /dev/null
+++ b/cmm/src/voicebuf.c
@@ -0,0 +1,398 @@
+ /*
+  *  voicebuf.c
+  *
+  *  Copyright (C) 2010 Mindspeed Technologies, Inc.
+  *
+  * 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
+  */
+
+
+#include "cmm.h"
+#include "fpp.h"
+#include "cmmd.h"
+#include "voicebuf.h"
+
+static int voice_file_fd[VOICE_FILE_MAX];
+
+int voice_file_load(FCI_CLIENT *fci_handle, cmmd_voice_file_load_cmd_t *cmd, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	fpp_voice_buffer_load_cmd_t fpp_cmd;
+	struct usr_scatter_list sc;
+	int file_fd;
+	int file_size;
+	int buf_fd;
+	int i;
+	int rc = 0;
+
+	cmm_print(DEBUG_INFO, "%s\n", __func__);
+	*res_len = 2;
+
+	if (cmd->file_id >= VOICE_FILE_MAX)
+	{
+		cmm_print(DEBUG_ERROR, "%s: fileid(%d) out of range\n", __func__, cmd->file_id);
+		res_buf[0] = CMMD_ERR_WRONG_COMMAND_PARAM;
+		goto err0;
+	}
+
+	if (voice_file_fd[cmd->file_id])
+	{
+		cmm_print(DEBUG_ERROR, "%s: fileid(%d) already loaded\n", __func__, cmd->file_id);
+		res_buf[0] = CMMD_ERR_WRONG_COMMAND_PARAM;
+		goto err0;
+	}
+
+	file_fd = open(cmd->filename, O_RDONLY, 0);
+	if (file_fd < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: open(%s) error, %s\n", __func__, cmd->filename, strerror(errno));
+		rc = -1;
+		goto err0;
+	}
+
+	buf_fd = open(MEMBUF_CHAR_DEVNAME, O_WRONLY, 0);
+	if (buf_fd < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: open(%s) error, %s\n", __func__, MEMBUF_CHAR_DEVNAME, strerror(errno));
+		rc = -1;
+		goto err1;
+	}
+
+	file_size = lseek(file_fd, 0, SEEK_END);
+	if (file_size < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: lseek() error, %s\n", __func__, strerror(errno));
+		rc = -1;
+		goto err2;
+	}
+
+	rc = lseek(buf_fd, file_size, SEEK_SET);
+	if (rc < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: lseek() error, %s\n", __func__, strerror(errno));
+		goto err2;
+	}
+
+	rc = lseek(file_fd, 0, SEEK_SET);
+	if (rc < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: lseek() error, %s\n", __func__, strerror(errno));
+		goto err2;
+	}
+
+	rc = lseek(buf_fd, 0, SEEK_SET);
+	if (rc < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: lseek() error, %s\n", __func__, strerror(errno));
+		goto err2;
+	}
+
+	while (1)
+	{
+		char buf[4096];
+		int len;
+
+		len = read(file_fd, buf, 4096);
+		if (!len)
+			break;
+
+		if (len < 0)
+		{
+			if (errno != EINTR)
+			{
+				cmm_print(DEBUG_ERROR, "%s: read() error, %s\n", __func__, strerror(errno));
+				rc = -1;
+				goto err2;
+			}
+		}
+
+		while (len)
+		{
+			rc = write(buf_fd, buf, len);
+			if (rc <= 0)
+			{
+				if (errno != EINTR)
+				{
+					cmm_print(DEBUG_ERROR, "%s: write() error, %s\n", __func__, strerror(errno));
+					goto err2;
+				}
+
+				continue;
+			}
+
+			len -= rc;
+		}
+	}
+
+	rc = ioctl(buf_fd, MEMBUF_GET_SCATTER, &sc);
+	if (rc < 0)
+	{
+		cmm_print(DEBUG_ERROR, "%s: ioctl() error, %s\n", __func__, strerror(errno));
+		goto err2;
+	}
+
+	fpp_cmd.buffer_id = cmd->file_id;
+	fpp_cmd.payload_type = cmd->payload_type;
+	fpp_cmd.frame_size = cmd->frame_size;
+
+	fpp_cmd.entries = sc.entries;
+	fpp_cmd.data_len = file_size;
+
+	for (i = 0; i < sc.entries; i++)
+	{
+		fpp_cmd.page_order[i] = sc.pg_order[i];
+		fpp_cmd.addr[i] = sc.addr[i];
+
+		cmm_print(DEBUG_INFO, "%s: %d %x %x\n", __func__, i, fpp_cmd.page_order[i], fpp_cmd.addr[i]);
+	}
+
+	cmm_print(DEBUG_COMMAND, "%s: Send FPP_CMD_VOICE_BUFFER_LOAD\n", __func__);
+
+	rc = fci_cmd(fci_handle, FPP_CMD_VOICE_BUFFER_LOAD, (u_int16_t *) &fpp_cmd, sizeof(fpp_cmd), res_buf, res_len);
+	if (rc == 0 && res_buf[0] == FPP_ERR_OK)
+	{
+		voice_file_fd[cmd->file_id] = buf_fd;
+	}
+	else
+	{
+		if (rc < 0)
+			cmm_print(DEBUG_ERROR, "%s: FPP_CMD_VOICE_BUFFER_LOAD failed, '%s'\n", __func__, strerror(errno));
+		else
+			cmm_print(DEBUG_ERROR, "%s: FPP_CMD_VOICE_BUFFER_LOAD failed, %d\n", __func__, res_buf[0]);
+		goto err2;
+	}
+
+	close(file_fd);
+
+	return rc;
+
+err2:
+	close(buf_fd);
+
+err1:
+	close(file_fd);
+
+err0:
+	return rc;
+}
+
+
+int voice_file_unload(FCI_CLIENT *fci_handle, cmmd_voice_file_unload_cmd_t *cmd, u_int16_t *res_buf, u_int16_t *res_len)
+{
+	fpp_voice_buffer_unload_cmd_t fpp_cmd;
+	int rc = 0;
+
+	cmm_print(DEBUG_INFO, "%s:\n", __func__);
+
+	*res_len = 2;
+
+	if (cmd->file_id >= VOICE_FILE_MAX)
+	{
+		cmm_print(DEBUG_ERROR, "%s: fileid(%d) out of range\n", __func__, cmd->file_id);
+		res_buf[0] = CMMD_ERR_WRONG_COMMAND_PARAM;
+		goto err;
+	}
+
+	if (!voice_file_fd[cmd->file_id])
+	{
+		cmm_print(DEBUG_ERROR, "%s: fileid(%d) not loaded\n", __func__, cmd->file_id);
+		res_buf[0] = CMMD_ERR_WRONG_COMMAND_PARAM;
+		goto err;
+	}
+
+	fpp_cmd.buffer_id = cmd->file_id;
+
+	cmm_print(DEBUG_COMMAND, "%s: Send FPP_CMD_VOICE_BUFFER_UNLOAD\n", __func__);
+
+	rc = fci_cmd(fci_handle, FPP_CMD_VOICE_BUFFER_UNLOAD, (u_int16_t *) &fpp_cmd, sizeof(fpp_cmd), res_buf, res_len);
+	if (rc == 0 && res_buf[0] == FPP_ERR_OK)
+	{
+		close(voice_file_fd[cmd->file_id]);
+		voice_file_fd[cmd->file_id] = 0;
+
+	}
+	else
+	{
+		if (rc < 0)
+			cmm_print(DEBUG_ERROR, "%s: FPP_CMD_VOICE_BUFFER_UNLOAD failed, '%s'\n", __func__, strerror(errno));
+		else
+			cmm_print(DEBUG_ERROR, "%s: FPP_CMD_VOICE_BUFFER_UNLOAD failed, %d\n", __func__, res_buf[0]);
+		goto err;
+	}
+
+err:
+	return rc;
+}
+
+int voice_buffer_reset(FCI_CLIENT *fci_handle)
+{
+	int rc;
+	int i;
+
+	rc = fci_write(fci_handle, FPP_CMD_VOICE_BUFFER_RESET, 0, NULL);
+
+	for (i = 0; i < VOICE_FILE_MAX;i++)
+		if (voice_file_fd[i])
+		{
+			close(voice_file_fd[i]);
+			voice_file_fd[i] = 0;
+		}
+
+	return rc;
+}
+
+static void voice_buffer_set_usage(void)
+{
+	cmm_print(DEBUG_STDOUT, 
+			"Usage: set voicebuf \n"
+			"\n"
+			"                                  [load] <file_id> <payload_type> <frame_size> <filename>\n"
+			"\n"
+			"                                  [unload] <file_id>\n"
+			"\n"
+			"                                  [start] <socket_id> <buffer_id> <seq_number_base> <ssrc> <timestamp_base>\n"
+			"\n"
+			"                                  [stop] <socket_id>\n"
+	          );
+}
+
+
+/* CMM client side voicebuf control */
+int cmmVoiceBufSetProcess(int argc, char *argv[], daemon_handle_t daemon_handle)
+{
+	char buf[CMM_BUF_SIZE];
+	int i = 0;
+	int rc;
+	const char* cmd_str = NULL;
+
+	if (argc < 1)
+	{
+		fprintf(stderr, "%s: missing arguments for voicebuf command\n", __func__);
+		goto err;
+	}
+
+	if (!strncasecmp(argv[i], "load", 4))
+	{
+		cmmd_voice_file_load_cmd_t cmd;
+
+		if (argc < 5)
+		{
+			fprintf(stderr, "%s: missing arguments for voicebuf load command\n", __func__);
+			goto err;
+		}
+
+		i++;
+		cmd.file_id = strtoul(argv[i], NULL, 0);
+
+		i++;
+		cmd.payload_type = strtoul(argv[i], NULL, 0);
+
+		i++;
+		cmd.frame_size = strtoul(argv[i], NULL, 0);
+
+		i++;
+		strncpy(cmd.filename, argv[i], CMMD_VOICE_FILE_MAX_NAMESIZE);
+
+		rc = cmmSendToDaemon(daemon_handle, CMMD_CMD_VOICE_FILE_LOAD, &cmd, sizeof(cmd), buf);
+		cmd_str = "CMD_VOICE_FILE_LOAD";
+	}
+	else if (!strncasecmp(argv[i], "unload", 6))
+	{
+		cmmd_voice_file_unload_cmd_t cmd;
+
+		if (argc < 2)
+		{
+			fprintf(stderr, "%s: missing arguments for voicebuf unload command\n", __func__);
+			goto err;
+		}
+
+		i++;
+		cmd.file_id = strtoul(argv[i], NULL, 0);
+
+		rc = cmmSendToDaemon(daemon_handle, CMMD_CMD_VOICE_FILE_UNLOAD, &cmd, sizeof(cmd), buf);
+		cmd_str = "CMD_VOICE_FILE_UNLOAD";
+	}
+	else if (!strncasecmp(argv[i], "start", 5))
+	{
+		fpp_voice_buffer_start_cmd_t cmd;
+
+		if (argc < 6)
+		{
+			fprintf(stderr, "%s: missing arguments for voicebuf start command\n", __func__);
+			goto err;
+		}
+
+		i++;
+		cmd.socket_id = strtoul(argv[i], NULL, 0);
+
+		i++;
+		cmd.buffer_id = strtoul(argv[i], NULL, 0);
+
+		i++;
+		cmd.seq_number_base = strtoul(argv[i], NULL, 0);
+
+		i++;
+		cmd.ssrc = strtoul(argv[i], NULL, 0);
+
+		i++;
+		cmd.timestamp_base = strtoul(argv[i], NULL, 0);
+
+		rc = cmmSendToDaemon(daemon_handle, FPP_CMD_VOICE_BUFFER_START, &cmd, sizeof(cmd), buf);
+		cmd_str = "CMD_VOICE_BUFFER_START";
+	}
+	else if (!strncasecmp(argv[i], "stop", 4))
+	{
+		fpp_voice_buffer_stop_cmd_t cmd;
+
+		if (argc < 2)
+		{
+			fprintf(stderr, "%s: missing arguments for voicebuf stop command\n", __func__);
+			goto err;
+		}
+
+		i++;
+		cmd.socket_id = strtoul(argv[i], NULL, 0);
+
+		rc = cmmSendToDaemon(daemon_handle, FPP_CMD_VOICE_BUFFER_STOP, &cmd, sizeof(cmd), buf);
+		cmd_str = "CMD_VOICE_BUFFER_STOP";
+	}
+	else
+		goto err;
+
+	if (rc == 2)
+	{
+		if (((u_int16_t*)buf)[0] != CMMD_ERR_OK)
+		{
+			fprintf(stdout, "%s: error sending %s: %d\n", __func__, cmd_str, ((u_int16_t*)buf)[0]);
+			return -1;
+		}
+	}
+	else
+	{
+		if (rc > 0)
+			fprintf(stdout, "%s: unexpected response size received for %s: %d\n", __func__, cmd_str, rc);
+		else
+			fprintf(stdout, "%s: error sending %s: '%s'\n", __func__, cmd_str, strerror(errno));
+		return -1;
+	}
+
+	return 0;
+
+err:
+	/* print usage */
+	voice_buffer_set_usage();
+
+	return -1;
+}
+
diff --git a/cmm/src/voicebuf.h b/cmm/src/voicebuf.h
new file mode 100644
index 0000000..03429ca
--- /dev/null
+++ b/cmm/src/voicebuf.h
@@ -0,0 +1,45 @@
+/*
+ *
+ *  Copyright (C) 2010 Mindspeed Technologies, Inc.
+ *
+ * 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 __VOICEBUF_H__
+#define __VOICEBUF_H__
+
+#include <sys/ioctl.h>
+
+#define MEMBUF_CHAR_DEVNAME "/dev/membuf"
+
+#define VOICE_FILE_MAX		8
+
+/* These must match the kernel definitions */
+#define MEMBUF_GET_SCATTER _IOR('m', 1, struct usr_scatter_list)
+
+#define MAX_BUFFERS	48
+
+struct usr_scatter_list
+{
+	u_int8_t entries;
+	u_int8_t pg_order[MAX_BUFFERS];
+	u_int32_t addr[MAX_BUFFERS];
+};
+
+int voice_file_load(FCI_CLIENT *fci_handle, cmmd_voice_file_load_cmd_t *cmd, u_int16_t *res_buf, u_int16_t *res_len);
+int voice_file_unload(FCI_CLIENT *fci_handle, cmmd_voice_file_unload_cmd_t *cmd, u_int16_t *res_buf, u_int16_t *res_len);
+int voice_buffer_reset(FCI_CLIENT *fci_handle);
+int cmmVoiceBufSetProcess(int argc, char *argv[], daemon_handle_t daemon_handle);
+
+#endif
diff --git a/cmm/unit_tests/001.sh b/cmm/unit_tests/001.sh
new file mode 100755
index 0000000..215c2a2
--- /dev/null
+++ b/cmm/unit_tests/001.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+cmm -c set socket open sock_id 1 type fpp saddr 1.1.1.1 daddr 2.2.2.2 sport 1 dport 2 proto udp queue 0 dscp 0
diff --git a/cmm/unit_tests/002.sh b/cmm/unit_tests/002.sh
new file mode 100755
index 0000000..67e09a1
--- /dev/null
+++ b/cmm/unit_tests/002.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+cmm -c show socket sock_id 1
diff --git a/cmm/unit_tests/003.sh b/cmm/unit_tests/003.sh
new file mode 100755
index 0000000..202584d
--- /dev/null
+++ b/cmm/unit_tests/003.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cmm -c query rx bridge
+
diff --git a/cmm/unit_tests/004.sh b/cmm/unit_tests/004.sh
new file mode 100755
index 0000000..230d060
--- /dev/null
+++ b/cmm/unit_tests/004.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cmm -c show stat interface lan query
+#returns ERROR: Unexpected returned result from FPP rc:044c
diff --git a/cmm/unit_tests/005.sh b/cmm/unit_tests/005.sh
new file mode 100755
index 0000000..d14fb17
--- /dev/null
+++ b/cmm/unit_tests/005.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+cmm -c query rtcp sock_id 1 reset
diff --git a/cmm/unit_tests/006.sh b/cmm/unit_tests/006.sh
new file mode 100755
index 0000000..06f047e
--- /dev/null
+++ b/cmm/unit_tests/006.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+cmm -c set socket open sock_id 2 type fpp saddr 3.3.3.3 daddr 4.4.4.4 sport 3 dport 4 proto udp queue 0 dscp 0
diff --git a/cmm/unit_tests/007.sh b/cmm/unit_tests/007.sh
new file mode 100755
index 0000000..a0dc2a3
--- /dev/null
+++ b/cmm/unit_tests/007.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+cmm -c set rtp open ccn 1 sock_id_a 1 sock_id_b 2
diff --git a/cmm/unit_tests/008.sh b/cmm/unit_tests/008.sh
new file mode 100755
index 0000000..97e12d6
--- /dev/null
+++ b/cmm/unit_tests/008.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+cmm -c set rtp close ccn 1
diff --git a/cmm/unit_tests/009.sh b/cmm/unit_tests/009.sh
new file mode 100755
index 0000000..a9273b8
--- /dev/null
+++ b/cmm/unit_tests/009.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+cmm -c set rx interface eth0 bridge on
diff --git a/cmm/unit_tests/010.sh b/cmm/unit_tests/010.sh
new file mode 100755
index 0000000..202584d
--- /dev/null
+++ b/cmm/unit_tests/010.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cmm -c query rx bridge
+
diff --git a/cmm/unit_tests/011.sh b/cmm/unit_tests/011.sh
new file mode 100755
index 0000000..f50fbcb
--- /dev/null
+++ b/cmm/unit_tests/011.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+cmm -c query route
+#returns "ERROR: FPP IPV4 ROUTE table empty"
+
diff --git a/cmm/unit_tests/012.sh b/cmm/unit_tests/012.sh
new file mode 100755
index 0000000..c6df2f5
--- /dev/null
+++ b/cmm/unit_tests/012.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cmm -c set natpt open sock_id_a 1 sock_id_b 2 4to6
+#returns "Error 1212 received from FPP"
diff --git a/cmm/unit_tests/013.sh b/cmm/unit_tests/013.sh
new file mode 100755
index 0000000..e9d31d0
--- /dev/null
+++ b/cmm/unit_tests/013.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cmm -c set socket close sock_id 1
+cmm -c set socket close sock_id 2
diff --git a/cmm/unit_tests/014.sh b/cmm/unit_tests/014.sh
new file mode 100755
index 0000000..55300e3
--- /dev/null
+++ b/cmm/unit_tests/014.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cmm -c show rx interface eth0 icc
+#returns "ERROR: Unexpected returned result from FPP rc:fffe"
diff --git a/cmm/unit_tests/015.sh b/cmm/unit_tests/015.sh
new file mode 100755
index 0000000..9c4b0a6
--- /dev/null
+++ b/cmm/unit_tests/015.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+cmm -c set rx interface wan bridge add da 1:1:1:1:1:1
diff --git a/cmm/unit_tests/016.sh b/cmm/unit_tests/016.sh
new file mode 100755
index 0000000..42c1784
--- /dev/null
+++ b/cmm/unit_tests/016.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+cmm -c set rx interface wan bridge remove da 1:1:1:1:1:1
diff --git a/cmm/unit_tests/017.sh b/cmm/unit_tests/017.sh
new file mode 100755
index 0000000..a0b087b
--- /dev/null
+++ b/cmm/unit_tests/017.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+cmm -c set rx interface wan bridge add da 1:1:1:1:1:1
+cmm -c query rx bridge
+
+#Interface eth0 (WAN) Status: OFF
+#Interface eth2 (LAN) Status: OFF
+#Input=wan    DA=01:01:01:01:01:01 SA=       *          Type=  *  Queue=0 Qmod=none VLANPrio=0 Output=lan
+
+#1 Bridge Table Entries found
diff --git a/cmm/unit_tests/018.sh b/cmm/unit_tests/018.sh
new file mode 100755
index 0000000..b1fb247
--- /dev/null
+++ b/cmm/unit_tests/018.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+cmm -c set rx interface wan bridge add output wan
+cmm -c query rx bridge
+
+#Interface eth0 (WAN) Status: OFF
+#Interface eth2 (LAN) Status: OFF
+#Input=wan    DA=00:00:00:00:00:00 SA=       *          Type=  *  Queue=0 Qmod=none VLANPrio=0 Output=wan
+#Input=wan    DA=01:01:01:01:01:01 SA=       *          Type=  *  Queue=0 Qmod=none VLANPrio=0 SessionId=58504 Output=lan
+
+#2 Bridge Table Entries found
diff --git a/cmm/unit_tests/019.sh b/cmm/unit_tests/019.sh
new file mode 100755
index 0000000..95141f9
--- /dev/null
+++ b/cmm/unit_tests/019.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+cmm -c set rx interface wan bridge remove da 00:00:00:00:00:00
+cmm -c query rx bridge
+
+#Interface eth0 (WAN) Status: OFF
+#Interface eth2 (LAN) Status: OFF
+#Input=wan    DA=01:01:01:01:01:01 SA=       *          Type=  *  Queue=0 Qmod=none VLANPrio=0 Output=lan
+
+#1 Bridge Table Entries found
+
diff --git a/cmm/unit_tests/020.sh b/cmm/unit_tests/020.sh
new file mode 100755
index 0000000..363c80b
--- /dev/null
+++ b/cmm/unit_tests/020.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:2
+cmm -c query rx bridge
+
+#Interface eth0 (WAN) Status: OFF
+#Interface eth2 (LAN) Status: OFF
+#Input=wan    DA=00:00:00:00:00:00 SA=02:02:02:02:02:02 Type=  *  Queue=0 Qmod=none VLANPrio=0 Output=lan
+#Input=wan    DA=01:01:01:01:01:01 SA=       *          Type=  *  Queue=0 Qmod=none VLANPrio=0 SessionId=58504 Output=lan
+
+#2 Bridge Table Entries found
diff --git a/cmm/unit_tests/021.sh b/cmm/unit_tests/021.sh
new file mode 100755
index 0000000..085b49f
--- /dev/null
+++ b/cmm/unit_tests/021.sh
@@ -0,0 +1,155 @@
+#!/bin/sh
+
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:2
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:3
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:4
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:5
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:6
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:7
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:8
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:9
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:10
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:11
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:12
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:13
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:14
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:15
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:16
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:17
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:18
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:19
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:20
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:21
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:22
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:23
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:24
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:25
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:26
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:27
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:28
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:29
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:30
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:31
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:32
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:33
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:34
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:35
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:36
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:37
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:38
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:39
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:40
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:41
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:42
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:43
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:44
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:45
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:46
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:47
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:48
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:49
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:50
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:51
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:52
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:53
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:54
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:55
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:56
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:57
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:58
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:59
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:60
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:61
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:62
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:63
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:64
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:65
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:66
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:67
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:68
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:69
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:70
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:71
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:72
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:73
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:74
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:75
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:76
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:77
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:78
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:79
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:80
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:81
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:82
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:83
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:84
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:85
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:86
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:87
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:88
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:89
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:90
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:91
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:92
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:93
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:94
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:95
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:96
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:A0
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:A1
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:A2
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:A3
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:A4
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:A5
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:A6
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:A7
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:A8
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:A9
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:B0
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:B1
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:B2
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:B3
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:B4
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:B5
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:B6
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:B7
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:B8
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:B9
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:C0
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:C1
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:C2
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:C3
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:C4
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:C5
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:C6
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:C7
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:C8
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:C9
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:D0
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:D1
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:D2
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:D3
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:D4
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:D5
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:D6
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:D7
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:D8
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:D9
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:D0
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:E1
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:E2
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:E3
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:E4
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:E5
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:E6
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:E7
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:E8
+cmm -c set rx interface wan bridge add sa 2:2:2:2:2:E9
+cmm -c query rx bridge
+
+#Interface eth0 (WAN) Status: OFF
+#Interface eth2 (LAN) Status: OFF
+#Input=wan    DA=00:00:00:00:00:00 SA=02:02:02:02:02:02 Type=  *  Queue=0 Qmod=none VLANPrio=0 Output=lan
+#Input=wan    DA=01:01:01:01:01:01 SA=       *          Type=  *  Queue=0 Qmod=none VLANPrio=0 SessionId=58504 Output=lan
+
+#2 Bridge Table Entries found
diff --git a/cmm/unit_tests/022.sh b/cmm/unit_tests/022.sh
new file mode 100755
index 0000000..280fe80
--- /dev/null
+++ b/cmm/unit_tests/022.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cmm -c set socket open sock_id 1 type fpp saddr 1.1.1.1 daddr 2.2.2.2 sport 1 dport 2 proto udp queue 0 dscp 0
+#should return "cmmSocketSetProcess: error sending message to daemon"
diff --git a/cmm/unit_tests/023.sh b/cmm/unit_tests/023.sh
new file mode 100755
index 0000000..4121019
--- /dev/null
+++ b/cmm/unit_tests/023.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+ip -6 tunnel add tnl0 mode ethipip6 remote 2000::1 local 2000::2 dev eth0
+ifconfig tnl0 up
+cmm -c tunnel tnl0 add ethipoip6 ipsec 1
+cmm -c tunnel tnl0 show
diff --git a/cmm/unit_tests/024.sh b/cmm/unit_tests/024.sh
new file mode 100755
index 0000000..56c8101
--- /dev/null
+++ b/cmm/unit_tests/024.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+cmm -c tunnel tnl0 del
+ifconfig tnl0 down
+ip -6 tunnel del tnl0
diff --git a/cmm/unit_tests/025.sh b/cmm/unit_tests/025.sh
new file mode 100755
index 0000000..c87962b
--- /dev/null
+++ b/cmm/unit_tests/025.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+ip -6 tunnel add tnl0 mode ethipip6 remote 2000::1 local 2000::2 dev eth0
+ifconfig tnl0 up
+cmm -c tunnel tnl0 add ethipoip6 ipsec 1
+cmm -c tunnel tnl0 show
+
+#Details for tunnel tnl0
+#Tunnel name        : tnl0
+#Protocol           : etherip over ip6 (97)
+#Local address      : 2000::2
+#Remote address     : 2000::1
+#Output device      : lo
+#Flags              : 1
+#Secure          : yes
+#Encap limit     : 4
+#Status             : running
diff --git a/cmm/unit_tests/026.sh b/cmm/unit_tests/026.sh
new file mode 100755
index 0000000..e70037c
--- /dev/null
+++ b/cmm/unit_tests/026.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+cmm -c tunnel tnl0 del
+cmm -c tunnel tnl0 add ethipoip6 ipsec 1
+
+#Error 3 received from CMM Deamon for CMD_CMMTD_TUNNEL_ADD - bug #57854
diff --git a/cmm/unit_tests/027.sh b/cmm/unit_tests/027.sh
new file mode 100755
index 0000000..35ab7f7
--- /dev/null
+++ b/cmm/unit_tests/027.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cmm -c set ff enable
+cmm -c set ff disable
diff --git a/cmm/unit_tests/028.sh b/cmm/unit_tests/028.sh
new file mode 100755
index 0000000..0cff86e
--- /dev/null
+++ b/cmm/unit_tests/028.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+cmm -c set mc6 interface eth0 add group 1.1.1.1 2000::1 2000::2
+cmm -c query mc6
+cmm -c set mc6 interface eth0 del group 1.1.1.1 2000::1 2000::2
+
+#IPv6 Multicast Entries:
+#0000: Src addr: 2000::1  src_mask_len: 1   Dst addr: 2000::2  
+#output interfaces:  eth0  
diff --git a/cmm/unit_tests/029.sh b/cmm/unit_tests/029.sh
new file mode 100755
index 0000000..7be0c15
--- /dev/null
+++ b/cmm/unit_tests/029.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+cmm -c set mc6 interface eth0 del group 1.1.1.1 2000::1 2000::2
+
+#Error 700 received from FPP for CMD_MC6_MULTICAST
+#700 means not found
diff --git a/cmm/unit_tests/030.sh b/cmm/unit_tests/030.sh
new file mode 100755
index 0000000..11717aa
--- /dev/null
+++ b/cmm/unit_tests/030.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+cmm -c set mc6 interface eth0 add group 1.1.1.1 2000::1 2000::2
+cmm -c set mc6 interface eth0 update group 1.1.1.2 2001::1 2000::2
+cmm -c query mc6
diff --git a/cmm/unit_tests/031.sh b/cmm/unit_tests/031.sh
new file mode 100755
index 0000000..fc88700
--- /dev/null
+++ b/cmm/unit_tests/031.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+cmm -c set mc4 interface eth0 add group 1.1.1.1 192.168.0.1 192.168.0.2
+cmm -c query mc4
+cmm -c set mc4 interface eth0 del group 1.1.1.1 192.168.0.1 192.168.0.2
+cmm -c query mc4
+
+#IPv4 Multicast Entries:
+#0000: Src addr: 192.168.0.1  src_mask_len: 1   Dst addr: 192.168.0.2  
+#output interfaces:  eth0  
+#ERROR: FPP Multicast IPV4 table empty
diff --git a/cmm/unit_tests/032.sh b/cmm/unit_tests/032.sh
new file mode 100755
index 0000000..b02b405
--- /dev/null
+++ b/cmm/unit_tests/032.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+cmm -c set mc4 interface eth0 del group 1.1.1.1 192.168.0.1 192.168.0.2
+
+#Error 700 received from FPP for CMD_MC4_MULTICAST
+#700 means not found
diff --git a/cmm/unit_tests/033.sh b/cmm/unit_tests/033.sh
new file mode 100755
index 0000000..f4a7521
--- /dev/null
+++ b/cmm/unit_tests/033.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+cmm -c set mc4 interface eth0 add group 1.1.1.1 192.168.0.1 192.168.0.2
+cmm -c set mc4 interface eth0 update group 1.1.1.2 192.168.0.3 192.168.0.2
+cmm -c query mc4
+
diff --git a/cmm/unit_tests/034.sh b/cmm/unit_tests/034.sh
new file mode 100755
index 0000000..64c328f
--- /dev/null
+++ b/cmm/unit_tests/034.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+cmm -c relay add 00:00:00:00:01:00 00:00:00:00:00:02 eth2 eth1 1 1
+cmm -c relay del 00:00:00:00:01:00 00:00:00:00:00:02 eth2 eth1 1 1
+
+#Error 32002 received from CMM Deamon
+#Error 32002 received from CMM Deamon
+#32002 means not configured.
+#on server-side:
+#Received commandCode: (0611) size 48
+#00 00 00 00 01 00 00 00 00 00 00 02 74 6e 6c 30 
+#00 00 00 00 00 00 00 00 00 00 00 00 65 74 68 31 
+#00 00 00 00 00 00 00 00 00 00 00 00 01 00 01 00 
+#__itf_find: find interface(11)
+#__itf_find: find interface(11)
+#__itf_find: find interface(4)
+#__itf_find: find interface(4)
+#cmmRelayAdd::125:Interface is not programmed to FPP  4
+#cmmDaemonThread: Sending ack commandCode: 0611, rc 0x0000, dataSize: 2 
+#02 7d 
+#cmmDaemonThread: Received commandCode: (0612) size 48
+#00 00 00 00 01 00 00 00 00 00 00 02 74 6e 6c 30 
+#00 00 00 00 00 00 00 00 00 00 00 00 65 74 68 31 
+#00 00 00 00 00 00 00 00 00 00 00 00 01 00 01 00 
+#relay_table is NULL
+#cmmDaemonThread: Sending ack commandCode: 0612, rc 0x0000, dataSize: 2 
+#02 7d 
diff --git a/cmm/unit_tests/035.sh b/cmm/unit_tests/035.sh
new file mode 100755
index 0000000..e378cb8
--- /dev/null
+++ b/cmm/unit_tests/035.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+cmm -c set route interface eth2 add prio 1 srcip 192.168.1.250 input eth0
diff --git a/cmm/unit_tests/036.sh b/cmm/unit_tests/036.sh
new file mode 100755
index 0000000..9355c73
--- /dev/null
+++ b/cmm/unit_tests/036.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+vconfig add eth0 1
+cmm -c vlan add eth0.1
+vconfig rem eth0.1
+#Error sending CMD_VLAN_ENTRY Register
diff --git a/cmm/unit_tests/037.sh b/cmm/unit_tests/037.sh
new file mode 100755
index 0000000..bf5b32f
--- /dev/null
+++ b/cmm/unit_tests/037.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+vconfig add eth0 1
+ifconfig eth0.1 up
+cmm -c vlan add eth0.1
+cmm -c vlan del eth0.1
+vconfig rem eth0.1
diff --git a/cmm/unit_tests/038.sh b/cmm/unit_tests/038.sh
new file mode 100755
index 0000000..84a7b37
--- /dev/null
+++ b/cmm/unit_tests/038.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+vconfig add eth0 1
+ifconfig eth0.1 up
+cmm -c vlan add eth0.1
+cmm -c vlan show
+cmm -c query vlan
diff --git a/cmm/unit_tests/039.sh b/cmm/unit_tests/039.sh
new file mode 100755
index 0000000..d9c8dd1
--- /dev/null
+++ b/cmm/unit_tests/039.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cmm -c set sa_query_timer enable
+cmm -c set sa_query_timer disable
diff --git a/cmm/unit_tests/040.sh b/cmm/unit_tests/040.sh
new file mode 100755
index 0000000..cdfd06a
--- /dev/null
+++ b/cmm/unit_tests/040.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+cmm -c set socket6 open sock_id 10 type fpp saddr 2000::1 daddr 2000::2 sport 1 dport 2 proto udp queue 0 dscp 0
+cmm -c show socket sock_id 10
+cmm -c set socket6 close sock_id 10
diff --git a/cmm/unit_tests/041.sh b/cmm/unit_tests/041.sh
new file mode 100755
index 0000000..9ddde5a
--- /dev/null
+++ b/cmm/unit_tests/041.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cmm -c set voicebuf load 5 8 160 ./voicebuf
+cmm -c set voicebuf unload 5
\ No newline at end of file
diff --git a/cmm/unit_tests/042.sh b/cmm/unit_tests/042.sh
new file mode 100755
index 0000000..471c1a8
--- /dev/null
+++ b/cmm/unit_tests/042.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+cmm -c set voicebuf load 5 8 160 ./voicebuf
+cmm -c set voicebuf load 5 8 160 ./voicebuf
+cmm -c set voicebuf unload 5
diff --git a/cmm/unit_tests/voicebuf b/cmm/unit_tests/voicebuf
new file mode 100644
index 0000000..d8bf621
--- /dev/null
+++ b/cmm/unit_tests/voicebuf
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+cmm -c relay add 00:00:00:00:01:00 00:00:00:00:00:02 eth2 eth1 1 1
+cmm -c relay del 00:00:00:00:01:00 00:00:00:00:00:02 eth2 eth1 1 1
+
+#Error 32002 r
\ No newline at end of file
