keepalived (1:1.1.20-1) debian-dir only changes

Summary

 debian/changelog                          |  264 +++++++
 debian/compat                             |    1 
 debian/control                            |   24 
 debian/copyright                          |   40 +
 debian/dirs                               |    4 
 debian/docs                               |    6 
 debian/include/net/ip_vs.h                |  999 ++++++++++++++++++++++++++++++
 debian/init.d                             |   80 ++
 debian/patches/04_fix_manpage.patch       |   12 
 debian/patches/95_use_linux_ip_vs_h.patch |   60 +
 debian/patches/99_linux_2.6_compat.patch  |   13 
 debian/rules                              |   21 
 debian/source/format                      |    1 
 debian/watch                              |    2 
 14 files changed, 1527 insertions(+)

    
download this patch

Patch contents

--- keepalived-1.1.20.orig/debian/init.d
+++ keepalived-1.1.20/debian/init.d
@@ -0,0 +1,80 @@
+#! /bin/sh
+#
+# keepalived   LVS cluster monitor daemon.
+#
+#              Written by Andres Salomon <dilinger@voxel.net>
+#
+### BEGIN INIT INFO
+# Provides:          keepalived
+# Required-Start:    $syslog $network $remote_fs
+# Required-Stop:     $syslog $network $remote_fs
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Starts keepalived
+# Description:       Starts keepalived lvs loadbalancer
+### END INIT INFO
+PATH=/sbin:/bin:/usr/sbin:/usr/bin
+DAEMON=/usr/sbin/keepalived
+NAME=keepalived
+DESC=keepalived
+CONFIG=/etc/keepalived/keepalived.conf
+TMPFILES="/tmp/.vrrp /tmp/.healthcheckers"
+
+#includes lsb functions 
+. /lib/lsb/init-functions
+
+test -f $CONFIG || exit 0 
+test -f $DAEMON || exit 0
+
+case "$1" in
+  start)
+       	log_daemon_msg "Starting $DESC" "$NAME"
+	for file in $TMPFILES
+	do 
+       		test -e $file && test ! -L $file && rm $file
+	done
+	if start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
+               --exec $DAEMON; then
+		log_end_msg 0
+	else
+		log_end_msg 1
+	fi
+       ;;
+  stop)
+	log_daemon_msg "Stopping $DESC" "$NAME"
+	if start-stop-daemon --oknodo --stop --quiet --pidfile /var/run/$NAME.pid \
+        	--exec $DAEMON; then
+		log_end_msg 0
+	else
+		log_end_msg 1
+	fi
+       ;;
+  reload|force-reload)
+	log_action_begin_msg "Reloading $DESC configuration..."
+      	if start-stop-daemon --stop --quiet --signal 1 --pidfile \
+               /var/run/$NAME.pid --exec $DAEMON; then
+	       log_end_msg 0
+	else
+		log_action_end_msg 1
+	fi
+       ;;
+  restart)
+  	log_action_begin_msg "Restarting $DESC" "$NAME"
+
+       	start-stop-daemon --stop --quiet --pidfile \
+		/var/run/$NAME.pid --exec $DAEMON || true 
+       sleep 1
+       if start-stop-daemon --start --quiet --pidfile \
+               /var/run/$NAME.pid --exec $DAEMON; then
+	       log_end_msg 0
+	else
+		log_end_msg 1
+	fi
+       ;;
+  *)
+       echo "Usage: /etc/init.d/$NAME {start|stop|restart|reload|force-reload}" >&2
+       exit 1
+       ;;
+esac
+
+exit 0
--- keepalived-1.1.20.orig/debian/changelog
+++ keepalived-1.1.20/debian/changelog
@@ -0,0 +1,264 @@
+keepalived (1:1.1.20-1) unstable; urgency=low
+
+  * Go back to 1.1.20 since 1.2.0 is not ready for release
+  * Bump standards version (no changes)
+
+ -- Alexander Wirt <formorer@debian.org>  Sat, 14 Aug 2010 10:17:10 +0200
+
+keepalived (1.2.0-1) unstable; urgency=low
+
+  * New upstream release (Closes: #580607)
+  * Bump standards version (no changes)
+
+ -- Alexander Wirt <formorer@debian.org>  Sun, 04 Jul 2010 11:02:13 +0200
+
+keepalived (1.1.20-1) unstable; urgency=low
+
+  * New upstream release (Closes: #580607)
+  * Bump standards version (no changes)
+  * Raise debhelper dep to v5
+  * Refresh 95_use_linux_ip_vs_h.patch
+  * Fix typo in description
+  * Declare debsource v1.0
+  * Fix restart if daemon doesn't run (Closes: #561357)
+
+ -- Alexander Wirt <formorer@debian.org>  Sat, 08 May 2010 20:56:58 +0200
+
+keepalived (1.1.19-1) unstable; urgency=low
+
+  * New upstream version (Closes: #557814, #548254)
+    - Fix gigabit status interface support (Closes: #555634)
+  * Fix error reporting and manpage of genhash (Closes: #575399)
+
+ -- Alexander Wirt <formorer@debian.org>  Fri, 23 Apr 2010 13:17:53 +0200
+
+keepalived (1.1.17-2) unstable; urgency=low
+
+  * Reenable ipvs support thanks to Vincent Bernat for the hint 
+    (Closes: #530738)
+
+ -- Alexander Wirt <formorer@debian.org>  Thu, 28 May 2009 09:55:52 +0200
+
+keepalived (1.1.17-1) unstable; urgency=low
+
+  * New upstream release (Closes: #516102). 
+    Thanks to Vincent Bernat for the help
+  * Bump standards version (no changes)
+  * Remove outdated README.Debian (Closes: #470626)
+  * support nostrip option (Closes: #478261)
+    Thanks to Vincent Bernat for the patch
+  * Extract the patch for 336885 into debian/patches (Closes: #510092)
+
+ -- Alexander Wirt <formorer@debian.org>  Sun, 26 Apr 2009 19:41:12 +0200
+
+keepalived (1.1.15-1) unstable; urgency=low
+
+  * New upstream release (Closes: #401827)
+  * Remove 00_fix-manpagepath.patch and
+    01_fix-genhash-manpagepath.patch(obsolete)
+  * Bump standards version
+
+ -- Alexander Wirt <formorer@debian.org>  Tue, 18 Dec 2007 18:44:55 +0100
+
+keepalived (1.1.13-1) unstable; urgency=low
+
+  * New upstream release (Closes: #401827)
+  * Add patch to compile with libc6-dev. Thanks to Cyril Brulebois 
+    for the original patch (Closes: #428927)
+
+ -- Alexander Wirt <formorer@debian.org>  Tue, 24 Jul 2007 22:24:08 +0200
+
+keepalived (1.1.12-1) unstable; urgency=low
+
+  * New upstream release (Closes: #365220)
+  * Call notification for every failure. Thanks to Len Sorenson for
+    the patch (Closes: #336885)
+  * delete /tmp/.vrrp and /tmp/.healthcheckers if they exists before
+    starting keepalived (Closes: #333102)
+  * bumped standard version
+
+ -- Alexander Wirt <formorer@debian.org>  Wed, 28 Jun 2006 20:01:56 +0200
+
+keepalived (1.1.11-3) unstable; urgency=low
+
+  * Added a warning about sarge kernels to README.Debian and 
+    the package description 
+
+ -- Alexander Wirt <formorer@debian.org>  Fri, 29 Apr 2005 23:22:40 +0200
+
+keepalived (1.1.11-2) unstable; urgency=low
+
+  * Added iproute to dependency (Closes: #303421)
+
+ -- Alexander Wirt <formorer@debian.org>  Fri,  8 Apr 2005 21:45:33 +0200
+
+keepalived (1.1.11-1) unstable; urgency=low
+
+  * New upstream release (Closes: #297067)
+    - Fixes several bugs with his childs which
+      should fix restart und fork bugs 
+      (Closes: #296516)
+  * Updated to iv_vs.h 0x010201 (2.6.11)
+
+ -- Alexander Wirt <formorer@debian.org>  Wed,  2 Mar 2005 21:41:29 +0100
+
+keepalived (1.1.7-3) unstable; urgency=low
+
+  * No longer install the config per default (Closes: #261615)
+
+ -- Alexander Wirt <formorer@debian.org>  Sat, 14 Aug 2004 20:36:43 +0200
+
+keepalived (1.1.7-2) unstable; urgency=low
+
+  * New Maintainer: Alexander Wirt <formorer@debian.org>
+    No Bugs, no problems with this package. Thanks for the good 
+    work Andres, I'm happy to take this package
+
+ -- Alexander Wirt <formorer@debian.org>  Wed, 19 May 2004 20:32:03 +0200
+
+keepalived (1.1.7-1) unstable; urgency=low
+
+  * New upstream release.
+  * 003-genhash_8.patch: drop genhash manpage, as it's been merged upstream.
+  * 001-genhash_1.patch: add new manpage location fix; should be genhash(1).
+
+ -- Andres Salomon <dilinger@voxel.net>  Sun, 02 May 2004 23:44:39 -0400
+
+keepalived (1.1.6-1) unstable; urgency=low
+
+  * New upstream release.
+  * Drop 001-really_distclean.patch and 002-use_destdir.patch; merged 
+    upstream.
+  * 003-genhash_8.patch: add genhash manpage.
+  * Update ip_vs.h to version from 2.6.4-1.  Keepalived now compiles
+    using 2.6 headers.  Update description accordingly.
+  * Update copyright file.
+  * Make init script not check if kernel has IPVS support (closes: #237141).
+
+ -- Andres Salomon <dilinger@voxel.net>  Tue, 30 Mar 2004 22:05:24 -0500
+
+keepalived (1.1.5-2) unstable; urgency=low
+
+  * Can't use kernel-headers package, not all arch have it.  Revert
+    back to storing headers in debian/ subdir.
+
+ -- Andres Salomon <dilinger@voxel.net>  Tue, 10 Feb 2004 02:38:14 -0500
+
+keepalived (1.1.5-1) unstable; urgency=low
+
+  * New upstream release.  (Closes: #231418)
+  * Now that ipvs is in 2.4, use kernel-headers package instead of storing
+    kernel headers in debian/ subdir.  Add appropriate build-dep.
+  * Convert buildsys to cdbs and update standards-version.
+  * 001-really_distclean.patch: clean binaries out of ./bin.
+  * 002-use_destdir.patch: add DESTDIR to makefiles.
+  * Upstream now has manpages for keepalived and keepalived.conf.
+
+ -- Andres Salomon <dilinger@voxel.net>  Fri, 30 Jan 2004 02:51:47 -0500
+
+keepalived (1.0.3-1) unstable; urgency=low
+
+  * New upstream release; I'm going to wait for this release to enter
+    testing before allowing the 1.1.x series into unstable.  (Closes: #199437)
+  * Update maintainer email address.
+  * Update standards-version.
+  * Update kernel headers and scripts.
+
+ -- Andres Salomon <dilinger@voxel.net>  Sat, 26 Jul 2003 01:03:19 -0400
+
+keepalived (1.0.2-1) unstable; urgency=low
+
+  * New upstream release.
+  * Fixed previous changelog entry's year (2002 -> 2003), so it doesn's appear
+    that I time travel.  At the very least, I wouldn't want people discovering
+    my secret, and risk my time machine falling into the wrong hands.
+  * Upstream docs changed location; updated.
+  * Dropped dh_undocumented usage.
+  * Added reload support to the init script.
+
+ -- Andres Salomon <dilinger@mp3revolution.net>  Thu, 17 Apr 2003 00:38:48 -0500
+
+keepalived (1.0.0-1) unstable; urgency=low
+
+  * New upstream release.
+  * Update standards-version to 3.5.8.0.
+  * Update kernel headers for ipvs-1.0.7.
+
+ -- Andres Salomon <dilinger@mp3revolution.net>  Fri, 17 Jan 2003 15:26:38 -0400
+
+keepalived (0.7.6-1) unstable; urgency=low
+
+  * New upstream release.
+  * Several minor description/copyright changes to make new lintian happy.
+  * Add removal of config.log to clean target in debian/rules.
+
+ -- Andres Salomon <dilinger@mp3revolution.net>  Sun,  8 Dec 2002 23:59:17 -0400
+
+keepalived (0.7.1-1) unstable; urgency=low
+
+  * New upstream release.
+  * Update kernel headers for ipvs-1.0.6.
+  * Remove dependance upon gcc-3.0; upstream says 2.95 works fine now,
+    and we should be transitioning to gcc-3.2 soon, anyways (hopefully).
+
+ -- Andres Salomon <dilinger@mp3revolution.net>  Sat, 21 Sep 2002 16:05:52 -0400
+
+keepalived (0.6.10-2) unstable; urgency=low
+
+  * Add OpenSSL exception clause to the copyright file.
+
+ -- Andres Salomon <dilinger@mp3revolution.net>  Thu, 22 Aug 2002 11:48:16 -0400
+
+keepalived (0.6.10-1) unstable; urgency=low
+
+  * New upstream release.
+  * Update kernel headers to 2.4.19 and ipvs-1.0.4.
+
+ -- Andres Salomon <dilinger@mp3revolution.net>  Wed, 14 Aug 2002 23:42:48 -0400
+
+keepalived (0.6.8-1) unstable; urgency=low
+
+  * New upstream release.
+  * Updated description to mention VRRPv2.
+  * Depend upon gcc-3.0, since gcc-2.95 and keepalived have, uh, issues.
+  * Updated various paths to reflect changed build system/layout.
+
+ -- Andres Salomon <dilinger@mp3revolution.net>  Thu, 18 Jul 2002 01:47:42 -0500
+
+keepalived (0.6.2-1) unstable; urgency=low
+
+  * New upstream release, upload to archive.  (Closes: #144100)
+  * Autoconf sanity upstream, remove configure.in/Makefile.in patches.
+  * Fix typo in top level Makefile.in.
+  * Updated URL for keepalived (keepalived.sf.net -> www.keepalived.org).
+  * For easier maintenance of kernel header files, grab scripts from my
+    devmapper package.
+
+ -- Andres Salomon <dilinger@mp3revolution.net>  Sun, 16 Jun 2002 15:47:39 -0500
+
+keepalived (0.5.8-1) unstable; urgency=low
+
+  * New upstream release.
+  * Note the OpenSSL exception clause in the README.
+
+ -- Andres Salomon <dilinger@mp3revolution.net>  Tue, 21 May 2002 15:18:02 -0500
+
+keepalived (0.5.7-1) unstable; urgency=low
+
+  * New upstream release (w/ SSL_GET fixes!).
+  * Moved sample configs to doc directory.
+
+ -- Andres Salomon <dilinger@mp3revolution.net>  Thu,  2 May 2002 20:14:38 -0500
+
+keepalived (0.5.6-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Andres Salomon <dilinger@mp3revolution.net>  Thu, 11 Apr 2002 01:38:19 -0500
+
+keepalived (0.5.5-1) unstable; urgency=low
+
+  * Initial Release.
+
+ -- Andres Salomon <dilinger@mp3revolution.net>  Thu, 11 Apr 2002 01:38:19 -0500
+
--- keepalived-1.1.20.orig/debian/docs
+++ keepalived-1.1.20/debian/docs
@@ -0,0 +1,6 @@
+AUTHOR
+CONTRIBUTORS
+TODO
+README
+doc/keepalived.conf*
+doc/samples
--- keepalived-1.1.20.orig/debian/compat
+++ keepalived-1.1.20/debian/compat
@@ -0,0 +1 @@
+5
--- keepalived-1.1.20.orig/debian/rules
+++ keepalived-1.1.20/debian/rules
@@ -0,0 +1,21 @@
+#!/usr/bin/make -f
+
+include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/rules/simple-patchsys.mk
+include /usr/share/cdbs/1/class/autotools.mk
+
+DEB_AUTO_UPDATE_AUTOCONF = 2.50 
+DEB_CONFIGURE_SCRIPT_ENV := STRIP=/bin/true $(DEB_CONFIGURE_SCRIPT_ENV)
+
+binary-install/keepalived::
+	rm -rf $(DEB_DESTDIR)/etc/keepalived/samples
+	rm -rf $(DEB_DESTDIR)/etc/keepalived/keepalived.conf
+	rm -rf $(DEB_DESTDIR)/etc/init.d/keepalived.init
+	rm -rf $(DEB_DESTDIR)/etc/rc.d
+	rm -rf $(DEB_DESTDIR)/etc/sysconfig
+	rm -rf $(DEB_DESTDIR)/usr/man
+
+clean::
+	-rm config.status
+	-rm config.log
+	-rm configure
--- keepalived-1.1.20.orig/debian/copyright
+++ keepalived-1.1.20/debian/copyright
@@ -0,0 +1,40 @@
+This package was debianized by Andres Salomon <dilinger@voxel.net> on
+Thu, 11 Apr 2002 01:38:19 -0400.
+
+And is now maintained from Alexander Wirt <formorer@debian.org> on
+Do Mai 20 00:51:09 CEST 2004
+
+It was downloaded from http://www.keepalived.org/
+
+Upstream Author: Alexandre Cassen <acassen@linux-vs.org>
+
+Copyright (C) 2001-2004 Alexandre Cassen <acassen@linux-vs.org>
+
+keepalived 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.
+
+keepalived 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 St, Fifth Floor, Boston,
+MA 02110-1301, USA.
+
+
+On Debian systems, the full text of the GPL can be found in
+/usr/share/common-licenses/GPL
+
+Additionally, the following clause applies:
+
+In addition, as the copyright holder of Keepalived,
+I, Alexandre Cassen, <acassen@linux-vs.org>,
+grant the following special exception: 
+
+	I, Alexandre Cassen, <acassen@linux-vs.org>, explicitly allow
+	the compilation and distribution of the Keepalived software with
+	the OpenSSL Toolkit.
--- keepalived-1.1.20.orig/debian/dirs
+++ keepalived-1.1.20/debian/dirs
@@ -0,0 +1,4 @@
+usr/bin
+usr/sbin
+etc/keepalived
+usr/share/doc/keepalived/samples
--- keepalived-1.1.20.orig/debian/watch
+++ keepalived-1.1.20/debian/watch
@@ -0,0 +1,2 @@
+version=3
+http://www.keepalived.org/software/keepalived-(.*).tar.gz
--- keepalived-1.1.20.orig/debian/control
+++ keepalived-1.1.20/debian/control
@@ -0,0 +1,24 @@
+Source: keepalived
+Section: admin
+Priority: optional
+Maintainer: Alexander Wirt <formorer@debian.org>
+Build-Depends: debhelper (>= 5), libssl-dev, libpopt-dev, cdbs, autoconf, linux-libc-dev
+Standards-Version: 3.9.1
+
+Package: keepalived
+Section: admin
+Architecture: any
+Depends: ${shlibs:Depends}, ipvsadm, iproute, ${misc:Depends}
+Description: Failover and monitoring daemon for LVS clusters
+ keepalived is used for monitoring real servers within a Linux
+ Virtual Server (LVS) cluster.  keepalived can be configured to
+ remove real servers from the cluster pool if it stops responding,
+ as well as send a notification email to make the admin aware of
+ the service failure.
+ .
+ In addition, keepalived implements an independent Virtual Router
+ Redundancy Protocol (VRRPv2; see rfc2338 for additional info)
+ framework for director failover.
+ .
+ You need a kernel >= 2.4.28 or >= 2.6.11 for keepalived.
+ See README.Debian for more information.
--- keepalived-1.1.20.orig/debian/source/format
+++ keepalived-1.1.20/debian/source/format
@@ -0,0 +1 @@
+1.0
--- keepalived-1.1.20.orig/debian/include/net/ip_vs.h
+++ keepalived-1.1.20/debian/include/net/ip_vs.h
@@ -0,0 +1,999 @@
+/*
+ *      IP Virtual Server
+ *      data structure and functionality definitions
+ */
+
+#ifndef _IP_VS_H
+#define _IP_VS_H
+
+#include <asm/types.h>		/* For __uXX types */
+
+#define IP_VS_VERSION_CODE	0x010201
+#define NVERSION(version)			\
+	(version >> 16) & 0xFF,			\
+	(version >> 8) & 0xFF,			\
+	version & 0xFF
+
+/*
+ *      Virtual Service Flags
+ */
+#define IP_VS_SVC_F_PERSISTENT	0x0001		/* persistent port */
+#define IP_VS_SVC_F_HASHED	0x0002		/* hashed entry */
+
+/*
+ *      Destination Server Flags
+ */
+#define IP_VS_DEST_F_AVAILABLE	0x0001		/* server is available */
+#define IP_VS_DEST_F_OVERLOAD	0x0002		/* server is overloaded */
+
+/*
+ *      IPVS sync daemon states
+ */
+#define IP_VS_STATE_NONE	0x0000		/* daemon is stopped */
+#define IP_VS_STATE_MASTER	0x0001		/* started as master */
+#define IP_VS_STATE_BACKUP	0x0002		/* started as backup */
+
+/*
+ *      IPVS socket options
+ */
+#define IP_VS_BASE_CTL		(64+1024+64)		/* base */
+
+#define IP_VS_SO_SET_NONE	IP_VS_BASE_CTL		/* just peek */
+#define IP_VS_SO_SET_INSERT	(IP_VS_BASE_CTL+1)
+#define IP_VS_SO_SET_ADD	(IP_VS_BASE_CTL+2)
+#define IP_VS_SO_SET_EDIT	(IP_VS_BASE_CTL+3)
+#define IP_VS_SO_SET_DEL	(IP_VS_BASE_CTL+4)
+#define IP_VS_SO_SET_FLUSH	(IP_VS_BASE_CTL+5)
+#define IP_VS_SO_SET_LIST	(IP_VS_BASE_CTL+6)
+#define IP_VS_SO_SET_ADDDEST	(IP_VS_BASE_CTL+7)
+#define IP_VS_SO_SET_DELDEST	(IP_VS_BASE_CTL+8)
+#define IP_VS_SO_SET_EDITDEST	(IP_VS_BASE_CTL+9)
+#define IP_VS_SO_SET_TIMEOUT	(IP_VS_BASE_CTL+10)
+#define IP_VS_SO_SET_STARTDAEMON (IP_VS_BASE_CTL+11)
+#define IP_VS_SO_SET_STOPDAEMON (IP_VS_BASE_CTL+12)
+#define IP_VS_SO_SET_RESTORE    (IP_VS_BASE_CTL+13)
+#define IP_VS_SO_SET_SAVE       (IP_VS_BASE_CTL+14)
+#define IP_VS_SO_SET_ZERO	(IP_VS_BASE_CTL+15)
+#define IP_VS_SO_SET_MAX	IP_VS_SO_SET_ZERO
+
+#define IP_VS_SO_GET_VERSION	IP_VS_BASE_CTL
+#define IP_VS_SO_GET_INFO	(IP_VS_BASE_CTL+1)
+#define IP_VS_SO_GET_SERVICES	(IP_VS_BASE_CTL+2)
+#define IP_VS_SO_GET_SERVICE	(IP_VS_BASE_CTL+3)
+#define IP_VS_SO_GET_DESTS	(IP_VS_BASE_CTL+4)
+#define IP_VS_SO_GET_DEST	(IP_VS_BASE_CTL+5)	/* not used now */
+#define IP_VS_SO_GET_TIMEOUT	(IP_VS_BASE_CTL+6)
+#define IP_VS_SO_GET_DAEMON	(IP_VS_BASE_CTL+7)
+#define IP_VS_SO_GET_MAX	IP_VS_SO_GET_DAEMON
+
+
+/*
+ *      IPVS Connection Flags
+ */
+#define IP_VS_CONN_F_FWD_MASK	0x0007		/* mask for the fwd methods */
+#define IP_VS_CONN_F_MASQ	0x0000		/* masquerading/NAT */
+#define IP_VS_CONN_F_LOCALNODE	0x0001		/* local node */
+#define IP_VS_CONN_F_TUNNEL	0x0002		/* tunneling */
+#define IP_VS_CONN_F_DROUTE	0x0003		/* direct routing */
+#define IP_VS_CONN_F_BYPASS	0x0004		/* cache bypass */
+#define IP_VS_CONN_F_SYNC	0x0020		/* entry created by sync */
+#define IP_VS_CONN_F_HASHED	0x0040		/* hashed entry */
+#define IP_VS_CONN_F_NOOUTPUT	0x0080		/* no output packets */
+#define IP_VS_CONN_F_INACTIVE	0x0100		/* not established */
+#define IP_VS_CONN_F_OUT_SEQ	0x0200		/* must do output seq adjust */
+#define IP_VS_CONN_F_IN_SEQ	0x0400		/* must do input seq adjust */
+#define IP_VS_CONN_F_SEQ_MASK	0x0600		/* in/out sequence mask */
+#define IP_VS_CONN_F_NO_CPORT	0x0800		/* no client port set yet */
+
+/* Move it to better place one day, for now keep it unique */
+#define NFC_IPVS_PROPERTY	0x10000
+
+#define IP_VS_SCHEDNAME_MAXLEN	16
+#define IP_VS_IFNAME_MAXLEN	16
+
+
+/*
+ *	The struct ip_vs_service_user and struct ip_vs_dest_user are
+ *	used to set IPVS rules through setsockopt.
+ */
+struct ip_vs_service_user {
+	/* virtual service addresses */
+	u_int16_t		protocol;
+	u_int32_t		addr;		/* virtual ip address */
+	u_int16_t		port;
+	u_int32_t		fwmark;		/* firwall mark of service */
+
+	/* virtual service options */
+	char			sched_name[IP_VS_SCHEDNAME_MAXLEN];
+	unsigned		flags;		/* virtual service flags */
+	unsigned		timeout;	/* persistent timeout in sec */
+	u_int32_t		netmask;	/* persistent netmask */
+};
+
+
+struct ip_vs_dest_user {
+	/* destination server address */
+	u_int32_t		addr;
+	u_int16_t		port;
+
+	/* real server options */
+	unsigned		conn_flags;	/* connection flags */
+	int			weight;		/* destination weight */
+
+	/* thresholds for active connections */
+	u_int32_t		u_threshold;	/* upper threshold */
+	u_int32_t		l_threshold;	/* lower threshold */
+};
+
+
+/*
+ *	IPVS statistics object (for user space)
+ */
+struct ip_vs_stats_user
+{
+	__u32                   conns;          /* connections scheduled */
+	__u32                   inpkts;         /* incoming packets */
+	__u32                   outpkts;        /* outgoing packets */
+	__u64                   inbytes;        /* incoming bytes */
+	__u64                   outbytes;       /* outgoing bytes */
+
+	__u32			cps;		/* current connection rate */
+	__u32			inpps;		/* current in packet rate */
+	__u32			outpps;		/* current out packet rate */
+	__u32			inbps;		/* current in byte rate */
+	__u32			outbps;		/* current out byte rate */
+};
+
+
+/* The argument to IP_VS_SO_GET_INFO */
+struct ip_vs_getinfo {
+	/* version number */
+	unsigned int		version;
+
+	/* size of connection hash table */
+	unsigned int		size;
+
+	/* number of virtual services */
+	unsigned int		num_services;
+};
+
+
+/* The argument to IP_VS_SO_GET_SERVICE */
+struct ip_vs_service_entry {
+	/* which service: user fills in these */
+	u_int16_t		protocol;
+	u_int32_t		addr;		/* virtual address */
+	u_int16_t		port;
+	u_int32_t		fwmark;		/* firwall mark of service */
+
+	/* service options */
+	char			sched_name[IP_VS_SCHEDNAME_MAXLEN];
+	unsigned		flags;          /* virtual service flags */
+	unsigned		timeout;	/* persistent timeout */
+	u_int32_t		netmask;	/* persistent netmask */
+
+	/* number of real servers */
+	unsigned int		num_dests;
+
+	/* statistics */
+	struct ip_vs_stats_user stats;
+};
+
+
+struct ip_vs_dest_entry {
+	u_int32_t		addr;		/* destination address */
+	u_int16_t		port;
+	unsigned		conn_flags;	/* connection flags */
+	int			weight;		/* destination weight */
+
+	u_int32_t		u_threshold;	/* upper threshold */
+	u_int32_t		l_threshold;	/* lower threshold */
+
+	u_int32_t		activeconns;	/* active connections */
+	u_int32_t		inactconns;	/* inactive connections */
+	u_int32_t		persistconns;	/* persistent connections */
+
+	/* statistics */
+	struct ip_vs_stats_user stats;
+};
+
+
+/* The argument to IP_VS_SO_GET_DESTS */
+struct ip_vs_get_dests {
+	/* which service: user fills in these */
+	u_int16_t		protocol;
+	u_int32_t		addr;		/* virtual address */
+	u_int16_t		port;
+	u_int32_t		fwmark;		/* firwall mark of service */
+
+	/* number of real servers */
+	unsigned int		num_dests;
+
+	/* the real servers */
+	struct ip_vs_dest_entry	entrytable[0];
+};
+
+
+/* The argument to IP_VS_SO_GET_SERVICES */
+struct ip_vs_get_services {
+	/* number of virtual services */
+	unsigned int		num_services;
+
+	/* service table */
+	struct ip_vs_service_entry entrytable[0];
+};
+
+
+/* The argument to IP_VS_SO_GET_TIMEOUT */
+struct ip_vs_timeout_user {
+	int			tcp_timeout;
+	int			tcp_fin_timeout;
+	int			udp_timeout;
+};
+
+
+/* The argument to IP_VS_SO_GET_DAEMON */
+struct ip_vs_daemon_user {
+	/* sync daemon state (master/backup) */
+	int			state;
+
+	/* multicast interface name */
+	char			mcast_ifn[IP_VS_IFNAME_MAXLEN];
+
+	/* SyncID we belong to */
+	int			syncid;
+};
+
+
+#ifdef __KERNEL__
+
+#include <linux/config.h>
+#include <linux/list.h>                 /* for struct list_head */
+#include <linux/spinlock.h>             /* for struct rwlock_t */
+#include <linux/skbuff.h>               /* for struct sk_buff */
+#include <linux/ip.h>                   /* for struct iphdr */
+#include <asm/atomic.h>                 /* for struct atomic_t */
+#include <linux/netdevice.h>		/* for struct neighbour */
+#include <net/dst.h>			/* for struct dst_entry */
+#include <net/tcp.h>
+#include <net/udp.h>
+#include <linux/compiler.h>
+
+
+#ifdef CONFIG_IP_VS_DEBUG
+extern int ip_vs_get_debug_level(void);
+#define IP_VS_DBG(level, msg...)			\
+    do {						\
+	    if (level <= ip_vs_get_debug_level())	\
+		    printk(KERN_DEBUG "IPVS: " msg);	\
+    } while (0)
+#define IP_VS_DBG_RL(msg...)				\
+    do {						\
+	    if (net_ratelimit())			\
+		    printk(KERN_DEBUG "IPVS: " msg);	\
+    } while (0)
+#define IP_VS_DBG_PKT(level, pp, skb, ofs, msg)		\
+    do {						\
+	    if (level <= ip_vs_get_debug_level())	\
+		pp->debug_packet(pp, skb, ofs, msg);	\
+    } while (0)
+#define IP_VS_DBG_RL_PKT(level, pp, skb, ofs, msg)	\
+    do {						\
+	    if (level <= ip_vs_get_debug_level() &&	\
+		net_ratelimit())			\
+		pp->debug_packet(pp, skb, ofs, msg);	\
+    } while (0)
+#else	/* NO DEBUGGING at ALL */
+#define IP_VS_DBG(level, msg...)  do {} while (0)
+#define IP_VS_DBG_RL(msg...)  do {} while (0)
+#define IP_VS_DBG_PKT(level, pp, skb, ofs, msg)		do {} while (0)
+#define IP_VS_DBG_RL_PKT(level, pp, skb, ofs, msg)	do {} while (0)
+#endif
+
+#define IP_VS_BUG() BUG()
+#define IP_VS_ERR(msg...) printk(KERN_ERR "IPVS: " msg)
+#define IP_VS_INFO(msg...) printk(KERN_INFO "IPVS: " msg)
+#define IP_VS_WARNING(msg...) \
+	printk(KERN_WARNING "IPVS: " msg)
+#define IP_VS_ERR_RL(msg...)				\
+    do {						\
+	    if (net_ratelimit())			\
+		    printk(KERN_ERR "IPVS: " msg);	\
+    } while (0)
+
+#ifdef CONFIG_IP_VS_DEBUG
+#define EnterFunction(level)						\
+    do {								\
+	    if (level <= ip_vs_get_debug_level())			\
+		    printk(KERN_DEBUG "Enter: %s, %s line %i\n",	\
+			   __FUNCTION__, __FILE__, __LINE__);		\
+    } while (0)
+#define LeaveFunction(level)                                            \
+    do {                                                                \
+	    if (level <= ip_vs_get_debug_level())                       \
+			printk(KERN_DEBUG "Leave: %s, %s line %i\n",    \
+			       __FUNCTION__, __FILE__, __LINE__);       \
+    } while (0)
+#else
+#define EnterFunction(level)   do {} while (0)
+#define LeaveFunction(level)   do {} while (0)
+#endif
+
+#define	IP_VS_WAIT_WHILE(expr)	while (expr) { cpu_relax(); }
+
+
+/*
+ *      The port number of FTP service (in network order).
+ */
+#define FTPPORT  __constant_htons(21)
+#define FTPDATA  __constant_htons(20)
+
+/*
+ *      IPVS sysctl variables under the /proc/sys/net/ipv4/vs/
+ */
+#define NET_IPV4_VS              21
+
+enum {
+	NET_IPV4_VS_DEBUG_LEVEL=1,
+	NET_IPV4_VS_AMEMTHRESH=2,
+	NET_IPV4_VS_AMDROPRATE=3,
+	NET_IPV4_VS_DROP_ENTRY=4,
+	NET_IPV4_VS_DROP_PACKET=5,
+	NET_IPV4_VS_SECURE_TCP=6,
+	NET_IPV4_VS_TO_ES=7,
+	NET_IPV4_VS_TO_SS=8,
+	NET_IPV4_VS_TO_SR=9,
+	NET_IPV4_VS_TO_FW=10,
+	NET_IPV4_VS_TO_TW=11,
+	NET_IPV4_VS_TO_CL=12,
+	NET_IPV4_VS_TO_CW=13,
+	NET_IPV4_VS_TO_LA=14,
+	NET_IPV4_VS_TO_LI=15,
+	NET_IPV4_VS_TO_SA=16,
+	NET_IPV4_VS_TO_UDP=17,
+	NET_IPV4_VS_TO_ICMP=18,
+	NET_IPV4_VS_LBLC_EXPIRE=19,
+	NET_IPV4_VS_LBLCR_EXPIRE=20,
+	NET_IPV4_VS_CACHE_BYPASS=22,
+	NET_IPV4_VS_EXPIRE_NODEST_CONN=23,
+	NET_IPV4_VS_SYNC_THRESHOLD=24,
+	NET_IPV4_VS_NAT_ICMP_SEND=25,
+	NET_IPV4_VS_EXPIRE_QUIESCENT_TEMPLATE=26,
+	NET_IPV4_VS_LAST
+};
+
+/*
+ *      TCP State Values
+ */
+enum {
+	IP_VS_TCP_S_NONE = 0,
+	IP_VS_TCP_S_ESTABLISHED,
+	IP_VS_TCP_S_SYN_SENT,
+	IP_VS_TCP_S_SYN_RECV,
+	IP_VS_TCP_S_FIN_WAIT,
+	IP_VS_TCP_S_TIME_WAIT,
+	IP_VS_TCP_S_CLOSE,
+	IP_VS_TCP_S_CLOSE_WAIT,
+	IP_VS_TCP_S_LAST_ACK,
+	IP_VS_TCP_S_LISTEN,
+	IP_VS_TCP_S_SYNACK,
+	IP_VS_TCP_S_LAST
+};
+
+/*
+ *	UDP State Values
+ */
+enum {
+	IP_VS_UDP_S_NORMAL,
+	IP_VS_UDP_S_LAST,
+};
+
+/*
+ *	ICMP State Values
+ */
+enum {
+	IP_VS_ICMP_S_NORMAL,
+	IP_VS_ICMP_S_LAST,
+};
+
+/*
+ *	Delta sequence info structure
+ *	Each ip_vs_conn has 2 (output AND input seq. changes).
+ *      Only used in the VS/NAT.
+ */
+struct ip_vs_seq {
+	__u32			init_seq;	/* Add delta from this seq */
+	__u32			delta;		/* Delta in sequence numbers */
+	__u32			previous_delta;	/* Delta in sequence numbers
+						   before last resized pkt */
+};
+
+
+/*
+ *	IPVS statistics object
+ */
+struct ip_vs_stats
+{
+	__u32                   conns;          /* connections scheduled */
+	__u32                   inpkts;         /* incoming packets */
+	__u32                   outpkts;        /* outgoing packets */
+	__u64                   inbytes;        /* incoming bytes */
+	__u64                   outbytes;       /* outgoing bytes */
+
+	__u32			cps;		/* current connection rate */
+	__u32			inpps;		/* current in packet rate */
+	__u32			outpps;		/* current out packet rate */
+	__u32			inbps;		/* current in byte rate */
+	__u32			outbps;		/* current out byte rate */
+
+	spinlock_t              lock;           /* spin lock */
+};
+
+struct ip_vs_conn;
+struct ip_vs_app;
+
+struct ip_vs_protocol {
+	struct ip_vs_protocol	*next;
+	char			*name;
+	__u16			protocol;
+	int			dont_defrag;
+	atomic_t		appcnt;		/* counter of proto app incs */
+	int			*timeout_table;	/* protocol timeout table */
+
+	void (*init)(struct ip_vs_protocol *pp);
+
+	void (*exit)(struct ip_vs_protocol *pp);
+
+	int (*conn_schedule)(struct sk_buff *skb,
+			     struct ip_vs_protocol *pp,
+			     int *verdict, struct ip_vs_conn **cpp);
+
+	struct ip_vs_conn *
+	(*conn_in_get)(const struct sk_buff *skb,
+		       struct ip_vs_protocol *pp,
+		       const struct iphdr *iph,
+		       unsigned int proto_off,
+		       int inverse);
+
+	struct ip_vs_conn *
+	(*conn_out_get)(const struct sk_buff *skb,
+			struct ip_vs_protocol *pp,
+			const struct iphdr *iph,
+			unsigned int proto_off,
+			int inverse);
+
+	int (*snat_handler)(struct sk_buff **pskb,
+			    struct ip_vs_protocol *pp, struct ip_vs_conn *cp);
+
+	int (*dnat_handler)(struct sk_buff **pskb,
+			    struct ip_vs_protocol *pp, struct ip_vs_conn *cp);
+
+	int (*csum_check)(struct sk_buff *skb, struct ip_vs_protocol *pp);
+
+	const char *(*state_name)(int state);
+
+	int (*state_transition)(struct ip_vs_conn *cp, int direction,
+				const struct sk_buff *skb,
+				struct ip_vs_protocol *pp);
+
+	int (*register_app)(struct ip_vs_app *inc);
+
+	void (*unregister_app)(struct ip_vs_app *inc);
+
+	int (*app_conn_bind)(struct ip_vs_conn *cp);
+
+	void (*debug_packet)(struct ip_vs_protocol *pp,
+			     const struct sk_buff *skb,
+			     int offset,
+			     const char *msg);
+
+	void (*timeout_change)(struct ip_vs_protocol *pp, int flags);
+
+	int (*set_state_timeout)(struct ip_vs_protocol *pp, char *sname, int to);
+};
+
+extern struct ip_vs_protocol * ip_vs_proto_get(unsigned short proto);
+
+/*
+ *	IP_VS structure allocated for each dynamically scheduled connection
+ */
+struct ip_vs_conn {
+	struct list_head        c_list;         /* hashed list heads */
+
+	/* Protocol, addresses and port numbers */
+	__u32                   caddr;          /* client address */
+	__u32                   vaddr;          /* virtual address */
+	__u32                   daddr;          /* destination address */
+	__u16                   cport;
+	__u16                   vport;
+	__u16                   dport;
+	__u16                   protocol;       /* Which protocol (TCP/UDP) */
+
+	/* counter and timer */
+	atomic_t		refcnt;		/* reference count */
+	struct timer_list	timer;		/* Expiration timer */
+	volatile unsigned long	timeout;	/* timeout */
+
+	/* Flags and state transition */
+	spinlock_t              lock;           /* lock for state transition */
+	volatile __u16          flags;          /* status flags */
+	volatile __u16          state;          /* state info */
+
+	/* Control members */
+	struct ip_vs_conn       *control;       /* Master control connection */
+	atomic_t                n_control;      /* Number of controlled ones */
+	struct ip_vs_dest       *dest;          /* real server */
+	atomic_t                in_pkts;        /* incoming packet counter */
+
+	/* packet transmitter for different forwarding methods.  If it
+	   mangles the packet, it must return NF_DROP or better NF_STOLEN,
+	   otherwise this must be changed to a sk_buff **.
+	 */
+	int (*packet_xmit)(struct sk_buff *skb, struct ip_vs_conn *cp,
+			   struct ip_vs_protocol *pp);
+
+	/* Note: we can group the following members into a structure,
+	   in order to save more space, and the following members are
+	   only used in VS/NAT anyway */
+	struct ip_vs_app        *app;           /* bound ip_vs_app object */
+	void                    *app_data;      /* Application private data */
+	struct ip_vs_seq        in_seq;         /* incoming seq. struct */
+	struct ip_vs_seq        out_seq;        /* outgoing seq. struct */
+};
+
+
+/*
+ *	The information about the virtual service offered to the net
+ *	and the forwarding entries
+ */
+struct ip_vs_service {
+	struct list_head	s_list;   /* for normal service table */
+	struct list_head	f_list;   /* for fwmark-based service table */
+	atomic_t		refcnt;   /* reference counter */
+	atomic_t		usecnt;   /* use counter */
+
+	__u16			protocol; /* which protocol (TCP/UDP) */
+	__u32			addr;	  /* IP address for virtual service */
+	__u16			port;	  /* port number for the service */
+	__u32                   fwmark;   /* firewall mark of the service */
+	unsigned		flags;	  /* service status flags */
+	unsigned		timeout;  /* persistent timeout in ticks */
+	__u32			netmask;  /* grouping granularity */
+
+	struct list_head	destinations;  /* real server d-linked list */
+	__u32			num_dests;     /* number of servers */
+	struct ip_vs_stats      stats;         /* statistics for the service */
+	struct ip_vs_app	*inc;	  /* bind conns to this app inc */
+
+	/* for scheduling */
+	struct ip_vs_scheduler	*scheduler;    /* bound scheduler object */
+	rwlock_t		sched_lock;    /* lock sched_data */
+	void			*sched_data;   /* scheduler application data */
+};
+
+
+/*
+ *	The real server destination forwarding entry
+ *	with ip address, port number, and so on.
+ */
+struct ip_vs_dest {
+	struct list_head	n_list;   /* for the dests in the service */
+	struct list_head	d_list;   /* for table with all the dests */
+
+	__u32			addr;		/* IP address of the server */
+	__u16			port;		/* port number of the server */
+	volatile unsigned	flags;		/* dest status flags */
+	atomic_t		conn_flags;	/* flags to copy to conn */
+	atomic_t		weight;		/* server weight */
+
+	atomic_t		refcnt;		/* reference counter */
+	struct ip_vs_stats      stats;          /* statistics */
+
+	/* connection counters and thresholds */
+	atomic_t		activeconns;	/* active connections */
+	atomic_t		inactconns;	/* inactive connections */
+	atomic_t		persistconns;	/* persistent connections */
+	__u32			u_threshold;	/* upper threshold */
+	__u32			l_threshold;	/* lower threshold */
+
+	/* for destination cache */
+	spinlock_t		dst_lock;	/* lock of dst_cache */
+	struct dst_entry	*dst_cache;	/* destination cache entry */
+	u32			dst_rtos;	/* RT_TOS(tos) for dst */
+
+	/* for virtual service */
+	struct ip_vs_service	*svc;		/* service it belongs to */
+	__u16			protocol;	/* which protocol (TCP/UDP) */
+	__u32			vaddr;		/* virtual IP address */
+	__u16			vport;		/* virtual port number */
+	__u32			vfwmark;	/* firewall mark of service */
+};
+
+
+/*
+ *	The scheduler object
+ */
+struct ip_vs_scheduler {
+	struct list_head	n_list;		/* d-linked list head */
+	char			*name;		/* scheduler name */
+	atomic_t		refcnt;		/* reference counter */
+	struct module		*module;	/* THIS_MODULE/NULL */
+
+	/* scheduler initializing service */
+	int (*init_service)(struct ip_vs_service *svc);
+	/* scheduling service finish */
+	int (*done_service)(struct ip_vs_service *svc);
+	/* scheduler updating service */
+	int (*update_service)(struct ip_vs_service *svc);
+
+	/* selecting a server from the given service */
+	struct ip_vs_dest* (*schedule)(struct ip_vs_service *svc,
+				       const struct sk_buff *skb);
+};
+
+
+/*
+ *	The application module object (a.k.a. app incarnation)
+ */
+struct ip_vs_app
+{
+	struct list_head	a_list;		/* member in app list */
+	int			type;		/* IP_VS_APP_TYPE_xxx */
+	char			*name;		/* application module name */
+	__u16			protocol;
+	struct module		*module;	/* THIS_MODULE/NULL */
+	struct list_head	incs_list;	/* list of incarnations */
+
+	/* members for application incarnations */
+	struct list_head	p_list;		/* member in proto app list */
+	struct ip_vs_app	*app;		/* its real application */
+	__u16			port;		/* port number in net order */
+	atomic_t		usecnt;		/* usage counter */
+
+	/* output hook: return false if can't linearize. diff set for TCP.  */
+	int (*pkt_out)(struct ip_vs_app *, struct ip_vs_conn *,
+		       struct sk_buff **, int *diff);
+
+	/* input hook: return false if can't linearize. diff set for TCP. */
+	int (*pkt_in)(struct ip_vs_app *, struct ip_vs_conn *,
+		      struct sk_buff **, int *diff);
+
+	/* ip_vs_app initializer */
+	int (*init_conn)(struct ip_vs_app *, struct ip_vs_conn *);
+
+	/* ip_vs_app finish */
+	int (*done_conn)(struct ip_vs_app *, struct ip_vs_conn *);
+
+
+	/* not used now */
+	int (*bind_conn)(struct ip_vs_app *, struct ip_vs_conn *,
+			 struct ip_vs_protocol *);
+
+	void (*unbind_conn)(struct ip_vs_app *, struct ip_vs_conn *);
+
+	int *			timeout_table;
+	int *			timeouts;
+	int			timeouts_size;
+
+	int (*conn_schedule)(struct sk_buff *skb, struct ip_vs_app *app,
+			     int *verdict, struct ip_vs_conn **cpp);
+
+	struct ip_vs_conn *
+	(*conn_in_get)(const struct sk_buff *skb, struct ip_vs_app *app,
+		       const struct iphdr *iph, unsigned int proto_off,
+		       int inverse);
+
+	struct ip_vs_conn *
+	(*conn_out_get)(const struct sk_buff *skb, struct ip_vs_app *app,
+			const struct iphdr *iph, unsigned int proto_off,
+			int inverse);
+
+	int (*state_transition)(struct ip_vs_conn *cp, int direction,
+				const struct sk_buff *skb,
+				struct ip_vs_app *app);
+
+	void (*timeout_change)(struct ip_vs_app *app, int flags);
+};
+
+
+/*
+ *      IPVS core functions
+ *      (from ip_vs_core.c)
+ */
+extern const char *ip_vs_proto_name(unsigned proto);
+extern void ip_vs_init_hash_table(struct list_head *table, int rows);
+#define IP_VS_INIT_HASH_TABLE(t) ip_vs_init_hash_table(t, sizeof(t)/sizeof(t[0]))
+
+#define IP_VS_APP_TYPE_UNSPEC	0
+#define IP_VS_APP_TYPE_FTP	1
+
+/*
+ *     ip_vs_conn handling functions
+ *     (from ip_vs_conn.c)
+ */
+
+/*
+ *     IPVS connection entry hash table
+ */
+#ifndef CONFIG_IP_VS_TAB_BITS
+#define CONFIG_IP_VS_TAB_BITS   12
+#endif
+/* make sure that IP_VS_CONN_TAB_BITS is located in [8, 20] */
+#if CONFIG_IP_VS_TAB_BITS < 8
+#define IP_VS_CONN_TAB_BITS	8
+#endif
+#if CONFIG_IP_VS_TAB_BITS > 20
+#define IP_VS_CONN_TAB_BITS	20
+#endif
+#if 8 <= CONFIG_IP_VS_TAB_BITS && CONFIG_IP_VS_TAB_BITS <= 20
+#define IP_VS_CONN_TAB_BITS	CONFIG_IP_VS_TAB_BITS
+#endif
+#define IP_VS_CONN_TAB_SIZE     (1 << IP_VS_CONN_TAB_BITS)
+#define IP_VS_CONN_TAB_MASK     (IP_VS_CONN_TAB_SIZE - 1)
+
+enum {
+	IP_VS_DIR_INPUT = 0,
+	IP_VS_DIR_OUTPUT,
+	IP_VS_DIR_INPUT_ONLY,
+	IP_VS_DIR_LAST,
+};
+
+extern struct ip_vs_conn *ip_vs_conn_in_get
+(int protocol, __u32 s_addr, __u16 s_port, __u32 d_addr, __u16 d_port);
+extern struct ip_vs_conn *ip_vs_conn_out_get
+(int protocol, __u32 s_addr, __u16 s_port, __u32 d_addr, __u16 d_port);
+
+/* put back the conn without restarting its timer */
+static inline void __ip_vs_conn_put(struct ip_vs_conn *cp)
+{
+	atomic_dec(&cp->refcnt);
+}
+extern void ip_vs_conn_put(struct ip_vs_conn *cp);
+extern void ip_vs_conn_fill_cport(struct ip_vs_conn *cp, __u16 cport);
+
+extern struct ip_vs_conn *
+ip_vs_conn_new(int proto, __u32 caddr, __u16 cport, __u32 vaddr, __u16 vport,
+	       __u32 daddr, __u16 dport, unsigned flags,
+	       struct ip_vs_dest *dest);
+extern void ip_vs_conn_expire_now(struct ip_vs_conn *cp);
+
+extern const char * ip_vs_state_name(__u16 proto, int state);
+
+extern void ip_vs_tcp_conn_listen(struct ip_vs_conn *cp);
+extern int ip_vs_check_template(struct ip_vs_conn *ct);
+extern void ip_vs_secure_tcp_set(int on);
+extern void ip_vs_random_dropentry(void);
+extern int ip_vs_conn_init(void);
+extern void ip_vs_conn_cleanup(void);
+
+static inline void ip_vs_control_del(struct ip_vs_conn *cp)
+{
+	struct ip_vs_conn *ctl_cp = cp->control;
+	if (!ctl_cp) {
+		IP_VS_ERR("request control DEL for uncontrolled: "
+			  "%d.%d.%d.%d:%d to %d.%d.%d.%d:%d\n",
+			  NIPQUAD(cp->caddr),ntohs(cp->cport),
+			  NIPQUAD(cp->vaddr),ntohs(cp->vport));
+		return;
+	}
+
+	IP_VS_DBG(7, "DELeting control for: "
+		  "cp.dst=%d.%d.%d.%d:%d ctl_cp.dst=%d.%d.%d.%d:%d\n",
+		  NIPQUAD(cp->caddr),ntohs(cp->cport),
+		  NIPQUAD(ctl_cp->caddr),ntohs(ctl_cp->cport));
+
+	cp->control = NULL;
+	if (atomic_read(&ctl_cp->n_control) == 0) {
+		IP_VS_ERR("BUG control DEL with n=0 : "
+			  "%d.%d.%d.%d:%d to %d.%d.%d.%d:%d\n",
+			  NIPQUAD(cp->caddr),ntohs(cp->cport),
+			  NIPQUAD(cp->vaddr),ntohs(cp->vport));
+		return;
+	}
+	atomic_dec(&ctl_cp->n_control);
+}
+
+static inline void
+ip_vs_control_add(struct ip_vs_conn *cp, struct ip_vs_conn *ctl_cp)
+{
+	if (cp->control) {
+		IP_VS_ERR("request control ADD for already controlled: "
+			  "%d.%d.%d.%d:%d to %d.%d.%d.%d:%d\n",
+			  NIPQUAD(cp->caddr),ntohs(cp->cport),
+			  NIPQUAD(cp->vaddr),ntohs(cp->vport));
+		ip_vs_control_del(cp);
+	}
+
+	IP_VS_DBG(7, "ADDing control for: "
+		  "cp.dst=%d.%d.%d.%d:%d ctl_cp.dst=%d.%d.%d.%d:%d\n",
+		  NIPQUAD(cp->caddr),ntohs(cp->cport),
+		  NIPQUAD(ctl_cp->caddr),ntohs(ctl_cp->cport));
+
+	cp->control = ctl_cp;
+	atomic_inc(&ctl_cp->n_control);
+}
+
+
+/*
+ *      IPVS application functions
+ *      (from ip_vs_app.c)
+ */
+#define IP_VS_APP_MAX_PORTS  8
+extern int register_ip_vs_app(struct ip_vs_app *app);
+extern void unregister_ip_vs_app(struct ip_vs_app *app);
+extern int ip_vs_bind_app(struct ip_vs_conn *cp, struct ip_vs_protocol *pp);
+extern void ip_vs_unbind_app(struct ip_vs_conn *cp);
+extern int
+register_ip_vs_app_inc(struct ip_vs_app *app, __u16 proto, __u16 port);
+extern int ip_vs_app_inc_get(struct ip_vs_app *inc);
+extern void ip_vs_app_inc_put(struct ip_vs_app *inc);
+
+extern int ip_vs_app_pkt_out(struct ip_vs_conn *, struct sk_buff **pskb);
+extern int ip_vs_app_pkt_in(struct ip_vs_conn *, struct sk_buff **pskb);
+extern int ip_vs_skb_replace(struct sk_buff *skb, int pri,
+			     char *o_buf, int o_len, char *n_buf, int n_len);
+extern int ip_vs_app_init(void);
+extern void ip_vs_app_cleanup(void);
+
+
+/*
+ *	IPVS protocol functions (from ip_vs_proto.c)
+ */
+extern int ip_vs_protocol_init(void);
+extern void ip_vs_protocol_cleanup(void);
+extern void ip_vs_protocol_timeout_change(int flags);
+extern int *ip_vs_create_timeout_table(int *table, int size);
+extern int
+ip_vs_set_state_timeout(int *table, int num, char **names, char *name, int to);
+extern void
+ip_vs_tcpudp_debug_packet(struct ip_vs_protocol *pp, const struct sk_buff *skb,
+			  int offset, const char *msg);
+
+extern struct ip_vs_protocol ip_vs_protocol_tcp;
+extern struct ip_vs_protocol ip_vs_protocol_udp;
+extern struct ip_vs_protocol ip_vs_protocol_icmp;
+extern struct ip_vs_protocol ip_vs_protocol_esp;
+extern struct ip_vs_protocol ip_vs_protocol_ah;
+
+
+/*
+ *      Registering/unregistering scheduler functions
+ *      (from ip_vs_sched.c)
+ */
+extern int register_ip_vs_scheduler(struct ip_vs_scheduler *scheduler);
+extern int unregister_ip_vs_scheduler(struct ip_vs_scheduler *scheduler);
+extern int ip_vs_bind_scheduler(struct ip_vs_service *svc,
+				struct ip_vs_scheduler *scheduler);
+extern int ip_vs_unbind_scheduler(struct ip_vs_service *svc);
+extern struct ip_vs_scheduler *ip_vs_scheduler_get(const char *sched_name);
+extern void ip_vs_scheduler_put(struct ip_vs_scheduler *scheduler);
+extern struct ip_vs_conn *
+ip_vs_schedule(struct ip_vs_service *svc, const struct sk_buff *skb);
+extern int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb,
+			struct ip_vs_protocol *pp);
+
+
+/*
+ *      IPVS control data and functions (from ip_vs_ctl.c)
+ */
+extern int sysctl_ip_vs_cache_bypass;
+extern int sysctl_ip_vs_expire_nodest_conn;
+extern int sysctl_ip_vs_expire_quiescent_template;
+extern int sysctl_ip_vs_sync_threshold[2];
+extern int sysctl_ip_vs_nat_icmp_send;
+extern struct ip_vs_stats ip_vs_stats;
+
+extern struct ip_vs_service *
+ip_vs_service_get(__u32 fwmark, __u16 protocol, __u32 vaddr, __u16 vport);
+
+static inline void ip_vs_service_put(struct ip_vs_service *svc)
+{
+	atomic_dec(&svc->usecnt);
+}
+
+extern struct ip_vs_dest *
+ip_vs_lookup_real_service(__u16 protocol, __u32 daddr, __u16 dport);
+extern int ip_vs_use_count_inc(void);
+extern void ip_vs_use_count_dec(void);
+extern int ip_vs_control_init(void);
+extern void ip_vs_control_cleanup(void);
+
+
+/*
+ *      IPVS sync daemon data and function prototypes
+ *      (from ip_vs_sync.c)
+ */
+extern volatile int ip_vs_sync_state;
+extern volatile int ip_vs_master_syncid;
+extern volatile int ip_vs_backup_syncid;
+extern char ip_vs_master_mcast_ifn[IP_VS_IFNAME_MAXLEN];
+extern char ip_vs_backup_mcast_ifn[IP_VS_IFNAME_MAXLEN];
+extern int start_sync_thread(int state, char *mcast_ifn, __u8 syncid);
+extern int stop_sync_thread(int state);
+extern void ip_vs_sync_conn(struct ip_vs_conn *cp);
+
+
+/*
+ *      IPVS rate estimator prototypes (from ip_vs_est.c)
+ */
+extern int ip_vs_new_estimator(struct ip_vs_stats *stats);
+extern void ip_vs_kill_estimator(struct ip_vs_stats *stats);
+extern void ip_vs_zero_estimator(struct ip_vs_stats *stats);
+
+/*
+ *	Various IPVS packet transmitters (from ip_vs_xmit.c)
+ */
+extern int ip_vs_null_xmit
+(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp);
+extern int ip_vs_bypass_xmit
+(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp);
+extern int ip_vs_nat_xmit
+(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp);
+extern int ip_vs_tunnel_xmit
+(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp);
+extern int ip_vs_dr_xmit
+(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp);
+extern int ip_vs_icmp_xmit
+(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp, int offset);
+extern void ip_vs_dst_reset(struct ip_vs_dest *dest);
+
+
+/*
+ *	This is a simple mechanism to ignore packets when
+ *	we are loaded. Just set ip_vs_drop_rate to 'n' and
+ *	we start to drop 1/rate of the packets
+ */
+extern int ip_vs_drop_rate;
+extern int ip_vs_drop_counter;
+
+static __inline__ int ip_vs_todrop(void)
+{
+	if (!ip_vs_drop_rate) return 0;
+	if (--ip_vs_drop_counter > 0) return 0;
+	ip_vs_drop_counter = ip_vs_drop_rate;
+	return 1;
+}
+
+/*
+ *      ip_vs_fwd_tag returns the forwarding tag of the connection
+ */
+#define IP_VS_FWD_METHOD(cp)  (cp->flags & IP_VS_CONN_F_FWD_MASK)
+
+extern __inline__ char ip_vs_fwd_tag(struct ip_vs_conn *cp)
+{
+	char fwd;
+
+	switch (IP_VS_FWD_METHOD(cp)) {
+	case IP_VS_CONN_F_MASQ:
+		fwd = 'M'; break;
+	case IP_VS_CONN_F_LOCALNODE:
+		fwd = 'L'; break;
+	case IP_VS_CONN_F_TUNNEL:
+		fwd = 'T'; break;
+	case IP_VS_CONN_F_DROUTE:
+		fwd = 'R'; break;
+	case IP_VS_CONN_F_BYPASS:
+		fwd = 'B'; break;
+	default:
+		fwd = '?'; break;
+	}
+	return fwd;
+}
+
+extern int ip_vs_make_skb_writable(struct sk_buff **pskb, int len);
+extern void ip_vs_nat_icmp(struct sk_buff *skb, struct ip_vs_protocol *pp,
+		struct ip_vs_conn *cp, int dir);
+
+extern u16 ip_vs_checksum_complete(struct sk_buff *skb, int offset);
+
+static inline u16 ip_vs_check_diff(u32 old, u32 new, u16 oldsum)
+{
+	u32 diff[2] = { old, new };
+
+	return csum_fold(csum_partial((char *) diff, sizeof(diff),
+				      oldsum ^ 0xFFFF));
+}
+
+#endif /* __KERNEL__ */
+
+#endif	/* _IP_VS_H */
--- keepalived-1.1.20.orig/debian/patches/95_use_linux_ip_vs_h.patch
+++ keepalived-1.1.20/debian/patches/95_use_linux_ip_vs_h.patch
@@ -0,0 +1,60 @@
+diff -Nur -x '*.orig' -x '*~' keepalived-1.1.20//configure.in keepalived-1.1.20.new//configure.in
+--- keepalived-1.1.20//configure.in	2009-11-05 18:23:04.000000000 +0100
++++ keepalived-1.1.20.new//configure.in	2010-05-08 21:00:49.871501888 +0200
+@@ -113,7 +113,7 @@
+ dnl ----[ Checks for LVS and VRRP support ]----
+ IPVS_SUPPORT="_WITHOUT_LVS_"
+ if test "$enable_lvs" != "no"; then
+-  AC_CHECK_HEADER([net/ip_vs.h],
++  AC_CHECK_HEADER([linux/ip_vs.h],
+     [IPVS_SUPPORT="_WITH_LVS_"],
+     [
+       IPVS_SUPPORT="_WITHOUT_LVS_"
+diff -Nur -x '*.orig' -x '*~' keepalived-1.1.20//keepalived/include/check_data.h keepalived-1.1.20.new//keepalived/include/check_data.h
+--- keepalived-1.1.20//keepalived/include/check_data.h	2010-05-06 17:50:22.000000000 +0200
++++ keepalived-1.1.20.new//keepalived/include/check_data.h	2010-05-08 21:01:10.919590093 +0200
+@@ -33,7 +33,7 @@
+ 
+ #ifdef _WITH_LVS_
+   #define SCHED_MAX_LENGTH IP_VS_SCHEDNAME_MAXLEN
+-  #include <net/ip_vs.h>
++  #include <linux/ip_vs.h>
+ #else
+   #define SCHED_MAX_LENGTH   1
+ #endif
+diff -Nur -x '*.orig' -x '*~' keepalived-1.1.20//keepalived/include/ipvswrapper.h keepalived-1.1.20.new//keepalived/include/ipvswrapper.h
+--- keepalived-1.1.20//keepalived/include/ipvswrapper.h	2010-05-06 17:51:19.000000000 +0200
++++ keepalived-1.1.20.new//keepalived/include/ipvswrapper.h	2010-05-08 21:01:26.943589753 +0200
+@@ -43,7 +43,7 @@
+ #elif _KRNL_2_6_
+   #include "../libipvs-2.6/libipvs.h"
+ #endif
+-  #include <net/ip_vs.h>
++  #include <linux/ip_vs.h>
+ #endif
+ 
+ #ifndef IP_VS_TEMPLATE_TIMEOUT
+diff -Nur -x '*.orig' -x '*~' keepalived-1.1.20//keepalived/libipvs-2.4/libipvs.h keepalived-1.1.20.new//keepalived/libipvs-2.4/libipvs.h
+--- keepalived-1.1.20//keepalived/libipvs-2.4/libipvs.h	2009-09-28 12:56:54.000000000 +0200
++++ keepalived-1.1.20.new//keepalived/libipvs-2.4/libipvs.h	2010-05-08 21:01:51.835590518 +0200
+@@ -10,7 +10,7 @@
+ #ifndef _LIBIPVS_H
+ #define _LIBIPVS_H
+ 
+-#include <net/ip_vs.h>
++#include <linux/ip_vs.h>
+ 
+ /*
+  * The default IPVS_SVC_PERSISTENT_TIMEOUT is a little larger than average
+diff -Nur -x '*.orig' -x '*~' keepalived-1.1.20//keepalived/libipvs-2.6/libipvs.h keepalived-1.1.20.new//keepalived/libipvs-2.6/libipvs.h
+--- keepalived-1.1.20//keepalived/libipvs-2.6/libipvs.h	2009-09-28 12:56:54.000000000 +0200
++++ keepalived-1.1.20.new//keepalived/libipvs-2.6/libipvs.h	2010-05-08 21:02:13.455587791 +0200
+@@ -10,7 +10,7 @@
+ #ifndef _LIBIPVS_H
+ #define _LIBIPVS_H
+ 
+-#include <net/ip_vs.h>
++#include <linux/ip_vs.h>
+ 
+ #define MINIMUM_IPVS_VERSION_MAJOR      1
+ #define MINIMUM_IPVS_VERSION_MINOR      1
--- keepalived-1.1.20.orig/debian/patches/99_linux_2.6_compat.patch
+++ keepalived-1.1.20/debian/patches/99_linux_2.6_compat.patch
@@ -0,0 +1,13 @@
+diff -Nur keepalived-1.1.15/keepalived/vrrp/vrrp_arp.c keepalived-1.1.15.new/keepalived/vrrp/vrrp_arp.c
+--- keepalived-1.1.15/keepalived/vrrp/vrrp_arp.c	2007-09-14 17:20:47.000000000 +0200
++++ keepalived-1.1.15.new/keepalived/vrrp/vrrp_arp.c	2007-12-18 19:06:42.000000000 +0100
+@@ -22,6 +22,9 @@
+  * Copyright (C) 2001-2007 Alexandre Cassen, <acassen@freebox.fr>
+  */
+ 
++/* Work around incompatibility between linux/types.h and sys/types.h */
++#define __KERNEL_STRICT_NAMES
++
+ /* local includes */
+ #include "vrrp_arp.h"
+ #include "memory.h"
--- keepalived-1.1.20.orig/debian/patches/04_fix_manpage.patch
+++ keepalived-1.1.20/debian/patches/04_fix_manpage.patch
@@ -0,0 +1,12 @@
+diff -Nur keepalived-1.1.13/doc/man/man5/keepalived.conf.5 keepalived-1.1.13.new/doc/man/man5/keepalived.conf.5
+--- keepalived-1.1.13/doc/man/man5/keepalived.conf.5	2005-02-07 02:24:59.000000000 +0100
++++ keepalived-1.1.13.new/doc/man/man5/keepalived.conf.5	2007-07-25 08:13:33.000000000 +0200
+@@ -137,7 +137,7 @@
+ Here are described two IPs (on inside_network and on outside_network), 
+ on machine "my_hostname", which belong to the group VG_1 and
+ which will transition together on any state change.
+-.PPa
++.PP
+  #You will need to write another block for outside_network.
+  vrrp_instance inside_network {
+     # Initial state, MASTER|BACKUP