Updated to a new experimental openswan.
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 16 Jul 2008 21:57:36 +0000 (21:57 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 16 Jul 2008 21:57:36 +0000 (21:57 +0000)
config/kernel/kernel.config.i586
doc/packages-list.txt
lfs/linux
lfs/openswan
make.sh
src/patches/openswan-2.6.16dr2-2.6.24-kernel.patch [new file with mode: 0644]
src/patches/openswan-2.6.16dr2-2.6.24-natt.patch [moved from src/patches/openswan-2.4.x.kernel-2.6.23-natt.patch with 100% similarity]

index c97dfa3..4767921 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.24.7
-# Mon Jul 14 10:58:23 2008
+# Linux kernel version: 2.6.24.7-ipfire
+# Wed Jul 16 20:38:30 2008
 #
 # CONFIG_64BIT is not set
 CONFIG_X86_32=y
@@ -791,6 +791,23 @@ CONFIG_IEEE80211_SOFTMAC=m
 CONFIG_RFKILL=m
 CONFIG_RFKILL_INPUT=m
 # CONFIG_NET_9P is not set
+CONFIG_KLIPS=m
+
+#
+# KLIPS options
+#
+CONFIG_KLIPS_ESP=y
+CONFIG_KLIPS_AH=y
+CONFIG_KLIPS_AUTH_HMAC_MD5=y
+CONFIG_KLIPS_AUTH_HMAC_SHA1=y
+CONFIG_KLIPS_ALG=y
+# CONFIG_KLIPS_ENC_CRYPTOAPI is not set
+CONFIG_KLIPS_ENC_3DES=y
+CONFIG_KLIPS_ENC_AES=y
+CONFIG_KLIPS_IPCOMP=y
+# CONFIG_KLIPS_OCF is not set
+CONFIG_KLIPS_DEBUG=y
+CONFIG_KLIPS_IF_MAX=64
 
 #
 # Device Drivers
index 44cb72b..d50a76f 100644 (file)
@@ -39,6 +39,7 @@
 * arptables-v0.0.3-3
 * as86-0.16.17
 * asterisk-1.4.18
+* asterisk-1.4.18_old
 * atl2-2.0.4
 * autoconf-2.59
 * automake-1.9.6
 * icegenerator-0.5.5-pre2
 * igmpproxy-src-0.1-beta2
 * inetutils-1.4.2
+* initscripts_old
 * ipaddr-1.2
 * ipfireseeder-1.00
 * iproute2-2.6.16-060323
 * libxml2-2.6.26
 * libxslt-1.1.17
 * linux-2.6.24.7
+* linux-2.6.24.7-smp_old
+* linux-2.6.24.7_old
 * linux-atm-2.4.1
 * linux-libc-headers-2.6.12.0
 * linuxigd-0.95
 * openssl-0.9.8g
 * openswan-2.6.14
 * openswan-2.6.14-kmod
+* openswan-2.6.16dr2
 * openvpn-2.0.9
 * pam_mysql-0.7RC1
 * patch-2.5.4
 * tcptrack-1.3.0
 * teamspeak-2.0.24.1
 * texinfo-4.8
+* tftp-hpa-0.48
+* tftp-hpa-0.48_old
 * tiff-3.8.2
 * traceroute-1.4a12
 * tripwire-2.4.1.2
index 78e4468..d89d441 100644 (file)
--- a/lfs/linux
+++ b/lfs/linux
@@ -100,8 +100,9 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        # Add USB ID of US-Robotics USR805423 to ZD1211 driver
 #      cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-2.6.20.21-zd1211-usrobotics-usbid.patch
 
-       # Openswan nat-t
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/openswan-2.4.x.kernel-2.6.23-natt.patch
+       # Openswan
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/openswan-2.6.16dr2-2.6.24-kernel.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/openswan-2.6.16dr2-2.6.24-natt.patch
 
        # Reiser4
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/reiser4-for-2.6.24.patch
index c1d2fdd..36084a9 100644 (file)
@@ -24,7 +24,7 @@
 
 include Config
 
-VER        = 2.6.14
+VER        = 2.6.16dr2
 
 THISAPP    = openswan-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
@@ -48,8 +48,7 @@ objects = $(DL_FILE)
 
 $(DL_FILE) = $(DL_FROM)/$(DL_FILE)
 
-#$(DL_FILE)_MD5 = 0c2505cf2639a7de051e815f41e8e1f4
-$(DL_FILE)_MD5 = 44dc3cb98b9cb4e3fa03b82967d08b78
+$(DL_FILE)_MD5 = 8bf347f1d2219dd9277adb2b34720bf9
 
 install : $(TARGET)
 
@@ -81,15 +80,11 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
        cd $(DIR_APP) && sed -i \
                -e 's%^INC_USRLOCAL.*$$%INC_USRLOCAL=/usr%' \
-               -e 's%^USERCOMPILE.*$$%USERCOMPILE=$(CFLAGS)%' \
-               -e 's%^KLIPSCOMPILE.*$$%KLIPSCOMPILE=$(CFLAGS)%' Makefile.inc
-       cd $(DIR_APP) && sed -i \
-               -e 's/-Werror//g' programs/Makefile.program
+               -e 's%^USERCOMPILE.*$$%USERCOMPILE=$(CFLAGS)%' Makefile.inc
+
+       cd $(DIR_APP) && sed -e 's/-Werror//g' -i programs/Makefile.program
+       cd $(DIR_APP) && sed -e 's/-Werror//g' -i lib/liblwres/Makefile
 
-ifeq "$(KMOD)" "1"
-       cd $(DIR_APP) && make KERNELSRC=/usr/src/linux module
-       cd $(DIR_APP) && make minstall
-else
        cd $(DIR_APP) && make programs
        cd $(DIR_APP) && make install
        
@@ -108,6 +103,5 @@ else
        cd /usr/lib/ipsec && patch -Np0 < $(DIR_SRC)/src/patches/openswan-2.6.14-updown-1.patch
 #      cd /usr/lib/ipsec && patch -Np0 < $(DIR_SRC)/src/patches/openswan-2.4.9-updown_x509-1.patch
 #      cd /etc/ipsec.d/policies && patch -Np0 < $(DIR_SRC)/src/patches/openswan-2.4.9-clear-1.patch
-endif  
        #@rm -rf $(DIR_APP)
        @$(POSTBUILD)
diff --git a/make.sh b/make.sh
index daeb454..a4337a4 100755 (executable)
--- a/make.sh
+++ b/make.sh
@@ -343,7 +343,6 @@ buildipfire() {
   ipfiremake v4l-dvb                   SMP=1
   ipfiremake madwifi                    SMP=1
   ipfiremake sane              KMOD=1  SMP=1
-  ipfiremake openswan          KMOD=1  SMP=1
   ipfiremake linux
 #  ipfiremake linux-fusion
 #  ipfiremake ipp2p
@@ -355,7 +354,6 @@ buildipfire() {
   ipfiremake v4l-dvb
   ipfiremake madwifi
   ipfiremake sane              KMOD=1
-  ipfiremake openswan          KMOD=1
   ipfiremake pkg-config
   ipfiremake linux-atm
   ipfiremake cpio
diff --git a/src/patches/openswan-2.6.16dr2-2.6.24-kernel.patch b/src/patches/openswan-2.6.16dr2-2.6.24-kernel.patch
new file mode 100644 (file)
index 0000000..faf66e7
--- /dev/null
@@ -0,0 +1,56013 @@
+packaging/utils/kernelpatch 2.6
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/README.openswan-2     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,112 @@
++*
++* RCSID $Id: README.openswan-2,v 1.1 2003/12/10 01:07:49 mcr Exp $
++*
++
++               ****************************************
++               * IPSEC for Linux, Release 2.xx series *
++               ****************************************
++
++
++
++1. Files
++
++The contents of linux/net/ipsec/ (see below) join the linux kernel source tree.
++as provided for higher up.
++
++The programs/ directory contains the user-level utilities which you need
++to run IPSEC.  See the top-level top/INSTALL to compile and install them.
++
++The testing/ directory contains test scripts.
++
++The doc/ directory contains -- what else -- documentation. 
++
++1.1. Kernel files
++
++The following are found in net/ipsec/:
++
++Makefile                      The Makefile
++Config.in                     The configuration script for make menuconfig
++defconfig                     Configuration defaults for first time.
++
++radij.c                               General-purpose radix-tree operations
++
++ipsec_ipcomp.c           IPCOMP encapsulate/decapsulate code.
++ipsec_ah.c       Authentication Header (AH) encapsulate/decapsulate code.
++ipsec_esp.c      Encapsulated Security Payload (ESP) encap/decap code.
++
++pfkey_v2.c                    PF_KEYv2 socket interface code.
++pfkey_v2_parser.c             PF_KEYv2 message parsing and processing code.
++
++ipsec_init.c                  Initialization code, /proc interface.
++ipsec_radij.c                 Interface with the radix tree code.
++ipsec_netlink.c                       Interface with the netlink code.
++ipsec_xform.c                 Routines and structures common to transforms.
++ipsec_tunnel.c                        The outgoing packet processing code.
++ipsec_rcv.c                   The incoming packet processing code.
++ipsec_md5c.c                  Somewhat modified RSADSI MD5 C code.
++ipsec_sha1.c                  Somewhat modified Steve Reid SHA-1 C code.
++
++sysctl_net_ipsec.c            /proc/sys/net/ipsec/* variable definitions.
++
++version.c                     symbolic link to project version.
++
++radij.h                               Headers for radij.c
++
++ipcomp.h                      Headers used by IPCOMP code.
++
++ipsec_radij.h                 Interface with the radix tree code.
++ipsec_netlink.h                       Headers used by the netlink interface.
++ipsec_encap.h                 Headers defining encapsulation structures.
++ipsec_xform.h                 Transform headers.
++ipsec_tunnel.h                        Headers used by tunneling code.
++ipsec_ipe4.h                  Headers for the IP-in-IP code.
++ipsec_ah.h                    Headers common to AH transforms.
++ipsec_md5h.h                  RSADSI MD5 headers.
++ipsec_sha1.h                  SHA-1 headers.
++ipsec_esp.h                   Headers common to ESP transfroms.
++ipsec_rcv.h                   Headers for incoming packet processing code.
++
++1.2. User-level files.
++
++The following are found in utils/:
++
++eroute.c      Create an "extended route" source code
++spi.c         Set up Security Associations source code
++spigrp.c        Link SPIs together source code.
++tncfg.c         Configure the tunneling features of the virtual interface
++              source code
++klipsdebug.c  Set/reset klips debugging features source code.
++version.c     symbolic link to project version.
++
++eroute.8      Create an "extended route" manual page
++spi.8         Set up Security Associations manual page
++spigrp.8        Link SPIs together manual page
++tncfg.8         Configure the tunneling features of the virtual interface
++              manual page
++klipsdebug.8  Set/reset klips debugging features manual page
++
++eroute.5      /proc/net/ipsec_eroute format manual page
++spi.5         /proc/net/ipsec_spi format manual page
++spigrp.5      /proc/net/ipsec_spigrp format manual page
++tncfg.5               /proc/net/ipsec_tncfg format manual page
++klipsdebug.5  /proc/net/ipsec_klipsdebug format manual page
++version.5     /proc/net/ipsec_version format manual page
++pf_key.5      /proc/net/pf_key format manual page
++
++Makefile      Utilities makefile.
++
++*.8           Manpages for the respective utils.
++
++
++1.3. Test files
++
++The test scripts are locate in testing/ and and documentation is found
++at doc/src/umltesting.html. Automated testing via "make check" is available
++provided that the User-Mode-Linux patches are available.
++
++*
++* $Log: README.openswan-2,v $
++* Revision 1.1  2003/12/10 01:07:49  mcr
++*     documentation for additions.
++*
++*
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/des/des_locl.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,511 @@
++/* crypto/des/des_locl.org */
++/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
++ * All rights reserved.
++ *
++ * This package is an SSL implementation written
++ * by Eric Young (eay@cryptsoft.com).
++ * The implementation was written so as to conform with Netscapes SSL.
++ * 
++ * This library is free for commercial and non-commercial use as long as
++ * the following conditions are aheared to.  The following conditions
++ * apply to all code found in this distribution, be it the RC4, RSA,
++ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
++ * included with this distribution is covered by the same copyright terms
++ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
++ * 
++ * Copyright remains Eric Young's, and as such any Copyright notices in
++ * the code are not to be removed.
++ * If this package is used in a product, Eric Young should be given attribution
++ * as the author of the parts of the library used.
++ * This can be in the form of a textual message at program startup or
++ * in documentation (online or textual) provided with the package.
++ * 
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. All advertising materials mentioning features or use of this software
++ *    must display the following acknowledgement:
++ *    "This product includes cryptographic software written by
++ *     Eric Young (eay@cryptsoft.com)"
++ *    The word 'cryptographic' can be left out if the rouines from the library
++ *    being used are not cryptographic related :-).
++ * 4. If you include any Windows specific code (or a derivative thereof) from 
++ *    the apps directory (application code) you must include an acknowledgement:
++ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
++ * 
++ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * 
++ * The licence and distribution terms for any publically available version or
++ * derivative of this code cannot be changed.  i.e. this code cannot simply be
++ * copied and put under another distribution licence
++ * [including the GNU Public Licence.]
++ */
++
++/* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
++ *
++ * Always modify des_locl.org since des_locl.h is automatically generated from
++ * it during SSLeay configuration.
++ *
++ * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
++ */
++
++#ifndef HEADER_DES_LOCL_H
++#define HEADER_DES_LOCL_H
++
++#if defined(WIN32) || defined(WIN16)
++#ifndef MSDOS
++#define MSDOS
++#endif
++#endif
++
++#include "klips-crypto/des.h"
++#ifdef OCF_ASSIST
++#include "klips-crypto/ocf_assist.h"
++#endif
++
++#ifndef DES_DEFAULT_OPTIONS
++/* the following is tweaked from a config script, that is why it is a
++ * protected undef/define */
++#ifndef DES_PTR
++#define DES_PTR
++#endif
++
++/* This helps C compiler generate the correct code for multiple functional
++ * units.  It reduces register dependancies at the expense of 2 more
++ * registers */
++#ifndef DES_RISC1
++#define DES_RISC1
++#endif
++
++#ifndef DES_RISC2
++#undef DES_RISC2
++#endif
++
++#if defined(DES_RISC1) && defined(DES_RISC2)
++YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!!
++#endif
++
++/* Unroll the inner loop, this sometimes helps, sometimes hinders.
++ * Very mucy CPU dependant */
++#ifndef DES_UNROLL
++#define DES_UNROLL
++#endif
++
++/* These default values were supplied by
++ * Peter Gutman <pgut001@cs.auckland.ac.nz>
++ * They are only used if nothing else has been defined */
++#if !defined(DES_PTR) && !defined(DES_RISC1) && !defined(DES_RISC2) && !defined(DES_UNROLL)
++/* Special defines which change the way the code is built depending on the
++   CPU and OS.  For SGI machines you can use _MIPS_SZLONG (32 or 64) to find
++   even newer MIPS CPU's, but at the moment one size fits all for
++   optimization options.  Older Sparc's work better with only UNROLL, but
++   there's no way to tell at compile time what it is you're running on */
++ 
++#if defined( sun )            /* Newer Sparc's */
++  #define DES_PTR
++  #define DES_RISC1
++  #define DES_UNROLL
++#elif defined( __ultrix )     /* Older MIPS */
++  #define DES_PTR
++  #define DES_RISC2
++  #define DES_UNROLL
++#elif defined( __osf1__ )     /* Alpha */
++  #define DES_PTR
++  #define DES_RISC2
++#elif defined ( _AIX )                /* RS6000 */
++  /* Unknown */
++#elif defined( __hpux )               /* HP-PA */
++  /* Unknown */
++#elif defined( __aux )                /* 68K */
++  /* Unknown */
++#elif defined( __dgux )               /* 88K (but P6 in latest boxes) */
++  #define DES_UNROLL
++#elif defined( __sgi )                /* Newer MIPS */
++  #define DES_PTR
++  #define DES_RISC2
++  #define DES_UNROLL
++#elif defined( i386 )         /* x86 boxes, should be gcc */
++  #define DES_PTR
++  #define DES_RISC1
++  #define DES_UNROLL
++#endif /* Systems-specific speed defines */
++#endif
++
++#endif /* DES_DEFAULT_OPTIONS */
++
++#ifdef MSDOS          /* Visual C++ 2.1 (Windows NT/95) */
++#include <stdlib.h>
++#include <errno.h>
++#include <time.h>
++#include <io.h>
++#ifndef RAND
++#define RAND
++#endif
++#undef NOPROTO
++#endif
++
++#if defined(__STDC__) || defined(VMS) || defined(M_XENIX) || defined(MSDOS)
++#ifndef __KERNEL__
++#include <string.h>
++#else
++#include <linux/string.h>
++#endif
++#endif
++
++#ifndef RAND
++#define RAND
++#endif
++
++#ifdef linux
++#undef RAND
++#endif
++
++#ifdef MSDOS
++#define getpid() 2
++#define RAND
++#undef NOPROTO
++#endif
++
++#if defined(NOCONST)
++#define const
++#endif
++
++#ifdef __STDC__
++#undef NOPROTO
++#endif
++
++#define ITERATIONS 16
++#define HALF_ITERATIONS 8
++
++/* used in des_read and des_write */
++#define MAXWRITE      (1024*16)
++#define BSIZE         (MAXWRITE+4)
++
++#define c2l(c,l)      (l =((DES_LONG)(*((c)++)))    , \
++                       l|=((DES_LONG)(*((c)++)))<< 8L, \
++                       l|=((DES_LONG)(*((c)++)))<<16L, \
++                       l|=((DES_LONG)(*((c)++)))<<24L)
++
++/* NOTE - c is not incremented as per c2l */
++#define c2ln(c,l1,l2,n)       { \
++                      c+=n; \
++                      l1=l2=0; \
++                      switch (n) { \
++                      case 8: l2 =((DES_LONG)(*(--(c))))<<24L; \
++                      case 7: l2|=((DES_LONG)(*(--(c))))<<16L; \
++                      case 6: l2|=((DES_LONG)(*(--(c))))<< 8L; \
++                      case 5: l2|=((DES_LONG)(*(--(c))));     \
++                      case 4: l1 =((DES_LONG)(*(--(c))))<<24L; \
++                      case 3: l1|=((DES_LONG)(*(--(c))))<<16L; \
++                      case 2: l1|=((DES_LONG)(*(--(c))))<< 8L; \
++                      case 1: l1|=((DES_LONG)(*(--(c))));     \
++                              } \
++                      }
++
++#define l2c(l,c)      (*((c)++)=(unsigned char)(((l)     )&0xff), \
++                       *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
++                       *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
++                       *((c)++)=(unsigned char)(((l)>>24L)&0xff))
++
++/* replacements for htonl and ntohl since I have no idea what to do
++ * when faced with machines with 8 byte longs. */
++#define HDRSIZE 4
++
++#define n2l(c,l)      (l =((DES_LONG)(*((c)++)))<<24L, \
++                       l|=((DES_LONG)(*((c)++)))<<16L, \
++                       l|=((DES_LONG)(*((c)++)))<< 8L, \
++                       l|=((DES_LONG)(*((c)++))))
++
++#define l2n(l,c)      (*((c)++)=(unsigned char)(((l)>>24L)&0xff), \
++                       *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
++                       *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
++                       *((c)++)=(unsigned char)(((l)     )&0xff))
++
++/* NOTE - c is not incremented as per l2c */
++#define l2cn(l1,l2,c,n)       { \
++                      c+=n; \
++                      switch (n) { \
++                      case 8: *(--(c))=(unsigned char)(((l2)>>24L)&0xff); \
++                      case 7: *(--(c))=(unsigned char)(((l2)>>16L)&0xff); \
++                      case 6: *(--(c))=(unsigned char)(((l2)>> 8L)&0xff); \
++                      case 5: *(--(c))=(unsigned char)(((l2)     )&0xff); \
++                      case 4: *(--(c))=(unsigned char)(((l1)>>24L)&0xff); \
++                      case 3: *(--(c))=(unsigned char)(((l1)>>16L)&0xff); \
++                      case 2: *(--(c))=(unsigned char)(((l1)>> 8L)&0xff); \
++                      case 1: *(--(c))=(unsigned char)(((l1)     )&0xff); \
++                              } \
++                      }
++
++#define       ROTATE(a,n)     (((a)>>(n))+((a)<<(32-(n))))
++
++/* Don't worry about the LOAD_DATA() stuff, that is used by
++ * fcrypt() to add it's little bit to the front */
++
++#ifdef DES_FCRYPT
++
++#define LOAD_DATA_tmp(R,S,u,t,E0,E1) \
++      { DES_LONG tmp; LOAD_DATA(R,S,u,t,E0,E1,tmp); }
++
++#define LOAD_DATA(R,S,u,t,E0,E1,tmp) \
++      t=R^(R>>16L); \
++      u=t&E0; t&=E1; \
++      tmp=(u<<16); u^=R^s[S  ]; u^=tmp; \
++      tmp=(t<<16); t^=R^s[S+1]; t^=tmp
++#else
++#define LOAD_DATA_tmp(a,b,c,d,e,f) LOAD_DATA(a,b,c,d,e,f,g)
++#define LOAD_DATA(R,S,u,t,E0,E1,tmp) \
++      u=R^s[S  ]; \
++      t=R^s[S+1]
++#endif
++
++/* The changes to this macro may help or hinder, depending on the
++ * compiler and the achitecture.  gcc2 always seems to do well :-).
++ * Inspired by Dana How <how@isl.stanford.edu>
++ * DO NOT use the alternative version on machines with 8 byte longs.
++ * It does not seem to work on the Alpha, even when DES_LONG is 4
++ * bytes, probably an issue of accessing non-word aligned objects :-( */
++#ifdef DES_PTR
++
++/* It recently occured to me that 0^0^0^0^0^0^0 == 0, so there
++ * is no reason to not xor all the sub items together.  This potentially
++ * saves a register since things can be xored directly into L */
++
++#if defined(DES_RISC1) || defined(DES_RISC2)
++#ifdef DES_RISC1
++#define D_ENCRYPT(LL,R,S) { \
++      unsigned int u1,u2,u3; \
++      LOAD_DATA(R,S,u,t,E0,E1,u1); \
++      u2=(int)u>>8L; \
++      u1=(int)u&0xfc; \
++      u2&=0xfc; \
++      t=ROTATE(t,4); \
++      u>>=16L; \
++      LL^= *(DES_LONG *)((unsigned char *)des_SP      +u1); \
++      LL^= *(DES_LONG *)((unsigned char *)des_SP+0x200+u2); \
++      u3=(int)(u>>8L); \
++      u1=(int)u&0xfc; \
++      u3&=0xfc; \
++      LL^= *(DES_LONG *)((unsigned char *)des_SP+0x400+u1); \
++      LL^= *(DES_LONG *)((unsigned char *)des_SP+0x600+u3); \
++      u2=(int)t>>8L; \
++      u1=(int)t&0xfc; \
++      u2&=0xfc; \
++      t>>=16L; \
++      LL^= *(DES_LONG *)((unsigned char *)des_SP+0x100+u1); \
++      LL^= *(DES_LONG *)((unsigned char *)des_SP+0x300+u2); \
++      u3=(int)t>>8L; \
++      u1=(int)t&0xfc; \
++      u3&=0xfc; \
++      LL^= *(DES_LONG *)((unsigned char *)des_SP+0x500+u1); \
++      LL^= *(DES_LONG *)((unsigned char *)des_SP+0x700+u3); }
++#endif
++#ifdef DES_RISC2
++#define D_ENCRYPT(LL,R,S) { \
++      unsigned int u1,u2,s1,s2; \
++      LOAD_DATA(R,S,u,t,E0,E1,u1); \
++      u2=(int)u>>8L; \
++      u1=(int)u&0xfc; \
++      u2&=0xfc; \
++      t=ROTATE(t,4); \
++      LL^= *(DES_LONG *)((unsigned char *)des_SP      +u1); \
++      LL^= *(DES_LONG *)((unsigned char *)des_SP+0x200+u2); \
++      s1=(int)(u>>16L); \
++      s2=(int)(u>>24L); \
++      s1&=0xfc; \
++      s2&=0xfc; \
++      LL^= *(DES_LONG *)((unsigned char *)des_SP+0x400+s1); \
++      LL^= *(DES_LONG *)((unsigned char *)des_SP+0x600+s2); \
++      u2=(int)t>>8L; \
++      u1=(int)t&0xfc; \
++      u2&=0xfc; \
++      LL^= *(DES_LONG *)((unsigned char *)des_SP+0x100+u1); \
++      LL^= *(DES_LONG *)((unsigned char *)des_SP+0x300+u2); \
++      s1=(int)(t>>16L); \
++      s2=(int)(t>>24L); \
++      s1&=0xfc; \
++      s2&=0xfc; \
++      LL^= *(DES_LONG *)((unsigned char *)des_SP+0x500+s1); \
++      LL^= *(DES_LONG *)((unsigned char *)des_SP+0x700+s2); }
++#endif
++#else
++#define D_ENCRYPT(LL,R,S) { \
++      LOAD_DATA_tmp(R,S,u,t,E0,E1); \
++      t=ROTATE(t,4); \
++      LL^= \
++      *(DES_LONG *)((unsigned char *)des_SP      +((u     )&0xfc))^ \
++      *(DES_LONG *)((unsigned char *)des_SP+0x200+((u>> 8L)&0xfc))^ \
++      *(DES_LONG *)((unsigned char *)des_SP+0x400+((u>>16L)&0xfc))^ \
++      *(DES_LONG *)((unsigned char *)des_SP+0x600+((u>>24L)&0xfc))^ \
++      *(DES_LONG *)((unsigned char *)des_SP+0x100+((t     )&0xfc))^ \
++      *(DES_LONG *)((unsigned char *)des_SP+0x300+((t>> 8L)&0xfc))^ \
++      *(DES_LONG *)((unsigned char *)des_SP+0x500+((t>>16L)&0xfc))^ \
++      *(DES_LONG *)((unsigned char *)des_SP+0x700+((t>>24L)&0xfc)); }
++#endif
++
++#else /* original version */
++
++#if defined(DES_RISC1) || defined(DES_RISC2)
++#ifdef DES_RISC1
++#define D_ENCRYPT(LL,R,S) {\
++      unsigned int u1,u2,u3; \
++      LOAD_DATA(R,S,u,t,E0,E1,u1); \
++      u>>=2L; \
++      t=ROTATE(t,6); \
++      u2=(int)u>>8L; \
++      u1=(int)u&0x3f; \
++      u2&=0x3f; \
++      u>>=16L; \
++      LL^=des_SPtrans[0][u1]; \
++      LL^=des_SPtrans[2][u2]; \
++      u3=(int)u>>8L; \
++      u1=(int)u&0x3f; \
++      u3&=0x3f; \
++      LL^=des_SPtrans[4][u1]; \
++      LL^=des_SPtrans[6][u3]; \
++      u2=(int)t>>8L; \
++      u1=(int)t&0x3f; \
++      u2&=0x3f; \
++      t>>=16L; \
++      LL^=des_SPtrans[1][u1]; \
++      LL^=des_SPtrans[3][u2]; \
++      u3=(int)t>>8L; \
++      u1=(int)t&0x3f; \
++      u3&=0x3f; \
++      LL^=des_SPtrans[5][u1]; \
++      LL^=des_SPtrans[7][u3]; }
++#endif
++#ifdef DES_RISC2
++#define D_ENCRYPT(LL,R,S) {\
++      unsigned int u1,u2,s1,s2; \
++      LOAD_DATA(R,S,u,t,E0,E1,u1); \
++      u>>=2L; \
++      t=ROTATE(t,6); \
++      u2=(int)u>>8L; \
++      u1=(int)u&0x3f; \
++      u2&=0x3f; \
++      LL^=des_SPtrans[0][u1]; \
++      LL^=des_SPtrans[2][u2]; \
++      s1=(int)u>>16L; \
++      s2=(int)u>>24L; \
++      s1&=0x3f; \
++      s2&=0x3f; \
++      LL^=des_SPtrans[4][s1]; \
++      LL^=des_SPtrans[6][s2]; \
++      u2=(int)t>>8L; \
++      u1=(int)t&0x3f; \
++      u2&=0x3f; \
++      LL^=des_SPtrans[1][u1]; \
++      LL^=des_SPtrans[3][u2]; \
++      s1=(int)t>>16; \
++      s2=(int)t>>24L; \
++      s1&=0x3f; \
++      s2&=0x3f; \
++      LL^=des_SPtrans[5][s1]; \
++      LL^=des_SPtrans[7][s2]; }
++#endif
++
++#else
++
++#define D_ENCRYPT(LL,R,S) {\
++      LOAD_DATA_tmp(R,S,u,t,E0,E1); \
++      t=ROTATE(t,4); \
++      LL^=\
++              des_SPtrans[0][(u>> 2L)&0x3f]^ \
++              des_SPtrans[2][(u>>10L)&0x3f]^ \
++              des_SPtrans[4][(u>>18L)&0x3f]^ \
++              des_SPtrans[6][(u>>26L)&0x3f]^ \
++              des_SPtrans[1][(t>> 2L)&0x3f]^ \
++              des_SPtrans[3][(t>>10L)&0x3f]^ \
++              des_SPtrans[5][(t>>18L)&0x3f]^ \
++              des_SPtrans[7][(t>>26L)&0x3f]; }
++#endif
++#endif
++
++      /* IP and FP
++       * The problem is more of a geometric problem that random bit fiddling.
++       0  1  2  3  4  5  6  7      62 54 46 38 30 22 14  6
++       8  9 10 11 12 13 14 15      60 52 44 36 28 20 12  4
++      16 17 18 19 20 21 22 23      58 50 42 34 26 18 10  2
++      24 25 26 27 28 29 30 31  to  56 48 40 32 24 16  8  0
++
++      32 33 34 35 36 37 38 39      63 55 47 39 31 23 15  7
++      40 41 42 43 44 45 46 47      61 53 45 37 29 21 13  5
++      48 49 50 51 52 53 54 55      59 51 43 35 27 19 11  3
++      56 57 58 59 60 61 62 63      57 49 41 33 25 17  9  1
++
++      The output has been subject to swaps of the form
++      0 1 -> 3 1 but the odd and even bits have been put into
++      2 3    2 0
++      different words.  The main trick is to remember that
++      t=((l>>size)^r)&(mask);
++      r^=t;
++      l^=(t<<size);
++      can be used to swap and move bits between words.
++
++      So l =  0  1  2  3  r = 16 17 18 19
++              4  5  6  7      20 21 22 23
++              8  9 10 11      24 25 26 27
++             12 13 14 15      28 29 30 31
++      becomes (for size == 2 and mask == 0x3333)
++         t =   2^16  3^17 -- --   l =  0  1 16 17  r =  2  3 18 19
++               6^20  7^21 -- --        4  5 20 21       6  7 22 23
++              10^24 11^25 -- --        8  9 24 25      10 11 24 25
++              14^28 15^29 -- --       12 13 28 29      14 15 28 29
++
++      Thanks for hints from Richard Outerbridge - he told me IP&FP
++      could be done in 15 xor, 10 shifts and 5 ands.
++      When I finally started to think of the problem in 2D
++      I first got ~42 operations without xors.  When I remembered
++      how to use xors :-) I got it to its final state.
++      */
++#define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
++      (b)^=(t),\
++      (a)^=((t)<<(n)))
++
++#define IP(l,r) \
++      { \
++      register DES_LONG tt; \
++      PERM_OP(r,l,tt, 4,0x0f0f0f0fL); \
++      PERM_OP(l,r,tt,16,0x0000ffffL); \
++      PERM_OP(r,l,tt, 2,0x33333333L); \
++      PERM_OP(l,r,tt, 8,0x00ff00ffL); \
++      PERM_OP(r,l,tt, 1,0x55555555L); \
++      }
++
++#define FP(l,r) \
++      { \
++      register DES_LONG tt; \
++      PERM_OP(l,r,tt, 1,0x55555555L); \
++      PERM_OP(r,l,tt, 8,0x00ff00ffL); \
++      PERM_OP(l,r,tt, 2,0x33333333L); \
++      PERM_OP(r,l,tt,16,0x0000ffffL); \
++      PERM_OP(l,r,tt, 4,0x0f0f0f0fL); \
++      }
++
++extern const DES_LONG des_SPtrans[8][64];
++
++#ifndef NO_FCRYPT
++#ifndef NOPROTO
++void fcrypt_body(DES_LONG *out,des_key_schedule ks,
++      DES_LONG Eswap0, DES_LONG Eswap1);
++#else
++void fcrypt_body();
++#endif
++#endif /* NO_FCRYPT */
++
++#endif
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/des/des_ver.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,60 @@
++/* crypto/des/des_ver.h */
++/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
++ * All rights reserved.
++ *
++ * This package is an SSL implementation written
++ * by Eric Young (eay@cryptsoft.com).
++ * The implementation was written so as to conform with Netscapes SSL.
++ * 
++ * This library is free for commercial and non-commercial use as long as
++ * the following conditions are aheared to.  The following conditions
++ * apply to all code found in this distribution, be it the RC4, RSA,
++ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
++ * included with this distribution is covered by the same copyright terms
++ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
++ * 
++ * Copyright remains Eric Young's, and as such any Copyright notices in
++ * the code are not to be removed.
++ * If this package is used in a product, Eric Young should be given attribution
++ * as the author of the parts of the library used.
++ * This can be in the form of a textual message at program startup or
++ * in documentation (online or textual) provided with the package.
++ * 
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. All advertising materials mentioning features or use of this software
++ *    must display the following acknowledgement:
++ *    "This product includes cryptographic software written by
++ *     Eric Young (eay@cryptsoft.com)"
++ *    The word 'cryptographic' can be left out if the rouines from the library
++ *    being used are not cryptographic related :-).
++ * 4. If you include any Windows specific code (or a derivative thereof) from 
++ *    the apps directory (application code) you must include an acknowledgement:
++ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
++ * 
++ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * 
++ * The licence and distribution terms for any publically available version or
++ * derivative of this code cannot be changed.  i.e. this code cannot simply be
++ * copied and put under another distribution licence
++ * [including the GNU Public Licence.]
++ */
++
++extern char *DES_version;     /* SSLeay version string */
++extern char *libdes_version;  /* old libdes version string */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/des/podd.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,75 @@
++/* crypto/des/podd.h */
++/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
++ * All rights reserved.
++ *
++ * This package is an SSL implementation written
++ * by Eric Young (eay@cryptsoft.com).
++ * The implementation was written so as to conform with Netscapes SSL.
++ * 
++ * This library is free for commercial and non-commercial use as long as
++ * the following conditions are aheared to.  The following conditions
++ * apply to all code found in this distribution, be it the RC4, RSA,
++ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
++ * included with this distribution is covered by the same copyright terms
++ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
++ * 
++ * Copyright remains Eric Young's, and as such any Copyright notices in
++ * the code are not to be removed.
++ * If this package is used in a product, Eric Young should be given attribution
++ * as the author of the parts of the library used.
++ * This can be in the form of a textual message at program startup or
++ * in documentation (online or textual) provided with the package.
++ * 
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. All advertising materials mentioning features or use of this software
++ *    must display the following acknowledgement:
++ *    "This product includes cryptographic software written by
++ *     Eric Young (eay@cryptsoft.com)"
++ *    The word 'cryptographic' can be left out if the rouines from the library
++ *    being used are not cryptographic related :-).
++ * 4. If you include any Windows specific code (or a derivative thereof) from 
++ *    the apps directory (application code) you must include an acknowledgement:
++ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
++ * 
++ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * 
++ * The licence and distribution terms for any publically available version or
++ * derivative of this code cannot be changed.  i.e. this code cannot simply be
++ * copied and put under another distribution licence
++ * [including the GNU Public Licence.]
++ */
++
++static const unsigned char odd_parity[256]={
++  1,  1,  2,  2,  4,  4,  7,  7,  8,  8, 11, 11, 13, 13, 14, 14,
++ 16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
++ 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
++ 49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
++ 64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
++ 81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
++ 97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110,
++112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,
++128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143,
++145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,
++161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,
++176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,
++193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,
++208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223,
++224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,
++241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254};
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/des/sk.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,204 @@
++/* crypto/des/sk.h */
++/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
++ * All rights reserved.
++ *
++ * This package is an SSL implementation written
++ * by Eric Young (eay@cryptsoft.com).
++ * The implementation was written so as to conform with Netscapes SSL.
++ * 
++ * This library is free for commercial and non-commercial use as long as
++ * the following conditions are aheared to.  The following conditions
++ * apply to all code found in this distribution, be it the RC4, RSA,
++ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
++ * included with this distribution is covered by the same copyright terms
++ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
++ * 
++ * Copyright remains Eric Young's, and as such any Copyright notices in
++ * the code are not to be removed.
++ * If this package is used in a product, Eric Young should be given attribution
++ * as the author of the parts of the library used.
++ * This can be in the form of a textual message at program startup or
++ * in documentation (online or textual) provided with the package.
++ * 
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. All advertising materials mentioning features or use of this software
++ *    must display the following acknowledgement:
++ *    "This product includes cryptographic software written by
++ *     Eric Young (eay@cryptsoft.com)"
++ *    The word 'cryptographic' can be left out if the rouines from the library
++ *    being used are not cryptographic related :-).
++ * 4. If you include any Windows specific code (or a derivative thereof) from 
++ *    the apps directory (application code) you must include an acknowledgement:
++ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
++ * 
++ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * 
++ * The licence and distribution terms for any publically available version or
++ * derivative of this code cannot be changed.  i.e. this code cannot simply be
++ * copied and put under another distribution licence
++ * [including the GNU Public Licence.]
++ */
++
++static const DES_LONG des_skb[8][64]={
++{
++/* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
++0x00000000L,0x00000010L,0x20000000L,0x20000010L,
++0x00010000L,0x00010010L,0x20010000L,0x20010010L,
++0x00000800L,0x00000810L,0x20000800L,0x20000810L,
++0x00010800L,0x00010810L,0x20010800L,0x20010810L,
++0x00000020L,0x00000030L,0x20000020L,0x20000030L,
++0x00010020L,0x00010030L,0x20010020L,0x20010030L,
++0x00000820L,0x00000830L,0x20000820L,0x20000830L,
++0x00010820L,0x00010830L,0x20010820L,0x20010830L,
++0x00080000L,0x00080010L,0x20080000L,0x20080010L,
++0x00090000L,0x00090010L,0x20090000L,0x20090010L,
++0x00080800L,0x00080810L,0x20080800L,0x20080810L,
++0x00090800L,0x00090810L,0x20090800L,0x20090810L,
++0x00080020L,0x00080030L,0x20080020L,0x20080030L,
++0x00090020L,0x00090030L,0x20090020L,0x20090030L,
++0x00080820L,0x00080830L,0x20080820L,0x20080830L,
++0x00090820L,0x00090830L,0x20090820L,0x20090830L,
++},{
++/* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
++0x00000000L,0x02000000L,0x00002000L,0x02002000L,
++0x00200000L,0x02200000L,0x00202000L,0x02202000L,
++0x00000004L,0x02000004L,0x00002004L,0x02002004L,
++0x00200004L,0x02200004L,0x00202004L,0x02202004L,
++0x00000400L,0x02000400L,0x00002400L,0x02002400L,
++0x00200400L,0x02200400L,0x00202400L,0x02202400L,
++0x00000404L,0x02000404L,0x00002404L,0x02002404L,
++0x00200404L,0x02200404L,0x00202404L,0x02202404L,
++0x10000000L,0x12000000L,0x10002000L,0x12002000L,
++0x10200000L,0x12200000L,0x10202000L,0x12202000L,
++0x10000004L,0x12000004L,0x10002004L,0x12002004L,
++0x10200004L,0x12200004L,0x10202004L,0x12202004L,
++0x10000400L,0x12000400L,0x10002400L,0x12002400L,
++0x10200400L,0x12200400L,0x10202400L,0x12202400L,
++0x10000404L,0x12000404L,0x10002404L,0x12002404L,
++0x10200404L,0x12200404L,0x10202404L,0x12202404L,
++},{
++/* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
++0x00000000L,0x00000001L,0x00040000L,0x00040001L,
++0x01000000L,0x01000001L,0x01040000L,0x01040001L,
++0x00000002L,0x00000003L,0x00040002L,0x00040003L,
++0x01000002L,0x01000003L,0x01040002L,0x01040003L,
++0x00000200L,0x00000201L,0x00040200L,0x00040201L,
++0x01000200L,0x01000201L,0x01040200L,0x01040201L,
++0x00000202L,0x00000203L,0x00040202L,0x00040203L,
++0x01000202L,0x01000203L,0x01040202L,0x01040203L,
++0x08000000L,0x08000001L,0x08040000L,0x08040001L,
++0x09000000L,0x09000001L,0x09040000L,0x09040001L,
++0x08000002L,0x08000003L,0x08040002L,0x08040003L,
++0x09000002L,0x09000003L,0x09040002L,0x09040003L,
++0x08000200L,0x08000201L,0x08040200L,0x08040201L,
++0x09000200L,0x09000201L,0x09040200L,0x09040201L,
++0x08000202L,0x08000203L,0x08040202L,0x08040203L,
++0x09000202L,0x09000203L,0x09040202L,0x09040203L,
++},{
++/* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
++0x00000000L,0x00100000L,0x00000100L,0x00100100L,
++0x00000008L,0x00100008L,0x00000108L,0x00100108L,
++0x00001000L,0x00101000L,0x00001100L,0x00101100L,
++0x00001008L,0x00101008L,0x00001108L,0x00101108L,
++0x04000000L,0x04100000L,0x04000100L,0x04100100L,
++0x04000008L,0x04100008L,0x04000108L,0x04100108L,
++0x04001000L,0x04101000L,0x04001100L,0x04101100L,
++0x04001008L,0x04101008L,0x04001108L,0x04101108L,
++0x00020000L,0x00120000L,0x00020100L,0x00120100L,
++0x00020008L,0x00120008L,0x00020108L,0x00120108L,
++0x00021000L,0x00121000L,0x00021100L,0x00121100L,
++0x00021008L,0x00121008L,0x00021108L,0x00121108L,
++0x04020000L,0x04120000L,0x04020100L,0x04120100L,
++0x04020008L,0x04120008L,0x04020108L,0x04120108L,
++0x04021000L,0x04121000L,0x04021100L,0x04121100L,
++0x04021008L,0x04121008L,0x04021108L,0x04121108L,
++},{
++/* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
++0x00000000L,0x10000000L,0x00010000L,0x10010000L,
++0x00000004L,0x10000004L,0x00010004L,0x10010004L,
++0x20000000L,0x30000000L,0x20010000L,0x30010000L,
++0x20000004L,0x30000004L,0x20010004L,0x30010004L,
++0x00100000L,0x10100000L,0x00110000L,0x10110000L,
++0x00100004L,0x10100004L,0x00110004L,0x10110004L,
++0x20100000L,0x30100000L,0x20110000L,0x30110000L,
++0x20100004L,0x30100004L,0x20110004L,0x30110004L,
++0x00001000L,0x10001000L,0x00011000L,0x10011000L,
++0x00001004L,0x10001004L,0x00011004L,0x10011004L,
++0x20001000L,0x30001000L,0x20011000L,0x30011000L,
++0x20001004L,0x30001004L,0x20011004L,0x30011004L,
++0x00101000L,0x10101000L,0x00111000L,0x10111000L,
++0x00101004L,0x10101004L,0x00111004L,0x10111004L,
++0x20101000L,0x30101000L,0x20111000L,0x30111000L,
++0x20101004L,0x30101004L,0x20111004L,0x30111004L,
++},{
++/* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
++0x00000000L,0x08000000L,0x00000008L,0x08000008L,
++0x00000400L,0x08000400L,0x00000408L,0x08000408L,
++0x00020000L,0x08020000L,0x00020008L,0x08020008L,
++0x00020400L,0x08020400L,0x00020408L,0x08020408L,
++0x00000001L,0x08000001L,0x00000009L,0x08000009L,
++0x00000401L,0x08000401L,0x00000409L,0x08000409L,
++0x00020001L,0x08020001L,0x00020009L,0x08020009L,
++0x00020401L,0x08020401L,0x00020409L,0x08020409L,
++0x02000000L,0x0A000000L,0x02000008L,0x0A000008L,
++0x02000400L,0x0A000400L,0x02000408L,0x0A000408L,
++0x02020000L,0x0A020000L,0x02020008L,0x0A020008L,
++0x02020400L,0x0A020400L,0x02020408L,0x0A020408L,
++0x02000001L,0x0A000001L,0x02000009L,0x0A000009L,
++0x02000401L,0x0A000401L,0x02000409L,0x0A000409L,
++0x02020001L,0x0A020001L,0x02020009L,0x0A020009L,
++0x02020401L,0x0A020401L,0x02020409L,0x0A020409L,
++},{
++/* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
++0x00000000L,0x00000100L,0x00080000L,0x00080100L,
++0x01000000L,0x01000100L,0x01080000L,0x01080100L,
++0x00000010L,0x00000110L,0x00080010L,0x00080110L,
++0x01000010L,0x01000110L,0x01080010L,0x01080110L,
++0x00200000L,0x00200100L,0x00280000L,0x00280100L,
++0x01200000L,0x01200100L,0x01280000L,0x01280100L,
++0x00200010L,0x00200110L,0x00280010L,0x00280110L,
++0x01200010L,0x01200110L,0x01280010L,0x01280110L,
++0x00000200L,0x00000300L,0x00080200L,0x00080300L,
++0x01000200L,0x01000300L,0x01080200L,0x01080300L,
++0x00000210L,0x00000310L,0x00080210L,0x00080310L,
++0x01000210L,0x01000310L,0x01080210L,0x01080310L,
++0x00200200L,0x00200300L,0x00280200L,0x00280300L,
++0x01200200L,0x01200300L,0x01280200L,0x01280300L,
++0x00200210L,0x00200310L,0x00280210L,0x00280310L,
++0x01200210L,0x01200310L,0x01280210L,0x01280310L,
++},{
++/* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
++0x00000000L,0x04000000L,0x00040000L,0x04040000L,
++0x00000002L,0x04000002L,0x00040002L,0x04040002L,
++0x00002000L,0x04002000L,0x00042000L,0x04042000L,
++0x00002002L,0x04002002L,0x00042002L,0x04042002L,
++0x00000020L,0x04000020L,0x00040020L,0x04040020L,
++0x00000022L,0x04000022L,0x00040022L,0x04040022L,
++0x00002020L,0x04002020L,0x00042020L,0x04042020L,
++0x00002022L,0x04002022L,0x00042022L,0x04042022L,
++0x00000800L,0x04000800L,0x00040800L,0x04040800L,
++0x00000802L,0x04000802L,0x00040802L,0x04040802L,
++0x00002800L,0x04002800L,0x00042800L,0x04042800L,
++0x00002802L,0x04002802L,0x00042802L,0x04042802L,
++0x00000820L,0x04000820L,0x00040820L,0x04040820L,
++0x00000822L,0x04000822L,0x00040822L,0x04040822L,
++0x00002820L,0x04002820L,0x00042820L,0x04042820L,
++0x00002822L,0x04002822L,0x00042822L,0x04042822L,
++}};
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/des/spr.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,204 @@
++/* crypto/des/spr.h */
++/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
++ * All rights reserved.
++ *
++ * This package is an SSL implementation written
++ * by Eric Young (eay@cryptsoft.com).
++ * The implementation was written so as to conform with Netscapes SSL.
++ * 
++ * This library is free for commercial and non-commercial use as long as
++ * the following conditions are aheared to.  The following conditions
++ * apply to all code found in this distribution, be it the RC4, RSA,
++ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
++ * included with this distribution is covered by the same copyright terms
++ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
++ * 
++ * Copyright remains Eric Young's, and as such any Copyright notices in
++ * the code are not to be removed.
++ * If this package is used in a product, Eric Young should be given attribution
++ * as the author of the parts of the library used.
++ * This can be in the form of a textual message at program startup or
++ * in documentation (online or textual) provided with the package.
++ * 
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. All advertising materials mentioning features or use of this software
++ *    must display the following acknowledgement:
++ *    "This product includes cryptographic software written by
++ *     Eric Young (eay@cryptsoft.com)"
++ *    The word 'cryptographic' can be left out if the rouines from the library
++ *    being used are not cryptographic related :-).
++ * 4. If you include any Windows specific code (or a derivative thereof) from 
++ *    the apps directory (application code) you must include an acknowledgement:
++ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
++ * 
++ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * 
++ * The licence and distribution terms for any publically available version or
++ * derivative of this code cannot be changed.  i.e. this code cannot simply be
++ * copied and put under another distribution licence
++ * [including the GNU Public Licence.]
++ */
++
++const DES_LONG des_SPtrans[8][64]={
++{
++/* nibble 0 */
++0x02080800L, 0x00080000L, 0x02000002L, 0x02080802L,
++0x02000000L, 0x00080802L, 0x00080002L, 0x02000002L,
++0x00080802L, 0x02080800L, 0x02080000L, 0x00000802L,
++0x02000802L, 0x02000000L, 0x00000000L, 0x00080002L,
++0x00080000L, 0x00000002L, 0x02000800L, 0x00080800L,
++0x02080802L, 0x02080000L, 0x00000802L, 0x02000800L,
++0x00000002L, 0x00000800L, 0x00080800L, 0x02080002L,
++0x00000800L, 0x02000802L, 0x02080002L, 0x00000000L,
++0x00000000L, 0x02080802L, 0x02000800L, 0x00080002L,
++0x02080800L, 0x00080000L, 0x00000802L, 0x02000800L,
++0x02080002L, 0x00000800L, 0x00080800L, 0x02000002L,
++0x00080802L, 0x00000002L, 0x02000002L, 0x02080000L,
++0x02080802L, 0x00080800L, 0x02080000L, 0x02000802L,
++0x02000000L, 0x00000802L, 0x00080002L, 0x00000000L,
++0x00080000L, 0x02000000L, 0x02000802L, 0x02080800L,
++0x00000002L, 0x02080002L, 0x00000800L, 0x00080802L,
++},{
++/* nibble 1 */
++0x40108010L, 0x00000000L, 0x00108000L, 0x40100000L,
++0x40000010L, 0x00008010L, 0x40008000L, 0x00108000L,
++0x00008000L, 0x40100010L, 0x00000010L, 0x40008000L,
++0x00100010L, 0x40108000L, 0x40100000L, 0x00000010L,
++0x00100000L, 0x40008010L, 0x40100010L, 0x00008000L,
++0x00108010L, 0x40000000L, 0x00000000L, 0x00100010L,
++0x40008010L, 0x00108010L, 0x40108000L, 0x40000010L,
++0x40000000L, 0x00100000L, 0x00008010L, 0x40108010L,
++0x00100010L, 0x40108000L, 0x40008000L, 0x00108010L,
++0x40108010L, 0x00100010L, 0x40000010L, 0x00000000L,
++0x40000000L, 0x00008010L, 0x00100000L, 0x40100010L,
++0x00008000L, 0x40000000L, 0x00108010L, 0x40008010L,
++0x40108000L, 0x00008000L, 0x00000000L, 0x40000010L,
++0x00000010L, 0x40108010L, 0x00108000L, 0x40100000L,
++0x40100010L, 0x00100000L, 0x00008010L, 0x40008000L,
++0x40008010L, 0x00000010L, 0x40100000L, 0x00108000L,
++},{
++/* nibble 2 */
++0x04000001L, 0x04040100L, 0x00000100L, 0x04000101L,
++0x00040001L, 0x04000000L, 0x04000101L, 0x00040100L,
++0x04000100L, 0x00040000L, 0x04040000L, 0x00000001L,
++0x04040101L, 0x00000101L, 0x00000001L, 0x04040001L,
++0x00000000L, 0x00040001L, 0x04040100L, 0x00000100L,
++0x00000101L, 0x04040101L, 0x00040000L, 0x04000001L,
++0x04040001L, 0x04000100L, 0x00040101L, 0x04040000L,
++0x00040100L, 0x00000000L, 0x04000000L, 0x00040101L,
++0x04040100L, 0x00000100L, 0x00000001L, 0x00040000L,
++0x00000101L, 0x00040001L, 0x04040000L, 0x04000101L,
++0x00000000L, 0x04040100L, 0x00040100L, 0x04040001L,
++0x00040001L, 0x04000000L, 0x04040101L, 0x00000001L,
++0x00040101L, 0x04000001L, 0x04000000L, 0x04040101L,
++0x00040000L, 0x04000100L, 0x04000101L, 0x00040100L,
++0x04000100L, 0x00000000L, 0x04040001L, 0x00000101L,
++0x04000001L, 0x00040101L, 0x00000100L, 0x04040000L,
++},{
++/* nibble 3 */
++0x00401008L, 0x10001000L, 0x00000008L, 0x10401008L,
++0x00000000L, 0x10400000L, 0x10001008L, 0x00400008L,
++0x10401000L, 0x10000008L, 0x10000000L, 0x00001008L,
++0x10000008L, 0x00401008L, 0x00400000L, 0x10000000L,
++0x10400008L, 0x00401000L, 0x00001000L, 0x00000008L,
++0x00401000L, 0x10001008L, 0x10400000L, 0x00001000L,
++0x00001008L, 0x00000000L, 0x00400008L, 0x10401000L,
++0x10001000L, 0x10400008L, 0x10401008L, 0x00400000L,
++0x10400008L, 0x00001008L, 0x00400000L, 0x10000008L,
++0x00401000L, 0x10001000L, 0x00000008L, 0x10400000L,
++0x10001008L, 0x00000000L, 0x00001000L, 0x00400008L,
++0x00000000L, 0x10400008L, 0x10401000L, 0x00001000L,
++0x10000000L, 0x10401008L, 0x00401008L, 0x00400000L,
++0x10401008L, 0x00000008L, 0x10001000L, 0x00401008L,
++0x00400008L, 0x00401000L, 0x10400000L, 0x10001008L,
++0x00001008L, 0x10000000L, 0x10000008L, 0x10401000L,
++},{
++/* nibble 4 */
++0x08000000L, 0x00010000L, 0x00000400L, 0x08010420L,
++0x08010020L, 0x08000400L, 0x00010420L, 0x08010000L,
++0x00010000L, 0x00000020L, 0x08000020L, 0x00010400L,
++0x08000420L, 0x08010020L, 0x08010400L, 0x00000000L,
++0x00010400L, 0x08000000L, 0x00010020L, 0x00000420L,
++0x08000400L, 0x00010420L, 0x00000000L, 0x08000020L,
++0x00000020L, 0x08000420L, 0x08010420L, 0x00010020L,
++0x08010000L, 0x00000400L, 0x00000420L, 0x08010400L,
++0x08010400L, 0x08000420L, 0x00010020L, 0x08010000L,
++0x00010000L, 0x00000020L, 0x08000020L, 0x08000400L,
++0x08000000L, 0x00010400L, 0x08010420L, 0x00000000L,
++0x00010420L, 0x08000000L, 0x00000400L, 0x00010020L,
++0x08000420L, 0x00000400L, 0x00000000L, 0x08010420L,
++0x08010020L, 0x08010400L, 0x00000420L, 0x00010000L,
++0x00010400L, 0x08010020L, 0x08000400L, 0x00000420L,
++0x00000020L, 0x00010420L, 0x08010000L, 0x08000020L,
++},{
++/* nibble 5 */
++0x80000040L, 0x00200040L, 0x00000000L, 0x80202000L,
++0x00200040L, 0x00002000L, 0x80002040L, 0x00200000L,
++0x00002040L, 0x80202040L, 0x00202000L, 0x80000000L,
++0x80002000L, 0x80000040L, 0x80200000L, 0x00202040L,
++0x00200000L, 0x80002040L, 0x80200040L, 0x00000000L,
++0x00002000L, 0x00000040L, 0x80202000L, 0x80200040L,
++0x80202040L, 0x80200000L, 0x80000000L, 0x00002040L,
++0x00000040L, 0x00202000L, 0x00202040L, 0x80002000L,
++0x00002040L, 0x80000000L, 0x80002000L, 0x00202040L,
++0x80202000L, 0x00200040L, 0x00000000L, 0x80002000L,
++0x80000000L, 0x00002000L, 0x80200040L, 0x00200000L,
++0x00200040L, 0x80202040L, 0x00202000L, 0x00000040L,
++0x80202040L, 0x00202000L, 0x00200000L, 0x80002040L,
++0x80000040L, 0x80200000L, 0x00202040L, 0x00000000L,
++0x00002000L, 0x80000040L, 0x80002040L, 0x80202000L,
++0x80200000L, 0x00002040L, 0x00000040L, 0x80200040L,
++},{
++/* nibble 6 */
++0x00004000L, 0x00000200L, 0x01000200L, 0x01000004L,
++0x01004204L, 0x00004004L, 0x00004200L, 0x00000000L,
++0x01000000L, 0x01000204L, 0x00000204L, 0x01004000L,
++0x00000004L, 0x01004200L, 0x01004000L, 0x00000204L,
++0x01000204L, 0x00004000L, 0x00004004L, 0x01004204L,
++0x00000000L, 0x01000200L, 0x01000004L, 0x00004200L,
++0x01004004L, 0x00004204L, 0x01004200L, 0x00000004L,
++0x00004204L, 0x01004004L, 0x00000200L, 0x01000000L,
++0x00004204L, 0x01004000L, 0x01004004L, 0x00000204L,
++0x00004000L, 0x00000200L, 0x01000000L, 0x01004004L,
++0x01000204L, 0x00004204L, 0x00004200L, 0x00000000L,
++0x00000200L, 0x01000004L, 0x00000004L, 0x01000200L,
++0x00000000L, 0x01000204L, 0x01000200L, 0x00004200L,
++0x00000204L, 0x00004000L, 0x01004204L, 0x01000000L,
++0x01004200L, 0x00000004L, 0x00004004L, 0x01004204L,
++0x01000004L, 0x01004200L, 0x01004000L, 0x00004004L,
++},{
++/* nibble 7 */
++0x20800080L, 0x20820000L, 0x00020080L, 0x00000000L,
++0x20020000L, 0x00800080L, 0x20800000L, 0x20820080L,
++0x00000080L, 0x20000000L, 0x00820000L, 0x00020080L,
++0x00820080L, 0x20020080L, 0x20000080L, 0x20800000L,
++0x00020000L, 0x00820080L, 0x00800080L, 0x20020000L,
++0x20820080L, 0x20000080L, 0x00000000L, 0x00820000L,
++0x20000000L, 0x00800000L, 0x20020080L, 0x20800080L,
++0x00800000L, 0x00020000L, 0x20820000L, 0x00000080L,
++0x00800000L, 0x00020000L, 0x20000080L, 0x20820080L,
++0x00020080L, 0x20000000L, 0x00000000L, 0x00820000L,
++0x20800080L, 0x20020080L, 0x20020000L, 0x00800080L,
++0x20820000L, 0x00000080L, 0x00800080L, 0x20020000L,
++0x20820080L, 0x00800000L, 0x20800000L, 0x20000080L,
++0x00820000L, 0x00020080L, 0x20020080L, 0x20800000L,
++0x00000080L, 0x20820000L, 0x00820080L, 0x00000000L,
++0x20000000L, 0x20800080L, 0x00020000L, 0x00820080L,
++}};
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/klips-crypto/aes.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,97 @@
++// I retain copyright in this code but I encourage its free use provided
++// that I don't carry any responsibility for the results. I am especially 
++// happy to see it used in free and open source software. If you do use 
++// it I would appreciate an acknowledgement of its origin in the code or
++// the product that results and I would also appreciate knowing a little
++// about the use to which it is being put. I am grateful to Frank Yellin
++// for some ideas that are used in this implementation.
++//
++// Dr B. R. Gladman <brg@gladman.uk.net> 6th April 2001.
++//
++// This is an implementation of the AES encryption algorithm (Rijndael)
++// designed by Joan Daemen and Vincent Rijmen. This version is designed
++// to provide both fixed and dynamic block and key lengths and can also 
++// run with either big or little endian internal byte order (see aes.h). 
++// It inputs block and key lengths in bytes with the legal values being 
++// 16, 24 and 32.
++
++/*
++ * Modified by Jari Ruusu,  May 1 2001
++ *  - Fixed some compile warnings, code was ok but gcc warned anyway.
++ *  - Changed basic types: byte -> unsigned char, word -> u_int32_t
++ *  - Major name space cleanup: Names visible to outside now begin
++ *    with "aes_" or "AES_". A lot of stuff moved from aes.h to aes.c
++ *  - Removed C++ and DLL support as part of name space cleanup.
++ *  - Eliminated unnecessary recomputation of tables. (actual bug fix)
++ *  - Merged precomputed constant tables to aes.c file.
++ *  - Removed data alignment restrictions for portability reasons.
++ *  - Made block and key lengths accept bit count (128/192/256)
++ *    as well byte count (16/24/32).
++ *  - Removed all error checks. This change also eliminated the need
++ *    to preinitialize the context struct to zero.
++ *  - Removed some totally unused constants.
++ */
++
++#ifndef _AES_H
++#define _AES_H
++
++#if defined(__linux__) && defined(__KERNEL__)
++#  include <linux/types.h>
++#else 
++#  include <sys/types.h>
++#endif
++
++// CONFIGURATION OPTIONS (see also aes.c)
++//
++// Define AES_BLOCK_SIZE to set the cipher block size (16, 24 or 32) or
++// leave this undefined for dynamically variable block size (this will
++// result in much slower code).
++// IMPORTANT NOTE: AES_BLOCK_SIZE is in BYTES (16, 24, 32 or undefined). If
++// left undefined a slower version providing variable block length is compiled
++
++#define AES_BLOCK_SIZE  16
++
++// The number of key schedule words for different block and key lengths
++// allowing for method of computation which requires the length to be a
++// multiple of the key length
++//
++// Nk =       4   6   8
++//        -------------
++// Nb = 4 |  60  60  64
++//      6 |  96  90  96
++//      8 | 120 120 120
++
++#if !defined(AES_BLOCK_SIZE) || (AES_BLOCK_SIZE == 32)
++#define AES_KS_LENGTH   120
++#define AES_RC_LENGTH    29
++#else
++#define AES_KS_LENGTH   4 * AES_BLOCK_SIZE
++#define AES_RC_LENGTH   (9 * AES_BLOCK_SIZE) / 8 - 8
++#endif
++
++typedef struct
++{
++    u_int32_t    aes_Nkey;      // the number of words in the key input block
++    u_int32_t    aes_Nrnd;      // the number of cipher rounds
++    u_int32_t    aes_e_key[AES_KS_LENGTH];   // the encryption key schedule
++    u_int32_t    aes_d_key[AES_KS_LENGTH];   // the decryption key schedule
++#if !defined(AES_BLOCK_SIZE)
++    u_int32_t    aes_Ncol;      // the number of columns in the cipher state
++#endif
++} aes_context;
++
++// THE CIPHER INTERFACE
++
++#if !defined(AES_BLOCK_SIZE)
++extern void aes_set_blk(aes_context *, const int);
++#endif
++extern void aes_set_key(aes_context *, const unsigned char [], const int, const int);
++extern void aes_encrypt(const aes_context *, const unsigned char [], unsigned char []);
++extern void aes_decrypt(const aes_context *, const unsigned char [], unsigned char []);
++
++// The block length inputs to aes_set_block and aes_set_key are in numbers
++// of bytes or bits.  The calls to subroutines must be made in the above
++// order but multiple calls can be made without repeating earlier calls
++// if their parameters have not changed.
++
++#endif  // _AES_H
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/klips-crypto/aes_cbc.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,4 @@
++/* Glue header */
++#include "aes.h"
++int AES_set_key(aes_context *aes_ctx, const u_int8_t * key, int keysize);
++int AES_cbc_encrypt(aes_context *ctx, const u_int8_t * in, u_int8_t * out, int ilen, const u_int8_t * iv, int encrypt);
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/klips-crypto/aes_xcbc_mac.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,12 @@
++#ifndef _AES_XCBC_MAC_H
++#define _AES_XCBC_MAC_H
++
++typedef u_int32_t aes_block[4];
++typedef struct {
++      aes_context ctx_k1;
++      aes_block k2;
++      aes_block k3;
++} aes_context_mac;
++int AES_xcbc_mac_set_key(aes_context_mac *ctxm, const u_int8_t *key, int keylen);
++int AES_xcbc_mac_hash(const aes_context_mac *ctxm, const u_int8_t * in, int ilen, u_int8_t hash[16]);
++#endif /* _AES_XCBC_MAC_H */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/klips-crypto/cbc_generic.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,110 @@
++#ifndef _CBC_GENERIC_H
++#define _CBC_GENERIC_H
++/*
++ * CBC macro helpers
++ *
++ * Author: JuanJo Ciarlante <jjo-ipsec@mendoza.gov.ar>
++ *
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ */
++
++/*
++ *    Heavily inspired in loop_AES
++ */
++#define CBC_IMPL_BLK16(name, ctx_type, addr_type, enc_func, dec_func) \
++int name(ctx_type *ctx, const u_int8_t * in, u_int8_t * out, int ilen, const u_int8_t * iv, int encrypt) { \
++      int ret=ilen, pos; \
++      const u_int32_t *iv_i; \
++      if ((ilen) % 16) return 0; \
++      if (encrypt) { \
++              pos=0; \
++              while(pos<ilen) { \
++                      if (pos==0) \
++                              iv_i=(const u_int32_t*) iv; \
++                      else \
++                              iv_i=(const u_int32_t*) (out-16); \
++                      *((u_int32_t *)(&out[ 0])) = iv_i[0]^*((const u_int32_t *)(&in[ 0])); \
++                      *((u_int32_t *)(&out[ 4])) = iv_i[1]^*((const u_int32_t *)(&in[ 4])); \
++                      *((u_int32_t *)(&out[ 8])) = iv_i[2]^*((const u_int32_t *)(&in[ 8])); \
++                      *((u_int32_t *)(&out[12])) = iv_i[3]^*((const u_int32_t *)(&in[12])); \
++                      enc_func(ctx, (addr_type) out, (addr_type) out); \
++                      in+=16; \
++                      out+=16; \
++                      pos+=16; \
++              } \
++      } else { \
++              pos=ilen-16; \
++              in+=pos; \
++              out+=pos; \
++              while(pos>=0) { \
++                      dec_func(ctx, (const addr_type) in, (addr_type) out); \
++                      if (pos==0) \
++                              iv_i=(const u_int32_t*) (iv); \
++                      else \
++                              iv_i=(const u_int32_t*) (in-16); \
++                      *((u_int32_t *)(&out[ 0])) ^= iv_i[0]; \
++                      *((u_int32_t *)(&out[ 4])) ^= iv_i[1]; \
++                      *((u_int32_t *)(&out[ 8])) ^= iv_i[2]; \
++                      *((u_int32_t *)(&out[12])) ^= iv_i[3]; \
++                      in-=16; \
++                      out-=16; \
++                      pos-=16; \
++              } \
++      } \
++      return ret; \
++} 
++#define CBC_IMPL_BLK8(name, ctx_type, addr_type,  enc_func, dec_func) \
++int name(ctx_type *ctx, u_int8_t * in, u_int8_t * out, int ilen, const u_int8_t * iv, int encrypt) { \
++      int ret=ilen, pos; \
++      const u_int32_t *iv_i; \
++      if ((ilen) % 8) return 0; \
++      if (encrypt) { \
++              pos=0; \
++              while(pos<ilen) { \
++                      if (pos==0) \
++                              iv_i=(const u_int32_t*) iv; \
++                      else \
++                              iv_i=(const u_int32_t*) (out-8); \
++                      *((u_int32_t *)(&out[ 0])) = iv_i[0]^*((const u_int32_t *)(&in[ 0])); \
++                      *((u_int32_t *)(&out[ 4])) = iv_i[1]^*((const u_int32_t *)(&in[ 4])); \
++                      enc_func(ctx, (addr_type)out, (addr_type)out); \
++                      in+=8; \
++                      out+=8; \
++                      pos+=8; \
++              } \
++      } else { \
++              pos=ilen-8; \
++              in+=pos; \
++              out+=pos; \
++              while(pos>=0) { \
++                      dec_func(ctx, (const addr_type)in, (addr_type)out); \
++                      if (pos==0) \
++                              iv_i=(const u_int32_t*) (iv); \
++                      else \
++                              iv_i=(const u_int32_t*) (in-8); \
++                      *((u_int32_t *)(&out[ 0])) ^= iv_i[0]; \
++                      *((u_int32_t *)(&out[ 4])) ^= iv_i[1]; \
++                      in-=8; \
++                      out-=8; \
++                      pos-=8; \
++              } \
++      } \
++      return ret; \
++} 
++#define CBC_DECL(name, ctx_type) \
++int name(ctx_type *ctx, u_int8_t * in, u_int8_t * out, int ilen, const u_int8_t * iv, int encrypt)
++/*
++Eg.:
++CBC_IMPL_BLK16(AES_cbc_encrypt, aes_context, u_int8_t *, aes_encrypt, aes_decrypt);
++CBC_DECL(AES_cbc_encrypt, aes_context);
++*/
++#endif /* _CBC_GENERIC_H */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/klips-crypto/des.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,286 @@
++/* crypto/des/des.org */
++/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
++ * All rights reserved.
++ *
++ * This package is an SSL implementation written
++ * by Eric Young (eay@cryptsoft.com).
++ * The implementation was written so as to conform with Netscapes SSL.
++ * 
++ * This library is free for commercial and non-commercial use as long as
++ * the following conditions are aheared to.  The following conditions
++ * apply to all code found in this distribution, be it the RC4, RSA,
++ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
++ * included with this distribution is covered by the same copyright terms
++ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
++ * 
++ * Copyright remains Eric Young's, and as such any Copyright notices in
++ * the code are not to be removed.
++ * If this package is used in a product, Eric Young should be given attribution
++ * as the author of the parts of the library used.
++ * This can be in the form of a textual message at program startup or
++ * in documentation (online or textual) provided with the package.
++ * 
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. All advertising materials mentioning features or use of this software
++ *    must display the following acknowledgement:
++ *    "This product includes cryptographic software written by
++ *     Eric Young (eay@cryptsoft.com)"
++ *    The word 'cryptographic' can be left out if the rouines from the library
++ *    being used are not cryptographic related :-).
++ * 4. If you include any Windows specific code (or a derivative thereof) from 
++ *    the apps directory (application code) you must include an acknowledgement:
++ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
++ * 
++ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ * 
++ * The licence and distribution terms for any publically available version or
++ * derivative of this code cannot be changed.  i.e. this code cannot simply be
++ * copied and put under another distribution licence
++ * [including the GNU Public Licence.]
++ */
++
++/* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING 
++ *
++ * Always modify des.org since des.h is automatically generated from
++ * it during SSLeay configuration.
++ *
++ * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
++ */
++
++#ifndef HEADER_DES_H
++#define HEADER_DES_H
++
++#ifdef  __cplusplus
++extern "C" {
++#endif
++
++
++/* If this is set to 'unsigned int' on a DEC Alpha, this gives about a
++ * %20 speed up (longs are 8 bytes, int's are 4). */
++/* Must be unsigned int on ia64/Itanium or DES breaks badly */
++
++#ifdef __KERNEL__
++#include <linux/types.h>
++#else
++#include <sys/types.h>
++#endif
++
++#ifndef DES_LONG
++#define DES_LONG u_int32_t
++#endif
++
++typedef unsigned char des_cblock[8];
++typedef struct { des_cblock ks; } des_key_schedule[16];
++
++#define DES_KEY_SZ    (sizeof(des_cblock))
++#define DES_SCHEDULE_SZ (sizeof(des_key_schedule))
++
++#define DES_ENCRYPT   1
++#define DES_DECRYPT   0
++
++#define DES_CBC_MODE  0
++#define DES_PCBC_MODE 1
++
++#define des_ecb2_encrypt(i,o,k1,k2,e) \
++      des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e))
++
++#define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \
++      des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e))
++
++#define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \
++      des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e))
++
++#define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \
++      des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n))
++
++#define C_Block des_cblock
++#define Key_schedule des_key_schedule
++#ifdef KERBEROS
++#define ENCRYPT DES_ENCRYPT
++#define DECRYPT DES_DECRYPT
++#endif
++#define KEY_SZ DES_KEY_SZ
++#define string_to_key des_string_to_key
++#define read_pw_string des_read_pw_string
++#define random_key des_random_key
++#define pcbc_encrypt des_pcbc_encrypt
++#define set_key des_set_key
++#define key_sched des_key_sched
++#define ecb_encrypt des_ecb_encrypt
++#define cbc_encrypt des_cbc_encrypt
++#define ncbc_encrypt des_ncbc_encrypt
++#define xcbc_encrypt des_xcbc_encrypt
++#define cbc_cksum des_cbc_cksum
++#define quad_cksum des_quad_cksum
++
++/* For compatibility with the MIT lib - eay 20/05/92 */
++typedef des_key_schedule bit_64;
++#define des_fixup_key_parity des_set_odd_parity
++#define des_check_key_parity check_parity
++
++extern int des_check_key;     /* defaults to false */
++extern int des_rw_mode;               /* defaults to DES_PCBC_MODE */
++
++/* The next line is used to disable full ANSI prototypes, if your
++ * compiler has problems with the prototypes, make sure this line always
++ * evaluates to true :-) */
++#if defined(MSDOS) || defined(__STDC__)
++#undef NOPROTO
++#endif
++#ifndef NOPROTO
++char *des_options(void);
++void des_ecb3_encrypt(des_cblock *input,des_cblock *output,
++      des_key_schedule ks1,des_key_schedule ks2,
++      des_key_schedule ks3, int enc);
++DES_LONG des_cbc_cksum(des_cblock *input,des_cblock *output,
++      long length,des_key_schedule schedule,des_cblock *ivec);
++void des_cbc_encrypt(des_cblock *input,des_cblock *output,long length,
++      des_key_schedule schedule,des_cblock *ivec,int enc);
++void des_ncbc_encrypt(des_cblock *input,des_cblock *output,long length,
++      des_key_schedule schedule,des_cblock *ivec,int enc);
++void des_xcbc_encrypt(des_cblock *input,des_cblock *output,long length,
++      des_key_schedule schedule,des_cblock *ivec,
++      des_cblock *inw,des_cblock *outw,int enc);
++void des_cfb_encrypt(unsigned char *in,unsigned char *out,int numbits,
++      long length,des_key_schedule schedule,des_cblock *ivec,int enc);
++void des_ecb_encrypt(des_cblock *input,des_cblock *output,
++      des_key_schedule ks,int enc);
++void des_encrypt(DES_LONG *data,des_key_schedule ks, int enc);
++void des_encrypt2(DES_LONG *data,des_key_schedule ks, int enc);
++void des_encrypt3(DES_LONG *data, des_key_schedule ks1,
++      des_key_schedule ks2, des_key_schedule ks3);
++void des_decrypt3(DES_LONG *data, des_key_schedule ks1,
++      des_key_schedule ks2, des_key_schedule ks3);
++void des_ede3_cbc_encrypt(des_cblock *input, des_cblock *output, 
++      long length, des_key_schedule ks1, des_key_schedule ks2, 
++      des_key_schedule ks3, des_cblock *ivec, int enc);
++void des_ede3_cfb64_encrypt(unsigned char *in, unsigned char *out,
++      long length, des_key_schedule ks1, des_key_schedule ks2,
++      des_key_schedule ks3, des_cblock *ivec, int *num, int enc);
++void des_ede3_ofb64_encrypt(unsigned char *in, unsigned char *out,
++      long length, des_key_schedule ks1, des_key_schedule ks2,
++      des_key_schedule ks3, des_cblock *ivec, int *num);
++
++void des_xwhite_in2out(des_cblock (*des_key), des_cblock (*in_white),
++      des_cblock (*out_white));
++
++int des_enc_read(int fd,char *buf,int len,des_key_schedule sched,
++      des_cblock *iv);
++int des_enc_write(int fd,char *buf,int len,des_key_schedule sched,
++      des_cblock *iv);
++char *des_fcrypt(const char *buf,const char *salt, char *ret);
++
++void des_ofb_encrypt(unsigned char *in,unsigned char *out,
++      int numbits,long length,des_key_schedule schedule,des_cblock *ivec);
++void des_pcbc_encrypt(des_cblock *input,des_cblock *output,long length,
++      des_key_schedule schedule,des_cblock *ivec,int enc);
++DES_LONG des_quad_cksum(des_cblock *input,des_cblock *output,
++      long length,int out_count,des_cblock *seed);
++void des_random_seed(des_cblock key);
++void des_random_key(des_cblock ret);
++int des_read_password(des_cblock *key,char *prompt,int verify);
++int des_read_2passwords(des_cblock *key1,des_cblock *key2,
++      char *prompt,int verify);
++int des_read_pw_string(char *buf,int length,char *prompt,int verify);
++void des_set_odd_parity(des_cblock *key);
++int des_is_weak_key(des_cblock *key);
++int des_set_key(des_cblock *key,des_key_schedule schedule);
++int des_key_sched(des_cblock *key,des_key_schedule schedule);
++void des_string_to_key(char *str,des_cblock *key);
++void des_string_to_2keys(char *str,des_cblock *key1,des_cblock *key2);
++void des_cfb64_encrypt(unsigned char *in, unsigned char *out, long length,
++      des_key_schedule schedule, des_cblock *ivec, int *num, int enc);
++void des_ofb64_encrypt(unsigned char *in, unsigned char *out, long length,
++      des_key_schedule schedule, des_cblock *ivec, int *num);
++int des_read_pw(char *buf, char *buff, int size, char *prompt, int verify);
++
++/* Extra functions from Mark Murray <mark@grondar.za> */
++/* The following functions are not in the normal unix build or the
++ * SSLeay build.  When using the SSLeay build, use RAND_seed()
++ * and RAND_bytes() instead. */
++int des_new_random_key(des_cblock *key);
++void des_init_random_number_generator(des_cblock *key);
++void des_set_random_generator_seed(des_cblock *key);
++void des_set_sequence_number(des_cblock new_sequence_number);
++void des_generate_random_block(des_cblock *block);
++
++#else
++
++char *des_options();
++void des_ecb3_encrypt();
++DES_LONG des_cbc_cksum();
++void des_cbc_encrypt();
++void des_ncbc_encrypt();
++void des_xcbc_encrypt();
++void des_cfb_encrypt();
++void des_ede3_cfb64_encrypt();
++void des_ede3_ofb64_encrypt();
++void des_ecb_encrypt();
++void des_encrypt();
++void des_encrypt2();
++void des_encrypt3();
++void des_decrypt3();
++void des_ede3_cbc_encrypt();
++int des_enc_read();
++int des_enc_write();
++char *des_fcrypt();
++#ifdef PERL5
++char *des_crypt();
++#else
++char *crypt();
++#endif
++void des_ofb_encrypt();
++void des_pcbc_encrypt();
++DES_LONG des_quad_cksum();
++void des_random_seed();
++void des_random_key();
++int des_read_password();
++int des_read_2passwords();
++int des_read_pw_string();
++void des_set_odd_parity();
++int des_is_weak_key();
++int des_set_key();
++int des_key_sched();
++void des_string_to_key();
++void des_string_to_2keys();
++void des_cfb64_encrypt();
++void des_ofb64_encrypt();
++int des_read_pw();
++void des_xwhite_in2out();
++
++/* Extra functions from Mark Murray <mark@grondar.za> */
++/* The following functions are not in the normal unix build or the
++ * SSLeay build.  When using the SSLeay build, use RAND_seed()
++ * and RAND_bytes() instead. */
++#ifdef FreeBSD
++int des_new_random_key();
++void des_init_random_number_generator();
++void des_set_random_generator_seed();
++void des_set_sequence_number();
++void des_generate_random_block();
++#endif
++
++#endif
++
++#ifdef  __cplusplus
++}
++#endif
++
++#endif
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/klips-crypto/ocf_assist.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,63 @@
++#ifndef _OCF_ASSIST_H
++#define _OCF_ASSIST_H 1
++/****************************************************************************/
++/* The various hw_assist functions return these bits */
++
++#define OCF_PROVIDES_AES              0x0001
++#define OCF_PROVIDES_DES_3DES 0x0002
++
++/****************************************************************************/
++#if !defined(OCF_ASSIST)
++/****************************************************************************/
++/*
++ *    stub it all out just in case
++ */
++
++#define ocf_aes_assist() (0)
++#define ocf_aes_set_key(a1,a2,a3,a4) 
++#define ocf_aes_cbc_encrypt(a1,a2,a3,a4,a5,a6)
++
++#define ocf_des_assist() (0)
++#define ocf_des_set_key(a, b)
++#define ocf_des_cbc_encrypt(a1,a2,a3,a4,a5,a6)
++#define ocf_des_encrypt(a1,a2,a3)
++#define ocf_des_ede3_cbc_encrypt(a1,a2,a3,a4,a5,a6,a7,a8)
++#define ocf_des_ncbc_encrypt(a1,a2,a3,a4,a5,a6)
++#define ocf_des_ecb_encrypt(a1,a2,a3,a4)
++
++/****************************************************************************/
++#else
++/****************************************************************************/
++
++#include <sys/types.h>
++#include "aes.h"
++#include "des.h"
++
++extern int    ocf_aes_assist(void);
++extern void   ocf_aes_set_key(aes_context *cx, const unsigned char in_key[],
++                                                              int n_bytes, const int f);
++extern int    ocf_aes_cbc_encrypt(aes_context *ctx, const u_int8_t *input,
++                                  u_int8_t *output,
++                                  long length,
++                                  const u_int8_t *ivec, int enc);
++
++extern int    ocf_des_assist(void);
++extern int    ocf_des_set_key(des_cblock *key, des_key_schedule schedule);
++extern void   ocf_des_cbc_encrypt(des_cblock *input, des_cblock *output,
++                                                              long length, des_key_schedule schedule,
++                                                              des_cblock *ivec, int enc);
++extern void   ocf_des_encrypt(DES_LONG *data, des_key_schedule ks, int enc);
++extern void   ocf_des_ede3_cbc_encrypt(des_cblock *input, des_cblock *output,
++                                                              long length, des_key_schedule ks1,
++                                                              des_key_schedule ks2, des_key_schedule ks3,
++                                                              des_cblock *ivec, int enc);
++extern void   ocf_des_ncbc_encrypt(des_cblock *input, des_cblock *output,
++                                                              long length, des_key_schedule schedule,
++                                                              des_cblock *ivec, int enc);
++extern void   ocf_des_ecb_encrypt(des_cblock *input, des_cblock *output,
++                                                              des_key_schedule ks, int enc);
++
++/****************************************************************************/
++#endif /* !defined(OCF_ASSIST) */
++/****************************************************************************/
++#endif /* _OCF_ASSIST_H */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,569 @@
++#ifndef _OPENSWAN_H
++/*
++ * header file for FreeS/WAN library functions
++ * Copyright (C) 1998, 1999, 2000  Henry Spencer.
++ * Copyright (C) 1999, 2000, 2001  Richard Guy Briggs
++ * 
++ * This library is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU Library General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.  See <http://www.fsf.org/copyleft/lgpl.txt>.
++ * 
++ * This library 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 Library General Public
++ * License for more details.
++ *
++ * RCSID $Id: openswan.h,v 1.95 2005/08/25 01:24:40 paul Exp $
++ */
++#define       _OPENSWAN_H     /* seen it, no need to see it again */
++
++/* you'd think this should be builtin to compiler... */
++#ifndef TRUE
++#define TRUE 1
++#endif
++
++#ifndef FALSE
++#define FALSE 0
++#endif
++
++/*
++ * When using uclibc, malloc(0) returns NULL instead of success. This is
++ * to make it use the inbuilt work-around.
++ * See: http://osdir.com/ml/network.freeswan.devel/2003-11/msg00009.html
++ */
++#ifdef __UCLIBC__
++# if !defined(__MALLOC_GLIBC_COMPAT__) && !defined(MALLOC_GLIBC_COMPAT)
++#  warning Please compile uclibc with GLIBC_COMPATIBILITY defined
++# endif
++#endif
++
++
++/*
++ * We've just got to have some datatypes defined...  And annoyingly, just
++ * where we get them depends on whether we're in userland or not.
++ */
++/* things that need to come from one place or the other, depending */
++#if defined(linux) 
++#if defined(__KERNEL__)
++#include <linux/types.h>
++#include <linux/socket.h>
++#include <linux/in.h>
++#include <linux/in6.h>
++#include <linux/string.h>
++#include <linux/ctype.h>
++#include <openswan/ipsec_kversion.h>
++#include <openswan/ipsec_param.h>
++#define user_assert(foo)  /*nothing*/
++
++#else /* NOT in kernel */
++#include <sys/types.h>
++#include <netinet/in.h>
++#include <string.h>
++#include <ctype.h>
++#include <assert.h>
++#define user_assert(foo) assert(foo)
++#include <stdio.h>
++
++#  define uint8_t u_int8_t
++#  define uint16_t u_int16_t 
++#  define uint32_t u_int32_t 
++#  define uint64_t u_int64_t 
++
++
++
++#endif /* __KERNEL__ */
++
++#endif /* linux */
++
++#define DEBUG_NO_STATIC static
++
++/*
++ * Yes Virginia, we have started a windows port.
++ */
++#if defined(__CYGWIN32__)
++#if !defined(WIN32_KERNEL) 
++/* get windows equivalents */
++#include <stdio.h>
++#include <string.h>
++#include <win32/types.h>
++#include <netinet/in.h>
++#include <cygwin/socket.h>
++#include <assert.h>
++#define user_assert(foo) assert(foo)
++#endif /* _KERNEL */
++#endif /* WIN32 */
++
++/*
++ * Kovacs? A macosx port?
++ */
++#if defined(macintosh) || (defined(__MACH__) && defined(__APPLE__))
++#include <TargetConditionals.h>
++#include <AvailabilityMacros.h>
++#include <machine/types.h>
++#include <machine/endian.h>
++#include <stdint.h>
++#include <stddef.h>
++#include <stdio.h>
++#include <time.h>
++#include <sys/time.h>
++#include <string.h>
++#include <netinet/in.h>
++#include <arpa/inet.h>
++#include <tcpd.h>
++#include <assert.h>
++#define user_assert(foo) assert(foo)
++#define __u32  unsigned int
++#define __u8  unsigned char
++#define s6_addr16 __u6_addr.__u6_addr16
++#define DEBUG_NO_STATIC static
++#endif
++
++/*
++ * FreeBSD
++ */
++#if defined(__FreeBSD__)
++#  define DEBUG_NO_STATIC static
++#include <sys/types.h>
++#include <netinet/in.h>
++#include <sys/socket.h>
++#include <arpa/inet.h>
++#include <string.h>
++#include <assert.h>
++#define user_assert(foo) assert(foo)
++/* apparently this way to deal with an IPv6 address is not standard. */
++#define s6_addr16 __u6_addr.__u6_addr16
++#endif
++
++
++#ifndef IPPROTO_COMP
++#  define IPPROTO_COMP 108
++#endif /* !IPPROTO_COMP */
++
++#ifndef IPPROTO_INT
++#  define IPPROTO_INT 61
++#endif /* !IPPROTO_INT */
++
++#if !defined(ESPINUDP_WITH_NON_IKE)
++#define ESPINUDP_WITH_NON_IKE   1  /* draft-ietf-ipsec-nat-t-ike-00/01 */
++#define ESPINUDP_WITH_NON_ESP   2  /* draft-ietf-ipsec-nat-t-ike-02    */
++#endif
++
++/*
++ * Basic data types for the address-handling functions.
++ * ip_address and ip_subnet are supposed to be opaque types; do not
++ * use their definitions directly, they are subject to change!
++ */
++
++/* first, some quick fakes in case we're on an old system with no IPv6 */
++#if !defined(s6_addr16) && defined(__CYGWIN32__)
++struct in6_addr {
++      union 
++      {
++              u_int8_t        u6_addr8[16];
++              u_int16_t       u6_addr16[8];
++              u_int32_t       u6_addr32[4];
++      } in6_u;
++#define s6_addr                       in6_u.u6_addr8
++#define s6_addr16             in6_u.u6_addr16
++#define s6_addr32             in6_u.u6_addr32
++};
++struct sockaddr_in6 {
++      unsigned short int      sin6_family;    /* AF_INET6 */
++      __u16                   sin6_port;      /* Transport layer port # */
++      __u32                   sin6_flowinfo;  /* IPv6 flow information */
++      struct in6_addr         sin6_addr;      /* IPv6 address */
++      __u32                   sin6_scope_id;  /* scope id (new in RFC2553) */
++};
++#endif        /* !s6_addr16 */
++
++/* then the main types */
++typedef struct {
++      union {
++              struct sockaddr_in v4;
++              struct sockaddr_in6 v6;
++      } u;
++} ip_address;
++typedef struct {
++      ip_address addr;
++      int maskbits;
++} ip_subnet;
++
++/* and the SA ID stuff */
++#ifdef __KERNEL__
++typedef __u32 ipsec_spi_t;
++#else
++typedef u_int32_t ipsec_spi_t;
++#endif
++typedef struct {              /* to identify an SA, we need: */
++        ip_address dst;               /* A. destination host */
++        ipsec_spi_t spi;      /* B. 32-bit SPI, assigned by dest. host */
++#             define  SPI_PASS        256     /* magic values... */
++#             define  SPI_DROP        257     /* ...for use... */
++#             define  SPI_REJECT      258     /* ...with SA_INT */
++#             define  SPI_HOLD        259
++#             define  SPI_TRAP        260
++#             define  SPI_TRAPSUBNET  261
++      int proto;              /* C. protocol */
++#             define  SA_ESP  50      /* IPPROTO_ESP */
++#             define  SA_AH   51      /* IPPROTO_AH */
++#             define  SA_IPIP 4       /* IPPROTO_IPIP */
++#             define  SA_COMP 108     /* IPPROTO_COMP */
++#             define  SA_INT  61      /* IANA reserved for internal use */
++} ip_said;
++
++/* misc */
++typedef const char *err_t;    /* error message, or NULL for success */
++struct prng {                 /* pseudo-random-number-generator guts */
++      unsigned char sbox[256];
++      int i, j;
++      unsigned long count;
++};
++
++
++/*
++ * definitions for user space, taken from freeswan/ipsec_sa.h
++ */
++typedef uint32_t IPsecSAref_t;
++
++/* Translation to/from nfmark.
++ *
++ * use bits 16-31. Leave bit 32 as a indicate that IPsec processing
++ * has already been done.
++ */
++#define IPSEC_SA_REF_TABLE_IDX_WIDTH 15
++#define IPSEC_SA_REF_TABLE_OFFSET    16
++#define IPSEC_SA_REF_MAASK           ((1<<IPSEC_SA_REF_TABLE_IDX_WIDTH)-1)
++
++#define IPsecSAref2NFmark(x) (((x)&IPSEC_SA_REF_MASK) << IPSEC_SA_REF_TABLE_OFFSET)
++#define NFmark2IPsecSAref(x) (((x) >> IPSEC_SA_REF_TABLE_OFFSET)&IPSEC_SA_REF_MASK)
++
++#define IPSEC_SAREF_NULL ((IPsecSAref_t)0)
++#define IPSEC_SAREF_NA   ((IPsecSAref_t)0xffff0001)
++
++/* GCC magic for use in function definitions! */
++#ifdef GCC_LINT
++# define PRINTF_LIKE(n) __attribute__ ((format(printf, n, n+1)))
++# define NEVER_RETURNS __attribute__ ((noreturn))
++# define UNUSED __attribute__ ((unused))
++# define BLANK_FORMAT " "     /* GCC_LINT whines about empty formats */
++#else
++# define PRINTF_LIKE(n)       /* ignore */
++# define NEVER_RETURNS /* ignore */
++# define UNUSED /* ignore */
++# define BLANK_FORMAT ""
++#endif
++
++
++/*
++ * function to log stuff from libraries that may be used in multiple
++ * places.
++ */
++typedef int (*openswan_keying_debug_func_t)(const char *message, ...);
++
++
++
++/*
++ * new IPv6-compatible functions
++ */
++
++/* text conversions */
++err_t ttoul(const char *src, size_t srclen, int format, unsigned long *dst);
++size_t ultot(unsigned long src, int format, char *buf, size_t buflen);
++#define       ULTOT_BUF       (22+1)  /* holds 64 bits in octal */
++
++/* looks up names in DNS */
++err_t ttoaddr(const char *src, size_t srclen, int af, ip_address *dst);
++
++/* does not look up names in DNS */
++err_t ttoaddr_num(const char *src, size_t srclen, int af, ip_address *dst);
++
++err_t tnatoaddr(const char *src, size_t srclen, int af, ip_address *dst);
++size_t addrtot(const ip_address *src, int format, char *buf, size_t buflen);
++/* RFC 1886 old IPv6 reverse-lookup format is the bulkiest */
++#define       ADDRTOT_BUF     (32*2 + 3 + 1 + 3 + 1 + 1)
++err_t ttosubnet(const char *src, size_t srclen, int af, ip_subnet *dst);
++size_t subnettot(const ip_subnet *src, int format, char *buf, size_t buflen);
++#define       SUBNETTOT_BUF   (ADDRTOT_BUF + 1 + 3)
++size_t subnetporttot(const ip_subnet *src, int format, char *buf, size_t buflen);
++#define       SUBNETPROTOTOT_BUF      (SUBNETTOTO_BUF + ULTOT_BUF)
++err_t ttosa(const char *src, size_t srclen, ip_said *dst);
++size_t satot(const ip_said *src, int format, char *bufptr, size_t buflen);
++#define       SATOT_BUF       (5 + ULTOA_BUF + 1 + ADDRTOT_BUF)
++err_t ttodata(const char *src, size_t srclen, int base, char *buf,
++                                              size_t buflen, size_t *needed);
++err_t ttodatav(const char *src, size_t srclen, int base,
++             char *buf,  size_t buflen, size_t *needed,
++             char *errp, size_t errlen, unsigned int flags);
++#define       TTODATAV_BUF    40      /* ttodatav's largest non-literal message */
++#define TTODATAV_IGNORESPACE  (1<<1)  /* ignore spaces in base64 encodings*/
++#define TTODATAV_SPACECOUNTS  0       /* do not ignore spaces in base64   */
++
++size_t datatot(const unsigned char *src, size_t srclen, int format
++             , char *buf, size_t buflen);
++size_t keyblobtoid(const unsigned char *src, size_t srclen, char *dst,
++                                                              size_t dstlen);
++size_t splitkeytoid(const unsigned char *e, size_t elen, const unsigned char *m,
++                                      size_t mlen, char *dst, size_t dstlen);
++#define       KEYID_BUF       10      /* up to 9 text digits plus NUL */
++err_t ttoprotoport(char *src, size_t src_len, u_int8_t *proto, u_int16_t *port,
++                                                       int *has_port_wildcard);
++
++/* initializations */
++void initsaid(const ip_address *addr, ipsec_spi_t spi, int proto, ip_said *dst);
++err_t loopbackaddr(int af, ip_address *dst);
++err_t unspecaddr(int af, ip_address *dst);
++err_t anyaddr(int af, ip_address *dst);
++err_t initaddr(const unsigned char *src, size_t srclen, int af, ip_address *dst);
++err_t add_port(int af, ip_address *addr, unsigned short port);
++err_t initsubnet(const ip_address *addr, int maskbits, int clash, ip_subnet *dst);
++err_t addrtosubnet(const ip_address *addr, ip_subnet *dst);
++
++/* misc. conversions and related */
++err_t rangetosubnet(const ip_address *from, const ip_address *to, ip_subnet *dst);
++int addrtypeof(const ip_address *src);
++int subnettypeof(const ip_subnet *src);
++size_t addrlenof(const ip_address *src);
++size_t addrbytesptr(const ip_address *src, const unsigned char **dst);
++size_t addrbytesptr_write(ip_address *src, unsigned char **dst);
++size_t addrbytesof(const ip_address *src, unsigned char *dst, size_t dstlen);
++int masktocount(const ip_address *src);
++void networkof(const ip_subnet *src, ip_address *dst);
++void maskof(const ip_subnet *src, ip_address *dst);
++
++/* tests */
++int sameaddr(const ip_address *a, const ip_address *b);
++int addrcmp(const ip_address *a, const ip_address *b);
++int samesubnet(const ip_subnet *a, const ip_subnet *b);
++int addrinsubnet(const ip_address *a, const ip_subnet *s);
++int subnetinsubnet(const ip_subnet *a, const ip_subnet *b);
++int subnetishost(const ip_subnet *s);
++int samesaid(const ip_said *a, const ip_said *b);
++int sameaddrtype(const ip_address *a, const ip_address *b);
++int samesubnettype(const ip_subnet *a, const ip_subnet *b);
++int isvalidsubnet(const ip_subnet *a);
++int isanyaddr(const ip_address *src);
++int isunspecaddr(const ip_address *src);
++int isloopbackaddr(const ip_address *src);
++
++/* low-level grot */
++int portof(const ip_address *src);
++void setportof(int port, ip_address *dst);
++struct sockaddr *sockaddrof(ip_address *src);
++size_t sockaddrlenof(const ip_address *src);
++
++/* PRNG */
++void prng_init(struct prng *prng, const unsigned char *key, size_t keylen);
++void prng_bytes(struct prng *prng, unsigned char *dst, size_t dstlen);
++unsigned long prng_count(struct prng *prng);
++void prng_final(struct prng *prng);
++
++/* odds and ends */
++const char *ipsec_version_code(void);
++const char *ipsec_version_string(void);
++const char **ipsec_copyright_notice(void);
++
++const char *dns_string_rr(int rr, char *buf, int bufsize);
++const char *dns_string_datetime(time_t seconds,
++                              char *buf,
++                              int bufsize);
++
++
++/*
++ * old functions, to be deleted eventually
++ */
++
++/* unsigned long */
++const char *                  /* NULL for success, else string literal */
++atoul(
++      const char *src,
++      size_t srclen,          /* 0 means strlen(src) */
++      int base,               /* 0 means figure it out */
++      unsigned long *resultp
++);
++size_t                                /* space needed for full conversion */
++ultoa(
++      unsigned long n,
++      int base,
++      char *dst,
++      size_t dstlen
++);
++#define       ULTOA_BUF       21      /* just large enough for largest result, */
++                              /* assuming 64-bit unsigned long! */
++
++/* Internet addresses */
++const char *                  /* NULL for success, else string literal */
++atoaddr(
++      const char *src,
++      size_t srclen,          /* 0 means strlen(src) */
++      struct in_addr *addr
++);
++size_t                                /* space needed for full conversion */
++addrtoa(
++      struct in_addr addr,
++      int format,             /* character; 0 means default */
++      char *dst,
++      size_t dstlen
++);
++#define       ADDRTOA_BUF     16      /* just large enough for largest result */
++
++/* subnets */
++const char *                  /* NULL for success, else string literal */
++atosubnet(
++      const char *src,
++      size_t srclen,          /* 0 means strlen(src) */
++      struct in_addr *addr,
++      struct in_addr *mask
++);
++size_t                                /* space needed for full conversion */
++subnettoa(
++      struct in_addr addr,
++      struct in_addr mask,
++      int format,             /* character; 0 means default */
++      char *dst,
++      size_t dstlen
++);
++#define       SUBNETTOA_BUF   32      /* large enough for worst case result */
++
++/* ranges */
++const char *                  /* NULL for success, else string literal */
++atoasr(
++      const char *src,
++      size_t srclen,          /* 0 means strlen(src) */
++      char *type,             /* 'a', 's', 'r' */
++      struct in_addr *addrs   /* two-element array */
++);
++size_t                                /* space needed for full conversion */
++rangetoa(
++      struct in_addr *addrs,  /* two-element array */
++      int format,             /* character; 0 means default */
++      char *dst,
++      size_t dstlen
++);
++#define       RANGETOA_BUF    34      /* large enough for worst case result */
++
++/* data types for SA conversion functions */
++
++/* generic data, e.g. keys */
++const char *                  /* NULL for success, else string literal */
++atobytes(
++      const char *src,
++      size_t srclen,          /* 0 means strlen(src) */
++      char *dst,
++      size_t dstlen,
++      size_t *lenp            /* NULL means don't bother telling me */
++);
++size_t                                /* 0 failure, else true size */
++bytestoa(
++      const unsigned char *src,
++      size_t srclen,
++      int format,             /* character; 0 means default */
++      char *dst,
++      size_t dstlen
++);
++
++/* old versions of generic-data functions; deprecated */
++size_t                                /* 0 failure, else true size */
++atodata(
++      const char *src,
++      size_t srclen,          /* 0 means strlen(src) */
++      char *dst,
++      size_t dstlen
++);
++size_t                                /* 0 failure, else true size */
++datatoa(
++      const unsigned char *src,
++      size_t srclen,
++      int format,             /* character; 0 means default */
++      char *dst,
++      size_t dstlen
++);
++
++/* part extraction and special addresses */
++struct in_addr
++subnetof(
++      struct in_addr addr,
++      struct in_addr mask
++);
++struct in_addr
++hostof(
++      struct in_addr addr,
++      struct in_addr mask
++);
++struct in_addr
++broadcastof(
++      struct in_addr addr,
++      struct in_addr mask
++);
++
++/* mask handling */
++int
++goodmask(
++      struct in_addr mask
++);
++extern int masktobits(struct in_addr mask);
++extern struct in_addr  bitstomask(int n);
++extern struct in6_addr bitstomask6(int n);
++
++
++
++/*
++ * ENUM of klips debugging values. Not currently used in klips.
++ * debug flag is actually 32 -bits, but only one bit is ever used,
++ * so we can actually pack it all into a single 32-bit word.
++ */
++enum klips_debug_flags {
++    KDF_VERBOSE     = 0,
++    KDF_XMIT        = 1,
++    KDF_NETLINK     = 2, /* obsolete */
++    KDF_XFORM       = 3,
++    KDF_EROUTE      = 4,
++    KDF_SPI         = 5,
++    KDF_RADIJ       = 6,
++    KDF_ESP         = 7,
++    KDF_AH          = 8, /* obsolete */
++    KDF_RCV         = 9,
++    KDF_TUNNEL      = 10,
++    KDF_PFKEY       = 11,
++    KDF_COMP        = 12,
++    KDF_NATT        = 13,
++};
++
++
++/*
++ * Debugging levels for pfkey_lib_debug
++ */
++#define PF_KEY_DEBUG_PARSE_NONE    0
++#define PF_KEY_DEBUG_PARSE_PROBLEM 1
++#define PF_KEY_DEBUG_PARSE_STRUCT  2
++#define PF_KEY_DEBUG_PARSE_FLOW    4
++#define PF_KEY_DEBUG_BUILD         8
++#define PF_KEY_DEBUG_PARSE_MAX    15
++
++extern unsigned int pfkey_lib_debug;  /* bits selecting what to report */
++
++/*
++ * pluto and lwdnsq need to know the maximum size of the commands to,
++ * and replies from lwdnsq. 
++ */
++
++#define LWDNSQ_CMDBUF_LEN      1024
++#define LWDNSQ_RESULT_LEN_MAX  4096
++
++
++/* syntax for passthrough SA */
++#ifndef PASSTHROUGHNAME
++#define       PASSTHROUGHNAME "%passthrough"
++#define       PASSTHROUGH4NAME        "%passthrough4"
++#define       PASSTHROUGH6NAME        "%passthrough6"
++#define       PASSTHROUGHIS   "tun0@0.0.0.0"
++#define       PASSTHROUGH4IS  "tun0@0.0.0.0"
++#define       PASSTHROUGH6IS  "tun0@::"
++#define       PASSTHROUGHTYPE "tun"
++#define       PASSTHROUGHSPI  0
++#define       PASSTHROUGHDST  0
++#endif
++
++
++
++#endif /* _OPENSWAN_H */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipcomp.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,58 @@
++/*
++ * IPCOMP zlib interface code.
++ * Copyright (C) 2000  Svenning Soerensen <svenning@post5.tele.dk>
++ * Copyright (C) 2000, 2001  Richard Guy Briggs <rgb@conscoop.ottawa.on.ca>
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++
++ RCSID $Id: ipcomp.h,v 1.14 2004/07/10 19:08:41 mcr Exp $
++
++ */
++
++/* SSS */
++
++#ifndef _IPCOMP_H
++#define _IPCOMP_H
++
++/* Prefix all global deflate symbols with "ipcomp_" to avoid collisions with ppp_deflate & ext2comp */
++#ifndef IPCOMP_PREFIX
++#define IPCOMP_PREFIX
++#endif /* IPCOMP_PREFIX */
++
++#ifndef IPPROTO_COMP
++#define IPPROTO_COMP 108
++#endif /* IPPROTO_COMP */
++
++#include "openswan/ipsec_sysctl.h"
++
++struct ipcomphdr {                    /* IPCOMP header */
++    __u8    ipcomp_nh;                /* Next header (protocol) */
++    __u8    ipcomp_flags;     /* Reserved, must be 0 */
++    __u16   ipcomp_cpi;               /* Compression Parameter Index */
++};
++
++extern struct inet_protocol comp_protocol;
++
++#define IPCOMP_UNCOMPRESSABLE     0x000000001
++#define IPCOMP_COMPRESSIONERROR   0x000000002
++#define IPCOMP_PARMERROR          0x000000004
++#define IPCOMP_DECOMPRESSIONERROR 0x000000008
++
++#define IPCOMP_ADAPT_INITIAL_TRIES    8
++#define IPCOMP_ADAPT_INITIAL_SKIP     4
++#define IPCOMP_ADAPT_SUBSEQ_TRIES     2
++#define IPCOMP_ADAPT_SUBSEQ_SKIP      8
++
++/* Function prototypes */
++struct sk_buff *skb_compress(struct sk_buff *skb, struct ipsec_sa *ips, unsigned int *flags);
++struct sk_buff *skb_decompress(struct sk_buff *skb, struct ipsec_sa *ips, unsigned int *flags);
++
++#endif /* _IPCOMP_H */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_ah.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,201 @@
++/*
++ * Authentication Header declarations
++ * Copyright (C) 1996, 1997  John Ioannidis.
++ * Copyright (C) 1998, 1999, 2000, 2001  Richard Guy Briggs.
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_ah.h,v 1.26 2004/09/13 02:22:10 mcr Exp $
++ */
++
++#include "ipsec_md5h.h"
++#include "ipsec_sha1.h"
++
++#ifndef IPPROTO_AH
++#define IPPROTO_AH 51
++#endif /* IPPROTO_AH */
++
++#include "ipsec_auth.h"
++
++#ifdef __KERNEL__
++
++#ifndef CONFIG_XFRM_ALTERNATE_STACK
++extern struct inet_protocol ah_protocol;
++#endif /* CONFIG_XFRM_ALTERNATE_STACK */
++
++struct options;
++
++struct ahhdr                          /* Generic AH header */
++{
++      __u8    ah_nh;                  /* Next header (protocol) */
++      __u8    ah_hl;                  /* AH length, in 32-bit words */
++      __u16   ah_rv;                  /* reserved, must be 0 */
++      __u32   ah_spi;                 /* Security Parameters Index */
++        __u32   ah_rpl;                 /* Replay prevention */
++      __u8    ah_data[AHHMAC_HASHLEN];/* Authentication hash */
++};
++#define AH_BASIC_LEN 8      /* basic AH header is 8 bytes, nh,hl,rv,spi
++                           * and the ah_hl, says how many bytes after that
++                           * to cover. */
++
++extern struct xform_functions ah_xform_funcs[];
++
++#include "openswan/ipsec_sysctl.h"
++
++#endif /* __KERNEL__ */
++
++/*
++ * $Log: ipsec_ah.h,v $
++ * Revision 1.26  2004/09/13 02:22:10  mcr
++ *    #define inet_protocol if necessary.
++ *
++ * Revision 1.25  2004/09/06 18:35:41  mcr
++ *    2.6.8.1 gets rid of inet_protocol->net_protocol compatibility,
++ *    so adjust for that.
++ *
++ * Revision 1.24  2004/07/10 19:08:41  mcr
++ *    CONFIG_IPSEC -> CONFIG_KLIPS.
++ *
++ * Revision 1.23  2004/04/05 19:55:04  mcr
++ * Moved from linux/include/freeswan/ipsec_ah.h,v
++ *
++ * Revision 1.22  2004/04/05 19:41:05  mcr
++ *    merged alg-branch code.
++ *
++ * Revision 1.21  2003/12/13 19:10:16  mcr
++ *    refactored rcv and xmit code - same as FS 2.05.
++ *
++ * Revision 1.22  2003/12/11 20:14:58  mcr
++ *    refactored the xmit code, to move all encapsulation
++ *    code into protocol functions. Note that all functions
++ *    are essentially done by a single function, which is probably
++ *    wrong.
++ *    the rcv_functions structures are renamed xform_functions.
++ *
++ * Revision 1.21  2003/12/06 21:21:19  mcr
++ *    split up receive path into per-transform files, for
++ *    easier later removal.
++ *
++ * Revision 1.20.8.1  2003/12/22 15:25:52  jjo
++ *      Merged algo-0.8.1-rc11-test1 into alg-branch
++ *
++ * Revision 1.20  2003/02/06 02:21:34  rgb
++ *
++ * Moved "struct auth_alg" from ipsec_rcv.c to ipsec_ah.h .
++ * Changed "struct ah" to "struct ahhdr" and "struct esp" to "struct esphdr".
++ * Removed "#ifdef INBOUND_POLICY_CHECK_eroute" dead code.
++ *
++ * Revision 1.19  2002/09/16 21:19:13  mcr
++ *    fixes for west-ah-icmp-01 - length of AH header must be
++ *    calculated properly, and next_header field properly copied.
++ *
++ * Revision 1.18  2002/05/14 02:37:02  rgb
++ * Change reference from _TDB to _IPSA.
++ *
++ * Revision 1.17  2002/04/24 07:36:46  mcr
++ * Moved from ./klips/net/ipsec/ipsec_ah.h,v
++ *
++ * Revision 1.16  2002/02/20 01:27:06  rgb
++ * Ditched a pile of structs only used by the old Netlink interface.
++ *
++ * Revision 1.15  2001/12/11 02:35:57  rgb
++ * Change "struct net_device" to "struct device" for 2.2 compatibility.
++ *
++ * Revision 1.14  2001/11/26 09:23:47  rgb
++ * Merge MCR's ipsec_sa, eroute, proc and struct lifetime changes.
++ *
++ * Revision 1.13.2.1  2001/09/25 02:18:24  mcr
++ *    replace "struct device" with "struct netdevice"
++ *
++ * Revision 1.13  2001/06/14 19:35:08  rgb
++ * Update copyright date.
++ *
++ * Revision 1.12  2000/09/12 03:21:20  rgb
++ * Cleared out unused htonq.
++ *
++ * Revision 1.11  2000/09/08 19:12:55  rgb
++ * Change references from DEBUG_IPSEC to CONFIG_IPSEC_DEBUG.
++ *
++ * Revision 1.10  2000/01/21 06:13:10  rgb
++ * Tidied up spacing.
++ * Added macros for HMAC padding magic numbers.(kravietz)
++ *
++ * Revision 1.9  1999/12/07 18:16:23  rgb
++ * Fixed comments at end of #endif lines.
++ *
++ * Revision 1.8  1999/04/11 00:28:56  henry
++ * GPL boilerplate
++ *
++ * Revision 1.7  1999/04/06 04:54:25  rgb
++ * Fix/Add RCSID Id: and Log: bits to make PHMDs happy.  This includes
++ * patch shell fixes.
++ *
++ * Revision 1.6  1999/01/26 02:06:01  rgb
++ * Removed CONFIG_IPSEC_ALGO_SWITCH macro.
++ *
++ * Revision 1.5  1999/01/22 06:17:49  rgb
++ * Updated macro comments.
++ * Added context types to support algorithm switch code.
++ * 64-bit clean-up -- converting 'u long long' to __u64.
++ *
++ * Revision 1.4  1998/07/14 15:54:56  rgb
++ * Add #ifdef __KERNEL__ to protect kernel-only structures.
++ *
++ * Revision 1.3  1998/06/30 18:05:16  rgb
++ * Comment out references to htonq.
++ *
++ * Revision 1.2  1998/06/25 19:33:46  rgb
++ * Add prototype for protocol receive function.
++ * Rearrange for more logical layout.
++ *
++ * Revision 1.1  1998/06/18 21:27:43  henry
++ * move sources from klips/src to klips/net/ipsec, to keep stupid
++ * kernel-build scripts happier in the presence of symlinks
++ *
++ * Revision 1.4  1998/05/18 22:28:43  rgb
++ * Disable key printing facilities from /proc/net/ipsec_*.
++ *
++ * Revision 1.3  1998/04/21 21:29:07  rgb
++ * Rearrange debug switches to change on the fly debug output from user
++ * space.  Only kernel changes checked in at this time.  radij.c was also
++ * changed to temporarily remove buggy debugging code in rj_delete causing
++ * an OOPS and hence, netlink device open errors.
++ *
++ * Revision 1.2  1998/04/12 22:03:17  rgb
++ * Updated ESP-3DES-HMAC-MD5-96,
++ *    ESP-DES-HMAC-MD5-96,
++ *    AH-HMAC-MD5-96,
++ *    AH-HMAC-SHA1-96 since Henry started freeswan cvs repository
++ * from old standards (RFC182[5-9] to new (as of March 1998) drafts.
++ *
++ * Fixed eroute references in /proc/net/ipsec*.
++ *
++ * Started to patch module unloading memory leaks in ipsec_netlink and
++ * radij tree unloading.
++ *
++ * Revision 1.1  1998/04/09 03:05:55  henry
++ * sources moved up from linux/net/ipsec
++ *
++ * Revision 1.1.1.1  1998/04/08 05:35:02  henry
++ * RGB's ipsec-0.8pre2.tar.gz ipsec-0.8
++ *
++ * Revision 0.4  1997/01/15 01:28:15  ji
++ * Added definitions for new AH transforms.
++ *
++ * Revision 0.3  1996/11/20 14:35:48  ji
++ * Minor Cleanup.
++ * Rationalized debugging code.
++ *
++ * Revision 0.2  1996/11/02 00:18:33  ji
++ * First limited release.
++ *
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_alg.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,248 @@
++/*
++ * Modular extensions service and registration functions interface
++ *
++ * Author: JuanJo Ciarlante <jjo-ipsec@mendoza.gov.ar>
++ *
++ * ipsec_alg.h,v 1.1.2.1 2003/11/21 18:12:23 jjo Exp
++ *
++ */
++/*
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ */
++#ifndef IPSEC_ALG_H
++#define IPSEC_ALG_H
++
++/* 
++ *   gcc >= 3.2 has removed __FUNCTION__, replaced by C99 __func__
++ *   *BUT* its a compiler variable.
++ */
++#if (__GNUC__ >= 3)
++#ifndef __FUNCTION__
++#define __FUNCTION__ __func__
++#endif
++#endif
++
++/*    Version 0.8.1-0 */
++#define IPSEC_ALG_VERSION     0x00080100
++
++#include <linux/types.h>
++#include <linux/list.h>
++#include <asm/atomic.h>
++#include <openswan/pfkey.h>
++
++/*    
++ *    The following structs are used via pointers in ipsec_alg object to
++ *    avoid ipsec_alg.h coupling with freeswan headers, thus simplifying
++ *    module development
++ */
++struct ipsec_sa;
++struct esp;
++
++/**************************************
++ *
++ *    Main registration object 
++ *
++ *************************************/
++#define IPSEC_ALG_VERSION_QUAD(v)     \
++      (v>>24),((v>>16)&0xff),((v>>8)&0xff),(v&0xff)
++/*    
++ *    Main ipsec_alg objects: "OOPrograming wannabe"
++ *    Hierachy (carefully handled with _minimal_ cast'ing):
++ *
++ *      ipsec_alg+
++ *             +->ipsec_alg_enc  (ixt_alg_type=SADB_EXT_SUPPORTED_ENCRYPT)
++ *             +->ipsec_alg_auth (ixt_alg_type=SADB_EXT_SUPPORTED_AUTH)
++ */
++
++/***************************************************************
++ *
++ *    INTERFACE object: struct ipsec_alg
++ *
++ ***************************************************************/
++
++#define ixt_alg_type ixt_support.ias_exttype
++#define ixt_alg_id   ixt_support.ias_id
++
++#define IPSEC_ALG_ST_SUPP     0x01
++#define IPSEC_ALG_ST_REGISTERED 0x02
++#define IPSEC_ALG_ST_EXCL     0x04
++struct ipsec_alg {
++      unsigned ixt_version;   /* only allow this version (or 'near')*/ \
++      struct list_head ixt_list;      /* dlinked list */ \
++      struct module *ixt_module;      /* THIS_MODULE */ \
++      unsigned ixt_state;             /* state flags */ \
++      atomic_t ixt_refcnt;    /* ref. count when pointed from ipsec_sa */ \
++      char ixt_name[16];      /* descriptive short name, eg. "3des" */ \
++      void *ixt_data;         /* private for algo implementation */ \
++      uint8_t  ixt_blocksize; /* blocksize in bytes */ \
++
++      struct ipsec_alg_supported ixt_support;
++};
++/* 
++ *    Note the const in cbc_encrypt IV arg:
++ *    some ciphers like to toast passed IV (eg. 3DES): make a local IV copy
++ */
++struct ipsec_alg_enc {
++      struct ipsec_alg ixt_common;
++      unsigned ixt_e_keylen;          /* raw key length in bytes          */
++      unsigned ixt_e_ctx_size;        /* sa_p->key_e_size */
++      int (*ixt_e_set_key)(struct ipsec_alg_enc *alg, __u8 *key_e, const __u8 *key, size_t keysize);
++      __u8 *(*ixt_e_new_key)(struct ipsec_alg_enc *alg, const __u8 *key, size_t keysize);
++      void (*ixt_e_destroy_key)(struct ipsec_alg_enc *alg, __u8 *key_e);
++      int (*ixt_e_cbc_encrypt)(struct ipsec_alg_enc *alg, __u8 *key_e, __u8 *in, int ilen, __u8 *iv, int encrypt);
++};
++struct ipsec_alg_auth {
++      struct ipsec_alg ixt_common;
++      unsigned ixt_a_keylen;          /* raw key length in bytes          */
++      unsigned ixt_a_ctx_size;        /* sa_p->key_a_size */
++      unsigned ixt_a_authlen;         /* 'natural' auth. hash len (bytes) */
++      int (*ixt_a_hmac_set_key)(struct ipsec_alg_auth *alg, __u8 *key_a, const __u8 *key, int keylen);
++      int (*ixt_a_hmac_hash)(struct ipsec_alg_auth *alg, __u8 *key_a, const __u8 *dat, int len, __u8 *hash, int hashlen);
++};
++/*    
++ *    These are _copies_ of SADB_EXT_SUPPORTED_{AUTH,ENCRYPT}, 
++ *    to avoid header coupling for true constants
++ *    about headers ... "cp is your friend" --Linus
++ */
++#define IPSEC_ALG_TYPE_AUTH   14
++#define IPSEC_ALG_TYPE_ENCRYPT        15
++
++/***************************************************************
++ *
++ *    INTERFACE for module loading,testing, and unloading
++ *
++ ***************************************************************/
++/*    -  registration calls   */
++int register_ipsec_alg(struct ipsec_alg *);
++int unregister_ipsec_alg(struct ipsec_alg *);
++/*    -  optional (simple test) for algos     */
++int ipsec_alg_test(unsigned alg_type, unsigned alg_id, int testparm);
++/*    inline wrappers (usefull for type validation */
++static inline int register_ipsec_alg_enc(struct ipsec_alg_enc *ixt) {
++      return register_ipsec_alg((struct ipsec_alg*)ixt);
++}
++static inline int unregister_ipsec_alg_enc(struct ipsec_alg_enc *ixt) {
++      return unregister_ipsec_alg((struct ipsec_alg*)ixt);
++}
++static inline int register_ipsec_alg_auth(struct ipsec_alg_auth *ixt) {
++      return register_ipsec_alg((struct ipsec_alg*)ixt);
++}
++static inline int unregister_ipsec_alg_auth(struct ipsec_alg_auth *ixt) {
++      return unregister_ipsec_alg((struct ipsec_alg*)ixt);
++}
++
++/*****************************************************************
++ *
++ *    INTERFACE for ENC services: key creation, encrypt function
++ *
++ *****************************************************************/
++
++#define IPSEC_ALG_ENCRYPT 1
++#define IPSEC_ALG_DECRYPT 0
++
++/*    encryption key context creation function */
++int ipsec_alg_enc_key_create(struct ipsec_sa *sa_p);
++/* 
++ *    ipsec_alg_esp_encrypt(): encrypt ilen bytes in idat returns
++ *    0 or ERR<0
++ */
++int ipsec_alg_esp_encrypt(struct ipsec_sa *sa_p, __u8 *idat, int ilen, __u8 *iv, int action);
++
++/***************************************************************
++ *
++ *    INTERFACE for AUTH services: key creation, hash functions
++ *
++ ***************************************************************/
++int ipsec_alg_auth_key_create(struct ipsec_sa *sa_p);
++int ipsec_alg_sa_esp_hash(const struct ipsec_sa *sa_p, const __u8 *espp, int len, __u8 *hash, int hashlen) ;
++#define ipsec_alg_sa_esp_update(c,k,l) ipsec_alg_sa_esp_hash(c,k,l,NULL,0)
++
++/* only called from ipsec_init.c */
++int ipsec_alg_init(void);
++
++/* algo module glue for static algos */
++void ipsec_alg_static_init(void);
++typedef int (*ipsec_alg_init_func_t) (void);
++
++/**********************************************
++ *
++ *    INTERFACE for ipsec_sa init and wipe
++ *
++ **********************************************/
++
++/* returns true if ipsec_sa has ipsec_alg obj attached */
++/* 
++ * Initializes ipsec_sa's ipsec_alg object, using already loaded
++ * proto, authalg, encalg.; links ipsec_alg objects (enc, auth)
++ */
++int ipsec_alg_sa_init(struct ipsec_sa *sa_p);
++/* 
++ * Destroys ipsec_sa's ipsec_alg object
++ * unlinking ipsec_alg objects
++ */
++int ipsec_alg_sa_wipe(struct ipsec_sa *sa_p);
++
++#define IPSEC_ALG_MODULE_INIT_MOD( func_name )        \
++      static int func_name(void);             \
++      module_init(func_name);                 \
++      static int __init func_name(void)
++#define IPSEC_ALG_MODULE_EXIT_MOD( func_name )        \
++      static void func_name(void);            \
++      module_exit(func_name);                 \
++      static void __exit func_name(void)
++
++#define IPSEC_ALG_MODULE_INIT_STATIC( func_name )     \
++      extern int func_name(void);             \
++      int func_name(void)
++#define IPSEC_ALG_MODULE_EXIT_STATIC( func_name )     \
++      extern void func_name(void);            \
++      void func_name(void)
++
++/**********************************************
++ *
++ *    2.2 backport for some 2.4 useful module stuff
++ *
++ **********************************************/
++#ifdef MODULE
++#ifndef THIS_MODULE
++#define THIS_MODULE          (&__this_module)
++#endif
++#ifndef module_init
++typedef int (*__init_module_func_t)(void);
++typedef void (*__cleanup_module_func_t)(void);
++
++#define module_init(x) \
++        int init_module(void) __attribute__((alias(#x))); \
++        static inline __init_module_func_t __init_module_inline(void) \
++        { return x; }
++#define module_exit(x) \
++        void cleanup_module(void) __attribute__((alias(#x))); \
++        static inline __cleanup_module_func_t __cleanup_module_inline(void) \
++        { return x; }
++#endif
++#define IPSEC_ALG_MODULE_INIT( func_name )    IPSEC_ALG_MODULE_INIT_MOD( func_name )  
++#define IPSEC_ALG_MODULE_EXIT( func_name )    IPSEC_ALG_MODULE_EXIT_MOD( func_name )
++
++#else /* not MODULE */
++#ifndef THIS_MODULE
++#define THIS_MODULE          NULL
++#endif
++/*    
++ *    I only want module_init() magic 
++ *    when algo.c file *is THE MODULE*, in all other
++ *    cases, initialization is called explicitely from ipsec_alg_init()
++ */
++#define IPSEC_ALG_MODULE_INIT( func_name )      IPSEC_ALG_MODULE_INIT_STATIC(func_name)
++#define IPSEC_ALG_MODULE_EXIT( func_name )    IPSEC_ALG_MODULE_EXIT_STATIC(func_name)
++#endif
++
++#endif /* IPSEC_ALG_H */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_alg_3des.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,12 @@
++struct TripleDES_context {
++  des_key_schedule s1;
++  des_key_schedule s2;
++  des_key_schedule s3;
++};
++typedef struct TripleDES_context TripleDES_context;
++
++#define ESP_3DES_KEY_SZ       3*(sizeof(des_cblock))
++#define ESP_3DES_CBC_BLK_LEN    8
++
++
++
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_auth.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,100 @@
++/*
++ * Authentication Header declarations
++ * Copyright (C) 2003 Michael Richardson <mcr@sandelman.ottawa.on.ca>
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_auth.h,v 1.3 2004/04/06 02:49:08 mcr Exp $
++ */
++
++#include "ipsec_md5h.h"
++#include "ipsec_sha1.h"
++
++#ifndef IPSEC_AUTH_H
++#define IPSEC_AUTH_H
++
++#define AH_FLENGTH            12              /* size of fixed part */
++#define AHMD5_KMAX            64              /* MD5 max 512 bits key */
++#define AHMD5_AMAX            12              /* MD5 96 bits of authenticator */
++
++#define AHMD596_KLEN          16              /* MD5 128 bits key */
++#define AHSHA196_KLEN         20              /* SHA1 160 bits key */
++
++#define AHMD596_ALEN          16              /* MD5 128 bits authentication length */
++#define AHSHA196_ALEN         20              /* SHA1 160 bits authentication length */
++
++#define AHMD596_BLKLEN        64              /* MD5 block length */
++#define AHSHA196_BLKLEN       64              /* SHA1 block length */
++#define AHSHA2_256_BLKLEN     64              /* SHA2-256 block length */
++#define AHSHA2_384_BLKLEN     128             /* SHA2-384 block length (?) */
++#define AHSHA2_512_BLKLEN     128             /* SHA2-512 block length */
++
++#define AH_BLKLEN_MAX                 128             /* keep up to date! */
++
++
++#define AH_AMAX               AHSHA196_ALEN   /* keep up to date! */
++#define AHHMAC_HASHLEN        12              /* authenticator length of 96bits */
++#define AHHMAC_RPLLEN         4               /* 32 bit replay counter */
++
++#define DB_AH_PKTRX           0x0001
++#define DB_AH_PKTRX2          0x0002
++#define DB_AH_DMP             0x0004
++#define DB_AH_IPSA            0x0010
++#define DB_AH_XF              0x0020
++#define DB_AH_INAU            0x0040
++#define DB_AH_REPLAY          0x0100
++
++#ifdef __KERNEL__
++
++/* General HMAC algorithm is described in RFC 2104 */
++
++#define               HMAC_IPAD       0x36
++#define               HMAC_OPAD       0x5C
++
++struct md5_ctx {
++      MD5_CTX ictx;           /* context after H(K XOR ipad) */
++      MD5_CTX octx;           /* context after H(K XOR opad) */
++};
++
++struct sha1_ctx {
++      SHA1_CTX ictx;          /* context after H(K XOR ipad) */
++      SHA1_CTX octx;          /* context after H(K XOR opad) */
++};
++
++struct auth_alg {
++      void (*init)(void *ctx);
++      void (*update)(void *ctx, unsigned char *bytes, __u32 len);
++      void (*final)(unsigned char *hash, void *ctx);
++      int hashlen;
++};
++
++struct options;
++
++#endif /* __KERNEL__ */
++#endif /* IPSEC_AUTH_H */
++
++/*
++ * $Log: ipsec_auth.h,v $
++ * Revision 1.3  2004/04/06 02:49:08  mcr
++ *    pullup of algo code from alg-branch.
++ *
++ * Revision 1.2  2004/04/05 19:55:04  mcr
++ * Moved from linux/include/freeswan/ipsec_auth.h,v
++ *
++ * Revision 1.1  2003/12/13 19:10:16  mcr
++ *    refactored rcv and xmit code - same as FS 2.05.
++ *
++ * Revision 1.1  2003/12/06 21:21:19  mcr
++ *    split up receive path into per-transform files, for
++ *    easier later removal.
++ *
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_encap.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,149 @@
++/*
++ * declarations relevant to encapsulation-like operations
++ * Copyright (C) 1996, 1997  John Ioannidis.
++ * Copyright (C) 1998, 1999, 2000, 2001  Richard Guy Briggs.
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_encap.h,v 1.19 2004/04/05 19:55:04 mcr Exp $
++ */
++
++#ifndef _IPSEC_ENCAP_H_
++
++#define SENT_IP4      16      /* data is two struct in_addr + proto + ports*/
++                      /* (2 * sizeof(struct in_addr)) */
++                      /* sizeof(struct sockaddr_encap)
++                         - offsetof(struct sockaddr_encap, Sen.Sip4.Src) */
++
++struct sockaddr_encap
++{
++      __u8    sen_len;                /* length */
++      __u8    sen_family;             /* AF_ENCAP */
++      __u16   sen_type;               /* see SENT_* */
++      union
++      {
++              struct                  /* SENT_IP4 */
++              {
++                      struct in_addr Src;
++                      struct in_addr Dst;
++                      __u8 Proto;
++                      __u16 Sport;
++                      __u16 Dport;
++              } Sip4;
++      } Sen;
++};
++
++#define sen_ip_src    Sen.Sip4.Src
++#define sen_ip_dst    Sen.Sip4.Dst
++#define sen_proto       Sen.Sip4.Proto
++#define sen_sport       Sen.Sip4.Sport
++#define sen_dport       Sen.Sip4.Dport
++
++#ifndef AF_ENCAP
++#define AF_ENCAP 26
++#endif /* AF_ENCAP */
++
++#define _IPSEC_ENCAP_H_
++#endif /* _IPSEC_ENCAP_H_ */
++
++/*
++ * $Log: ipsec_encap.h,v $
++ * Revision 1.19  2004/04/05 19:55:04  mcr
++ * Moved from linux/include/freeswan/ipsec_encap.h,v
++ *
++ * Revision 1.18  2003/10/31 02:27:05  mcr
++ *    pulled up port-selector patches and sa_id elimination.
++ *
++ * Revision 1.17.30.1  2003/09/21 13:59:38  mcr
++ *    pre-liminary X.509 patch - does not yet pass tests.
++ *
++ * Revision 1.17  2002/04/24 07:36:46  mcr
++ * Moved from ./klips/net/ipsec/ipsec_encap.h,v
++ *
++ * Revision 1.16  2001/11/26 09:23:47  rgb
++ * Merge MCR's ipsec_sa, eroute, proc and struct lifetime changes.
++ *
++ * Revision 1.15.2.1  2001/09/25 02:18:54  mcr
++ *    struct eroute moved to ipsec_eroute.h
++ *
++ * Revision 1.15  2001/09/14 16:58:36  rgb
++ * Added support for storing the first and last packets through a HOLD.
++ *
++ * Revision 1.14  2001/09/08 21:13:31  rgb
++ * Added pfkey ident extension support for ISAKMPd. (NetCelo)
++ *
++ * Revision 1.13  2001/06/14 19:35:08  rgb
++ * Update copyright date.
++ *
++ * Revision 1.12  2001/05/27 06:12:10  rgb
++ * Added structures for pid, packet count and last access time to eroute.
++ * Added packet count to beginning of /proc/net/ipsec_eroute.
++ *
++ * Revision 1.11  2000/09/08 19:12:56  rgb
++ * Change references from DEBUG_IPSEC to CONFIG_IPSEC_DEBUG.
++ *
++ * Revision 1.10  2000/03/22 16:15:36  rgb
++ * Fixed renaming of dev_get (MB).
++ *
++ * Revision 1.9  2000/01/21 06:13:26  rgb
++ * Added a macro for AF_ENCAP
++ *
++ * Revision 1.8  1999/12/31 14:56:55  rgb
++ * MB fix for 2.3 dev-use-count.
++ *
++ * Revision 1.7  1999/11/18 04:09:18  rgb
++ * Replaced all kernel version macros to shorter, readable form.
++ *
++ * Revision 1.6  1999/09/24 00:34:13  rgb
++ * Add Marc Boucher's support for 2.3.xx+.
++ *
++ * Revision 1.5  1999/04/11 00:28:57  henry
++ * GPL boilerplate
++ *
++ * Revision 1.4  1999/04/06 04:54:25  rgb
++ * Fix/Add RCSID Id: and Log: bits to make PHMDs happy.  This includes
++ * patch shell fixes.
++ *
++ * Revision 1.3  1998/10/19 14:44:28  rgb
++ * Added inclusion of freeswan.h.
++ * sa_id structure implemented and used: now includes protocol.
++ *
++ * Revision 1.2  1998/07/14 18:19:33  rgb
++ * Added #ifdef __KERNEL__ directives to restrict scope of header.
++ *
++ * Revision 1.1  1998/06/18 21:27:44  henry
++ * move sources from klips/src to klips/net/ipsec, to keep stupid
++ * kernel-build scripts happier in the presence of symlinks
++ *
++ * Revision 1.2  1998/04/21 21:29:10  rgb
++ * Rearrange debug switches to change on the fly debug output from user
++ * space.  Only kernel changes checked in at this time.  radij.c was also
++ * changed to temporarily remove buggy debugging code in rj_delete causing
++ * an OOPS and hence, netlink device open errors.
++ *
++ * Revision 1.1  1998/04/09 03:05:58  henry
++ * sources moved up from linux/net/ipsec
++ *
++ * Revision 1.1.1.1  1998/04/08 05:35:02  henry
++ * RGB's ipsec-0.8pre2.tar.gz ipsec-0.8
++ *
++ * Revision 0.4  1997/01/15 01:28:15  ji
++ * Minor cosmetic changes.
++ *
++ * Revision 0.3  1996/11/20 14:35:48  ji
++ * Minor Cleanup.
++ * Rationalized debugging code.
++ *
++ * Revision 0.2  1996/11/02 00:18:33  ji
++ * First limited release.
++ *
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_eroute.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,112 @@
++/*
++ * @(#) declarations of eroute structures
++ *
++ * Copyright (C) 1996, 1997  John Ioannidis.
++ * Copyright (C) 1998, 1999, 2000, 2001  Richard Guy Briggs <rgb@freeswan.org>
++ * Copyright (C) 2001                    Michael Richardson <mcr@freeswan.org>
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_eroute.h,v 1.5 2004/04/05 19:55:05 mcr Exp $
++ *
++ * derived from ipsec_encap.h 1.15 on 2001/9/18 by mcr.
++ *
++ */
++
++#ifndef _IPSEC_EROUTE_H_
++
++#include "radij.h"
++#include "ipsec_encap.h"
++#include "ipsec_radij.h"
++
++/*
++ * The "type" is really part of the address as far as the routing
++ * system is concerned. By using only one bit in the type field
++ * for each type, we sort-of make sure that different types of
++ * encapsulation addresses won't be matched against the wrong type.
++ */
++
++/*
++ * An entry in the radix tree 
++ */
++
++struct rjtentry
++{
++      struct  radij_node rd_nodes[2]; /* tree glue, and other values */
++#define       rd_key(r)       ((struct sockaddr_encap *)((r)->rd_nodes->rj_key))
++#define       rd_mask(r)      ((struct sockaddr_encap *)((r)->rd_nodes->rj_mask))
++      short   rd_flags;
++      short   rd_count;
++};
++
++struct ident
++{
++      __u16   type;   /* identity type */
++      __u64   id;     /* identity id */
++      __u8    len;    /* identity len */
++      caddr_t data;   /* identity data */
++};
++
++/*
++ * An encapsulation route consists of a pointer to a 
++ * radix tree entry and a SAID (a destination_address/SPI/protocol triple).
++ */
++
++struct eroute
++{
++      struct rjtentry er_rjt;
++      ip_said er_said;
++      uint32_t er_pid;
++      uint32_t er_count;
++      uint64_t er_lasttime;
++      struct sockaddr_encap er_eaddr; /* MCR get rid of _encap, it is silly*/
++      struct sockaddr_encap er_emask;
++        struct ident er_ident_s;
++        struct ident er_ident_d;
++      struct sk_buff* er_first;
++      struct sk_buff* er_last;
++};
++
++#define er_dst er_said.dst
++#define er_spi er_said.spi
++
++#define _IPSEC_EROUTE_H_
++#endif /* _IPSEC_EROUTE_H_ */
++
++/*
++ * $Log: ipsec_eroute.h,v $
++ * Revision 1.5  2004/04/05 19:55:05  mcr
++ * Moved from linux/include/freeswan/ipsec_eroute.h,v
++ *
++ * Revision 1.4  2003/10/31 02:27:05  mcr
++ *    pulled up port-selector patches and sa_id elimination.
++ *
++ * Revision 1.3.30.2  2003/10/29 01:10:19  mcr
++ *    elimited "struct sa_id"
++ *
++ * Revision 1.3.30.1  2003/09/21 13:59:38  mcr
++ *    pre-liminary X.509 patch - does not yet pass tests.
++ *
++ * Revision 1.3  2002/04/24 07:36:46  mcr
++ * Moved from ./klips/net/ipsec/ipsec_eroute.h,v
++ *
++ * Revision 1.2  2001/11/26 09:16:13  rgb
++ * Merge MCR's ipsec_sa, eroute, proc and struct lifetime changes.
++ *
++ * Revision 1.1.2.1  2001/09/25 02:18:54  mcr
++ *    struct eroute moved to ipsec_eroute.h
++ *
++ *
++ * Local variables:
++ * c-file-style: "linux"
++ * End:
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_errs.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,53 @@
++/*
++ * @(#) definition of ipsec_errs structure
++ *
++ * Copyright (C) 2001  Richard Guy Briggs  <rgb@freeswan.org>
++ *                 and Michael Richardson  <mcr@freeswan.org>
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_errs.h,v 1.4 2004/04/05 19:55:05 mcr Exp $
++ *
++ */
++
++/* 
++ * This file describes the errors/statistics that FreeSWAN collects.
++ *
++ */
++
++struct ipsec_errs {
++      __u32           ips_alg_errs;          /* number of algorithm errors */
++      __u32           ips_auth_errs;         /* # of authentication errors */
++      __u32           ips_encsize_errs;      /* # of encryption size errors*/
++      __u32           ips_encpad_errs;       /* # of encryption pad  errors*/
++      __u32           ips_replaywin_errs;    /* # of pkt sequence errors */
++};
++
++/*
++ * $Log: ipsec_errs.h,v $
++ * Revision 1.4  2004/04/05 19:55:05  mcr
++ * Moved from linux/include/freeswan/ipsec_errs.h,v
++ *
++ * Revision 1.3  2002/04/24 07:36:46  mcr
++ * Moved from ./klips/net/ipsec/ipsec_errs.h,v
++ *
++ * Revision 1.2  2001/11/26 09:16:13  rgb
++ * Merge MCR's ipsec_sa, eroute, proc and struct lifetime changes.
++ *
++ * Revision 1.1.2.1  2001/09/25 02:25:57  mcr
++ *    lifetime structure created and common functions created.
++ *
++ *
++ * Local variables:
++ * c-file-style: "linux"
++ * End:
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_esp.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,161 @@
++/*
++ * Copyright (C) 1996, 1997  John Ioannidis.
++ * Copyright (C) 1998, 1999, 2000, 2001  Richard Guy Briggs.
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_esp.h,v 1.28 2004/09/13 02:22:10 mcr Exp $
++ */
++
++#include "openswan/ipsec_md5h.h"
++#include "openswan/ipsec_sha1.h"
++
++#include "klips-crypto/des.h"
++
++#ifndef IPPROTO_ESP
++#define IPPROTO_ESP 50
++#endif /* IPPROTO_ESP */
++
++#define ESP_HEADER_LEN                8       /* 64 bits header (spi+rpl)*/
++
++#define EMT_ESPDESCBC_ULEN    20      /* coming from user mode */
++#define EMT_ESPDES_KMAX               64      /* 512 bit secret key enough? */
++#define EMT_ESPDES_KEY_SZ     8       /* 56 bit secret key with parity = 64 bits */
++#define EMT_ESP3DES_KEY_SZ    24      /* 168 bit secret key with parity = 192 bits */
++#define EMT_ESPDES_IV_SZ      8       /* IV size */
++#define ESP_DESCBC_BLKLEN       8       /* DES-CBC block size */
++
++#define ESP_IV_MAXSZ          16      /* This is _critical_ */
++#define ESP_IV_MAXSZ_INT      (ESP_IV_MAXSZ/sizeof(int))
++
++#define DB_ES_PKTRX   0x0001
++#define DB_ES_PKTRX2  0x0002
++#define DB_ES_IPSA    0x0010
++#define DB_ES_XF      0x0020
++#define DB_ES_IPAD    0x0040
++#define DB_ES_INAU    0x0080
++#define DB_ES_OINFO   0x0100
++#define DB_ES_OINFO2  0x0200
++#define DB_ES_OH      0x0400
++#define DB_ES_REPLAY  0x0800
++
++#ifdef __KERNEL__
++struct des_eks {
++      des_key_schedule ks;
++};
++
++#ifndef CONFIG_XFRM_ALTERNATE_STACK
++extern struct inet_protocol esp_protocol;
++#endif /* CONFIG_XFRM_ALTERNATE_STACK */
++
++struct options;
++
++struct esphdr
++{
++      __u32   esp_spi;                /* Security Parameters Index */
++        __u32   esp_rpl;                /* Replay counter */
++      __u8    esp_iv[8];              /* iv */
++};
++
++extern struct xform_functions esp_xform_funcs[];
++
++extern enum ipsec_rcv_value ipsec_rcv_esp_post_decrypt(struct ipsec_rcv_state *irs);
++
++#ifdef CONFIG_KLIPS_DEBUG
++extern int debug_esp;
++#endif /* CONFIG_KLIPS_DEBUG */
++#endif /* __KERNEL__ */
++
++/*
++ * $Log: ipsec_esp.h,v $
++ * Revision 1.28  2004/09/13 02:22:10  mcr
++ *    #define inet_protocol if necessary.
++ *
++ * Revision 1.27  2004/09/06 18:35:41  mcr
++ *    2.6.8.1 gets rid of inet_protocol->net_protocol compatibility,
++ *    so adjust for that.
++ *
++ * Revision 1.26  2004/07/10 19:08:41  mcr
++ *    CONFIG_IPSEC -> CONFIG_KLIPS.
++ *
++ * Revision 1.25  2004/04/06 02:49:08  mcr
++ *    pullup of algo code from alg-branch.
++ *
++ * Revision 1.24  2004/04/05 19:55:05  mcr
++ * Moved from linux/include/freeswan/ipsec_esp.h,v
++ *
++ * Revision 1.23  2004/04/05 19:41:05  mcr
++ *    merged alg-branch code.
++ *
++ * Revision 1.22  2003/12/13 19:10:16  mcr
++ *    refactored rcv and xmit code - same as FS 2.05.
++ *
++ * Revision 1.23  2003/12/11 20:14:58  mcr
++ *    refactored the xmit code, to move all encapsulation
++ *    code into protocol functions. Note that all functions
++ *    are essentially done by a single function, which is probably
++ *    wrong.
++ *    the rcv_functions structures are renamed xform_functions.
++ *
++ * Revision 1.22  2003/12/06 21:21:19  mcr
++ *    split up receive path into per-transform files, for
++ *    easier later removal.
++ *
++ * Revision 1.21.8.1  2003/12/22 15:25:52  jjo
++ *      Merged algo-0.8.1-rc11-test1 into alg-branch
++ *
++ * Revision 1.21  2003/02/06 02:21:34  rgb
++ *
++ * Moved "struct auth_alg" from ipsec_rcv.c to ipsec_ah.h .
++ * Changed "struct ah" to "struct ahhdr" and "struct esp" to "struct esphdr".
++ * Removed "#ifdef INBOUND_POLICY_CHECK_eroute" dead code.
++ *
++ * Revision 1.20  2002/05/14 02:37:02  rgb
++ * Change reference from _TDB to _IPSA.
++ *
++ * Revision 1.19  2002/04/24 07:55:32  mcr
++ *    #include patches and Makefiles for post-reorg compilation.
++ *
++ * Revision 1.18  2002/04/24 07:36:46  mcr
++ * Moved from ./klips/net/ipsec/ipsec_esp.h,v
++ *
++ * Revision 1.17  2002/02/20 01:27:07  rgb
++ * Ditched a pile of structs only used by the old Netlink interface.
++ *
++ * Revision 1.16  2001/12/11 02:35:57  rgb
++ * Change "struct net_device" to "struct device" for 2.2 compatibility.
++ *
++ * Revision 1.15  2001/11/26 09:23:48  rgb
++ * Merge MCR's ipsec_sa, eroute, proc and struct lifetime changes.
++ *
++ * Revision 1.14.2.3  2001/10/23 04:16:42  mcr
++ *    get definition of des_key_schedule from des.h
++ *
++ * Revision 1.14.2.2  2001/10/22 20:33:13  mcr
++ *    use "des_key_schedule" structure instead of cooking our own.
++ *
++ * Revision 1.14.2.1  2001/09/25 02:18:25  mcr
++ *    replace "struct device" with "struct netdevice"
++ *
++ * Revision 1.14  2001/06/14 19:35:08  rgb
++ * Update copyright date.
++ *
++ * Revision 1.13  2000/09/08 19:12:56  rgb
++ * Change references from DEBUG_IPSEC to CONFIG_IPSEC_DEBUG.
++ *
++ * Revision 1.12  2000/08/01 14:51:50  rgb
++ * Removed _all_ remaining traces of DES.
++ *
++ * Revision 1.11  2000/01/10 16:36:20  rgb
++ * Ditch last of EME option flags, including initiator.
++ *
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_ipcomp.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,97 @@
++/*
++ * IP compression header declations
++ *
++ * Copyright (C) 2003 Michael Richardson <mcr@sandelman.ottawa.on.ca>
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_ipcomp.h,v 1.4 2004/07/10 19:08:41 mcr Exp $
++ */
++
++#ifndef IPSEC_IPCOMP_H
++#define IPSEC_IPCOMP_H
++
++#include "openswan/ipsec_auth.h"
++
++/* Prefix all global deflate symbols with "ipcomp_" to avoid collisions with ppp_deflate & ext2comp */
++#ifndef IPCOMP_PREFIX
++#define IPCOMP_PREFIX
++#endif /* IPCOMP_PREFIX */
++
++#ifndef IPPROTO_COMP
++#define IPPROTO_COMP 108
++#endif /* IPPROTO_COMP */
++
++#ifdef CONFIG_KLIPS_DEBUG
++extern int sysctl_ipsec_debug_ipcomp;
++#endif /* CONFIG_KLIPS_DEBUG */
++
++struct ipcomphdr {                    /* IPCOMP header */
++    __u8    ipcomp_nh;                /* Next header (protocol) */
++    __u8    ipcomp_flags;     /* Reserved, must be 0 */
++    __u16   ipcomp_cpi;               /* Compression Parameter Index */
++};
++
++#ifndef CONFIG_XFRM_ALTERNATE_STACK
++extern struct inet_protocol comp_protocol;
++#endif /* CONFIG_XFRM_ALTERNATE_STACK */
++
++extern int sysctl_ipsec_debug_ipcomp;
++
++#define IPCOMP_UNCOMPRESSABLE     0x000000001
++#define IPCOMP_COMPRESSIONERROR   0x000000002
++#define IPCOMP_PARMERROR          0x000000004
++#define IPCOMP_DECOMPRESSIONERROR 0x000000008
++
++#define IPCOMP_ADAPT_INITIAL_TRIES    8
++#define IPCOMP_ADAPT_INITIAL_SKIP     4
++#define IPCOMP_ADAPT_SUBSEQ_TRIES     2
++#define IPCOMP_ADAPT_SUBSEQ_SKIP      8
++
++/* Function prototypes */
++struct sk_buff *skb_compress(struct sk_buff *skb, struct ipsec_sa *ips, unsigned int *flags);
++struct sk_buff *skb_decompress(struct sk_buff *skb, struct ipsec_sa *ips, unsigned int *flags);
++
++extern struct xform_functions ipcomp_xform_funcs[];
++
++#endif /* IPSEC_IPCOMP_H */
++
++/*
++ * $Log: ipsec_ipcomp.h,v $
++ * Revision 1.4  2004/07/10 19:08:41  mcr
++ *    CONFIG_IPSEC -> CONFIG_KLIPS.
++ *
++ * Revision 1.3  2004/04/06 02:49:08  mcr
++ *    pullup of algo code from alg-branch.
++ *
++ * Revision 1.2  2004/04/05 19:55:05  mcr
++ * Moved from linux/include/freeswan/ipsec_ipcomp.h,v
++ *
++ * Revision 1.1  2003/12/13 19:10:16  mcr
++ *    refactored rcv and xmit code - same as FS 2.05.
++ *
++ * Revision 1.2  2003/12/11 20:14:58  mcr
++ *    refactored the xmit code, to move all encapsulation
++ *    code into protocol functions. Note that all functions
++ *    are essentially done by a single function, which is probably
++ *    wrong.
++ *    the rcv_functions structures are renamed xform_functions.
++ *
++ * Revision 1.1  2003/12/06 21:21:19  mcr
++ *    split up receive path into per-transform files, for
++ *    easier later removal.
++ *
++ *
++ *
++ */
++
++
++
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_ipe4.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,68 @@
++/*
++ * IP-in-IP Header declarations
++ * Copyright (C) 1996, 1997  John Ioannidis.
++ * Copyright (C) 1998, 1999, 2000, 2001  Richard Guy Briggs.
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_ipe4.h,v 1.6 2004/04/05 19:55:05 mcr Exp $
++ */
++
++/* The packet header is an IP header! */
++
++struct ipe4_xdata                     /* transform table data */
++{
++      struct in_addr  i4_src;
++      struct in_addr  i4_dst;
++};
++
++#define EMT_IPE4_ULEN 8       /* coming from user mode */
++ 
++
++/*
++ * $Log: ipsec_ipe4.h,v $
++ * Revision 1.6  2004/04/05 19:55:05  mcr
++ * Moved from linux/include/freeswan/ipsec_ipe4.h,v
++ *
++ * Revision 1.5  2002/04/24 07:36:46  mcr
++ * Moved from ./klips/net/ipsec/ipsec_ipe4.h,v
++ *
++ * Revision 1.4  2001/06/14 19:35:08  rgb
++ * Update copyright date.
++ *
++ * Revision 1.3  1999/04/11 00:28:57  henry
++ * GPL boilerplate
++ *
++ * Revision 1.2  1999/04/06 04:54:25  rgb
++ * Fix/Add RCSID Id: and Log: bits to make PHMDs happy.  This includes
++ * patch shell fixes.
++ *
++ * Revision 1.1  1998/06/18 21:27:47  henry
++ * move sources from klips/src to klips/net/ipsec, to keep stupid
++ * kernel-build scripts happier in the presence of symlinks
++ *
++ * Revision 1.1  1998/04/09 03:06:07  henry
++ * sources moved up from linux/net/ipsec
++ *
++ * Revision 1.1.1.1  1998/04/08 05:35:03  henry
++ * RGB's ipsec-0.8pre2.tar.gz ipsec-0.8
++ *
++ * Revision 0.4  1997/01/15 01:28:15  ji
++ * No changes.
++ *
++ * Revision 0.3  1996/11/20 14:48:53  ji
++ * Release update only.
++ *
++ * Revision 0.2  1996/11/02 00:18:33  ji
++ * First limited release.
++ *
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_ipip.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,45 @@
++/*
++ * Copyright (C) 2003 Michael Richardson <mcr@sandelman.ottawa.on.ca>
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_ipip.h,v 1.2 2004/04/05 19:55:05 mcr Exp $
++ */
++
++#ifndef _IPSEC_IPIP_H_
++
++#ifndef IPPROTO_IPIP
++#define IPPROTO_IPIP 4
++#endif /* IPPROTO_ESP */
++
++extern struct xform_functions ipip_xform_funcs[];
++
++#define _IPSEC_IPIP_H_
++
++#endif /* _IPSEC_IPIP_H_ */
++
++/*
++ * $Log: ipsec_ipip.h,v $
++ * Revision 1.2  2004/04/05 19:55:05  mcr
++ * Moved from linux/include/freeswan/ipsec_ipip.h,v
++ *
++ * Revision 1.1  2003/12/13 19:10:16  mcr
++ *    refactored rcv and xmit code - same as FS 2.05.
++ *
++ * Revision 1.1  2003/12/11 20:14:58  mcr
++ *    refactored the xmit code, to move all encapsulation
++ *    code into protocol functions. Note that all functions
++ *    are essentially done by a single function, which is probably
++ *    wrong.
++ *    the rcv_functions structures are renamed xform_functions.
++ *
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_kern24.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,92 @@
++/*
++ * @(#) routines to makes kernel 2.4 compatible with 2.6 usage.
++ *
++ * Copyright (C) 2004 Michael Richardson <mcr@sandelman.ottawa.on.ca>
++ * Copyright (C) 2005 - 2008 Paul Wouters <paul@xelerance.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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ */
++
++#ifndef _IPSEC_KERN24_H
++
++
++#ifdef NETDEV_23
++#if 0
++#ifndef NETDEV_25
++#define device net_device
++#endif
++#endif
++
++# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
++#  define __ipsec_dev_get(x) __dev_get_by_name(&init_net, x)
++#  define ipsec_dev_get(x) dev_get_by_name(&init_net, x)
++# else
++#  define ipsec_dev_get(x) __dev_get_by_name(x)
++#  define __ipsec_dev_get(x) __dev_get_by_name(x)
++# endif
++
++# define ipsec_dev_put(x) dev_put(x)
++# define __ipsec_dev_put(x) __dev_put(x)
++# define ipsec_dev_hold(x) dev_hold(x)
++#else /* NETDEV_23 */
++# define ipsec_dev_get dev_get
++# define __ipsec_dev_put(x) 
++# define ipsec_dev_put(x)
++# define ipsec_dev_hold(x) 
++#endif /* NETDEV_23 */
++
++#ifndef HAVE_NETDEV_PRINTK
++#define netdev_printk(sevlevel, netdev, msglevel, format, arg...) \
++      printk(sevlevel "%s: " format , netdev->name , ## arg)
++#endif
++
++#ifndef NET_26
++#define sk_receive_queue  receive_queue
++#define sk_destruct       destruct
++#define sk_reuse          reuse
++#define sk_zapped         zapped
++#define sk_family         family
++#define sk_protocol       protocol
++#define sk_protinfo       protinfo
++#define sk_sleep          sleep
++#define sk_state_change   state_change
++#define sk_shutdown       shutdown
++#define sk_err            err
++#define sk_stamp          stamp
++#define sk_socket         socket
++#define sk_sndbuf         sndbuf
++#define sock_flag(sk, flag)  sk->dead
++#define sk_for_each(sk, node, plist) for(sk=*plist; sk!=NULL; sk = sk->next)
++#endif
++
++/* deal with 2.4 vs 2.6 issues with module counts */
++
++/* in 2.6, all refcounts are maintained *outside* of the
++ * module to deal with race conditions.
++ */
++
++#ifdef NET_26
++#define KLIPS_INC_USE /* nothing */
++#define KLIPS_DEC_USE /* nothing */
++
++#else
++#define KLIPS_INC_USE MOD_INC_USE_COUNT
++#define KLIPS_DEC_USE MOD_DEC_USE_COUNT
++#endif
++
++extern int printk_ratelimit(void);
++
++
++#define _IPSEC_KERN24_H 1
++
++#endif /* _IPSEC_KERN24_H */
++
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_kversion.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,441 @@
++#ifndef _OPENSWAN_KVERSIONS_H
++/*
++ * header file for Openswan library functions
++ * Copyright (C) 1998, 1999, 2000  Henry Spencer.
++ * Copyright (C) 1999, 2000, 2001  Richard Guy Briggs
++ * Copyright (C) 2003 - 2008  Paul Wouters <paul@xelerance.com>
++ * 
++ * This library is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU Library General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.  See <http://www.fsf.org/copyleft/lgpl.txt>.
++ * 
++ * This library 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 Library General Public
++ * License for more details.
++ *
++ */
++#define       _OPENSWAN_KVERSIONS_H   /* seen it, no need to see it again */
++
++/*
++ * this file contains a series of atomic defines that depend upon
++ * kernel version numbers. The kernel versions are arranged
++ * in version-order number (which is often not chronological)
++ * and each clause enables or disables a feature.
++ */
++
++/*
++ * First, assorted kernel-version-dependent trickery.
++ */
++#include <linux/version.h>
++#ifndef KERNEL_VERSION
++# define KERNEL_VERSION(x,y,z) (((x)<<16)+((y)<<8)+(z))
++#endif
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
++# define HEADER_CACHE_BIND_21
++# error "KLIPS is no longer supported on Linux 2.0. Sorry"
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0)
++# define SPINLOCK
++# define PROC_FS_21
++# define NETLINK_SOCK
++# define NET_21
++#endif
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,19)
++# define net_device_stats enet_statistics
++#endif                                                                         
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
++# define SPINLOCK_23
++# define NETDEV_23
++# ifndef CONFIG_IP_ALIAS
++#  define CONFIG_IP_ALIAS
++# endif
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,25)
++# define PROC_FS_2325
++# undef  PROC_FS_21
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,30)
++# define PROC_NO_DUMMY
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,35)
++# define SKB_COPY_EXPAND
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,37)
++# define IP_SELECT_IDENT
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,2)
++# define IP_SELECT_IDENT_NEW
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,4)
++# define IPH_is_SKB_PULLED
++# define SKB_COW_NEW
++# define PROTO_HANDLER_SINGLE_PARM
++# define IP_FRAGMENT_LINEARIZE 1
++#else /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,4) */
++#  ifdef REDHAT_BOGOSITY
++#  define IP_SELECT_IDENT_NEW
++#  define IPH_is_SKB_PULLED
++#  define SKB_COW_NEW
++#  define PROTO_HANDLER_SINGLE_PARM
++#  endif /* REDHAT_BOGOSITY */
++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,4) */
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,9)
++# define MALLOC_SLAB
++# define LINUX_KERNEL_HAS_SNPRINTF
++#endif                                                                         
++
++/* API changes are documented at: http://lwn.net/Articles/2.6-kernel-api/ */
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
++# define HAVE_NETDEV_PRINTK 1
++# define NET_26
++# define NETDEV_25
++# define NEED_SPINLOCK_TYPES
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,8)
++# define NEED_INET_PROTOCOL
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
++# define HAVE_SOCK_ZAPPED
++# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
++#  define NET_26_24_SKALLOC
++# else
++#  define NET_26_12_SKALLOC
++# endif
++#endif
++#endif
++
++/* see <linux/security.h> */
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13)
++# define HAVE_SOCK_SECURITY
++/* skb->nf_debug disappared completely in 2.6.13 */
++# define ipsec_nf_debug_reset(skb)    ((skb)->nf_debug = 0)
++#else
++# define ipsec_nf_debug_reset(skb)
++#endif
++
++/* how to reset an skb we are reusing after encrpytion/decryption etc */
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,17)
++# define ipsec_nf_reset(skb)  nf_reset((skb))
++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,50) && defined(CONFIG_NETFILTER)
++# define ipsec_nf_reset(skb)  do { \
++                                                                      nf_conntrack_put((skb)->nfct); \
++                                                                      (skb)->nfct=NULL; \
++                                                                      ipsec_nf_debug_reset(skb); \
++                                                              } while(0)
++#else
++# define ipsec_nf_reset(skb)  /**/
++#endif
++
++/* skb->stamp changed to skb->tstamp in 2.6.14 */
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14)
++# define HAVE_TSTAMP
++# define HAVE_INET_SK_SPORT
++#else
++# define HAVE_SKB_LIST 
++#endif
++
++/* it seems 2.6.14 accidentally removed sysctl_ip_default_ttl */
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14)
++# define SYSCTL_IPSEC_DEFAULT_TTL IPSEC_DEFAULT_TTL
++#else
++# define SYSCTL_IPSEC_DEFAULT_TTL sysctl_ip_default_ttl                      
++#endif
++
++/*
++   The obsolete MODULE_PARM() macro is gone forevermore [in 2.6.17+]
++    It was introduced in 2.6.0
++   Zero-filled memory can now be allocated from slab caches with
++    kmem_cache_zalloc(). There is also a new slab debugging option
++    to produce a /proc/slab_allocators file with detailed allocation
++    information.
++ */
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
++# define module_param(a,b,c)  MODULE_PARM(#a,"i")
++/* note below is only true for our current calls to module_param_array */
++# define module_param_array(a,b,c,d)  MODULE_PARM(#a,"1-2i")
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
++/*
++   The skb_linearize() function has been reworked, and no longer has a
++    GFP flags argument. There is also a new skb_linearize_cow() function
++    which ensures that the resulting SKB is writable.
++   Network drivers should no longer manipulate the xmit_lock  spinlock
++    in the net_device structure; instead, the following new functions
++    should be used:
++     int netif_tx_lock(struct net_device *dev);
++     int netif_tx_lock_bh(struct net_device *dev);
++     void netif_tx_unlock(struct net_device *dev);
++     void netif_tx_unlock_bh(struct net_device *dev);
++     int netif_tx_trylock(struct net_device *dev);
++   A number of crypto API changes have been merged, the biggest being
++    a change to most algorithm-specific functions to take a pointer to
++    the crypto_tfm structure, rather than the old "context" pointer. This
++    change was necessary to support parameterized algorithms.
++*/
++
++# define HAVE_NEW_SKB_LINEARIZE
++#endif
++
++/* this is the best we can do to detect XEN, which makes
++ * patches to linux/skbuff.h, making it look like 2.6.18 version 
++ */
++#ifdef CONFIG_XEN
++# define HAVE_NEW_SKB_LINEARIZE
++#endif
++
++/* And the same for SuSe kernels who have it before it got into the
++ * linus kernel.
++ */
++#ifdef SLE_VERSION_CODE
++# if SLE_VERSION_CODE >= 655616
++#  define HAVE_NEW_SKB_LINEARIZE
++# else
++#  warning "A Suse kernel was detected, but we are unsure if it requires HAVE_NEW_SKB_LINEARIZE"
++# endif
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
++# define VOID_SOCK_UNREGISTER
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
++/* skb->nfmark changed to skb->mark in 2.6.20 */
++# define nfmark mark
++#else
++# define HAVE_KMEM_CACHE_T
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)
++/*
++   Significant changes have been made to the crypto support interface.
++   The sysctl code has been heavily reworked, leading to a number of
++    internal API changes. 
++*/
++# define ipsec_register_sysctl_table(a,b) register_sysctl_table(a)
++# define CTL_TABLE_PARENT
++#else
++# define ipsec_register_sysctl_table(a,b) register_sysctl_table(a,b)
++#endif
++ 
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
++/*
++   The eth_type_trans() function now sets the skb->dev field, consistent
++    with how similar functions for other link types operate. As a result,
++    many Ethernet drivers have been changed to remove the (now) redundant
++    assignment.
++   The header fields in the sk_buff structure have been renamed
++    and are no longer unions. Networking code and drivers can
++    now just use skb->transport_header, skb->network_header, and
++    skb->skb_mac_header. There are new functions for finding specific
++    headers within packets: tcp_hdr(), udp_hdr(), ipip_hdr(), and
++    ipipv6_hdr().
++   The crypto API has a new set of functions for use with asynchronous
++    block ciphers. There is also a new cryptd kernel thread which can
++    run any synchronous cipher in an asynchronous mode.
++   A new macro has been added to make the creation of slab caches easier:
++    struct kmem_cache KMEM_CACHE(struct-type, flags);
++    The result is the creation of a cache holding objects of the given
++     struct_type, named after that type, and with the additional slab
++     flags (if any). 
++*/
++
++/* need to include ip.h early, no longer pick it up in skbuff.h */
++# include <linux/ip.h>
++# define HAVE_KERNEL_TSTAMP
++/* type of sock.sk_stamp changed from timeval to ktime  */
++# define grab_socket_timeval(tv, sock)  { (tv) = ktime_to_timeval((sock).sk_stamp); }
++#else
++# define grab_socket_timeval(tv, sock)  { (tv) = (sock).sk_stamp; }
++/* internals of struct skbuff changed */
++# define        HAVE_DEV_NEXT
++# define ip_hdr(skb)  ((skb)->nh.iph)
++# define skb_tail_pointer(skb)  ((skb)->tail)
++# define skb_end_pointer(skb)  ((skb)->end)
++# define skb_network_header(skb)  ((skb)->nh.raw)
++# define skb_set_network_header(skb,off)  ((skb)->nh.raw = (skb)->data + (off))
++# define tcp_hdr(skb)  ((skb)->h.th)
++# define udp_hdr(skb)  ((skb)->h.uh)
++# define skb_transport_header(skb)  ((skb)->h.raw)
++# define skb_set_transport_header(skb,off)  ((skb)->h.raw = (skb)->data + (off))
++# define skb_mac_header(skb)  ((skb)->mac.raw)
++# define skb_set_mac_header(skb,off)  ((skb)->mac.raw = (skb)->data + (off))
++#endif
++/* turn a pointer into an offset for above macros */
++#define ipsec_skb_offset(skb, ptr) (((unsigned char *)(ptr)) - (skb)->data)
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23)
++/* 
++ * The macro got introduced in 2,6,22 but it does not work properly, and
++ * still uses the old number of arguments. 
++ */
++ /*
++    The destructor argument has been removed from kmem_cache_create(), as
++    destructors are no longer supported. All in-kernel callers have been
++    updated
++  */
++# define HAVE_KMEM_CACHE_MACRO
++
++/* Try using the new kernel encaps hook for nat-t, instead of udp.c */
++# ifdef NOT_YET_FINISHED
++#  define HAVE_UDP_ENCAP_CONVERT
++# endif
++
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
++/*
++ * We can switch on earlier kernels, but from here on we have no choice
++ * but to abandon the old style proc_net and use seq_file
++ * The hard_header() method has been removed from struct net_device;
++    it has been replaced by a per-protocol header_ops structure pointer. 
++
++   The prototype for slab constructor callbacks has changed to:
++    void (*ctor)(struct kmem_cache *cache, void *object);
++   The unused flags argument has been removed and the order of the other
++    two arguments has been reversed to match other slab functions. 
++ */
++# define HAVE_PROC_DIR_ENTRY
++# define        PROC_NET        init_net.proc_net
++
++# define __ipsec_dev_get(x) __dev_get_by_name(&init_net, x)
++# define ipsec_dev_get(x) dev_get_by_name(&init_net, x)
++#else
++
++# define        PROC_NET        proc_net
++
++# define ipsec_dev_get(x) __dev_get_by_name(x)
++# define __ipsec_dev_get(x) __dev_get_by_name(x)
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
++# define ip_chk_addr(a) inet_addr_type(&init_net, a)
++
++# define l_inet_addr_type(a)  inet_addr_type(&init_net, a)
++
++#else
++# define ip_chk_addr inet_addr_type
++
++#define l_inet_addr_type      inet_addr_type
++
++#endif
++
++#ifndef NETDEV_TX_BUSY
++# ifdef NETDEV_XMIT_CN
++#  define NETDEV_TX_BUSY NETDEV_XMIT_CN
++# else
++#  define NETDEV_TX_BUSY 1
++# endif
++#endif
++
++
++#ifdef NET_21
++# define ipsec_kfree_skb(a) kfree_skb(a)
++#else /* NET_21 */
++# define ipsec_kfree_skb(a) kfree_skb(a, FREE_WRITE)
++#endif /* NET_21 */
++
++#ifdef NETDEV_23
++
++#ifndef SPINLOCK
++#  include <linux/bios32.h>
++     /* simulate spin locks and read/write locks */
++     typedef struct {
++       volatile char lock;
++     } spinlock_t;
++
++     typedef struct {
++       volatile unsigned int lock;
++     } rwlock_t;                                                                     
++
++#  define spin_lock_init(x) { (x)->lock = 0;}
++#  define rw_lock_init(x) { (x)->lock = 0; }
++
++#  define spin_lock(x) { while ((x)->lock) barrier(); (x)->lock=1;}
++#  define spin_lock_irq(x) { cli(); spin_lock(x);}
++#  define spin_lock_irqsave(x,flags) { save_flags(flags); spin_lock_irq(x);}
++
++#  define spin_unlock(x) { (x)->lock=0;}
++#  define spin_unlock_irq(x) { spin_unlock(x); sti();}
++#  define spin_unlock_irqrestore(x,flags) { spin_unlock(x); restore_flags(flags);}
++
++#  define read_lock(x) spin_lock(x)
++#  define read_lock_irq(x) spin_lock_irq(x)
++#  define read_lock_irqsave(x,flags) spin_lock_irqsave(x,flags)
++
++#  define read_unlock(x) spin_unlock(x)
++#  define read_unlock_irq(x) spin_unlock_irq(x)
++#  define read_unlock_irqrestore(x,flags) spin_unlock_irqrestore(x,flags)
++
++#  define write_lock(x) spin_lock(x)
++#  define write_lock_irq(x) spin_lock_irq(x)
++#  define write_lock_irqsave(x,flags) spin_lock_irqsave(x,flags)
++
++#  define write_unlock(x) spin_unlock(x)
++#  define write_unlock_irq(x) spin_unlock_irq(x)
++#  define write_unlock_irqrestore(x,flags) spin_unlock_irqrestore(x,flags)
++#endif /* !SPINLOCK */
++
++#ifndef SPINLOCK_23
++#  define spin_lock_bh(x)  spin_lock_irq(x)
++#  define spin_unlock_bh(x)  spin_unlock_irq(x)
++
++#  define read_lock_bh(x)  read_lock_irq(x)
++#  define read_unlock_bh(x)  read_unlock_irq(x)
++
++#  define write_lock_bh(x)  write_lock_irq(x)
++#  define write_unlock_bh(x)  write_unlock_irq(x)
++#endif /* !SPINLOCK_23 */
++
++#ifndef HAVE_NETDEV_PRINTK
++#define netdev_printk(sevlevel, netdev, msglevel, format, arg...) \
++      printk(sevlevel "%s: " format , netdev->name , ## arg)
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
++#define       PROC_NET        init_net.proc_net
++#define       PROC_EOF_DATA
++#else
++#define       PROC_NET        proc_net
++#endif
++
++#ifdef NET_21
++# include <linux/in6.h>
++#else
++     /* old kernel in.h has some IPv6 stuff, but not quite enough */
++# define      s6_addr16       s6_addr
++# define      AF_INET6        10
++# define uint8_t __u8
++# define uint16_t __u16 
++# define uint32_t __u32 
++# define uint64_t __u64 
++#endif
++
++#if __KERNEL__
++# if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,0)
++#  if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) 
++#   include "openswan/ipsec_kern24.h"
++#  else
++#   error "kernels before 2.4 are not supported at this time"
++#  endif
++# endif
++#endif
++
++#endif /* _OPENSWAN_KVERSIONS_H */
++
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_life.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,112 @@
++/*
++ * Definitions relevant to IPSEC lifetimes
++ * Copyright (C) 2001  Richard Guy Briggs  <rgb@freeswan.org>
++ *                 and Michael Richardson  <mcr@freeswan.org>
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_life.h,v 1.4 2004/04/05 19:55:05 mcr Exp $
++ *
++ * This file derived from ipsec_xform.h on 2001/9/18 by mcr.
++ *
++ */
++
++/* 
++ * This file describes the book keeping fields for the 
++ *   IPsec Security Association Structure. ("ipsec_sa")
++ *
++ * This structure is never allocated directly by kernel code,
++ * (it is always a static/auto or is part of a structure)
++ * so it does not have a reference count.
++ *
++ */
++
++#ifndef _IPSEC_LIFE_H_
++
++/*
++ *  _count is total count.
++ *  _hard is hard limit (kill SA after this number)
++ *  _soft is soft limit (try to renew SA after this number)
++ *  _last is used in some special cases.
++ *
++ */
++
++struct ipsec_lifetime64
++{
++      __u64           ipl_count;
++      __u64           ipl_soft;
++      __u64           ipl_hard;
++      __u64           ipl_last;  
++};
++
++struct ipsec_lifetimes
++{
++      /* number of bytes processed */
++      struct ipsec_lifetime64 ipl_bytes;
++
++      /* number of packets processed */
++      struct ipsec_lifetime64 ipl_packets;
++
++      /* time since SA was added */
++      struct ipsec_lifetime64 ipl_addtime;
++
++      /* time since SA was first used */
++      struct ipsec_lifetime64 ipl_usetime;
++
++      /* from rfc2367:  
++         *         For CURRENT, the number of different connections,
++         *         endpoints, or flows that the association has been
++         *          allocated towards. For HARD and SOFT, the number of
++         *          these the association may be allocated towards
++         *          before it expires. The concept of a connection,
++         *          flow, or endpoint is system specific.
++       *
++       * mcr(2001-9-18) it is unclear what purpose these serve for FreeSWAN.
++       *          They are maintained for PF_KEY compatibility. 
++       */
++      struct ipsec_lifetime64 ipl_allocations;
++};
++
++enum ipsec_life_alive {
++      ipsec_life_harddied = -1,
++      ipsec_life_softdied = 0,
++      ipsec_life_okay     = 1
++};
++
++enum ipsec_life_type {
++      ipsec_life_timebased = 1,
++      ipsec_life_countbased= 0
++};
++
++#define _IPSEC_LIFE_H_
++#endif /* _IPSEC_LIFE_H_ */
++
++
++/*
++ * $Log: ipsec_life.h,v $
++ * Revision 1.4  2004/04/05 19:55:05  mcr
++ * Moved from linux/include/freeswan/ipsec_life.h,v
++ *
++ * Revision 1.3  2002/04/24 07:36:46  mcr
++ * Moved from ./klips/net/ipsec/ipsec_life.h,v
++ *
++ * Revision 1.2  2001/11/26 09:16:14  rgb
++ * Merge MCR's ipsec_sa, eroute, proc and struct lifetime changes.
++ *
++ * Revision 1.1.2.1  2001/09/25 02:25:58  mcr
++ *    lifetime structure created and common functions created.
++ *
++ *
++ * Local variables:
++ * c-file-style: "linux"
++ * End:
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_mast.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,59 @@
++#ifndef _IPSEC_MAST_H
++#define _IPSEC_MAST_H
++
++#ifdef CONFIG_KLIPS_DEBUG
++#define DB_MAST_INIT  0x0001
++#define DB_MAST_PROCFS        0x0002
++#define DB_MAST_XMIT  0x0010
++#define DB_MAST_OHDR  0x0020
++#define DB_MAST_CROUT 0x0040
++#define DB_MAST_OXFS  0x0080
++#define DB_MAST_REVEC 0x0100
++#define DB_MAST_ENCAP   0x0200
++#endif /* CONFIG_KLIPS_DEBUG */
++
++struct ipsecmastconf {
++      __u32   cf_cmd;
++      union
++      {
++              char    cfu_name[12];
++      } cf_u;
++#define cf_name cf_u.cfu_name
++};
++
++struct mastpriv
++{
++      struct sk_buff_head sendq;
++      struct wait_queue *wait_queue;
++      int  (*hard_header) (struct sk_buff *skb,
++                           struct net_device *dev,
++                           unsigned short type,
++                           void *daddr,
++                           void *saddr,
++                           unsigned len);
++#if 0
++      char locked;
++      int  (*hard_start_xmit) (struct sk_buff *skb,
++                               struct net_device *dev);
++      int  (*rebuild_header)(struct sk_buff *skb);
++      int  (*set_mac_address)(struct net_device *dev, void *addr);
++      void (*header_cache_bind)(struct hh_cache **hhp, struct net_device *dev,
++                                unsigned short htype, __u32 daddr);
++      void (*header_cache_update)(struct hh_cache *hh,
++                                  struct net_device *dev,
++                                  unsigned char *  haddr);
++      struct net_device_stats *(*get_stats)(struct net_device *dev);
++#endif
++      struct net_device_stats mystats;
++      int mtu;        /* What is the desired MTU? */
++};
++
++extern int ipsec_mast_init_devices(void);
++extern int ipsec_mast_deletenum(int vifnum);
++extern int ipsec_mast_createnum(int vifnum);
++extern struct net_device *ipsec_mast_get_device(int vifnum);
++extern unsigned int ipsec_mast_is_transport(int vifnum);
++
++
++
++#endif
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_md5h.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,143 @@
++/*
++ * RCSID $Id: ipsec_md5h.h,v 1.10 2004/09/08 17:21:35 ken Exp $
++ */
++
++/*
++ * The rest of this file is Copyright RSA DSI. See the following comments
++ * for the full Copyright notice.
++ */
++
++#ifndef _IPSEC_MD5H_H_
++#define _IPSEC_MD5H_H_
++
++/* GLOBAL.H - RSAREF types and constants
++ */
++
++/* PROTOTYPES should be set to one if and only if the compiler supports
++     function argument prototyping.
++   The following makes PROTOTYPES default to 0 if it has not already
++     been defined with C compiler flags.
++ */
++#ifndef PROTOTYPES
++#define PROTOTYPES 1
++#endif /* !PROTOTYPES */
++
++/* POINTER defines a generic pointer type */
++typedef __u8 *POINTER;
++
++/* UINT2 defines a two byte word */
++typedef __u16 UINT2;
++
++/* UINT4 defines a four byte word */
++typedef __u32 UINT4;
++
++/* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
++   If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
++     returns an empty list.
++ */
++
++#if PROTOTYPES
++#define PROTO_LIST(list) list
++#else /* PROTOTYPES */
++#define PROTO_LIST(list) ()
++#endif /* PROTOTYPES */
++
++
++/* MD5.H - header file for MD5C.C
++ */
++
++/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
++rights reserved.
++
++License to copy and use this software is granted provided that it
++is identified as the "RSA Data Security, Inc. MD5 Message-Digest
++Algorithm" in all material mentioning or referencing this software
++or this function.
++
++License is also granted to make and use derivative works provided
++that such works are identified as "derived from the RSA Data
++Security, Inc. MD5 Message-Digest Algorithm" in all material
++mentioning or referencing the derived work.
++
++RSA Data Security, Inc. makes no representations concerning either
++the merchantability of this software or the suitability of this
++software for any particular purpose. It is provided "as is"
++without express or implied warranty of any kind.
++
++These notices must be retained in any copies of any part of this
++documentation and/or software.
++ */
++
++/* MD5 context. */
++typedef struct {
++  UINT4 state[4];                                   /* state (ABCD) */
++  UINT4 count[2];        /* number of bits, modulo 2^64 (lsb first) */
++  unsigned char buffer[64];                         /* input buffer */
++} MD5_CTX;
++
++void osMD5Init PROTO_LIST ((void *));
++void osMD5Update PROTO_LIST
++  ((void *, unsigned char *, __u32));
++void osMD5Final PROTO_LIST ((unsigned char [16], void *));
++ 
++#endif /* _IPSEC_MD5H_H_ */
++
++/*
++ * $Log: ipsec_md5h.h,v $
++ * Revision 1.10  2004/09/08 17:21:35  ken
++ * Rename MD5* -> osMD5 functions to prevent clashes with other symbols exported by kernel modules (CIFS in 2.6 initiated this)
++ *
++ * Revision 1.9  2004/04/05 19:55:05  mcr
++ * Moved from linux/include/freeswan/ipsec_md5h.h,v
++ *
++ * Revision 1.8  2002/09/10 01:45:09  mcr
++ *    changed type of MD5_CTX and SHA1_CTX to void * so that
++ *    the function prototypes would match, and could be placed
++ *    into a pointer to a function.
++ *
++ * Revision 1.7  2002/04/24 07:36:46  mcr
++ * Moved from ./klips/net/ipsec/ipsec_md5h.h,v
++ *
++ * Revision 1.6  1999/12/13 13:59:13  rgb
++ * Quick fix to argument size to Update bugs.
++ *
++ * Revision 1.5  1999/12/07 18:16:23  rgb
++ * Fixed comments at end of #endif lines.
++ *
++ * Revision 1.4  1999/04/06 04:54:26  rgb
++ * Fix/Add RCSID Id: and Log: bits to make PHMDs happy.  This includes
++ * patch shell fixes.
++ *
++ * Revision 1.3  1999/01/22 06:19:58  rgb
++ * 64-bit clean-up.
++ *
++ * Revision 1.2  1998/11/30 13:22:54  rgb
++ * Rationalised all the klips kernel file headers.  They are much shorter
++ * now and won't conflict under RH5.2.
++ *
++ * Revision 1.1  1998/06/18 21:27:48  henry
++ * move sources from klips/src to klips/net/ipsec, to keep stupid
++ * kernel-build scripts happier in the presence of symlinks
++ *
++ * Revision 1.2  1998/04/23 20:54:03  rgb
++ * Fixed md5 and sha1 include file nesting issues, to be cleaned up when
++ * verified.
++ *
++ * Revision 1.1  1998/04/09 03:04:21  henry
++ * sources moved up from linux/net/ipsec
++ * these two include files modified not to include others except in kernel
++ *
++ * Revision 1.1.1.1  1998/04/08 05:35:03  henry
++ * RGB's ipsec-0.8pre2.tar.gz ipsec-0.8
++ *
++ * Revision 0.4  1997/01/15 01:28:15  ji
++ * No changes.
++ *
++ * Revision 0.3  1996/11/20 14:48:53  ji
++ * Release update only.
++ *
++ * Revision 0.2  1996/11/02 00:18:33  ji
++ * First limited release.
++ *
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_param.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,268 @@
++/*
++ * @(#) Openswan tunable paramaters
++ *
++ * Copyright (C) 2001  Richard Guy Briggs  <rgb@freeswan.org>
++ *                 and Michael Richardson  <mcr@freeswan.org>
++ * Copyright (C) 2004  Michael Richardson  <mcr@xelerance.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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ *
++ */
++
++/* 
++ * This file provides a set of #define's which may be tuned by various
++ * people/configurations. It keeps all compile-time tunables in one place.
++ *
++ * This file should be included before all other IPsec kernel-only files.
++ *
++ */
++
++#ifndef _IPSEC_PARAM_H_
++
++#ifdef __KERNEL__
++
++#include "openswan/ipsec_kversion.h"
++
++/* Set number of ipsecX virtual devices here. */
++/* This must be < exp(field width of IPSEC_DEV_FORMAT) */
++/* It must also be reasonable so as not to overload the memory and CPU */
++/* constraints of the host. */
++#ifdef CONFIG_KLIPS_IF_MAX
++#define IPSEC_NUM_IFMAX CONFIG_KLIPS_IF_MAX
++#endif
++#ifndef IPSEC_NUM_IFMAX
++#define IPSEC_NUM_IFMAX       64
++#endif
++
++/* default number of ipsecX devices to create */
++#define IPSEC_NUM_IF  2
++
++/* The field width must be < IF_NAM_SIZ - strlen("ipsec") - 1. */
++/* With "ipsec" being 5 characters, that means 10 is the max field width */
++/* but machine memory and CPU constraints are not likely to tollerate */
++/* more than 3 digits.  The default is one digit. */
++/* Update: userland scripts get upset if they can't find "ipsec0", so */
++/* for now, no "0"-padding should be used (which would have been helpful */
++/* to make text-searches work */
++#define IPSEC_DEV_FORMAT "ipsec%d"
++#define MAST_DEV_FORMAT "mast%d"
++
++/* For, say, 500 virtual ipsec devices, I would recommend: */
++/* #define IPSEC_NUM_IF       500 */
++/* #define IPSEC_DEV_FORMAT "ipsec%03d" */
++/* Note that the "interfaces=" line in /etc/ipsec.conf would be, um, challenging. */
++
++/* use dynamic ipsecX device allocation */
++#ifndef CONFIG_KLIPS_DYNDEV
++#define CONFIG_KLIPS_DYNDEV 1
++#endif /* CONFIG_KLIPS_DYNDEV */
++
++
++#ifdef CONFIG_KLIPS_BIGGATE
++# define SADB_HASHMOD   8069
++#else /* CONFIG_KLIPS_BIGGATE */
++# define SADB_HASHMOD 257
++#endif /* CONFIG_KLIPS_BIGGATE */
++
++#endif /* __KERNEL__ */
++
++/*
++ * This is for the SA reference table. This number is related to the
++ * maximum number of SAs that KLIPS can concurrently deal with, plus enough
++ * space for keeping expired SAs around.
++ *
++ * TABLE_IDX_WIDTH is the number of bits that we will use.
++ * MAIN_TABLE_WIDTH is the number of bits used for the primary index table.
++ *
++ */
++#ifndef IPSEC_SA_REF_MAINTABLE_IDX_WIDTH 
++# define IPSEC_SA_REF_MAINTABLE_IDX_WIDTH 4 
++#endif
++
++#ifndef IPSEC_SA_REF_FREELIST_NUM_ENTRIES 
++# define IPSEC_SA_REF_FREELIST_NUM_ENTRIES 256
++#endif
++
++#ifndef IPSEC_SA_REF_CODE 
++# define IPSEC_SA_REF_CODE 1 
++#endif
++
++#ifdef __KERNEL__
++/* This is defined for 2.4, but not 2.2.... */
++#ifndef ARPHRD_VOID
++# define ARPHRD_VOID 0xFFFF
++#endif
++
++/* always turn on IPIP mode */
++#ifndef CONFIG_KLIPS_IPIP 
++#define CONFIG_KLIPS_IPIP 1
++#endif
++
++/*
++ * Worry about PROC_FS stuff
++ */
++#if defined(PROC_FS_2325)
++/* kernel 2.4 */
++# define IPSEC_PROC_LAST_ARG ,int *eof,void *data
++# define IPSEC_PROCFS_DEBUG_NO_STATIC
++# define IPSEC_PROC_SUBDIRS
++#else
++/* kernel <2.4 */
++# define IPSEC_PROCFS_DEBUG_NO_STATIC DEBUG_NO_STATIC
++
++# ifndef PROC_NO_DUMMY
++#  define IPSEC_PROC_LAST_ARG , int dummy
++# else
++#  define IPSEC_PROC_LAST_ARG
++# endif /* !PROC_NO_DUMMY */
++#endif /* PROC_FS_2325 */
++
++#if !defined(LINUX_KERNEL_HAS_SNPRINTF)
++/* GNU CPP specific! */
++# define snprintf(buf, len, fmt...) sprintf(buf, ##fmt)
++#endif /* !LINUX_KERNEL_HAS_SNPRINTF */
++
++#ifdef SPINLOCK
++# ifdef SPINLOCK_23
++#  include <linux/spinlock.h> /* *lock* */
++# else /* SPINLOCK_23 */
++#  include <asm/spinlock.h> /* *lock* */
++# endif /* SPINLOCK_23 */
++#endif /* SPINLOCK */
++
++#ifndef KLIPS_FIXES_DES_PARITY
++# define KLIPS_FIXES_DES_PARITY 1
++#endif /* !KLIPS_FIXES_DES_PARITY */
++
++/* we don't really want to print these unless there are really big problems */
++#ifndef KLIPS_DIVULGE_CYPHER_KEY
++# define KLIPS_DIVULGE_CYPHER_KEY 0
++#endif /* !KLIPS_DIVULGE_CYPHER_KEY */
++
++#ifndef KLIPS_DIVULGE_HMAC_KEY
++# define KLIPS_DIVULGE_HMAC_KEY 0
++#endif /* !KLIPS_DIVULGE_HMAC_KEY */
++
++#ifndef IPSEC_DISALLOW_IPOPTIONS
++# define IPSEC_DISALLOW_IPOPTIONS 1
++#endif /* !KLIPS_DIVULGE_HMAC_KEY */
++
++/* extra toggles for regression testing */
++#ifdef CONFIG_KLIPS_REGRESS
++
++/* 
++ * should pfkey_acquire() become 100% lossy?
++ *
++ */
++extern int sysctl_ipsec_regress_pfkey_lossage;
++#ifndef KLIPS_PFKEY_ACQUIRE_LOSSAGE
++# ifdef CONFIG_KLIPS_PFKEY_ACQUIRE_LOSSAGE
++#  define KLIPS_PFKEY_ACQUIRE_LOSSAGE 100
++# else /* CONFIG_KLIPS_PFKEY_ACQUIRE_LOSSAGE */
++/* not by default! */
++#  define KLIPS_PFKEY_ACQUIRE_LOSSAGE 0
++# endif /* CONFIG_KLIPS_PFKEY_ACQUIRE_LOSSAGE */
++#endif /* KLIPS_PFKEY_ACQUIRE_LOSSAGE */
++
++#endif /* CONFIG_KLIPS_REGRESS */
++
++
++/*
++ * debugging routines.
++ */
++#ifdef CONFIG_KLIPS_DEBUG
++        #define KLIPS_ERROR(flag, format, args...) if(printk_ratelimit() || flag) printk(KERN_ERR "KLIPS " format, ## args)
++      #define KLIPS_PRINT(flag, format, args...) \
++              ((flag) ? printk(KERN_INFO format , ## args) : 0)
++      #define KLIPS_PRINTMORE(flag, format, args...) \
++              ((flag) ? printk(format , ## args) : 0)
++      #define KLIPS_IP_PRINT(flag, ip) \
++              ((flag) ? ipsec_print_ip(ip) : 0)
++      #define KLIPS_SATOT(flag, sa, format, dst, dstlen) \
++              ((flag) ? satot(sa, format, dst, dstlen) : 0)
++#else /* CONFIG_KLIPS_DEBUG */
++        #define KLIPS_ERROR(flag, format, args...) if(printk_ratelimit()) printk(KERN_ERR "KLIPS " format, ## args)
++      #define KLIPS_PRINT(flag, format, args...) do ; while(0)
++      #define KLIPS_PRINTMORE(flag, format, args...) do ; while(0)
++      #define KLIPS_IP_PRINT(flag, ip) do ; while(0)
++      #define KLIPS_SATOT(flag, sa, format, dst, dstlen) (0)
++#endif /* CONFIG_KLIPS_DEBUG */
++
++
++/* 
++ * Stupid kernel API differences in APIs. Not only do some
++ * kernels not have ip_select_ident, but some have differing APIs,
++ * and SuSE has one with one parameter, but no way of checking to
++ * see what is really what.
++ */
++
++#ifdef SUSE_LINUX_2_4_19_IS_STUPID
++#define KLIPS_IP_SELECT_IDENT(iph, skb) ip_select_ident(iph)
++#else
++
++/* simplest case, nothing */
++#if !defined(IP_SELECT_IDENT)
++#define KLIPS_IP_SELECT_IDENT(iph, skb)  do { iph->id = htons(ip_id_count++); } while(0)
++#endif
++
++/* kernels > 2.3.37-ish */
++#if defined(IP_SELECT_IDENT) && !defined(IP_SELECT_IDENT_NEW)
++#define KLIPS_IP_SELECT_IDENT(iph, skb) ip_select_ident(iph, skb->dst)
++#endif
++
++/* kernels > 2.4.2 */
++#if defined(IP_SELECT_IDENT) && defined(IP_SELECT_IDENT_NEW)
++#define KLIPS_IP_SELECT_IDENT(iph, skb) ip_select_ident(iph, skb->dst, NULL)
++#endif
++
++#endif /* SUSE_LINUX_2_4_19_IS_STUPID */
++
++/*
++ * make klips fail test:east-espiv-01.
++ * exploit is at testing/attacks/espiv
++ *
++ */
++#define KLIPS_IMPAIRMENT_ESPIV_CBC_ATTACK 0
++
++
++/* IP_FRAGMENT_LINEARIZE is set in freeswan.h if Kernel > 2.4.4 */
++#ifndef IP_FRAGMENT_LINEARIZE
++# define IP_FRAGMENT_LINEARIZE 0
++#endif /* IP_FRAGMENT_LINEARIZE */
++#endif /* __KERNEL__ */
++
++#ifdef NEED_INET_PROTOCOL
++#define inet_protocol net_protocol
++#endif
++
++#if defined(CONFIG_IPSEC_NAT_TRAVERSAL) && CONFIG_IPSEC_NAT_TRAVERSAL
++#define NAT_TRAVERSAL 1
++#else
++/* let people either #undef, or #define = 0 it */
++#ifdef CONFIG_IPSEC_NAT_TRAVERSAL
++#undef CONFIG_IPSEC_NAT_TRAVERSAL
++#endif
++#endif
++
++#ifndef IPSEC_DEFAULT_TTL
++#define IPSEC_DEFAULT_TTL 64
++#endif
++
++#define _IPSEC_PARAM_H_
++#endif /* _IPSEC_PARAM_H_ */
++
++/*
++ * Local variables:
++ * c-file-style: "linux"
++ * End:
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_policy.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,239 @@
++#ifndef _IPSEC_POLICY_H
++/*
++ * policy interface file between pluto and applications
++ * Copyright (C) 2003              Michael Richardson <mcr@freeswan.org>
++ * 
++ * This library is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU Library General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.  See <http://www.fsf.org/copyleft/lgpl.txt>.
++ * 
++ * This library 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 Library General Public
++ * License for more details.
++ *
++ * RCSID $Id: ipsec_policy.h,v 1.8 2005/07/26 01:12:38 mcr Exp $
++ */
++#define       _IPSEC_POLICY_H         /* seen it, no need to see it again */
++
++
++/*
++ * this file defines an interface between an application (or rather an
++ * application library) and a key/policy daemon. It provides for inquiries
++ * as to the current state of a connected socket, as well as for general
++ * questions.
++ *
++ * In general, the interface is defined as a series of functional interfaces,
++ * and the policy messages should be internal. However, because this is in
++ * fact an ABI between pieces of the system that may get compiled and revised
++ * seperately, this ABI must be public and revision controlled.
++ *
++ * It is expected that the daemon will always support previous versions.
++ */
++
++#define IPSEC_POLICY_MSG_REVISION (unsigned)200305061
++
++enum ipsec_policy_command {
++  IPSEC_CMD_QUERY_FD       = 1,
++  IPSEC_CMD_QUERY_HOSTPAIR = 2,
++  IPSEC_CMD_QUERY_DSTONLY  = 3,
++};
++
++struct ipsec_policy_msg_head {
++  u_int32_t ipm_version;
++  u_int32_t ipm_msg_len;  
++  u_int32_t ipm_msg_type;
++  u_int32_t ipm_msg_seq;
++};
++
++enum ipsec_privacy_quality {
++  IPSEC_PRIVACY_NONE     = 0,
++  IPSEC_PRIVACY_INTEGRAL = 4,   /* not private at all. AH-like */
++  IPSEC_PRIVACY_UNKNOWN  = 8,   /* something is claimed, but details unavail */
++  IPSEC_PRIVACY_ROT13    = 12,  /* trivially breakable, i.e. 1DES */
++  IPSEC_PRIVACY_GAK      = 16,  /* known eavesdroppers */
++  IPSEC_PRIVACY_PRIVATE  = 32,  /* secure for at least a decade */
++  IPSEC_PRIVACY_STRONG   = 64,  /* ridiculously secure */
++  IPSEC_PRIVACY_TORTOISE = 192, /* even stronger, but very slow */
++  IPSEC_PRIVACY_OTP      = 224, /* some kind of *true* one time pad */
++};
++
++enum ipsec_bandwidth_quality {
++  IPSEC_QOS_UNKNOWN = 0,       /* unknown bandwidth */
++  IPSEC_QOS_INTERACTIVE = 16,  /* reasonably moderate jitter, moderate fast.
++                                Good enough for telnet/ssh. */
++  IPSEC_QOS_VOIP        = 32,  /* faster crypto, predicable jitter */
++  IPSEC_QOS_FTP         = 64,  /* higher throughput crypto, perhaps hardware
++                                offloaded, but latency/jitter may be bad */
++  IPSEC_QOS_WIRESPEED   = 128, /* expect to be able to fill your pipe */
++};
++
++/* moved from programs/pluto/constants.h */
++/* IPsec AH transform values
++ * RFC2407 The Internet IP security Domain of Interpretation for ISAKMP 4.4.3
++ * and in http://www.iana.org/assignments/isakmp-registry
++ */
++enum ipsec_authentication_algo {
++  AH_NONE=0,
++  AH_MD5=2,
++  AH_SHA=3,
++  AH_DES=4,
++  AH_SHA2_256=5,
++  AH_SHA2_384=6,
++  AH_SHA2_512=7,
++  AH_RIPEMD=8,
++  AH__AES_XCBC_MAC=9,
++  AH_RSA=10
++};
++
++/* IPsec ESP transform values
++ * RFC2407 The Internet IP security Domain of Interpretation for ISAKMP 4.4.4
++ * and from http://www.iana.org/assignments/isakmp-registry
++ */
++
++enum ipsec_cipher_algo {
++  ESP_reserved=0,
++  ESP_DES_IV64=1,
++  ESP_DES=2,
++  ESP_3DES=3,
++  ESP_RC5=4,
++  ESP_IDEA=5,
++  ESP_CAST=6,
++  ESP_BLOWFISH=7,
++  ESP_3IDEA=8,
++  ESP_DES_IV32=9,
++  ESP_RC4=10,
++  ESP_NULL=11,
++  ESP_AES=12,         /* 128 bit AES */
++  ESP_AES_CTR=13,
++  ESP_AES_CCM_8=14,
++  ESP_AES_CCM_12=15,
++  ESP_AES_CCM_16=16,
++  /* unassigned=17 */
++  ESP_AES_GCM_8=18,
++  ESP_AES_GCM_12=19,
++  ESP_AES_GCM_16=20,
++  ESP_SEED_CBC=21,
++  ESP_CAMELLIA=22,
++  /* 249-255 reserved for private use */
++};
++
++/* IPCOMP transform values
++ * RFC2407 The Internet IP security Domain of Interpretation for ISAKMP 4.4.5
++ */
++
++enum ipsec_comp_algo {
++  IPCOMP_OUI=               1,
++  IPCOMP_DEFLATE=           2,
++  IPCOMP_LZS=               3,
++  IPCOMP_V42BIS=            4
++};
++
++/* Identification type values
++ * RFC 2407 The Internet IP security Domain of Interpretation for
++ * ISAKMP 4.6.2.1
++ *
++ * Also for RFC4306. 
++ *
++ * enum ident_names;
++ */
++
++enum ipsec_id_type {
++      ID_FROMCERT=         (-3),      /* taken from certificate */
++  ID_IMPOSSIBLE=             (-2),    /* private to Pluto */
++  ID_MYID=                   (-1),    /* private to Pluto */
++  ID_NONE=                     0,     /* private to Pluto */
++  ID_IPV4_ADDR=                1,
++  ID_FQDN=                     2,
++  ID_USER_FQDN=                3,
++  ID_RFC822_ADDR = ID_USER_FQDN,        /* RFC4306 */
++  ID_IPV4_ADDR_SUBNET=         4,
++  ID_IPV6_ADDR=                5,
++  ID_IPV6_ADDR_SUBNET=         6,
++  ID_IPV4_ADDR_RANGE=          7,
++  ID_IPV6_ADDR_RANGE=          8,
++  ID_DER_ASN1_DN=              9,
++  ID_DER_ASN1_GN=              10,
++  ID_KEY_ID=                   11
++};
++
++/* Certificate type values
++ * RFC 2408 ISAKMP, chapter 3.9
++ */
++enum ipsec_cert_type {
++  CERT_NONE=                  0,  /* none, or guess from file contents */
++  CERT_PKCS7_WRAPPED_X509=    1,  /* self-signed certificate from disk */
++  CERT_PGP=                   2,
++  CERT_DNS_SIGNED_KEY=                3,  /* KEY RR from DNS */
++  CERT_X509_SIGNATURE=                4,
++  CERT_X509_KEY_EXCHANGE=     5,
++  CERT_KERBEROS_TOKENS=               6,
++  CERT_CRL=                   7,
++  CERT_ARL=                   8,
++  CERT_SPKI=                  9,
++  CERT_X509_ATTRIBUTE=                10,
++  CERT_RAW_RSA=                 11, /* raw RSA from config file */ 
++};
++
++/* a SIG record in ASCII */
++struct ipsec_dns_sig {
++  char fqdn[256];
++  char dns_sig[768];     /* empty string if not signed */
++};
++
++struct ipsec_raw_key {
++  char id_name[256];
++  char fs_keyid[8];
++};
++
++struct ipsec_identity {
++  enum ipsec_id_type     ii_type;
++  enum ipsec_cert_type   ii_format;
++  union {
++    struct ipsec_dns_sig ipsec_dns_signed;
++    /* some thing for PGP */
++    /* some thing for PKIX */
++    struct ipsec_raw_key ipsec_raw_key;
++  } ii_credential;
++};
++
++#define IPSEC_MAX_CREDENTIALS 32
++
++struct ipsec_policy_cmd_query {
++  struct ipsec_policy_msg_head head;
++
++  /* Query section */
++  ip_address query_local;     /* us   */
++  ip_address query_remote;    /* them */
++  u_int8_t proto;             /* TCP, ICMP, etc. */
++  u_short src_port, dst_port;
++
++  /* Answer section */
++  enum ipsec_privacy_quality     strength;
++  enum ipsec_bandwidth_quality   bandwidth;
++  enum ipsec_authentication_algo auth_detail;  
++  enum ipsec_cipher_algo         esp_detail;
++  enum ipsec_comp_algo           comp_detail;
++
++  int                            credential_count;
++
++  struct ipsec_identity credentials[IPSEC_MAX_CREDENTIALS];
++};
++
++#define IPSEC_POLICY_SOCKET "/var/run/pluto/pluto.info"
++
++/* prototypes */
++extern err_t ipsec_policy_lookup(int fd, struct ipsec_policy_cmd_query *result);
++extern err_t ipsec_policy_init(void);
++extern err_t ipsec_policy_final(void);
++extern err_t ipsec_policy_readmsg(int policysock,
++                                unsigned char *buf, size_t buflen);
++extern err_t ipsec_policy_sendrecv(unsigned char *buf, size_t buflen);
++extern err_t ipsec_policy_cgilookup(struct ipsec_policy_cmd_query *result);
++
++
++extern const char *ipsec_policy_version_code(void);
++extern const char *ipsec_policy_version_string(void);
++
++#endif /* _IPSEC_POLICY_H */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_proto.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,195 @@
++/*
++ * @(#) prototypes for FreeSWAN functions 
++ *
++ * Copyright (C) 2001  Richard Guy Briggs  <rgb@freeswan.org>
++ *                 and Michael Richardson  <mcr@freeswan.org>
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_proto.h,v 1.14 2005/04/29 04:50:03 mcr Exp $
++ *
++ */
++
++#ifndef _IPSEC_PROTO_H_
++
++#include "ipsec_param.h"
++
++/* 
++ * This file is a kernel only file that declares prototypes for
++ * all intra-module function calls and global data structures.
++ *
++ * Include this file last.
++ *
++ */
++
++/* forward references */
++enum ipsec_direction;
++enum ipsec_life_type;
++struct ipsec_lifetime64;
++struct ident;
++struct sockaddr_encap;
++struct ipsec_sa;
++
++/* ipsec_init.c */
++extern struct prng ipsec_prng;
++
++/* ipsec_sa.c */
++extern struct ipsec_sa *ipsec_sadb_hash[SADB_HASHMOD];
++extern spinlock_t       tdb_lock;
++extern int ipsec_sadb_init(void);
++extern int ipsec_sadb_cleanup(__u8);
++
++extern struct ipsec_sa *ipsec_sa_alloc(int*error); 
++
++
++extern struct ipsec_sa *ipsec_sa_getbyid(ip_said *);
++extern /* void */ int ipsec_sa_add(struct ipsec_sa *);
++
++extern int ipsec_sa_init(struct ipsec_sa *ipsp);
++
++/* debug declarations */
++
++/* ipsec_proc.c */
++extern int  ipsec_proc_init(void);
++extern void ipsec_proc_cleanup(void);
++
++/* ipsec_rcv.c */
++extern int ipsec_rcv(struct sk_buff *skb);
++extern int klips26_rcv_encap(struct sk_buff *skb, __u16 encap_type);
++
++/* ipsec_xmit.c */
++struct ipsec_xmit_state;
++extern enum ipsec_xmit_value ipsec_xmit_sanity_check_dev(struct ipsec_xmit_state *ixs);
++extern enum ipsec_xmit_value ipsec_xmit_sanity_check_skb(struct ipsec_xmit_state *ixs);
++extern void ipsec_print_ip(struct iphdr *ip);
++
++
++
++/* ipsec_radij.c */
++extern int ipsec_makeroute(struct sockaddr_encap *ea,
++                         struct sockaddr_encap *em,
++                         ip_said said,
++                         uint32_t pid,
++                         struct sk_buff *skb,
++                         struct ident *ident_s,
++                         struct ident *ident_d);
++
++extern int ipsec_breakroute(struct sockaddr_encap *ea,
++                          struct sockaddr_encap *em,
++                          struct sk_buff **first,
++                          struct sk_buff **last);
++
++int ipsec_radijinit(void);
++int ipsec_cleareroutes(void);
++int ipsec_radijcleanup(void);
++
++/* ipsec_life.c */
++extern enum ipsec_life_alive ipsec_lifetime_check(struct ipsec_lifetime64 *il64,
++                                                const char *lifename,
++                                                const char *saname,
++                                                enum ipsec_life_type ilt,
++                                                enum ipsec_direction idir,
++                                                struct ipsec_sa *ips);
++
++
++extern int ipsec_lifetime_format(char *buffer,
++                               int   buflen,
++                               char *lifename,
++                               enum ipsec_life_type timebaselife,
++                               struct ipsec_lifetime64 *lifetime);
++
++extern void ipsec_lifetime_update_hard(struct ipsec_lifetime64 *lifetime,
++                                     __u64 newvalue);
++
++extern void ipsec_lifetime_update_soft(struct ipsec_lifetime64 *lifetime,
++                                     __u64 newvalue);
++
++/* ipsec_snprintf.c */
++extern int ipsec_snprintf(char * buf, ssize_t size, const char *fmt, ...);
++extern void ipsec_dmp_block(char *s, caddr_t bb, int len);
++
++
++/* ipsec_alg.c */
++extern int ipsec_alg_init(void);
++
++
++#ifdef CONFIG_KLIPS_DEBUG
++
++extern int debug_xform;
++extern int debug_eroute;
++extern int debug_spi;
++extern int debug_netlink;
++
++#endif /* CONFIG_KLIPS_DEBUG */
++
++
++
++
++#define _IPSEC_PROTO_H
++#endif /* _IPSEC_PROTO_H_ */
++
++/*
++ * $Log: ipsec_proto.h,v $
++ * Revision 1.14  2005/04/29 04:50:03  mcr
++ *    prototypes for xmit and alg code.
++ *
++ * Revision 1.13  2005/04/17 03:46:07  mcr
++ *    added prototypes for ipsec_rcv() routines.
++ *
++ * Revision 1.12  2005/04/14 20:28:37  mcr
++ *    added additional prototypes.
++ *
++ * Revision 1.11  2005/04/14 01:16:28  mcr
++ *    add prototypes for snprintf.
++ *
++ * Revision 1.10  2005/04/13 22:47:28  mcr
++ *    make sure that forward references are available.
++ *
++ * Revision 1.9  2004/07/10 19:08:41  mcr
++ *    CONFIG_IPSEC -> CONFIG_KLIPS.
++ *
++ * Revision 1.8  2004/04/05 19:55:06  mcr
++ * Moved from linux/include/freeswan/ipsec_proto.h,v
++ *
++ * Revision 1.7  2003/10/31 02:27:05  mcr
++ *    pulled up port-selector patches and sa_id elimination.
++ *
++ * Revision 1.6.30.1  2003/10/29 01:10:19  mcr
++ *    elimited "struct sa_id"
++ *
++ * Revision 1.6  2002/05/23 07:13:48  rgb
++ * Added ipsec_sa_put() for releasing an ipsec_sa refcount.
++ *
++ * Revision 1.5  2002/05/14 02:36:40  rgb
++ * Converted reference from ipsec_sa_put to ipsec_sa_add to avoid confusion
++ * with "put" usage in the kernel.
++ *
++ * Revision 1.4  2002/04/24 07:36:47  mcr
++ * Moved from ./klips/net/ipsec/ipsec_proto.h,v
++ *
++ * Revision 1.3  2002/04/20 00:12:25  rgb
++ * Added esp IV CBC attack fix, disabled.
++ *
++ * Revision 1.2  2001/11/26 09:16:15  rgb
++ * Merge MCR's ipsec_sa, eroute, proc and struct lifetime changes.
++ *
++ * Revision 1.1.2.1  2001/09/25 02:21:01  mcr
++ *    ipsec_proto.h created to keep prototypes rather than deal with
++ *    cyclic dependancies of structures and prototypes in .h files.
++ *
++ *
++ *
++ * Local variables:
++ * c-file-style: "linux"
++ * End:
++ *
++ */
++
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_radij.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,179 @@
++/*
++ * @(#) Definitions relevant to the IPSEC <> radij tree interfacing
++ * Copyright (C) 1996, 1997  John Ioannidis.
++ * Copyright (C) 1998, 1999, 2000, 2001  Richard Guy Briggs.
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_radij.h,v 1.22 2004/07/10 19:08:41 mcr Exp $
++ */
++
++#ifndef _IPSEC_RADIJ_H
++
++#include <openswan.h>
++
++int ipsec_walk(char *);
++
++int ipsec_rj_walker_procprint(struct radij_node *, void *);
++int ipsec_rj_walker_delete(struct radij_node *, void *);
++
++/* This structure is used to pass information between
++ * ipsec_eroute_get_info and ipsec_rj_walker_procprint
++ * (through rj_walktree) and between calls of ipsec_rj_walker_procprint.
++ */
++struct wsbuf
++{
++       /* from caller of ipsec_eroute_get_info: */
++       char *const buffer;     /* start of buffer provided */
++       const int length;       /* length of buffer provided */
++       const off_t offset;     /* file position of first character of interest */
++       /* accumulated by ipsec_rj_walker_procprint: */
++       int len;        /* number of character filled into buffer */
++       off_t begin;    /* file position contained in buffer[0] (<=offset) */
++};
++
++extern struct radij_node_head *rnh;
++extern spinlock_t eroute_lock;
++
++struct eroute * ipsec_findroute(struct sockaddr_encap *);
++
++#define O1(x) (int)(((x)>>24)&0xff)
++#define O2(x) (int)(((x)>>16)&0xff)
++#define O3(x) (int)(((x)>>8)&0xff)
++#define O4(x) (int)(((x))&0xff)
++
++#ifdef CONFIG_KLIPS_DEBUG
++extern int debug_radij;
++void rj_dumptrees(void);
++
++#define DB_RJ_DUMPTREES       0x0001
++#define DB_RJ_FINDROUTE 0x0002
++#endif /* CONFIG_KLIPS_DEBUG */
++
++#define _IPSEC_RADIJ_H
++#endif
++
++/*
++ * $Log: ipsec_radij.h,v $
++ * Revision 1.22  2004/07/10 19:08:41  mcr
++ *    CONFIG_IPSEC -> CONFIG_KLIPS.
++ *
++ * Revision 1.21  2004/04/29 11:06:42  ken
++ * Last bits from 2.06 procfs updates
++ *
++ * Revision 1.20  2004/04/06 02:49:08  mcr
++ *    pullup of algo code from alg-branch.
++ *
++ * Revision 1.19  2004/04/05 19:55:06  mcr
++ * Moved from linux/include/freeswan/ipsec_radij.h,v
++ *
++ * Revision 1.18  2002/04/24 07:36:47  mcr
++ * Moved from ./klips/net/ipsec/ipsec_radij.h,v
++ *
++ * Revision 1.17  2001/11/26 09:23:49  rgb
++ * Merge MCR's ipsec_sa, eroute, proc and struct lifetime changes.
++ *
++ * Revision 1.16.2.1  2001/09/25 02:21:17  mcr
++ *    ipsec_proto.h created to keep prototypes rather than deal with
++ *    cyclic dependancies of structures and prototypes in .h files.
++ *
++ * Revision 1.16  2001/09/15 16:24:04  rgb
++ * Re-inject first and last HOLD packet when an eroute REPLACE is done.
++ *
++ * Revision 1.15  2001/09/14 16:58:37  rgb
++ * Added support for storing the first and last packets through a HOLD.
++ *
++ * Revision 1.14  2001/09/08 21:13:32  rgb
++ * Added pfkey ident extension support for ISAKMPd. (NetCelo)
++ *
++ * Revision 1.13  2001/06/14 19:35:09  rgb
++ * Update copyright date.
++ *
++ * Revision 1.12  2001/05/27 06:12:11  rgb
++ * Added structures for pid, packet count and last access time to eroute.
++ * Added packet count to beginning of /proc/net/ipsec_eroute.
++ *
++ * Revision 1.11  2000/09/08 19:12:56  rgb
++ * Change references from DEBUG_IPSEC to CONFIG_IPSEC_DEBUG.
++ *
++ * Revision 1.10  1999/11/17 15:53:39  rgb
++ * Changed all occurrences of #include "../../../lib/freeswan.h"
++ * to #include <freeswan.h> which works due to -Ilibfreeswan in the
++ * klips/net/ipsec/Makefile.
++ *
++ * Revision 1.9  1999/10/01 00:01:23  rgb
++ * Added eroute structure locking.
++ *
++ * Revision 1.8  1999/04/11 00:28:59  henry
++ * GPL boilerplate
++ *
++ * Revision 1.7  1999/04/06 04:54:26  rgb
++ * Fix/Add RCSID Id: and Log: bits to make PHMDs happy.  This includes
++ * patch shell fixes.
++ *
++ * Revision 1.6  1999/01/22 06:23:26  rgb
++ * Cruft clean-out.
++ *
++ * Revision 1.5  1998/10/25 02:42:08  rgb
++ * Change return type on ipsec_breakroute and ipsec_makeroute and add an
++ * argument to be able to transmit more infomation about errors.
++ *
++ * Revision 1.4  1998/10/19 14:44:29  rgb
++ * Added inclusion of freeswan.h.
++ * sa_id structure implemented and used: now includes protocol.
++ *
++ * Revision 1.3  1998/07/28 00:03:31  rgb
++ * Comment out temporary inet_nto4u() kluge.
++ *
++ * Revision 1.2  1998/07/14 18:22:00  rgb
++ * Add function to clear the eroute table.
++ *
++ * Revision 1.1  1998/06/18 21:27:49  henry
++ * move sources from klips/src to klips/net/ipsec, to keep stupid
++ * kernel-build scripts happier in the presence of symlinks
++ *
++ * Revision 1.5  1998/05/25 20:30:38  rgb
++ * Remove temporary ipsec_walk, rj_deltree and rj_delnodes functions.
++ *
++ * Rename ipsec_rj_walker (ipsec_walk) to ipsec_rj_walker_procprint and
++ * add ipsec_rj_walker_delete.
++ *
++ * Revision 1.4  1998/05/21 13:02:56  rgb
++ * Imported definitions from ipsec_radij.c and radij.c to support /proc 3k
++ * limit fix.
++ *
++ * Revision 1.3  1998/04/21 21:29:09  rgb
++ * Rearrange debug switches to change on the fly debug output from user
++ * space.  Only kernel changes checked in at this time.  radij.c was also
++ * changed to temporarily remove buggy debugging code in rj_delete causing
++ * an OOPS and hence, netlink device open errors.
++ *
++ * Revision 1.2  1998/04/14 17:30:39  rgb
++ * Fix up compiling errors for radij tree memory reclamation.
++ *
++ * Revision 1.1  1998/04/09 03:06:10  henry
++ * sources moved up from linux/net/ipsec
++ *
++ * Revision 1.1.1.1  1998/04/08 05:35:04  henry
++ * RGB's ipsec-0.8pre2.tar.gz ipsec-0.8
++ *
++ * Revision 0.4  1997/01/15 01:28:15  ji
++ * No changes.
++ *
++ * Revision 0.3  1996/11/20 14:39:04  ji
++ * Minor cleanups.
++ * Rationalized debugging code.
++ *
++ * Revision 0.2  1996/11/02 00:18:33  ji
++ * First limited release.
++ *
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_rcv.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,261 @@
++/*
++ * 
++ * Copyright (C) 1996, 1997  John Ioannidis.
++ * Copyright (C) 1998, 1999, 2000, 2001  Richard Guy Briggs.
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_rcv.h,v 1.28.2.1 2006/07/10 15:52:20 paul Exp $
++ */
++
++#ifndef IPSEC_RCV_H
++#define IPSEC_RCV_H
++
++#include "openswan/ipsec_auth.h"
++
++#define DB_RX_PKTRX   0x0001
++#define DB_RX_PKTRX2  0x0002
++#define DB_RX_DMP     0x0004
++#define DB_RX_IPSA    0x0010
++#define DB_RX_XF      0x0020
++#define DB_RX_IPAD    0x0040
++#define DB_RX_INAU    0x0080
++#define DB_RX_OINFO   0x0100
++#define DB_RX_OINFO2  0x0200
++#define DB_RX_OH      0x0400
++#define DB_RX_REPLAY  0x0800
++
++#ifdef __KERNEL__
++/* struct options; */
++
++#define __NO_VERSION__
++#ifndef AUTOCONF_INCLUDED
++#include <linux/config.h>
++#endif        /* for CONFIG_IP_FORWARD */
++#ifdef CONFIG_MODULES
++#include <linux/module.h>
++#endif
++#include <linux/version.h>
++#include <openswan.h>
++
++#ifdef CONFIG_KLIPS_OCF
++#include <cryptodev.h>
++#endif
++
++#define IPSEC_BIRTH_TEMPLATE_MAXLEN 256
++
++struct ipsec_birth_reply {
++  int            packet_template_len;
++  unsigned char  packet_template[IPSEC_BIRTH_TEMPLATE_MAXLEN];
++};
++
++extern struct ipsec_birth_reply ipsec_ipv4_birth_packet;
++extern struct ipsec_birth_reply ipsec_ipv6_birth_packet;
++
++enum ipsec_rcv_value {
++      IPSEC_RCV_PENDING=2,
++      IPSEC_RCV_LASTPROTO=1,
++      IPSEC_RCV_OK=0,
++      IPSEC_RCV_BADPROTO=-1,
++      IPSEC_RCV_BADLEN=-2,
++      IPSEC_RCV_ESP_BADALG=-3,
++      IPSEC_RCV_3DES_BADBLOCKING=-4,
++      IPSEC_RCV_ESP_DECAPFAIL=-5,
++      IPSEC_RCV_DECAPFAIL=-6,
++      IPSEC_RCV_SAIDNOTFOUND=-7,
++      IPSEC_RCV_IPCOMPALONE=-8,
++      IPSEC_RCV_IPCOMPFAILED=-10,
++      IPSEC_RCV_SAIDNOTLIVE=-11,
++      IPSEC_RCV_FAILEDINBOUND=-12,
++      IPSEC_RCV_LIFETIMEFAILED=-13,
++      IPSEC_RCV_BADAUTH=-14,
++      IPSEC_RCV_REPLAYFAILED=-15,
++      IPSEC_RCV_AUTHFAILED=-16,
++      IPSEC_RCV_REPLAYROLLED=-17,
++      IPSEC_RCV_BAD_DECRYPT=-18,
++      IPSEC_RCV_REALLYBAD=-19
++};
++
++/*
++ * state machine states
++ */
++
++#define IPSEC_RSM_INIT                        0       /* make it easy, starting state is 0 */
++#define       IPSEC_RSM_DECAP_INIT    1
++#define       IPSEC_RSM_DECAP_LOOKUP  2
++#define       IPSEC_RSM_AUTH_INIT             3
++#define       IPSEC_RSM_AUTH_DECAP    4
++#define       IPSEC_RSM_AUTH_CALC             5
++#define       IPSEC_RSM_AUTH_CHK              6
++#define       IPSEC_RSM_DECRYPT               7
++#define       IPSEC_RSM_DECAP_CONT    8       /* do we restart at IPSEC_RSM_DECAP_INIT */
++#define       IPSEC_RSM_CLEANUP               9
++#define       IPSEC_RSM_IPCOMP                10
++#define       IPSEC_RSM_COMPLETE              11
++#define IPSEC_RSM_DONE                        100
++
++struct ipsec_rcv_state {
++      struct sk_buff *skb;
++      struct net_device_stats *stats;
++      struct iphdr    *ipp;          /* the IP header */
++      struct ipsec_sa *ipsp;         /* current SA being processed */
++      struct ipsec_sa *lastipsp;     /* last SA that was processed */
++      int len;                       /* length of packet */
++      int ilen;                      /* length of inner payload (-authlen) */
++      int authlen;                   /* how big is the auth data at end */
++      int hard_header_len;           /* layer 2 size */
++      int iphlen;                    /* how big is IP header */
++      unsigned int   transport_direct:1;
++      struct auth_alg *authfuncs;
++      ip_said said;
++      char   sa[SATOT_BUF];
++      size_t sa_len;
++      __u8 next_header;
++      __u8 hash[AH_AMAX];
++      char ipsaddr_txt[ADDRTOA_BUF];
++      char ipdaddr_txt[ADDRTOA_BUF];
++      __u8 *octx;
++      __u8 *ictx;
++      int ictx_len;
++      int octx_len;
++      union {
++              struct {
++                      struct esphdr *espp;
++              } espstuff;
++              struct {
++                      struct ahhdr *ahp;
++              } ahstuff;
++              struct {
++                      struct ipcomphdr *compp;
++              } ipcompstuff;
++      } protostuff;
++#ifdef CONFIG_IPSEC_NAT_TRAVERSAL
++      __u8            natt_type;
++      __u16           natt_sport;
++      __u16           natt_dport;
++      int             natt_len; 
++#endif  
++
++      /*
++       * rcv state machine use
++       */
++      int             state;
++      int             next_state;
++      int             auth_checked;
++
++#ifdef CONFIG_KLIPS_OCF
++      struct work_struct      workq;
++#ifdef DECLARE_TASKLET
++      struct tasklet_struct   tasklet;
++#endif
++#endif
++#ifndef NET_21
++      struct net_device *devp;
++      struct inet_protocol *protop;
++#endif
++      struct xform_functions *proto_funcs;
++      __u8 proto;
++      int replay;
++      unsigned char *authenticator;
++      int esphlen;
++#ifdef CONFIG_KLIPS_ALG
++      struct ipsec_alg_auth *ixt_a;
++#endif
++      __u8 ttl, tos;
++      __u16 frag_off, check;
++};
++
++extern void ipsec_rsm(struct ipsec_rcv_state *irs);
++#ifdef HAVE_KMEM_CACHE_T
++extern kmem_cache_t *ipsec_irs_cache;
++#else
++extern struct kmem_cache *ipsec_irs_cache;
++#endif
++extern int ipsec_irs_max;
++extern atomic_t ipsec_irs_cnt;
++
++extern int
++#ifdef PROTO_HANDLER_SINGLE_PARM
++ipsec_rcv(struct sk_buff *skb);
++#else /* PROTO_HANDLER_SINGLE_PARM */
++ipsec_rcv(struct sk_buff *skb,
++        unsigned short xlen);
++#endif /* PROTO_HANDLER_SINGLE_PARM */
++
++#ifdef CONFIG_KLIPS_DEBUG
++extern int debug_rcv;
++#define ipsec_rcv_dmp(_x,_y, _z) if (debug_rcv && sysctl_ipsec_debug_verbose) ipsec_dmp_block(_x,_y,_z)
++#else
++#define ipsec_rcv_dmp(_x,_y, _z) do {} while(0)
++#endif /* CONFIG_KLIPS_DEBUG */
++
++extern int sysctl_ipsec_inbound_policy_check;
++#endif /* __KERNEL__ */
++
++extern int klips26_udp_encap_rcv(struct sock *sk, struct sk_buff *skb);
++extern int klips26_rcv_encap(struct sk_buff *skb, __u16 encap_type);
++
++// manage ipsec rcv state objects
++extern int ipsec_rcv_state_cache_init (void);
++extern void ipsec_rcv_state_cache_cleanup (void);
++
++#endif /* IPSEC_RCV_H */
++
++/*
++ * $Log: ipsec_rcv.h,v $
++ * Revision 1.28.2.1  2006/07/10 15:52:20  paul
++ * Fix for bug #642 by Bart Trojanowski
++ *
++ * Revision 1.28  2005/05/11 00:59:45  mcr
++ *    do not call debug routines if !defined KLIPS_DEBUG.
++ *
++ * Revision 1.27  2005/04/29 04:59:46  mcr
++ *    use ipsec_dmp_block.
++ *
++ * Revision 1.26  2005/04/13 22:48:35  mcr
++ *    added comments, and removed some log.
++ *    removed Linux 2.0 support.
++ *
++ * Revision 1.25  2005/04/08 18:25:37  mcr
++ *    prototype klips26 encap receive function
++ *
++ * Revision 1.24  2004/08/20 21:45:37  mcr
++ *    CONFIG_KLIPS_NAT_TRAVERSAL is not used in an attempt to
++ *    be 26sec compatible. But, some defines where changed.
++ *
++ * Revision 1.23  2004/08/03 18:17:40  mcr
++ *    in 2.6, use "net_device" instead of #define device->net_device.
++ *    this probably breaks 2.0 compiles.
++ *
++ * Revision 1.22  2004/07/10 19:08:41  mcr
++ *    CONFIG_IPSEC -> CONFIG_KLIPS.
++ *
++ * Revision 1.21  2004/04/06 02:49:08  mcr
++ *    pullup of algo code from alg-branch.
++ *
++ * Revision 1.20  2004/04/05 19:55:06  mcr
++ * Moved from linux/include/freeswan/ipsec_rcv.h,v
++ *
++ * Revision 1.19  2003/12/15 18:13:09  mcr
++ *    when compiling with NAT traversal, don't assume that the
++ *    kernel has been patched, unless CONFIG_IPSEC_NAT_NON_ESP
++ *    is set.
++ *
++ * history elided 2005-04-12.
++ *
++ * Local Variables:
++ * c-basic-offset:8
++ * c-style:linux
++ * End:
++ *
++ */
++
++
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_sa.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,280 @@
++/*
++ * @(#) Definitions of IPsec Security Association (ipsec_sa)
++ *
++ * Copyright (C) 2001, 2002, 2003
++ *                      Richard Guy Briggs  <rgb@freeswan.org>
++ *                  and Michael Richardson  <mcr@freeswan.org>
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_sa.h,v 1.23.2.1 2007/09/05 02:31:15 paul Exp $
++ *
++ * This file derived from ipsec_xform.h on 2001/9/18 by mcr.
++ *
++ */
++
++/* 
++ * This file describes the IPsec Security Association Structure.
++ *
++ * This structure keeps track of a single transform that may be done
++ * to a set of packets. It can describe applying the transform or
++ * apply the reverse. (e.g. compression vs expansion). However, it
++ * only describes one at a time. To describe both, two structures would
++ * be used, but since the sides of the transform are performed 
++ * on different machines typically it is usual to have only one side
++ * of each association.
++ * 
++ */
++
++#ifndef _IPSEC_SA_H_
++
++#ifdef __KERNEL__
++#include "openswan/ipsec_stats.h"
++#include "openswan/ipsec_life.h"
++#include "openswan/ipsec_eroute.h"
++#endif /* __KERNEL__ */
++#include "openswan/ipsec_param.h"
++
++#include "openswan/pfkeyv2.h"
++
++
++/* SAs are held in a table.
++ * Entries in this table are referenced by IPsecSAref_t values.
++ * IPsecSAref_t values are conceptually subscripts.  Because
++ * we want to allocate the table piece-meal, the subscripting
++ * is implemented with two levels, a bit like paged virtual memory.
++ * This representation mechanism is known as an Iliffe Vector.
++ *
++ * The Main table (AKA the refTable) consists of 2^IPSEC_SA_REF_MAINTABLE_IDX_WIDTH
++ * pointers to subtables.
++ * Each subtable has 2^IPSEC_SA_REF_SUBTABLE_IDX_WIDTH entries, each of which
++ * is a pointer to an SA.
++ *
++ * An IPsecSAref_t contains either an exceptional value (signified by the
++ * high-order bit being on) or a reference to a table entry.  A table entry
++ * reference has the subtable subscript in the low-order
++ * IPSEC_SA_REF_SUBTABLE_IDX_WIDTH bits and the Main table subscript
++ * in the next lowest IPSEC_SA_REF_MAINTABLE_IDX_WIDTH bits.
++ *
++ * The Maintable entry for an IPsecSAref_t x, a pointer to its subtable, is
++ * IPsecSAref2table(x).  It is of type struct IPsecSArefSubTable *.
++ *
++ * The pointer to the SA for x is IPsecSAref2SA(x).  It is of type
++ * struct ipsec_sa*.  The macro definition clearly shows the two-level
++ * access needed to find the SA pointer.
++ *
++ * The Maintable is allocated when IPsec is initialized.
++ * Each subtable is allocated when needed, but the first is allocated
++ * when IPsec is initialized.
++ *
++ * IPsecSAref_t is designed to be smaller than an NFmark so that
++ * they can be stored in NFmarks and still leave a few bits for other
++ * purposes.  The spare bits are in the low order of the NFmark
++ * but in the high order of the IPsecSAref_t, so conversion is required.
++ * We pick the upper bits of NFmark on the theory that they are less likely to
++ * interfere with more pedestrian uses of nfmark.
++ */
++
++
++typedef unsigned short int IPsecRefTableUnusedCount;
++
++#define IPSEC_SA_REF_TABLE_NUM_ENTRIES (1 << IPSEC_SA_REF_TABLE_IDX_WIDTH)
++
++#ifdef __KERNEL__
++#if ((IPSEC_SA_REF_TABLE_IDX_WIDTH - (1 + IPSEC_SA_REF_MAINTABLE_IDX_WIDTH)) < 0)
++#error "IPSEC_SA_REF_TABLE_IDX_WIDTH("IPSEC_SA_REF_TABLE_IDX_WIDTH") MUST be < 1 + IPSEC_SA_REF_MAINTABLE_IDX_WIDTH("IPSEC_SA_REF_MAINTABLE_IDX_WIDTH")"
++#endif
++
++#define IPSEC_SA_REF_SUBTABLE_IDX_WIDTH (IPSEC_SA_REF_TABLE_IDX_WIDTH - IPSEC_SA_REF_MAINTABLE_IDX_WIDTH)
++
++#define IPSEC_SA_REF_MAINTABLE_NUM_ENTRIES (1 << IPSEC_SA_REF_MAINTABLE_IDX_WIDTH)
++#define IPSEC_SA_REF_SUBTABLE_NUM_ENTRIES (1 << IPSEC_SA_REF_SUBTABLE_IDX_WIDTH)
++
++#ifdef CONFIG_NETFILTER
++#define IPSEC_SA_REF_HOST_FIELD(x) ((struct sk_buff*)(x))->nfmark
++#define IPSEC_SA_REF_HOST_FIELD_TYPE typeof(IPSEC_SA_REF_HOST_FIELD(NULL))
++#else /* CONFIG_NETFILTER */
++/* just make it work for now, it doesn't matter, since there is no nfmark */
++#define IPSEC_SA_REF_HOST_FIELD_TYPE unsigned long
++#endif /* CONFIG_NETFILTER */
++#define IPSEC_SA_REF_HOST_FIELD_WIDTH (8 * sizeof(IPSEC_SA_REF_HOST_FIELD_TYPE))
++#define IPSEC_SA_REF_FIELD_WIDTH (8 * sizeof(IPsecSAref_t))
++
++#define IPSEC_SA_REF_MAX         (~IPSEC_SAREF_NULL)
++#define IPSEC_SAREF_FIRST        1
++#define IPSEC_SA_REF_MASK        (IPSEC_SA_REF_MAX >> (IPSEC_SA_REF_FIELD_WIDTH - IPSEC_SA_REF_TABLE_IDX_WIDTH))
++#define IPSEC_SA_REF_TABLE_MASK ((IPSEC_SA_REF_MAX >> (IPSEC_SA_REF_FIELD_WIDTH - IPSEC_SA_REF_MAINTABLE_IDX_WIDTH)) << IPSEC_SA_REF_SUBTABLE_IDX_WIDTH)
++#define IPSEC_SA_REF_ENTRY_MASK  (IPSEC_SA_REF_MAX >> (IPSEC_SA_REF_FIELD_WIDTH - IPSEC_SA_REF_SUBTABLE_IDX_WIDTH))
++
++#define IPsecSAref2table(x) (((x) & IPSEC_SA_REF_TABLE_MASK) >> IPSEC_SA_REF_SUBTABLE_IDX_WIDTH)
++#define IPsecSAref2entry(x) ((x) & IPSEC_SA_REF_ENTRY_MASK)
++#define IPsecSArefBuild(x,y) (((x) << IPSEC_SA_REF_SUBTABLE_IDX_WIDTH) + (y))
++
++#define IPsecSAref2SA(x) (ipsec_sadb.refTable[IPsecSAref2table(x)]->entry[IPsecSAref2entry(x)])
++#define IPsecSA2SAref(x) ((x)->ips_ref)
++
++#define EMT_INBOUND   0x01    /* SA direction, 1=inbound */
++
++/* 'struct ipsec_sa' should be 64bit aligned when allocated. */
++struct ipsec_sa                               
++{
++      atomic_t        ips_refcount;   /* reference count for this struct */
++        int             ips_marked_deleted;     /* used with reference counting */
++      IPsecSAref_t    ips_ref;        /* reference table entry number */
++      IPsecSAref_t    ips_refhim;     /* ref of paired SA, if any */
++      struct ipsec_sa *ips_next;              /* pointer to next xform */
++
++      struct ipsec_sa *ips_hnext;             /* next in hash chain */
++
++      struct ifnet    *ips_rcvif;             /* related rcv encap interface */
++
++      struct xform_functions *ips_xformfuncs; /* pointer to routines to process this SA */
++
++      struct net_device *ips_out;             /* what interface to emerge on */
++      __u8            ips_transport_direct;   /* if true, punt directly to
++                                               * the protocol layer */
++      struct socket  *ips_sock;               /* cache of transport socket */
++
++      ip_said         ips_said;               /* SA ID */
++
++      __u32           ips_seq;                /* seq num of msg that initiated this SA */
++      __u32           ips_pid;                /* PID of process that initiated this SA */
++      __u8            ips_authalg;            /* auth algorithm for this SA */
++      __u8            ips_encalg;             /* enc algorithm for this SA */
++
++      struct ipsec_stats ips_errs;
++
++      __u8            ips_replaywin;          /* replay window size */
++      enum sadb_sastate ips_state;            /* state of SA */
++      __u32           ips_replaywin_lastseq;  /* last pkt sequence num */
++      __u64           ips_replaywin_bitmap;   /* bitmap of received pkts */
++      __u32           ips_replaywin_maxdiff;  /* max pkt sequence difference */
++
++      __u32           ips_flags;              /* generic xform flags */
++
++
++      struct ipsec_lifetimes ips_life;        /* lifetime records */
++
++      /* selector information */
++        __u8            ips_transport_protocol; /* protocol for this SA, if ports are involved */
++      struct sockaddr*ips_addr_s;             /* src sockaddr */
++      struct sockaddr*ips_addr_d;             /* dst sockaddr */
++      struct sockaddr*ips_addr_p;             /* proxy sockaddr */
++      __u16           ips_addr_s_size;
++      __u16           ips_addr_d_size;
++      __u16           ips_addr_p_size;
++      ip_address      ips_flow_s;
++      ip_address      ips_flow_d;
++      ip_address      ips_mask_s;
++      ip_address      ips_mask_d;
++
++      __u16           ips_key_bits_a;         /* size of authkey in bits */
++      __u16           ips_auth_bits;          /* size of authenticator in bits */
++      __u16           ips_key_bits_e;         /* size of enckey in bits */
++      __u16           ips_iv_bits;            /* size of IV in bits */
++      __u8            ips_iv_size;
++      __u16           ips_key_a_size;
++      __u16           ips_key_e_size;
++
++      caddr_t         ips_key_a;              /* authentication key */
++      caddr_t         ips_key_e;              /* encryption key */
++      caddr_t         ips_iv;                 /* Initialisation Vector */
++
++      struct ident    ips_ident_s;            /* identity src */
++      struct ident    ips_ident_d;            /* identity dst */
++
++        /* these are included even if CONFIG_KLIPS_IPCOMP is off */
++      __u16           ips_comp_adapt_tries;   /* ipcomp self-adaption tries */
++      __u16           ips_comp_adapt_skip;    /* ipcomp self-adaption to-skip */
++      __u64           ips_comp_ratio_cbytes;  /* compressed bytes */
++      __u64           ips_comp_ratio_dbytes;  /* decompressed (or uncompressed) bytes */
++
++        /* these are included even if CONFIG_IPSEC_NAT_TRAVERSAL is off */
++      __u8            ips_natt_type;
++      __u8            ips_natt_reserved[3];
++      __u16           ips_natt_sport;
++      __u16           ips_natt_dport;
++
++      struct sockaddr *ips_natt_oa;
++      __u16           ips_natt_oa_size;
++      __u16           ips_natt_reserved2;
++
++#if 0
++      __u32           ips_sens_dpd;
++      __u8            ips_sens_sens_level;
++      __u8            ips_sens_sens_len;
++      __u64*          ips_sens_sens_bitmap;
++      __u8            ips_sens_integ_level;
++      __u8            ips_sens_integ_len;
++      __u64*          ips_sens_integ_bitmap;
++#endif
++      struct ipsec_alg_enc *ips_alg_enc;
++      struct ipsec_alg_auth *ips_alg_auth;
++
++      int             ocf_in_use;
++      int64_t         ocf_cryptoid;
++};
++
++struct IPsecSArefSubTable
++{
++      struct ipsec_sa* entry[IPSEC_SA_REF_SUBTABLE_NUM_ENTRIES];
++};
++
++struct ipsec_sadb {
++      struct IPsecSArefSubTable* refTable[IPSEC_SA_REF_MAINTABLE_NUM_ENTRIES];
++      IPsecSAref_t refFreeList[IPSEC_SA_REF_FREELIST_NUM_ENTRIES];
++      int refFreeListHead;
++      int refFreeListTail;
++      IPsecSAref_t refFreeListCont;
++      IPsecSAref_t said_hash[SADB_HASHMOD];
++      spinlock_t sadb_lock;
++};
++
++extern struct ipsec_sadb ipsec_sadb;
++
++extern int ipsec_SAref_recycle(void);
++extern int ipsec_SArefSubTable_alloc(unsigned table);
++extern int ipsec_saref_freelist_init(void);
++extern int ipsec_sadb_init(void);
++extern struct ipsec_sa *ipsec_sa_alloc(int*error); /* pass in error var by pointer */
++extern IPsecSAref_t ipsec_SAref_alloc(int*erorr); /* pass in error var by pointer */
++extern int ipsec_sa_free(struct ipsec_sa* ips);
++
++#define ipsec_sa_get(ips) __ipsec_sa_get(ips, __FUNCTION__, __LINE__)
++extern struct ipsec_sa * __ipsec_sa_get(struct ipsec_sa *ips, const char *func, int line);
++
++#define ipsec_sa_put(ips) __ipsec_sa_put(ips, __FUNCTION__, __LINE__)
++extern void __ipsec_sa_put(struct ipsec_sa *ips, const char *func, int line);
++extern int ipsec_sa_add(struct ipsec_sa *ips);
++extern void ipsec_sa_rm(struct ipsec_sa *ips);
++extern int ipsec_sadb_cleanup(__u8 proto);
++extern int ipsec_sadb_free(void);
++extern int ipsec_sa_wipe(struct ipsec_sa *ips);
++extern int ipsec_sa_intern(struct ipsec_sa *ips);
++extern struct ipsec_sa *ipsec_sa_getbyref(IPsecSAref_t ref);
++
++extern void ipsec_sa_untern(struct ipsec_sa *ips);
++#endif /* __KERNEL__ */
++
++enum ipsec_direction {
++      ipsec_incoming = 1,
++      ipsec_outgoing = 2
++};
++
++#define _IPSEC_SA_H_
++#endif /* _IPSEC_SA_H_ */
++
++/*
++ * Local variables:
++ * c-file-style: "linux"
++ * End:
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_sha1.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,79 @@
++/*
++ * RCSID $Id: ipsec_sha1.h,v 1.8 2004/04/05 19:55:07 mcr Exp $
++ */
++
++/*
++ * Here is the original comment from the distribution:
++
++SHA-1 in C
++By Steve Reid <steve@edmweb.com>
++100% Public Domain
++
++ * Adapted for use by the IPSEC code by John Ioannidis
++ */
++
++
++#ifndef _IPSEC_SHA1_H_
++#define _IPSEC_SHA1_H_
++
++typedef struct
++{
++      __u32   state[5];
++      __u32   count[2];
++      __u8    buffer[64];
++} SHA1_CTX;
++
++void SHA1Transform(__u32 state[5], __u8 buffer[64]);
++void SHA1Init(void *context);
++void SHA1Update(void *context, unsigned char *data, __u32 len);
++void SHA1Final(unsigned char digest[20], void *context);
++
++ 
++#endif /* _IPSEC_SHA1_H_ */
++
++/*
++ * $Log: ipsec_sha1.h,v $
++ * Revision 1.8  2004/04/05 19:55:07  mcr
++ * Moved from linux/include/freeswan/ipsec_sha1.h,v
++ *
++ * Revision 1.7  2002/09/10 01:45:09  mcr
++ *    changed type of MD5_CTX and SHA1_CTX to void * so that
++ *    the function prototypes would match, and could be placed
++ *    into a pointer to a function.
++ *
++ * Revision 1.6  2002/04/24 07:36:47  mcr
++ * Moved from ./klips/net/ipsec/ipsec_sha1.h,v
++ *
++ * Revision 1.5  1999/12/13 13:59:13  rgb
++ * Quick fix to argument size to Update bugs.
++ *
++ * Revision 1.4  1999/12/07 18:16:23  rgb
++ * Fixed comments at end of #endif lines.
++ *
++ * Revision 1.3  1999/04/06 04:54:27  rgb
++ * Fix/Add RCSID Id: and Log: bits to make PHMDs happy.  This includes
++ * patch shell fixes.
++ *
++ * Revision 1.2  1998/11/30 13:22:54  rgb
++ * Rationalised all the klips kernel file headers.  They are much shorter
++ * now and won't conflict under RH5.2.
++ *
++ * Revision 1.1  1998/06/18 21:27:50  henry
++ * move sources from klips/src to klips/net/ipsec, to keep stupid
++ * kernel-build scripts happier in the presence of symlinks
++ *
++ * Revision 1.2  1998/04/23 20:54:05  rgb
++ * Fixed md5 and sha1 include file nesting issues, to be cleaned up when
++ * verified.
++ *
++ * Revision 1.1  1998/04/09 03:04:21  henry
++ * sources moved up from linux/net/ipsec
++ * these two include files modified not to include others except in kernel
++ *
++ * Revision 1.1.1.1  1998/04/08 05:35:04  henry
++ * RGB's ipsec-0.8pre2.tar.gz ipsec-0.8
++ *
++ * Revision 0.4  1997/01/15 01:28:15  ji
++ * New transform
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_stats.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,76 @@
++/*
++ * @(#) definition of ipsec_stats structure
++ *
++ * Copyright (C) 2001  Richard Guy Briggs  <rgb@freeswan.org>
++ *                 and Michael Richardson  <mcr@freeswan.org>
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_stats.h,v 1.7 2005/04/14 01:17:45 mcr Exp $
++ *
++ */
++
++/* 
++ * This file describes the errors/statistics that FreeSWAN collects.
++ */
++
++#ifndef _IPSEC_STATS_H_
++
++struct ipsec_stats {
++      __u32           ips_alg_errs;          /* number of algorithm errors */
++      __u32           ips_auth_errs;         /* # of authentication errors */
++      __u32           ips_encsize_errs;      /* # of encryption size errors*/
++      __u32           ips_encpad_errs;       /* # of encryption pad  errors*/
++      __u32           ips_replaywin_errs;    /* # of pkt sequence errors */
++};
++
++#define _IPSEC_STATS_H_
++#endif /* _IPSEC_STATS_H_ */
++
++/*
++ * $Log: ipsec_stats.h,v $
++ * Revision 1.7  2005/04/14 01:17:45  mcr
++ *    add prototypes for snprintf.
++ *
++ * Revision 1.6  2004/04/05 19:55:07  mcr
++ * Moved from linux/include/freeswan/ipsec_stats.h,v
++ *
++ * Revision 1.5  2004/04/05 19:41:05  mcr
++ *    merged alg-branch code.
++ *
++ * Revision 1.4  2004/03/28 20:27:19  paul
++ * Included tested and confirmed fixes mcr made and dhr verified for
++ * snprint statements. Changed one other snprintf to use ipsec_snprintf
++ * so it wouldnt break compatibility with 2.0/2.2 kernels. Verified with
++ * dhr. (thanks dhr!)
++ *
++ * Revision 1.4  2004/03/24 01:58:31  mcr
++ *     sprintf->snprintf for formatting into proc buffer.
++ *
++ * Revision 1.3.34.1  2004/04/05 04:30:46  mcr
++ *    patches for alg-branch to compile/work with 2.x openswan
++ *
++ * Revision 1.3  2002/04/24 07:36:47  mcr
++ * Moved from ./klips/net/ipsec/ipsec_stats.h,v
++ *
++ * Revision 1.2  2001/11/26 09:16:16  rgb
++ * Merge MCR's ipsec_sa, eroute, proc and struct lifetime changes.
++ *
++ * Revision 1.1.2.1  2001/09/25 02:27:00  mcr
++ *    statistics moved to seperate structure.
++ *
++ *
++ *
++ * Local variables:
++ * c-file-style: "linux"
++ * End:
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_sysctl.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,20 @@
++#ifndef OPENSWAN_SYSCTL_H
++#define OPENSWAN_SYSCTL_H
++
++extern int debug_ah;
++extern int debug_esp;
++extern int debug_xform;
++extern int debug_eroute;
++extern int debug_spi;
++extern int debug_netlink;
++extern int debug_radij;
++extern int debug_rcv;
++extern int debug_tunnel;
++extern int debug_xmit;
++extern int debug_mast;
++
++extern int sysctl_ip_default_ttl;
++extern int sysctl_ipsec_inbound_policy_check;
++extern int sysctl_ipsec_debug_ipcomp;
++extern int sysctl_ipsec_debug_verbose;
++#endif
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_tunnel.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,286 @@
++/*
++ * IPSEC tunneling code
++ * Copyright (C) 1996, 1997  John Ioannidis.
++ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003  Richard Guy Briggs.
++ * Copyright (C) 2006        Michael Richardson <mcr@xelerance.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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ */
++
++
++# define DEV_QUEUE_XMIT(skb, device, pri) {\
++      skb->dev = device; \
++      neigh_compat_output(skb); \
++      /* skb->dst->output(skb); */ \
++ }
++# define ICMP_SEND(skb_in, type, code, info, dev) \
++      icmp_send(skb_in, type, code, htonl(info))
++# define IP_SEND(skb, dev) \
++      ip_send(skb);
++
++
++#if defined(KLIPS)
++/*
++ * Heavily based on drivers/net/new_tunnel.c.  Lots
++ * of ideas also taken from the 2.1.x version of drivers/net/shaper.c
++ */
++
++struct ipsectunnelconf
++{
++      uint32_t        cf_cmd;
++      union
++      {
++              char    cfu_name[12];
++      } cf_u;
++#define cf_name cf_u.cfu_name
++};
++
++#define IPSEC_SET_DEV (SIOCDEVPRIVATE)
++#define IPSEC_DEL_DEV (SIOCDEVPRIVATE + 1)
++#define IPSEC_CLR_DEV (SIOCDEVPRIVATE + 2)
++#define IPSEC_UDP_ENCAP_CONVERT       (SIOCDEVPRIVATE + 3)
++#endif
++
++#ifdef __KERNEL__
++#include <linux/version.h>
++#ifndef KERNEL_VERSION
++#  define KERNEL_VERSION(x,y,z) (((x)<<16)+((y)<<8)+(z))
++#endif
++struct ipsecpriv
++{
++      struct sk_buff_head sendq;
++      struct net_device *dev;
++      struct wait_queue *wait_queue;
++      int  vifnum;
++      char locked;
++      int  (*hard_start_xmit) (struct sk_buff *skb,
++              struct net_device *dev);
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
++      const struct header_ops *header_ops;
++#else
++
++      int  (*hard_header) (struct sk_buff *skb,
++              struct net_device *dev,
++              unsigned short type,
++              void *daddr,
++              void *saddr,
++              unsigned len);
++#ifdef NET_21
++      int  (*rebuild_header)(struct sk_buff *skb);
++#else /* NET_21 */
++      int  (*rebuild_header)(void *buff, struct net_device *dev,
++                      unsigned long raddr, struct sk_buff *skb);
++#endif /* NET_21 */
++#ifndef NET_21
++      void (*header_cache_bind)(struct hh_cache **hhp, struct net_device *dev,
++                               unsigned short htype, __u32 daddr);
++#endif /* !NET_21 */
++      void (*header_cache_update)(struct hh_cache *hh, struct net_device *dev, unsigned char *  haddr);
++#endif
++      int  (*set_mac_address)(struct net_device *dev, void *addr);
++      struct net_device_stats *(*get_stats)(struct net_device *dev);
++      struct net_device_stats mystats;
++      int mtu;        /* What is the desired MTU? */
++};
++
++extern char ipsec_tunnel_c_version[];
++
++extern struct net_device *ipsecdevices[IPSEC_NUM_IFMAX];
++extern int ipsecdevices_max;
++
++int ipsec_tunnel_init_devices(void);
++
++/* void */ int ipsec_tunnel_cleanup_devices(void);
++
++extern /* void */ int ipsec_init(void);
++
++extern int ipsec_tunnel_start_xmit(struct sk_buff *skb, struct net_device *dev);
++extern struct net_device *ipsec_get_device(int inst);
++
++#ifdef CONFIG_KLIPS_DEBUG
++extern int debug_tunnel;
++extern int sysctl_ipsec_debug_verbose;
++#endif /* CONFIG_KLIPS_DEBUG */
++#endif /* __KERNEL__ */
++
++#ifdef CONFIG_KLIPS_DEBUG
++#define DB_TN_INIT    0x0001
++#define DB_TN_PROCFS  0x0002
++#define DB_TN_XMIT    0x0010
++#define DB_TN_OHDR    0x0020
++#define DB_TN_CROUT   0x0040
++#define DB_TN_OXFS    0x0080
++#define DB_TN_REVEC   0x0100
++#define DB_TN_ENCAP     0x0200
++#endif /* CONFIG_KLIPS_DEBUG */
++
++extern int ipsec_tunnel_deletenum(int vifnum);
++extern int ipsec_tunnel_createnum(int vifnum);
++extern struct net_device *ipsec_tunnel_get_device(int vifnum);
++
++
++/* manage ipsec xmit state objects */
++extern int ipsec_xmit_state_cache_init (void);
++extern void ipsec_xmit_state_cache_cleanup (void);
++struct ipsec_xmit_state *ipsec_xmit_state_new (void);
++void ipsec_xmit_state_delete (struct ipsec_xmit_state *ixs);
++
++/*
++ * $Log: ipsec_tunnel.h,v $
++ * Revision 1.33  2005/06/04 16:06:05  mcr
++ *    better patch for nat-t rcv-device code.
++ *
++ * Revision 1.32  2005/05/21 03:18:35  mcr
++ *    added additional debug flag tunnelling.
++ *
++ * Revision 1.31  2004/08/03 18:18:02  mcr
++ *    in 2.6, use "net_device" instead of #define device->net_device.
++ *    this probably breaks 2.0 compiles.
++ *
++ * Revision 1.30  2004/07/10 19:08:41  mcr
++ *    CONFIG_IPSEC -> CONFIG_KLIPS.
++ *
++ * Revision 1.29  2004/04/05 19:55:07  mcr
++ * Moved from linux/include/freeswan/ipsec_tunnel.h,v
++ *
++ * Revision 1.28  2003/06/24 20:22:32  mcr
++ *    added new global: ipsecdevices[] so that we can keep track of
++ *    the ipsecX devices. They will be referenced with dev_hold(),
++ *    so 2.2 may need this as well.
++ *
++ * Revision 1.27  2003/04/03 17:38:09  rgb
++ * Centralised ipsec_kfree_skb and ipsec_dev_{get,put}.
++ *
++ * Revision 1.26  2003/02/12 19:32:20  rgb
++ * Updated copyright year.
++ *
++ * Revision 1.25  2002/05/27 18:56:07  rgb
++ * Convert to dynamic ipsec device allocation.
++ *
++ * Revision 1.24  2002/04/24 07:36:48  mcr
++ * Moved from ./klips/net/ipsec/ipsec_tunnel.h,v
++ *
++ * Revision 1.23  2001/11/06 19:50:44  rgb
++ * Moved IP_SEND, ICMP_SEND, DEV_QUEUE_XMIT macros to ipsec_tunnel.h for
++ * use also by pfkey_v2_parser.c
++ *
++ * Revision 1.22  2001/09/15 16:24:05  rgb
++ * Re-inject first and last HOLD packet when an eroute REPLACE is done.
++ *
++ * Revision 1.21  2001/06/14 19:35:10  rgb
++ * Update copyright date.
++ *
++ * Revision 1.20  2000/09/15 11:37:02  rgb
++ * Merge in heavily modified Svenning Soerensen's <svenning@post5.tele.dk>
++ * IPCOMP zlib deflate code.
++ *
++ * Revision 1.19  2000/09/08 19:12:56  rgb
++ * Change references from DEBUG_IPSEC to CONFIG_IPSEC_DEBUG.
++ *
++ * Revision 1.18  2000/07/28 13:50:54  rgb
++ * Changed enet_statistics to net_device_stats and added back compatibility
++ * for pre-2.1.19.
++ *
++ * Revision 1.17  1999/11/19 01:12:15  rgb
++ * Purge unneeded proc_info prototypes, now that static linking uses
++ * dynamic proc_info registration.
++ *
++ * Revision 1.16  1999/11/18 18:51:00  rgb
++ * Changed all device registrations for static linking to
++ * dynamic to reduce the number and size of patches.
++ *
++ * Revision 1.15  1999/11/18 04:14:21  rgb
++ * Replaced all kernel version macros to shorter, readable form.
++ * Added CONFIG_PROC_FS compiler directives in case it is shut off.
++ * Added Marc Boucher's 2.3.25 proc patches.
++ *
++ * Revision 1.14  1999/05/25 02:50:10  rgb
++ * Fix kernel version macros for 2.0.x static linking.
++ *
++ * Revision 1.13  1999/05/25 02:41:06  rgb
++ * Add ipsec_klipsdebug support for static linking.
++ *
++ * Revision 1.12  1999/05/05 22:02:32  rgb
++ * Add a quick and dirty port to 2.2 kernels by Marc Boucher <marc@mbsi.ca>.
++ *
++ * Revision 1.11  1999/04/29 15:19:50  rgb
++ * Add return values to init and cleanup functions.
++ *
++ * Revision 1.10  1999/04/16 16:02:39  rgb
++ * Bump up macro to 4 ipsec I/Fs.
++ *
++ * Revision 1.9  1999/04/15 15:37:25  rgb
++ * Forward check changes from POST1_00 branch.
++ *
++ * Revision 1.5.2.1  1999/04/02 04:26:14  rgb
++ * Backcheck from HEAD, pre1.0.
++ *
++ * Revision 1.8  1999/04/11 00:29:01  henry
++ * GPL boilerplate
++ *
++ * Revision 1.7  1999/04/06 04:54:28  rgb
++ * Fix/Add RCSID Id: and Log: bits to make PHMDs happy.  This includes
++ * patch shell fixes.
++ *
++ * Revision 1.6  1999/03/31 05:44:48  rgb
++ * Keep PMTU reduction private.
++ *
++ * Revision 1.5  1999/02/10 22:31:20  rgb
++ * Change rebuild_header member to reflect generality of link layer.
++ *
++ * Revision 1.4  1998/12/01 13:22:04  rgb
++ * Added support for debug printing of version info.
++ *
++ * Revision 1.3  1998/07/29 20:42:46  rgb
++ * Add a macro for clearing all tunnel devices.
++ * Rearrange structures and declarations for sharing with userspace.
++ *
++ * Revision 1.2  1998/06/25 20:01:45  rgb
++ * Make prototypes available for ipsec_init and ipsec proc_dir_entries
++ * for static linking.
++ *
++ * Revision 1.1  1998/06/18 21:27:50  henry
++ * move sources from klips/src to klips/net/ipsec, to keep stupid
++ * kernel-build scripts happier in the presence of symlinks
++ *
++ * Revision 1.3  1998/05/18 21:51:50  rgb
++ * Added macros for num of I/F's and a procfs debug switch.
++ *
++ * Revision 1.2  1998/04/21 21:29:09  rgb
++ * Rearrange debug switches to change on the fly debug output from user
++ * space.  Only kernel changes checked in at this time.  radij.c was also
++ * changed to temporarily remove buggy debugging code in rj_delete causing
++ * an OOPS and hence, netlink device open errors.
++ *
++ * Revision 1.1  1998/04/09 03:06:13  henry
++ * sources moved up from linux/net/ipsec
++ *
++ * Revision 1.1.1.1  1998/04/08 05:35:05  henry
++ * RGB's ipsec-0.8pre2.tar.gz ipsec-0.8
++ *
++ * Revision 0.5  1997/06/03 04:24:48  ji
++ * Added transport mode.
++ * Changed the way routing is done.
++ * Lots of bug fixes.
++ *
++ * Revision 0.4  1997/01/15 01:28:15  ji
++ * No changes.
++ *
++ * Revision 0.3  1996/11/20 14:39:04  ji
++ * Minor cleanups.
++ * Rationalized debugging code.
++ *
++ * Revision 0.2  1996/11/02 00:18:33  ji
++ * First limited release.
++ *
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_xform.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,278 @@
++/*
++ * Definitions relevant to IPSEC transformations
++ * Copyright (C) 1996, 1997  John Ioannidis.
++ * Copyright (C) 1998, 1999, 2000, 2001  Richard Guy Briggs.
++ * COpyright (C) 2003  Michael Richardson <mcr@sandelman.ottawa.on.ca>
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_xform.h,v 1.42 2005/08/05 08:50:45 mcr Exp $
++ */
++
++#ifndef _IPSEC_XFORM_H_
++
++#include <openswan.h>
++
++#define XF_NONE                       0       /* No transform set */
++#define XF_IP4                        1       /* IPv4 inside IPv4 */
++#define XF_AHMD5              2       /* AH MD5 */
++#define XF_AHSHA              3       /* AH SHA */
++#define XF_ESP3DES            5       /* ESP DES3-CBC */
++#define XF_AHHMACMD5          6       /* AH-HMAC-MD5 with opt replay prot */
++#define XF_AHHMACSHA1         7       /* AH-HMAC-SHA1 with opt replay prot */
++#define XF_ESP3DESMD5         9       /* triple DES, HMAC-MD-5, 128-bits of authentication */
++#define       XF_ESP3DESMD596         10      /* triple DES, HMAC-MD-5, 96-bits of authentication */
++#define       XF_ESPNULLMD596         12      /* NULL, HMAC-MD-5 with 96-bits of authentication */
++#define       XF_ESPNULLSHA196        13      /* NULL, HMAC-SHA-1 with 96-bits of authentication */
++#define       XF_ESP3DESSHA196        14      /* triple DES, HMAC-SHA-1, 96-bits of authentication */
++#define XF_IP6                        15      /* IPv6 inside IPv6 */
++#define XF_COMPDEFLATE                16      /* IPCOMP deflate */
++
++#define XF_CLR                        126     /* Clear SA table */
++#define XF_DEL                        127     /* Delete SA */
++
++/* IPsec AH transform values
++ * RFC 2407
++ * draft-ietf-ipsec-doi-tc-mib-02.txt
++ */
++
++/* why are these hardcoded here? See ipsec_policy.h for their enums -- Paul*/
++/* ---------- These really need to go from here ------------------ */
++#define AH_NONE                       0
++#define AH_MD5                        2
++#define AH_SHA                        3
++/* draft-ietf-ipsec-ciph-aes-cbc-03.txt */
++#define AH_SHA2_256           5
++#define AH_SHA2_384           6
++#define AH_SHA2_512           7
++#define AH_RIPEMD             8
++#define AH_AES                        9
++#define AH_NULL                       251
++#define AH_MAX                        251
++
++/* IPsec ESP transform values */
++
++#define ESP_NONE              0
++#define ESP_DES                       2
++#define ESP_3DES              3
++#define ESP_RC5                       4
++#define ESP_IDEA              5
++#define ESP_CAST              6
++#define ESP_BLOWFISH          7
++#define ESP_3IDEA             8
++#define ESP_RC4                       10
++#define ESP_NULL              11
++#define ESP_AES                       12
++#define ESP_AES_CTR           13
++#define ESP_AES_CCM_A         14
++#define ESP_AES_CCM_B         15
++#define ESP_AES_CCM_C         16
++#define ESP_ID17              17
++#define ESP_AES_GCM_A         18
++#define ESP_AES_GCM_B         19
++#define ESP_AES_GCM_C         20
++#define ESP_SEED_CBC          21
++#define ESP_CAMELLIA          22
++
++/* as draft-ietf-ipsec-ciph-aes-cbc-02.txt */
++#define ESP_MARS              249
++#define       ESP_RC6                 250
++#define ESP_SERPENT           252
++#define ESP_TWOFISH           253
++                       
++/* IPCOMP transform values */
++
++#define IPCOMP_NONE           0
++#define IPCOMP_OUI            1
++#define IPCOMP_DEFLAT         2
++#define IPCOMP_LZS            3
++#define IPCOMP_V42BIS         4
++
++#define XFT_AUTH              0x0001
++#define XFT_CONF              0x0100
++
++/* available if CONFIG_KLIPS_DEBUG is defined */
++#define DB_XF_INIT            0x0001
++
++#define PROTO2TXT(x) \
++      (x) == IPPROTO_AH ? "AH" : \
++      (x) == IPPROTO_ESP ? "ESP" : \
++      (x) == IPPROTO_IPIP ? "IPIP" : \
++      (x) == IPPROTO_COMP ? "COMP" : \
++      "UNKNOWN_proto"
++static inline const char *enc_name_id (unsigned id) {
++      static char buf[16];
++      snprintf(buf, sizeof(buf), "_ID%d", id);
++      return buf;
++}
++static inline const char *auth_name_id (unsigned id) {
++      static char buf[16];
++      snprintf(buf, sizeof(buf), "_ID%d", id);
++      return buf;
++}
++#define IPS_XFORM_NAME(x) \
++      PROTO2TXT((x)->ips_said.proto), \
++      (x)->ips_said.proto == IPPROTO_COMP ? \
++              ((x)->ips_encalg == SADB_X_CALG_DEFLATE ? \
++               "_DEFLATE" : "_UNKNOWN_comp") : \
++      (x)->ips_encalg == ESP_NONE ? "" : \
++      (x)->ips_encalg == ESP_3DES ? "_3DES" : \
++      (x)->ips_encalg == ESP_AES ? "_AES" : \
++      (x)->ips_encalg == ESP_SERPENT ? "_SERPENT" : \
++      (x)->ips_encalg == ESP_TWOFISH ? "_TWOFISH" : \
++      enc_name_id(x->ips_encalg)/* "_UNKNOWN_encr" */, \
++      (x)->ips_authalg == AH_NONE ? "" : \
++      (x)->ips_authalg == AH_MD5 ? "_HMAC_MD5" : \
++      (x)->ips_authalg == AH_SHA ? "_HMAC_SHA1" : \
++      (x)->ips_authalg == AH_SHA2_256 ? "_HMAC_SHA2_256" : \
++      (x)->ips_authalg == AH_SHA2_384 ? "_HMAC_SHA2_384" : \
++      (x)->ips_authalg == AH_SHA2_512 ? "_HMAC_SHA2_512" : \
++      auth_name_id(x->ips_authalg) /* "_UNKNOWN_auth" */ \
++
++#ifdef __KERNEL__
++#include <linux/skbuff.h>
++
++struct ipsec_rcv_state;
++struct ipsec_xmit_state;
++
++struct xform_functions {
++      u8   protocol;
++      enum ipsec_rcv_value (*rcv_checks)(struct ipsec_rcv_state *irs,
++                                     struct sk_buff *skb);
++        enum ipsec_rcv_value (*rcv_decrypt)(struct ipsec_rcv_state *irs);
++
++      enum ipsec_rcv_value (*rcv_setup_auth)(struct ipsec_rcv_state *irs,
++                                         struct sk_buff *skb,
++                                         __u32          *replay,
++                                         unsigned char **authenticator);
++      enum ipsec_rcv_value (*rcv_calc_auth)(struct ipsec_rcv_state *irs,
++                                      struct sk_buff *skb);
++
++      enum ipsec_xmit_value (*xmit_setup)(struct ipsec_xmit_state *ixs);
++        enum ipsec_xmit_value (*xmit_encrypt)(struct ipsec_xmit_state *ixs);
++
++      enum ipsec_xmit_value (*xmit_setup_auth)(struct ipsec_xmit_state *ixs,
++                                         struct sk_buff *skb,
++                                         __u32          *replay,
++                                         unsigned char **authenticator);
++      enum ipsec_xmit_value (*xmit_calc_auth)(struct ipsec_xmit_state *ixs,
++                                      struct sk_buff *skb);
++        int  xmit_headroom;
++      int  xmit_needtailroom;
++};
++
++#endif /* __KERNEL__ */
++
++#ifdef CONFIG_KLIPS_DEBUG
++extern void ipsec_dmp(char *s, caddr_t bb, int len);
++#else /* CONFIG_KLIPS_DEBUG */
++#define ipsec_dmp(_x, _y, _z) 
++#endif /* CONFIG_KLIPS_DEBUG */
++
++
++#define _IPSEC_XFORM_H_
++#endif /* _IPSEC_XFORM_H_ */
++
++/*
++ * $Log: ipsec_xform.h,v $
++ * Revision 1.42  2005/08/05 08:50:45  mcr
++ *    move #include of skbuff.h to a place where
++ *    we know it will be kernel only code.
++ *
++ * Revision 1.41  2004/07/10 19:08:41  mcr
++ *    CONFIG_IPSEC -> CONFIG_KLIPS.
++ *
++ * Revision 1.40  2004/04/06 02:49:08  mcr
++ *    pullup of algo code from alg-branch.
++ *
++ * Revision 1.39  2004/04/05 19:55:07  mcr
++ * Moved from linux/include/freeswan/ipsec_xform.h,v
++ *
++ * Revision 1.38  2004/04/05 19:41:05  mcr
++ *    merged alg-branch code.
++ *
++ * Revision 1.37  2003/12/13 19:10:16  mcr
++ *    refactored rcv and xmit code - same as FS 2.05.
++ *
++ * Revision 1.36.34.1  2003/12/22 15:25:52  jjo
++ *      Merged algo-0.8.1-rc11-test1 into alg-branch
++ *
++ * Revision 1.36  2002/04/24 07:36:48  mcr
++ * Moved from ./klips/net/ipsec/ipsec_xform.h,v
++ *
++ * Revision 1.35  2001/11/26 09:23:51  rgb
++ * Merge MCR's ipsec_sa, eroute, proc and struct lifetime changes.
++ *
++ * Revision 1.33.2.1  2001/09/25 02:24:58  mcr
++ *    struct tdb -> struct ipsec_sa.
++ *    sa(tdb) manipulation functions renamed and moved to ipsec_sa.c
++ *    ipsec_xform.c removed. header file still contains useful things.
++ *
++ * Revision 1.34  2001/11/06 19:47:17  rgb
++ * Changed lifetime_packets to uint32 from uint64.
++ *
++ * Revision 1.33  2001/09/08 21:13:34  rgb
++ * Added pfkey ident extension support for ISAKMPd. (NetCelo)
++ *
++ * Revision 1.32  2001/07/06 07:40:01  rgb
++ * Reformatted for readability.
++ * Added inbound policy checking fields for use with IPIP SAs.
++ *
++ * Revision 1.31  2001/06/14 19:35:11  rgb
++ * Update copyright date.
++ *
++ * Revision 1.30  2001/05/30 08:14:03  rgb
++ * Removed vestiges of esp-null transforms.
++ *
++ * Revision 1.29  2001/01/30 23:42:47  rgb
++ * Allow pfkey msgs from pid other than user context required for ACQUIRE
++ * and subsequent ADD or UDATE.
++ *
++ * Revision 1.28  2000/11/06 04:30:40  rgb
++ * Add Svenning's adaptive content compression.
++ *
++ * Revision 1.27  2000/09/19 00:38:25  rgb
++ * Fixed algorithm name bugs introduced for ipcomp.
++ *
++ * Revision 1.26  2000/09/17 21:36:48  rgb
++ * Added proto2txt macro.
++ *
++ * Revision 1.25  2000/09/17 18:56:47  rgb
++ * Added IPCOMP support.
++ *
++ * Revision 1.24  2000/09/12 19:34:12  rgb
++ * Defined XF_IP6 from Gerhard for ipv6 tunnel support.
++ *
++ * Revision 1.23  2000/09/12 03:23:14  rgb
++ * Cleaned out now unused tdb_xform and tdb_xdata members of struct tdb.
++ *
++ * Revision 1.22  2000/09/08 19:12:56  rgb
++ * Change references from DEBUG_IPSEC to CONFIG_IPSEC_DEBUG.
++ *
++ * Revision 1.21  2000/09/01 18:32:43  rgb
++ * Added (disabled) sensitivity members to tdb struct.
++ *
++ * Revision 1.20  2000/08/30 05:31:01  rgb
++ * Removed all the rest of the references to tdb_spi, tdb_proto, tdb_dst.
++ * Kill remainder of tdb_xform, tdb_xdata, xformsw.
++ *
++ * Revision 1.19  2000/08/01 14:51:52  rgb
++ * Removed _all_ remaining traces of DES.
++ *
++ * Revision 1.18  2000/01/21 06:17:45  rgb
++ * Tidied up spacing.
++ *
++ *
++ * Local variables:
++ * c-file-style: "linux"
++ * End:
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/ipsec_xmit.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,267 @@
++/*
++ * IPSEC tunneling code
++ * Copyright (C) 1996, 1997  John Ioannidis.
++ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003  Richard Guy Briggs.
++ * 
++ * 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: ipsec_xmit.h,v 1.14 2005/05/11 01:00:26 mcr Exp $
++ */
++
++#include "openswan/ipsec_sa.h"
++
++#ifdef CONFIG_KLIPS_OCF
++#include <cryptodev.h>
++#endif
++
++enum ipsec_xmit_value
++{
++      IPSEC_XMIT_STOLEN=2,
++      IPSEC_XMIT_PASS=1,
++      IPSEC_XMIT_OK=0,
++      IPSEC_XMIT_ERRMEMALLOC=-1,
++      IPSEC_XMIT_ESP_BADALG=-2,
++      IPSEC_XMIT_BADPROTO=-3,
++      IPSEC_XMIT_ESP_PUSHPULLERR=-4,
++      IPSEC_XMIT_BADLEN=-5,
++      IPSEC_XMIT_AH_BADALG=-6,
++      IPSEC_XMIT_SAIDNOTFOUND=-7,
++      IPSEC_XMIT_SAIDNOTLIVE=-8,
++      IPSEC_XMIT_REPLAYROLLED=-9,
++      IPSEC_XMIT_LIFETIMEFAILED=-10,
++      IPSEC_XMIT_CANNOTFRAG=-11,
++      IPSEC_XMIT_MSSERR=-12,
++      IPSEC_XMIT_ERRSKBALLOC=-13,
++      IPSEC_XMIT_ENCAPFAIL=-14,
++      IPSEC_XMIT_NODEV=-15,
++      IPSEC_XMIT_NOPRIVDEV=-16,
++      IPSEC_XMIT_NOPHYSDEV=-17,
++      IPSEC_XMIT_NOSKB=-18,
++      IPSEC_XMIT_NOIPV6=-19,
++      IPSEC_XMIT_NOIPOPTIONS=-20,
++      IPSEC_XMIT_TTLEXPIRED=-21,
++      IPSEC_XMIT_BADHHLEN=-22,
++      IPSEC_XMIT_PUSHPULLERR=-23,
++      IPSEC_XMIT_ROUTEERR=-24,
++      IPSEC_XMIT_RECURSDETECT=-25,
++      IPSEC_XMIT_IPSENDFAILURE=-26,
++      IPSEC_XMIT_ESPUDP=-27,
++      IPSEC_XMIT_ESPUDP_BADTYPE=-28,
++      IPSEC_XMIT_PENDING=-29,
++};
++
++
++/*
++ * state machine states
++ */
++
++#define IPSEC_XSM_INIT1                       0       /* make it easy, starting state is 0 */
++#define IPSEC_XSM_INIT2                       1
++#define IPSEC_XSM_ENCAP_INIT  2
++#define IPSEC_XSM_ENCAP_SELECT        3
++#define IPSEC_XSM_ESP                 4
++#define IPSEC_XSM_ESP_AH              5
++#define IPSEC_XSM_AH                  6
++#define IPSEC_XSM_IPIP                        7
++#define IPSEC_XSM_IPCOMP              8
++#define IPSEC_XSM_CONT                        9
++#define IPSEC_XSM_DONE                        100
++
++
++struct ipsec_xmit_state
++{
++      struct sk_buff *skb;            /* working skb pointer */
++      struct net_device *dev;         /* working dev pointer */
++      struct ipsecpriv *prv;          /* Our device' private space */
++      struct sk_buff *oskb;           /* Original skb pointer */
++      struct net_device_stats *stats; /* This device's statistics */
++      struct iphdr  *iph;             /* Our new IP header */
++      __u32   newdst;                 /* The other SG's IP address */
++      __u32   orgdst;                 /* Original IP destination address */
++      __u32   orgedst;                /* 1st SG's IP address */
++      __u32   newsrc;                 /* The new source SG's IP address */
++      __u32   orgsrc;                 /* Original IP source address */
++      __u32   innersrc;               /* Innermost IP source address */
++      int     iphlen;                 /* IP header length */
++      int     pyldsz;                 /* upper protocol payload size */
++      int     headroom;
++      int     tailroom;
++        int     authlen;
++      int     max_headroom;           /* The extra header space needed */
++      int     max_tailroom;           /* The extra stuffing needed */
++      int     ll_headroom;            /* The extra link layer hard_header space needed */
++      int     tot_headroom;           /* The total header space needed */
++      int     tot_tailroom;           /* The totalstuffing needed */
++      __u8    *saved_header;          /* saved copy of the hard header */
++      unsigned short   sport, dport;
++
++      struct sockaddr_encap matcher;  /* eroute search key */
++      struct eroute *eroute;
++        struct ipsec_sa *ipsp;                /* ipsec_sa pointers */
++  //struct ipsec_sa *ipsp_outer;    /* last SA applied by encap_bundle */
++      char sa_txt[SATOT_BUF];
++      size_t sa_len;
++      int hard_header_stripped;       /* has the hard header been removed yet? */
++      int hard_header_len;
++      struct net_device *physdev;
++/*    struct device *virtdev; */
++      short physmtu;
++      short cur_mtu;          /* copy of prv->mtu, cause prv may == NULL */
++      short mtudiff;
++#ifdef NET_21
++      struct rtable *route;
++#endif /* NET_21 */
++      ip_said outgoing_said;
++#ifdef NET_21
++      int pass;
++#endif /* NET_21 */
++      uint32_t eroute_pid;
++      struct ipsec_sa ips;
++#ifdef CONFIG_IPSEC_NAT_TRAVERSAL
++      uint8_t natt_type;
++      uint8_t natt_head;
++      uint16_t natt_sport;
++      uint16_t natt_dport;
++#endif
++
++      /*
++       * xmit state machine use
++       */
++      void (*xsm_complete)(struct ipsec_xmit_state *ixs,
++                      enum ipsec_xmit_value stat);
++      int             state;
++      int             next_state;
++#ifdef CONFIG_KLIPS_OCF
++      struct work_struct      workq;
++#ifdef DECLARE_TASKLET
++      struct tasklet_struct   tasklet;
++#endif
++#endif
++#ifdef CONFIG_KLIPS_ALG
++      struct ipsec_alg_auth *ixt_a;
++      struct ipsec_alg_enc *ixt_e;
++#endif
++#ifdef CONFIG_KLIPS_ESP
++      struct esphdr *espp;
++      unsigned char *idat;
++#endif /* !CONFIG_KLIPS_ESP */
++      int blocksize;
++      int ilen, len;
++      unsigned char *dat;
++      __u8 frag_off, tos;
++      __u16 ttl, check;
++};
++
++enum ipsec_xmit_value
++ipsec_xmit_sanity_check_dev(struct ipsec_xmit_state *ixs);
++
++enum ipsec_xmit_value
++ipsec_xmit_sanity_check_skb(struct ipsec_xmit_state *ixs);
++
++enum ipsec_xmit_value
++ipsec_xmit_encap_bundle(struct ipsec_xmit_state *ixs);
++
++extern void ipsec_xsm(struct ipsec_xmit_state *ixs);
++#ifdef HAVE_KMEM_CACHE_T
++extern kmem_cache_t *ipsec_ixs_cache;
++#else
++extern struct kmem_cache *ipsec_ixs_cache;
++#endif
++extern int ipsec_ixs_max;
++extern atomic_t ipsec_ixs_cnt;
++
++extern void ipsec_extract_ports(struct iphdr * iph, struct sockaddr_encap * er);
++
++extern enum ipsec_xmit_value
++ipsec_xmit_send(struct ipsec_xmit_state*ixs, struct flowi *fl);
++
++extern enum ipsec_xmit_value
++ipsec_nat_encap(struct ipsec_xmit_state*ixs);
++
++extern enum ipsec_xmit_value
++ipsec_tunnel_send(struct ipsec_xmit_state *ixs);
++
++extern void ipsec_xmit_cleanup(struct ipsec_xmit_state*ixs);
++
++
++extern int ipsec_xmit_trap_count;
++extern int ipsec_xmit_trap_sendcount;
++
++#ifdef CONFIG_KLIPS_DEBUG
++extern int debug_xmit;
++extern int debug_mast;
++
++#define ipsec_xmit_dmp(_x,_y, _z) if (debug_xmit && sysctl_ipsec_debug_verbose) ipsec_dmp_block(_x,_y,_z)
++#else
++#define ipsec_xmit_dmp(_x,_y, _z) do {} while(0)
++
++#endif /* CONFIG_KLIPS_DEBUG */
++
++extern int sysctl_ipsec_debug_verbose;
++extern int sysctl_ipsec_icmp;
++extern int sysctl_ipsec_tos;
++
++
++/*
++ * $Log: ipsec_xmit.h,v $
++ * Revision 1.14  2005/05/11 01:00:26  mcr
++ *    do not call debug routines if !defined KLIPS_DEBUG.
++ *
++ * Revision 1.13  2005/04/29 05:01:38  mcr
++ *    use ipsec_dmp_block.
++ *    added cur_mtu to ixs instead of using ixs->dev.
++ *
++ * Revision 1.12  2004/08/20 21:45:37  mcr
++ *    CONFIG_KLIPS_NAT_TRAVERSAL is not used in an attempt to
++ *    be 26sec compatible. But, some defines where changed.
++ *
++ * Revision 1.11  2004/08/03 18:18:21  mcr
++ *    in 2.6, use "net_device" instead of #define device->net_device.
++ *    this probably breaks 2.0 compiles.
++ *
++ * Revision 1.10  2004/07/10 19:08:41  mcr
++ *    CONFIG_IPSEC -> CONFIG_KLIPS.
++ *
++ * Revision 1.9  2004/04/06 02:49:08  mcr
++ *    pullup of algo code from alg-branch.
++ *
++ * Revision 1.8  2004/04/05 19:55:07  mcr
++ * Moved from linux/include/freeswan/ipsec_xmit.h,v
++ *
++ * Revision 1.7  2004/02/03 03:11:40  mcr
++ *    new xmit type if the UDP encapsulation is wrong.
++ *
++ * Revision 1.6  2003/12/13 19:10:16  mcr
++ *    refactored rcv and xmit code - same as FS 2.05.
++ *
++ * Revision 1.5  2003/12/10 01:20:06  mcr
++ *    NAT-traversal patches to KLIPS.
++ *
++ * Revision 1.4  2003/12/06 16:37:04  mcr
++ *    1.4.7a X.509 patch applied.
++ *
++ * Revision 1.3  2003/10/31 02:27:05  mcr
++ *    pulled up port-selector patches and sa_id elimination.
++ *
++ * Revision 1.2.4.2  2003/10/29 01:10:19  mcr
++ *    elimited "struct sa_id"
++ *
++ * Revision 1.2.4.1  2003/09/21 13:59:38  mcr
++ *    pre-liminary X.509 patch - does not yet pass tests.
++ *
++ * Revision 1.2  2003/06/20 01:42:13  mcr
++ *    added counters to measure how many ACQUIREs we send to pluto,
++ *    and how many are successfully sent.
++ *
++ * Revision 1.1  2003/02/12 19:31:03  rgb
++ * Refactored from ipsec_tunnel.c
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/mast.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,33 @@
++struct mast_callbacks {
++  int (*packet_encap)(struct device *mast, void *context,
++                    struct sk_buff *skb, int flowref);
++  int (*link_inquire)(struct device *mast, void *context);
++};
++
++
++struct device *mast_init (int family,
++                        struct mast_callbacks *callbacks,
++                        unsigned int flags,
++                        unsigned int desired_unit,
++                        unsigned int max_flowref,
++                        void *context);
++
++int mast_destroy(struct device *mast);
++
++int mast_recv(struct device *mast, struct sk_buff *skb, int flowref);
++
++/* free this skb as being useless, increment failure count. */
++int mast_toast(struct device *mast, struct sk_buff *skb, int flowref);
++
++int mast_linkstat (struct device *mast, int flowref,
++                 int status);
++
++int mast_setreference (struct device *mast,
++                     int defaultSA);
++
++int mast_setneighbor (struct device *mast,
++                    struct sockaddr *source,
++                    struct sockaddr *destination,
++                    int flowref);
++
++
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/passert.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,75 @@
++/*
++ * sanitize a string into a printable format.
++ *
++ * Copyright (C) 1998-2002  D. Hugh Redelmeier.
++ * Copyright (C) 2003  Michael Richardson <mcr@freeswan.org>
++ * 
++ * This library is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU Library General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.  See <http://www.fsf.org/copyleft/lgpl.txt>.
++ * 
++ * This library 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 Library General Public
++ * License for more details.
++ *
++ * RCSID $Id: passert.h,v 1.7.8.1 2007/09/05 02:32:24 paul Exp $
++ */
++
++#include "openswan.h"
++
++#ifndef _OPENSWAN_PASSERT_H
++#define _OPENSWAN_PASSERT_H
++/* our versions of assert: log result */
++
++#ifdef DEBUG
++
++typedef void (*openswan_passert_fail_t)(const char *pred_str,
++                                      const char *file_str,
++                                      unsigned long line_no) NEVER_RETURNS;
++
++extern openswan_passert_fail_t openswan_passert_fail;
++
++extern void pexpect_log(const char *pred_str
++                      , const char *file_str, unsigned long line_no);
++
++# define impossible() do { \
++    if(openswan_passert_fail) {                                       \
++      (*openswan_passert_fail)("impossible", __FILE__, __LINE__); \
++    }} while(0)
++
++extern void openswan_switch_fail(int n
++    , const char *file_str, unsigned long line_no) NEVER_RETURNS;
++
++# define bad_case(n) openswan_switch_fail((int) n, __FILE__, __LINE__)
++
++# define passert(pred) do { \
++      if (!(pred)) \
++        if(openswan_passert_fail) { \
++          (*openswan_passert_fail)(#pred, __FILE__, __LINE__);        \
++        } \
++  } while(0)
++
++# define pexpect(pred) do { \
++      if (!(pred)) \
++          pexpect_log(#pred, __FILE__, __LINE__); \
++  } while(0)
++
++/* assert that an err_t is NULL; evaluate exactly once */
++# define happy(x) { \
++      err_t ugh = x; \
++      if (ugh != NULL) \
++        if(openswan_passert_fail) { (*openswan_passert_fail)(ugh, __FILE__, __LINE__); }  \
++    }
++
++#else /*!DEBUG*/
++
++# define impossible() abort()
++# define bad_case(n) abort()
++# define passert(pred)  { }   /* do nothing */
++# define happy(x)  { (void) x; }      /* evaluate non-judgementally */
++
++#endif /*!DEBUG*/
++
++#endif /* _OPENSWAN_PASSERT_H */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/pfkey.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,384 @@
++/*
++ * Openswan specific PF_KEY headers
++ * Copyright (C) 1999, 2000, 2001  Richard Guy Briggs.
++ * Copyright (C) 2006-2007 Michael Richardson <mcr@xelerance.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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++ * 
++ * 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.
++ *
++ * RCSID $Id: pfkey.h,v 1.52 2005/11/09 00:30:37 mcr Exp $
++ */
++
++#ifndef __NET_IPSEC_PF_KEY_H
++#define __NET_IPSEC_PF_KEY_H
++
++#include "pfkeyv2.h"
++#ifdef __KERNEL__
++extern struct proto_ops pfkey_proto_ops;
++typedef struct sock pfkey_sock;
++extern int debug_pfkey;
++
++extern /* void */ int pfkey_init(void);
++extern /* void */ int pfkey_cleanup(void);
++
++struct socket_list
++{
++      struct socket *socketp;
++      struct socket_list *next;
++};
++extern int pfkey_list_insert_socket(struct socket*, struct socket_list**);
++extern int pfkey_list_remove_socket(struct socket*, struct socket_list**);
++extern struct socket_list *pfkey_open_sockets;
++extern struct socket_list *pfkey_registered_sockets[];
++
++struct ipsec_alg_supported
++{
++      uint16_t ias_exttype;
++      uint8_t  ias_id;
++      uint8_t  ias_ivlen;
++      uint16_t ias_keyminbits;
++      uint16_t ias_keymaxbits;
++        const char    *ias_name;
++};
++
++extern struct supported_list *pfkey_supported_list[];
++struct supported_list
++{
++      struct ipsec_alg_supported *supportedp;
++      struct supported_list *next;
++};
++extern int pfkey_list_insert_supported(struct ipsec_alg_supported*, struct supported_list**);
++extern int pfkey_list_remove_supported(struct ipsec_alg_supported*, struct supported_list**);
++
++struct sockaddr_key
++{
++      uint16_t        key_family;     /* PF_KEY */
++      uint16_t        key_pad;        /* not used */
++      uint32_t        key_pid;        /* process ID */
++};
++
++struct pfkey_extracted_data
++{
++      struct ipsec_sa* ips;
++      struct ipsec_sa* ips2;
++      struct eroute *eroute;
++      int            outif;
++      IPsecSAref_t   sarefme;
++      IPsecSAref_t   sarefhim;
++};
++
++/* forward reference */
++struct sadb_ext;
++struct sadb_msg;
++struct sockaddr;
++struct sadb_comb;
++struct sadb_sadb;
++struct sadb_alg;
++
++extern int
++pfkey_alloc_eroute(struct eroute** eroute);
++
++extern int
++pfkey_sa_process(struct sadb_ext *pfkey_ext,
++               struct pfkey_extracted_data* extr);
++
++extern int
++pfkey_lifetime_process(struct sadb_ext *pfkey_ext,
++                     struct pfkey_extracted_data* extr);
++
++extern int
++pfkey_address_process(struct sadb_ext *pfkey_ext,
++                    struct pfkey_extracted_data* extr);
++
++extern int
++pfkey_key_process(struct sadb_ext *pfkey_ext,
++                struct pfkey_extracted_data* extr);
++
++extern int
++pfkey_ident_process(struct sadb_ext *pfkey_ext,
++                  struct pfkey_extracted_data* extr);
++
++extern int
++pfkey_sens_process(struct sadb_ext *pfkey_ext,
++                 struct pfkey_extracted_data* extr);
++
++extern int
++pfkey_prop_process(struct sadb_ext *pfkey_ext,
++                 struct pfkey_extracted_data* extr);
++
++extern int
++pfkey_supported_process(struct sadb_ext *pfkey_ext,
++                      struct pfkey_extracted_data* extr);
++
++extern int
++pfkey_spirange_process(struct sadb_ext *pfkey_ext,
++                     struct pfkey_extracted_data* extr);
++
++extern int
++pfkey_x_kmprivate_process(struct sadb_ext *pfkey_ext,
++                        struct pfkey_extracted_data* extr);
++
++extern int
++pfkey_x_satype_process(struct sadb_ext *pfkey_ext,
++                     struct pfkey_extracted_data* extr);
++
++extern int
++pfkey_x_debug_process(struct sadb_ext *pfkey_ext,
++                    struct pfkey_extracted_data* extr);
++
++extern int pfkey_upmsg(struct socket *, struct sadb_msg *);
++extern int pfkey_upmsgsk(struct sock *, struct sadb_msg *);
++extern int pfkey_expire(struct ipsec_sa *, int);
++extern int pfkey_acquire(struct ipsec_sa *);
++#else /* ! __KERNEL__ */
++
++extern openswan_keying_debug_func_t pfkey_debug_func;
++extern openswan_keying_debug_func_t pfkey_error_func;
++extern void pfkey_print(struct sadb_msg *msg, FILE *out);
++
++
++#endif /* __KERNEL__ */
++
++extern uint8_t satype2proto(uint8_t satype);
++extern uint8_t proto2satype(uint8_t proto);
++extern char* satype2name(uint8_t satype);
++extern char* proto2name(uint8_t proto);
++
++struct key_opt
++{
++      uint32_t        key_pid;        /* process ID */
++      struct sock     *sk;
++};
++
++#define key_pid(sk) ((struct key_opt*)&((sk)->sk_protinfo))->key_pid
++
++/* XXX-mcr this is not an alignment, this is because the count is in 64-bit
++ * words.
++ */
++#define IPSEC_PFKEYv2_ALIGN (sizeof(uint64_t)/sizeof(uint8_t))
++#define BITS_PER_OCTET 8
++#define OCTETBITS 8
++#define PFKEYBITS 64
++#define DIVUP(x,y) ((x + y -1) / y) /* divide, rounding upwards */
++#define ALIGN_N(x,y) (DIVUP(x,y) * y) /* align on y boundary */
++
++#define IPSEC_PFKEYv2_LEN(x)   ((x) * IPSEC_PFKEYv2_ALIGN)
++#define IPSEC_PFKEYv2_WORDS(x) (DIVUP(x,IPSEC_PFKEYv2_ALIGN))
++
++
++#define PFKEYv2_MAX_MSGSIZE 4096
++
++/*
++ * PF_KEYv2 permitted and required extensions in and out bitmaps
++ */
++struct pf_key_ext_parsers_def {
++      int  (*parser)(struct sadb_ext*);
++      char  *parser_name;
++};
++
++enum pfkey_ext_required {
++      EXT_BITS_IN=0,
++      EXT_BITS_OUT=1
++};
++
++enum pfkey_ext_perm {
++      EXT_BITS_PERM=0,
++      EXT_BITS_REQ=1
++};
++
++
++typedef uint64_t pfkey_ext_track;
++static inline void pfkey_mark_extension(enum sadb_extension_t exttype,
++                                      pfkey_ext_track *exten_track)
++{
++      *exten_track |= (1 << exttype);
++}
++      
++extern int pfkey_extensions_missing(enum pfkey_ext_required inout,
++                                  enum sadb_msg_t sadb_operation,
++                                  pfkey_ext_track extensions_seen);
++extern int pfkey_required_extension(enum pfkey_ext_required inout,
++                                  enum sadb_msg_t sadb_operation,
++                                  enum sadb_extension_t exttype);
++extern int pfkey_permitted_extension(enum pfkey_ext_required inout,
++                                  enum sadb_msg_t sadb_operation,
++                                  enum sadb_extension_t exttype);
++
++
++extern void pfkey_extensions_init(struct sadb_ext *extensions[]);
++extern void pfkey_extensions_free(struct sadb_ext *extensions[]);
++extern void pfkey_msg_free(struct sadb_msg **pfkey_msg);
++
++extern int pfkey_msg_parse(struct sadb_msg *pfkey_msg,
++                         struct pf_key_ext_parsers_def *ext_parsers[],
++                         struct sadb_ext **extensions,
++                         int dir);
++
++extern int pfkey_register_reply(int satype, struct sadb_msg *sadb_msg);
++
++/*
++ * PF_KEYv2 build function prototypes
++ */
++
++int
++pfkey_msg_hdr_build(struct sadb_ext** pfkey_ext,
++                  uint8_t             msg_type,
++                  uint8_t             satype,
++                  uint8_t             msg_errno,
++                  uint32_t            seq,
++                  uint32_t            pid);
++
++int
++pfkey_sa_ref_build(struct sadb_ext ** pfkey_ext,
++             uint16_t                 exttype,
++             uint32_t                 spi, /* in network order */
++             uint8_t                  replay_window,
++             uint8_t                  sa_state,
++             uint8_t                  auth,
++             uint8_t                  encrypt,
++             uint32_t                 flags,
++             uint32_t/*IPsecSAref_t*/ ref);
++
++int
++pfkey_sa_build(struct sadb_ext **     pfkey_ext,
++             uint16_t                 exttype,
++             uint32_t                 spi, /* in network order */
++             uint8_t                  replay_window,
++             uint8_t                  sa_state,
++             uint8_t                  auth,
++             uint8_t                  encrypt,
++             uint32_t                 flags);
++
++extern int
++pfkey_saref_build(struct sadb_ext **pfkey_ext,
++                IPsecSAref_t in, IPsecSAref_t out);
++
++int
++pfkey_lifetime_build(struct sadb_ext **       pfkey_ext,
++                   uint16_t           exttype,
++                   uint32_t           allocations,
++                   uint64_t           bytes,
++                   uint64_t           addtime,
++                   uint64_t           usetime,
++                   uint32_t           packets);
++
++int
++pfkey_address_build(struct sadb_ext** pfkey_ext,
++                  uint16_t            exttype,
++                  uint8_t             proto,
++                  uint8_t             prefixlen,
++                  struct sockaddr*    address);
++
++int
++pfkey_key_build(struct sadb_ext**     pfkey_ext,
++              uint16_t                exttype,
++              uint16_t                key_bits,
++              unsigned char          *key);
++
++int
++pfkey_ident_build(struct sadb_ext**   pfkey_ext,
++                uint16_t              exttype,
++                uint16_t              ident_type,
++                uint64_t              ident_id,
++                uint8_t               ident_len,
++                char*                 ident_string);
++
++#ifdef __KERNEL__
++extern int pfkey_nat_t_new_mapping(struct ipsec_sa *, struct sockaddr *, __u16);
++extern int pfkey_x_nat_t_type_process(struct sadb_ext *pfkey_ext, struct pfkey_extracted_data* extr);
++extern int pfkey_x_nat_t_port_process(struct sadb_ext *pfkey_ext, struct pfkey_extracted_data* extr);
++#endif /* __KERNEL__ */
++int
++pfkey_x_nat_t_type_build(struct sadb_ext**  pfkey_ext,
++            uint8_t         type);
++int
++pfkey_x_nat_t_port_build(struct sadb_ext**  pfkey_ext,
++            uint16_t         exttype,
++            uint16_t         port);
++
++int
++pfkey_sens_build(struct sadb_ext**    pfkey_ext,
++               uint32_t               dpd,
++               uint8_t                sens_level,
++               uint8_t                sens_len,
++               uint64_t*              sens_bitmap,
++               uint8_t                integ_level,
++               uint8_t                integ_len,
++               uint64_t*              integ_bitmap);
++
++int pfkey_x_protocol_build(struct sadb_ext **, uint8_t);
++
++
++int
++pfkey_prop_build(struct sadb_ext**    pfkey_ext,
++               uint8_t                replay,
++               unsigned int           comb_num,
++               struct sadb_comb*      comb);
++
++int
++pfkey_supported_build(struct sadb_ext**       pfkey_ext,
++                    uint16_t          exttype,
++                    unsigned int      alg_num,
++                    struct sadb_alg*  alg);
++
++int
++pfkey_spirange_build(struct sadb_ext**        pfkey_ext,
++                   uint16_t           exttype,
++                   uint32_t           min,
++                   uint32_t           max);
++
++int
++pfkey_x_kmprivate_build(struct sadb_ext**     pfkey_ext);
++
++int
++pfkey_x_satype_build(struct sadb_ext**        pfkey_ext,
++                   uint8_t            satype);
++
++int
++pfkey_x_debug_build(struct sadb_ext** pfkey_ext,
++                  uint32_t            tunnel,
++                  uint32_t            netlink,
++                  uint32_t            xform,
++                  uint32_t            eroute,
++                  uint32_t            spi,
++                  uint32_t            radij,
++                  uint32_t            esp,
++                  uint32_t            ah,
++                  uint32_t            rcv,
++                  uint32_t            pfkey,
++                  uint32_t            ipcomp,
++                  uint32_t            verbose);
++
++int
++pfkey_msg_build(struct sadb_msg**     pfkey_msg,
++              struct sadb_ext*        extensions[],
++              int                     dir);
++
++/* in pfkey_v2_debug.c - routines to decode numbers -> strings */
++const char *
++pfkey_v2_sadb_ext_string(int extnum);
++
++const char *
++pfkey_v2_sadb_type_string(int sadb_type);
++
++struct sadb_builds {
++      struct k_sadb_sa       sa_base;
++};
++
++int
++pfkey_sa_builds(struct sadb_ext **pfkey_ext,
++              struct sadb_builds sab);
++
++extern int
++pfkey_outif_build(struct sadb_ext **pfkey_ext,
++                uint16_t outif);
++
++#endif /* __NET_IPSEC_PF_KEY_H */
++
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/pfkey_debug.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,54 @@
++/*
++ * sanitize a string into a printable format.
++ *
++ * Copyright (C) 1998-2002  D. Hugh Redelmeier.
++ * Copyright (C) 2003  Michael Richardson <mcr@freeswan.org>
++ * 
++ * This library is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU Library General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.  See <http://www.fsf.org/copyleft/lgpl.txt>.
++ * 
++ * This library 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 Library General Public
++ * License for more details.
++ *
++ * RCSID $Id: pfkey_debug.h,v 1.3 2004/04/05 19:55:07 mcr Exp $
++ */
++
++#ifndef _FREESWAN_PFKEY_DEBUG_H
++#define _FREESWAN_PFKEY_DEBUG_H
++
++#ifdef __KERNEL__
++
++/* note, kernel version ignores pfkey levels */
++# define DEBUGGING(level,args...) \
++         KLIPS_PRINT(debug_pfkey, "klips_debug:" args)
++
++# define ERROR(args...) printk(KERN_ERR "klips:" args)
++
++#else
++
++extern unsigned int pfkey_lib_debug;
++
++extern int (*pfkey_debug_func)(const char *message, ...) PRINTF_LIKE(1);
++extern int (*pfkey_error_func)(const char *message, ...) PRINTF_LIKE(1);
++
++#define DEBUGGING(level,args...)  if(pfkey_lib_debug & level) { \
++                              if(pfkey_debug_func != NULL) { \
++                                (*pfkey_debug_func)("pfkey_lib_debug:" args); \
++                              } else { \
++                                printf("pfkey_lib_debug:" args); \
++                              } }
++
++#define ERROR(args...)      if(pfkey_error_func != NULL) { \
++                                (*pfkey_error_func)("pfkey_lib_debug:" args); \
++                              } 
++
++# define MALLOC(size) malloc(size)
++# define FREE(obj) free(obj)
++
++#endif
++
++#endif
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/pfkeyv2.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,347 @@
++/*
++ * RCSID $Id: pfkeyv2.h,v 1.31 2005/04/14 01:14:54 mcr Exp $
++ */
++
++/*
++RFC 2367               PF_KEY Key Management API               July 1998
++
++
++Appendix D: Sample Header File
++
++This file defines structures and symbols for the PF_KEY Version 2
++key management interface. It was written at the U.S. Naval Research
++Laboratory. This file is in the public domain. The authors ask that
++you leave this credit intact on any copies of this file.
++*/
++
++#ifndef __PFKEY_V2_H
++#define __PFKEY_V2_H 1
++
++#include <linux/pfkeyv2.h>
++
++#define PF_KEY_V2               2
++#define PFKEYV2_REVISION        199806L
++
++enum sadb_msg_t {
++      K_SADB_RESERVED=SADB_RESERVED,
++      K_SADB_GETSPI=SADB_GETSPI,
++      K_SADB_UPDATE=SADB_UPDATE,
++      K_SADB_ADD=SADB_ADD,
++      K_SADB_DELETE=SADB_DELETE,
++      K_SADB_GET=SADB_GET,
++      K_SADB_ACQUIRE=SADB_ACQUIRE,
++      K_SADB_REGISTER=SADB_REGISTER,
++      K_SADB_EXPIRE=SADB_EXPIRE,
++      K_SADB_FLUSH=SADB_FLUSH,
++      K_SADB_DUMP=SADB_DUMP,
++      K_SADB_X_PROMISC=SADB_X_PROMISC,
++      K_SADB_X_PCHANGE=SADB_X_PCHANGE,
++      K_SADB_X_GRPSA=13,
++      K_SADB_X_ADDFLOW=14,
++      K_SADB_X_DELFLOW=15,
++      K_SADB_X_DEBUG=16,
++      K_SADB_X_NAT_T_NEW_MAPPING=17,
++      K_SADB_X_PLUMBIF=18,
++      K_SADB_X_UNPLUMBIF=19,
++      K_SADB_MAX=19
++};
++
++#define SADB_X_GRPSA      K_SADB_X_GRPSA                  
++#define SADB_X_ADDFLOW            K_SADB_X_ADDFLOW        
++#define SADB_X_DELFLOW            K_SADB_X_DELFLOW        
++#define SADB_X_DEBUG      K_SADB_X_DEBUG                  
++#define SADB_X_PLUMBIF            K_SADB_X_PLUMBIF        
++#define SADB_X_UNPLUMBIF    K_SADB_X_UNPLUMBIF            
++
++struct k_sadb_sa {
++      uint16_t sadb_sa_len;
++      uint16_t sadb_sa_exttype;
++      uint32_t sadb_sa_spi;
++      uint8_t sadb_sa_replay;
++      uint8_t sadb_sa_state;
++      uint8_t sadb_sa_auth;
++      uint8_t sadb_sa_encrypt;
++      uint32_t sadb_sa_flags;
++      uint32_t /*IPsecSAref_t*/ sadb_x_sa_ref; /* 32 bits */
++      uint8_t sadb_x_reserved[4];
++} __attribute__((packed));
++
++struct sadb_sa_v1 {
++  uint16_t sadb_sa_len;
++  uint16_t sadb_sa_exttype;
++  uint32_t sadb_sa_spi;
++  uint8_t sadb_sa_replay;
++  uint8_t sadb_sa_state;
++  uint8_t sadb_sa_auth;
++  uint8_t sadb_sa_encrypt;
++  uint32_t sadb_sa_flags;
++} __attribute__((packed));
++
++struct sadb_x_satype {
++  uint16_t sadb_x_satype_len;
++  uint16_t sadb_x_satype_exttype;
++  uint8_t sadb_x_satype_satype;
++  uint8_t sadb_x_satype_reserved[3];
++} __attribute__((packed));
++  
++struct sadb_x_debug {
++  uint16_t sadb_x_debug_len;
++  uint16_t sadb_x_debug_exttype;
++  uint32_t sadb_x_debug_tunnel;
++  uint32_t sadb_x_debug_netlink;
++  uint32_t sadb_x_debug_xform;
++  uint32_t sadb_x_debug_eroute;
++  uint32_t sadb_x_debug_spi;
++  uint32_t sadb_x_debug_radij;
++  uint32_t sadb_x_debug_esp;
++  uint32_t sadb_x_debug_ah;
++  uint32_t sadb_x_debug_rcv;
++  uint32_t sadb_x_debug_pfkey;
++  uint32_t sadb_x_debug_ipcomp;
++  uint32_t sadb_x_debug_verbose;
++  uint8_t sadb_x_debug_reserved[4];
++} __attribute__((packed));
++
++/*
++ * a plumbif extension can appear in
++ *          - a plumbif message to create the interface.
++ *          - a unplumbif message to delete the interface.
++ *          - a sadb add/replace to indicate which interface
++ *                   a decrypted packet should emerge on.
++ *
++ * the create/delete part could/should be replaced with netlink equivalents,
++ * or better yet, FORCES versions of same.
++ * 
++ */
++struct sadb_x_plumbif {
++      uint16_t sadb_x_outif_len;
++      uint16_t sadb_x_outif_exttype;
++      uint16_t sadb_x_outif_ifnum;
++} __attribute__((packed));
++
++/*
++ * the ifnum describes a device that you wish to create refer to.
++ *
++ * devices 0-40959 are mastXXX devices.
++ * devices 40960-49141 are mastXXX devices with transport set.
++ * devices 49152-65536 are deprecated ipsecXXX devices.
++ */
++#define IPSECDEV_OFFSET       (48*1024)
++#define MASTTRANSPORT_OFFSET  (40*1024)
++
++/*
++ * an saref extension sets the SA's reference number, and
++ * may also set the paired SA's reference number.
++ *
++ */
++struct sadb_x_saref {
++      uint16_t sadb_x_saref_len;
++      uint16_t sadb_x_saref_exttype;
++      uint32_t sadb_x_saref_me;       
++      uint32_t sadb_x_saref_him;
++} __attribute__((packed));
++
++/*
++ * A protocol structure for passing through the transport level
++ * protocol.  It contains more fields than are actually used/needed
++ * but it is this way to be compatible with the structure used in
++ * OpenBSD (http://www.openbsd.org/cgi-bin/cvsweb/src/sys/net/pfkeyv2.h)
++ */
++struct sadb_protocol {
++  uint16_t sadb_protocol_len;
++  uint16_t sadb_protocol_exttype;
++  uint8_t  sadb_protocol_proto;
++  uint8_t  sadb_protocol_direction;
++  uint8_t  sadb_protocol_flags;
++  uint8_t  sadb_protocol_reserved2;
++} __attribute__((packed));
++
++/*
++ * NOTE that there is a limit of 31 extensions due to current implementation
++ * in pfkeyv2_ext_bits.c
++ */
++enum sadb_extension_t {
++      K_SADB_EXT_RESERVED=SADB_RESERVED,
++      K_SADB_EXT_SA=              SADB_EXT_SA,
++      K_SADB_EXT_LIFETIME_CURRENT=SADB_EXT_LIFETIME_CURRENT,
++      K_SADB_EXT_LIFETIME_HARD=   SADB_EXT_LIFETIME_HARD,
++      K_SADB_EXT_LIFETIME_SOFT=   SADB_EXT_LIFETIME_SOFT,
++      K_SADB_EXT_ADDRESS_SRC=     SADB_EXT_ADDRESS_SRC,
++      K_SADB_EXT_ADDRESS_DST=     SADB_EXT_ADDRESS_DST,
++      K_SADB_EXT_ADDRESS_PROXY=   SADB_EXT_ADDRESS_PROXY,
++      K_SADB_EXT_KEY_AUTH=        SADB_EXT_KEY_AUTH,
++      K_SADB_EXT_KEY_ENCRYPT=     SADB_EXT_KEY_ENCRYPT,
++      K_SADB_EXT_IDENTITY_SRC=    SADB_EXT_IDENTITY_SRC,
++      K_SADB_EXT_IDENTITY_DST=    SADB_EXT_IDENTITY_DST,
++      K_SADB_EXT_SENSITIVITY=     SADB_EXT_SENSITIVITY,
++      K_SADB_EXT_PROPOSAL=        SADB_EXT_PROPOSAL,
++      K_SADB_EXT_SUPPORTED_AUTH=  SADB_EXT_SUPPORTED_AUTH,
++      K_SADB_EXT_SUPPORTED_ENCRYPT=SADB_EXT_SUPPORTED_ENCRYPT,
++      K_SADB_EXT_SPIRANGE=        SADB_EXT_SPIRANGE,
++      K_SADB_X_EXT_KMPRIVATE=     SADB_X_EXT_KMPRIVATE,
++      K_SADB_X_EXT_SATYPE2=       18,
++      K_SADB_X_EXT_POLICY=        SADB_X_EXT_POLICY,
++      K_SADB_X_EXT_SA2=           SADB_X_EXT_SA2,
++      K_SADB_X_EXT_ADDRESS_DST2=  20,
++      K_SADB_X_EXT_ADDRESS_SRC_FLOW=21,
++      K_SADB_X_EXT_ADDRESS_DST_FLOW=22,
++      K_SADB_X_EXT_ADDRESS_SRC_MASK=23,
++      K_SADB_X_EXT_ADDRESS_DST_MASK=24,
++      K_SADB_X_EXT_DEBUG=         25,
++      K_SADB_X_EXT_PROTOCOL=      26,
++      K_SADB_X_EXT_NAT_T_TYPE=    27,
++      K_SADB_X_EXT_NAT_T_SPORT=   28,
++      K_SADB_X_EXT_NAT_T_DPORT=   29,
++      K_SADB_X_EXT_NAT_T_OA=      30,
++      K_SADB_X_EXT_PLUMBIF=       31,
++      K_SADB_X_EXT_SAREF=         32,
++      K_SADB_EXT_MAX=             32,
++};
++
++
++#define SADB_X_EXT_SATYPE2            K_SADB_X_EXT_SATYPE2            
++#define SADB_X_EXT_ADDRESS_DST2               K_SADB_X_EXT_ADDRESS_DST2       
++#define SADB_X_EXT_ADDRESS_SRC_FLOW   K_SADB_X_EXT_ADDRESS_SRC_FLOW   
++#define SADB_X_EXT_ADDRESS_DST_FLOW   K_SADB_X_EXT_ADDRESS_DST_FLOW   
++#define SADB_X_EXT_ADDRESS_SRC_MASK   K_SADB_X_EXT_ADDRESS_SRC_MASK   
++#define SADB_X_EXT_ADDRESS_DST_MASK   K_SADB_X_EXT_ADDRESS_DST_MASK   
++#define SADB_X_EXT_DEBUG              K_SADB_X_EXT_DEBUG              
++#define SADB_X_EXT_PROTOCOL           K_SADB_X_EXT_PROTOCOL           
++
++#undef SADB_X_EXT_NAT_T_TYPE          
++#undef SADB_X_EXT_NAT_T_SPORT         
++#undef SADB_X_EXT_NAT_T_DPORT         
++#undef SADB_X_EXT_NAT_T_OA            
++#define SADB_X_EXT_PLUMBIF            K_SADB_X_EXT_PLUMBIF            
++
++
++
++/* K_SADB_X_DELFLOW required over and above K_SADB_X_SAFLAGS_CLEARFLOW */
++#define K_SADB_X_EXT_ADDRESS_DELFLOW \
++      ( (1<<K_SADB_X_EXT_ADDRESS_SRC_FLOW) \
++      | (1<<K_SADB_X_EXT_ADDRESS_DST_FLOW) \
++      | (1<<K_SADB_X_EXT_ADDRESS_SRC_MASK) \
++      | (1<<K_SADB_X_EXT_ADDRESS_DST_MASK))
++
++enum sadb_satype {
++      K_SADB_SATYPE_UNSPEC=SADB_SATYPE_UNSPEC,
++      K_SADB_SATYPE_AH=SADB_SATYPE_AH,
++      K_SADB_SATYPE_ESP=SADB_SATYPE_ESP,
++      K_SADB_SATYPE_RSVP=SADB_SATYPE_RSVP,
++      K_SADB_SATYPE_OSPFV2=SADB_SATYPE_OSPFV2,
++      K_SADB_SATYPE_RIPV2=SADB_SATYPE_RIPV2,
++      K_SADB_SATYPE_MIP=SADB_SATYPE_MIP,
++      K_SADB_X_SATYPE_IPIP=9,
++      K_SADB_X_SATYPE_COMP=10,
++      K_SADB_X_SATYPE_INT=11
++};
++#define K_SADB_SATYPE_MAX       11
++
++enum sadb_sastate {
++  K_SADB_SASTATE_LARVAL=0,
++  K_SADB_SASTATE_MATURE=1,
++  K_SADB_SASTATE_DYING=2,
++  K_SADB_SASTATE_DEAD=3
++};
++#undef  SADB_SASTATE_LARVAL
++#undef  SADB_SASTATE_MATURE
++#undef  SADB_SASTATE_DYING
++#undef  SADB_SASTATE_DEAD
++#define K_SADB_SASTATE_MAX 3
++
++#define SADB_SAFLAGS_PFS              1
++#define SADB_X_SAFLAGS_REPLACEFLOW    2
++#define SADB_X_SAFLAGS_CLEARFLOW      4
++#define SADB_X_SAFLAGS_INFLOW         8
++
++/* not obvious, but these are the same values as used in isakmp,
++ * and in freeswan/ipsec_policy.h. If you need to add any, they
++ * should be added as according to 
++ *   http://www.iana.org/assignments/isakmp-registry
++ * 
++ * and if not, then please try to use a private-use value, and
++ * consider asking IANA to assign a value.
++ */
++#define SADB_AALG_NONE                  0
++#define SADB_AALG_MD5HMAC               2
++#define SADB_AALG_SHA1HMAC              3
++#define SADB_X_AALG_SHA2_256HMAC      5
++#define SADB_X_AALG_SHA2_384HMAC      6
++#define SADB_X_AALG_SHA2_512HMAC      7
++#define SADB_X_AALG_RIPEMD160HMAC     8
++#define SADB_X_AALG_NULL              251     /* kame */
++enum sadb_aalg {
++      K_SADB_AALG_NONE=          SADB_AALG_NONE,              
++      K_SADB_AALG_MD5HMAC=       SADB_AALG_MD5HMAC,           
++      K_SADB_AALG_SHA1HMAC=      SADB_AALG_SHA1HMAC,          
++      K_SADB_X_AALG_SHA2_256HMAC=SADB_X_AALG_SHA2_256HMAC,
++      K_SADB_X_AALG_SHA2_384HMAC=SADB_X_AALG_SHA2_384HMAC,
++      K_SADB_X_AALG_SHA2_512HMAC=SADB_X_AALG_SHA2_512HMAC,
++      K_SADB_X_AALG_RIPEMD160HMAC=SADB_X_AALG_RIPEMD160HMAC,
++};
++#define K_SADB_AALG_MAX                       251
++
++#define SADB_EALG_NONE                  0
++#define SADB_EALG_DESCBC                2
++#define SADB_EALG_3DESCBC               3
++#define SADB_X_EALG_CASTCBC           6
++#define SADB_X_EALG_BLOWFISHCBC               7
++#define SADB_EALG_NULL                        11
++#define SADB_X_EALG_AESCBC            12
++#define SADB_X_EALG_AESCTR            13
++#define SADB_X_EALG_AES_CCM_ICV8      14
++#define SADB_X_EALG_AES_CCM_ICV12     15
++#define SADB_X_EALG_AES_CCM_ICV16     16
++#define SADB_X_EALG_AES_GCM_ICV8      18
++#define SADB_X_EALG_AES_GCM_ICV12     19
++#define SADB_X_EALG_AES_GCM_ICV16     20
++#define SADB_X_EALG_CAMELLIACBC               22
++
++enum sadb_ealg {
++      K_SADB_EALG_NONE=SADB_EALG_NONE,                 
++      K_SADB_EALG_DESCBC=SADB_EALG_DESCBC,     
++      K_SADB_EALG_3DESCBC=SADB_EALG_3DESCBC,   
++      K_SADB_X_EALG_CASTCBC=SADB_X_EALG_CASTCBC,       
++      K_SADB_X_EALG_BLOWFISHCBC=SADB_X_EALG_BLOWFISHCBC, 
++      K_SADB_EALG_NULL=SADB_EALG_NULL,                 
++      K_SADB_X_EALG_AESCBC=SADB_X_EALG_AESCBC,    
++      K_SADB_X_EALG_AESCTR=SADB_X_EALG_AESCTR,
++      K_SADB_X_EALG_AES_CCM_ICV8=SADB_X_EALG_AES_CCM_ICV8,
++      K_SADB_X_EALG_AES_CCM_ICV12=SADB_X_EALG_AES_CCM_ICV12,
++      K_SADB_X_EALG_AES_CCM_ICV16=SADB_X_EALG_AES_CCM_ICV16,
++      K_SADB_X_EALG_AES_GCM_ICV8=SADB_X_EALG_AES_GCM_ICV8,
++      K_SADB_X_EALG_AES_GCM_ICV12=SADB_X_EALG_AES_GCM_ICV12,
++      K_SADB_X_EALG_AES_GCM_ICV16=SADB_X_EALG_AES_GCM_ICV16,
++      K_SADB_X_EALG_CAMELLIACBC=SADB_X_EALG_CAMELLIACBC
++};
++
++#undef SADB_EALG_MAX
++#define K_SADB_EALG_MAX                       255
++
++#define SADB_X_CALG_NONE          0
++#define SADB_X_CALG_OUI           1
++#define SADB_X_CALG_DEFLATE       2
++#define SADB_X_CALG_LZS           3
++#define SADB_X_CALG_LZJH          4
++#define SADB_X_CALG_MAX           4
++
++enum sadb_talg {
++      K_SADB_X_TALG_NONE=0,
++      K_SADB_X_TALG_IPv4_in_IPv4=1,
++      K_SADB_X_TALG_IPv6_in_IPv4=2,
++      K_SADB_X_TALG_IPv4_in_IPv6=3,
++      K_SADB_X_TALG_IPv6_in_IPv6=4,
++};
++#define SADB_X_TALG_MAX         4
++
++
++#define SADB_IDENTTYPE_RESERVED   0
++#define SADB_IDENTTYPE_PREFIX     1
++#define SADB_IDENTTYPE_FQDN       2
++#define SADB_IDENTTYPE_USERFQDN   3
++#define SADB_X_IDENTTYPE_CONNECTION 4
++#define K_SADB_IDENTTYPE_MAX        4
++
++#define K_SADB_KEY_FLAGS_MAX     0
++#endif /* __PFKEY_V2_H */
++
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/openswan/radij.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,280 @@
++/*
++ * RCSID $Id: radij.h,v 1.13 2004/04/05 19:55:08 mcr Exp $
++ */
++
++/*
++ * This file is defived from ${SRC}/sys/net/radix.h of BSD 4.4lite
++ *
++ * Variable and procedure names have been modified so that they don't
++ * conflict with the original BSD code, as a small number of modifications
++ * have been introduced and we may want to reuse this code in BSD.
++ * 
++ * The `j' in `radij' is pronounced as a voiceless guttural (like a Greek
++ * chi or a German ch sound (as `doch', not as in `milch'), or even a 
++ * spanish j as in Juan.  It is not as far back in the throat like
++ * the corresponding Hebrew sound, nor is it a soft breath like the English h.
++ * It has nothing to do with the Dutch ij sound.
++ * 
++ * Here is the appropriate copyright notice:
++ */
++
++/*
++ * Copyright (c) 1988, 1989, 1993
++ *    The Regents of the University of California.  All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ *    notice, this list of conditions and the following disclaimer in the
++ *    documentation and/or other materials provided with the distribution.
++ * 3. All advertising materials mentioning features or use of this software
++ *    must display the following acknowledgement:
++ *    This product includes software developed by the University of
++ *    California, Berkeley and its contributors.
++ * 4. Neither the name of the University nor the names of its contributors
++ *    may be used to endorse or promote products derived from this software
++ *    without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ *
++ *    @(#)radix.h     8.1 (Berkeley) 6/10/93
++ */
++
++#ifndef _RADIJ_H_
++#define       _RADIJ_H_
++
++/* 
++#define RJ_DEBUG
++*/
++
++#ifdef __KERNEL__
++
++#ifndef __P
++#ifdef __STDC__
++#define __P(x)  x
++#else
++#define __P(x)  ()
++#endif
++#endif
++
++/*
++ * Radix search tree node layout.
++ */
++
++struct radij_node
++{
++      struct  radij_mask *rj_mklist;  /* list of masks contained in subtree */
++      struct  radij_node *rj_p;       /* parent */
++      short   rj_b;                   /* bit offset; -1-index(netmask) */
++      char    rj_bmask;               /* node: mask for bit test*/
++      u_char  rj_flags;               /* enumerated next */
++#define RJF_NORMAL    1               /* leaf contains normal route */
++#define RJF_ROOT      2               /* leaf is root leaf for tree */
++#define RJF_ACTIVE    4               /* This node is alive (for rtfree) */
++      union {
++              struct {                        /* leaf only data: */
++                      caddr_t rj_Key; /* object of search */
++                      caddr_t rj_Mask;        /* netmask, if present */
++                      struct  radij_node *rj_Dupedkey;
++              } rj_leaf;
++              struct {                        /* node only data: */
++                      int     rj_Off;         /* where to start compare */
++                      struct  radij_node *rj_L;/* progeny */
++                      struct  radij_node *rj_R;/* progeny */
++              }rj_node;
++      }               rj_u;
++#ifdef RJ_DEBUG
++      int rj_info;
++      struct radij_node *rj_twin;
++      struct radij_node *rj_ybro;
++#endif
++};
++
++#define rj_dupedkey rj_u.rj_leaf.rj_Dupedkey
++#define rj_key rj_u.rj_leaf.rj_Key
++#define rj_mask rj_u.rj_leaf.rj_Mask
++#define rj_off rj_u.rj_node.rj_Off
++#define rj_l rj_u.rj_node.rj_L
++#define rj_r rj_u.rj_node.rj_R
++
++/*
++ * Annotations to tree concerning potential routes applying to subtrees.
++ */
++
++extern struct radij_mask {
++      short   rm_b;                   /* bit offset; -1-index(netmask) */
++      char    rm_unused;              /* cf. rj_bmask */
++      u_char  rm_flags;               /* cf. rj_flags */
++      struct  radij_mask *rm_mklist;  /* more masks to try */
++      caddr_t rm_mask;                /* the mask */
++      int     rm_refs;                /* # of references to this struct */
++} *rj_mkfreelist;
++
++#define MKGet(m) {\
++      if (rj_mkfreelist) {\
++              m = rj_mkfreelist; \
++              rj_mkfreelist = (m)->rm_mklist; \
++      } else \
++              R_Malloc(m, struct radij_mask *, sizeof (*(m))); }\
++
++#define MKFree(m) { (m)->rm_mklist = rj_mkfreelist; rj_mkfreelist = (m);}
++
++struct radij_node_head {
++      struct  radij_node *rnh_treetop;
++      int     rnh_addrsize;           /* permit, but not require fixed keys */
++      int     rnh_pktsize;            /* permit, but not require fixed keys */
++#if 0
++      struct  radij_node *(*rnh_addaddr)      /* add based on sockaddr */
++              __P((void *v, void *mask,
++                   struct radij_node_head *head, struct radij_node nodes[]));
++#endif
++      int (*rnh_addaddr)      /* add based on sockaddr */
++              __P((void *v, void *mask,
++                   struct radij_node_head *head, struct radij_node nodes[]));
++      struct  radij_node *(*rnh_addpkt)       /* add based on packet hdr */
++              __P((void *v, void *mask,
++                   struct radij_node_head *head, struct radij_node nodes[]));
++#if 0
++      struct  radij_node *(*rnh_deladdr)      /* remove based on sockaddr */
++              __P((void *v, void *mask, struct radij_node_head *head));
++#endif
++      int (*rnh_deladdr)      /* remove based on sockaddr */
++              __P((void *v, void *mask, struct radij_node_head *head, struct radij_node **node));
++      struct  radij_node *(*rnh_delpkt)       /* remove based on packet hdr */
++              __P((void *v, void *mask, struct radij_node_head *head));
++      struct  radij_node *(*rnh_matchaddr)    /* locate based on sockaddr */
++              __P((void *v, struct radij_node_head *head));
++      struct  radij_node *(*rnh_matchpkt)     /* locate based on packet hdr */
++              __P((void *v, struct radij_node_head *head));
++      int     (*rnh_walktree)                 /* traverse tree */
++              __P((struct radij_node_head *head, int (*f)(struct radij_node *rn, void *w), void *w));
++      struct  radij_node rnh_nodes[3];        /* empty tree for common case */
++};
++
++
++#define Bcmp(a, b, n) memcmp(((caddr_t)(b)), ((caddr_t)(a)), (unsigned)(n))
++#define Bcopy(a, b, n) memmove(((caddr_t)(b)), ((caddr_t)(a)), (unsigned)(n))
++#define Bzero(p, n) memset((caddr_t)(p), 0, (unsigned)(n))
++#define R_Malloc(p, t, n) ((p = (t) kmalloc((size_t)(n), GFP_ATOMIC)), Bzero((p),(n)))
++#define Free(p) kfree((caddr_t)p);
++
++void   rj_init __P((void));
++int    rj_inithead __P((void **, int));
++int    rj_refines __P((void *, void *));
++int    rj_walktree __P((struct radij_node_head *head, int (*f)(struct radij_node *rn, void *w), void *w));
++struct radij_node
++       *rj_addmask __P((void *, int, int)) /* , rgb */ ;
++int /* * */ rj_addroute __P((void *, void *, struct radij_node_head *,
++                      struct radij_node [2])) /* , rgb */ ;
++int /* * */ rj_delete __P((void *, void *, struct radij_node_head *, struct radij_node **)) /* , rgb */ ;
++struct radij_node /* rgb */
++       *rj_insert __P((void *, struct radij_node_head *, int *,
++                      struct radij_node [2])),
++       *rj_match __P((void *, struct radij_node_head *)),
++       *rj_newpair __P((void *, int, struct radij_node[2])),
++       *rj_search __P((void *, struct radij_node *)),
++       *rj_search_m __P((void *, struct radij_node *, void *));
++
++void rj_deltree(struct radij_node_head *);
++void rj_delnodes(struct radij_node *);
++void rj_free_mkfreelist(void);
++int radijcleartree(void);
++int radijcleanup(void);
++
++extern struct radij_node_head *mask_rjhead;
++extern int maj_keylen;
++#endif /* __KERNEL__ */
++
++#endif /* _RADIJ_H_ */
++
++
++/*
++ * $Log: radij.h,v $
++ * Revision 1.13  2004/04/05 19:55:08  mcr
++ * Moved from linux/include/freeswan/radij.h,v
++ *
++ * Revision 1.12  2002/04/24 07:36:48  mcr
++ * Moved from ./klips/net/ipsec/radij.h,v
++ *
++ * Revision 1.11  2001/09/20 15:33:00  rgb
++ * Min/max cleanup.
++ *
++ * Revision 1.10  1999/11/18 04:09:20  rgb
++ * Replaced all kernel version macros to shorter, readable form.
++ *
++ * Revision 1.9  1999/05/05 22:02:33  rgb
++ * Add a quick and dirty port to 2.2 kernels by Marc Boucher <marc@mbsi.ca>.
++ *
++ * Revision 1.8  1999/04/29 15:24:58  rgb
++ * Add check for existence of macros min/max.
++ *
++ * Revision 1.7  1999/04/11 00:29:02  henry
++ * GPL boilerplate
++ *
++ * Revision 1.6  1999/04/06 04:54:29  rgb
++ * Fix/Add RCSID Id: and Log: bits to make PHMDs happy.  This includes
++ * patch shell fixes.
++ *
++ * Revision 1.5  1999/01/22 06:30:32  rgb
++ * 64-bit clean-up.
++ *
++ * Revision 1.4  1998/11/30 13:22:55  rgb
++ * Rationalised all the klips kernel file headers.  They are much shorter
++ * now and won't conflict under RH5.2.
++ *
++ * Revision 1.3  1998/10/25 02:43:27  rgb
++ * Change return type on rj_addroute and rj_delete and add and argument
++ * to the latter to be able to transmit more infomation about errors.
++ *
++ * Revision 1.2  1998/07/14 18:09:51  rgb
++ * Add a routine to clear eroute table.
++ * Added #ifdef __KERNEL__ directives to restrict scope of header.
++ *
++ * Revision 1.1  1998/06/18 21:30:22  henry
++ * move sources from klips/src to klips/net/ipsec to keep stupid kernel
++ * build scripts happier about symlinks
++ *
++ * Revision 1.4  1998/05/25 20:34:16  rgb
++ * Remove temporary ipsec_walk, rj_deltree and rj_delnodes functions.
++ *
++ * Rename ipsec_rj_walker (ipsec_walk) to ipsec_rj_walker_procprint and
++ * add ipsec_rj_walker_delete.
++ *
++ * Recover memory for eroute table on unload of module.
++ *
++ * Revision 1.3  1998/04/22 16:51:37  rgb
++ * Tidy up radij debug code from recent rash of modifications to debug code.
++ *
++ * Revision 1.2  1998/04/14 17:30:38  rgb
++ * Fix up compiling errors for radij tree memory reclamation.
++ *
++ * Revision 1.1  1998/04/09 03:06:16  henry
++ * sources moved up from linux/net/ipsec
++ *
++ * Revision 1.1.1.1  1998/04/08 05:35:04  henry
++ * RGB's ipsec-0.8pre2.tar.gz ipsec-0.8
++ *
++ * Revision 0.4  1997/01/15 01:28:15  ji
++ * No changes.
++ *
++ * Revision 0.3  1996/11/20 14:44:45  ji
++ * Release update only.
++ *
++ * Revision 0.2  1996/11/02 00:18:33  ji
++ * First limited release.
++ *
++ *
++ */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/zlib/zconf.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,309 @@
++/* zconf.h -- configuration of the zlib compression library
++ * Copyright (C) 1995-2002 Jean-loup Gailly.
++ * For conditions of distribution and use, see copyright notice in zlib.h 
++ */
++
++/* @(#) $Id: zconf.h,v 1.4 2004/07/10 07:48:40 mcr Exp $ */
++
++#ifndef _ZCONF_H
++#define _ZCONF_H
++
++/*
++ * If you *really* need a unique prefix for all types and library functions,
++ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
++ */
++#ifdef IPCOMP_PREFIX
++#  define deflateInit_        ipcomp_deflateInit_
++#  define deflate     ipcomp_deflate
++#  define deflateEnd  ipcomp_deflateEnd
++#  define inflateInit_        ipcomp_inflateInit_
++#  define inflate     ipcomp_inflate
++#  define inflateEnd  ipcomp_inflateEnd
++#  define deflateInit2_       ipcomp_deflateInit2_
++#  define deflateSetDictionary ipcomp_deflateSetDictionary
++#  define deflateCopy ipcomp_deflateCopy
++#  define deflateReset        ipcomp_deflateReset
++#  define deflateParams       ipcomp_deflateParams
++#  define inflateInit2_       ipcomp_inflateInit2_
++#  define inflateSetDictionary ipcomp_inflateSetDictionary
++#  define inflateSync ipcomp_inflateSync
++#  define inflateSyncPoint ipcomp_inflateSyncPoint
++#  define inflateReset        ipcomp_inflateReset
++#  define compress    ipcomp_compress
++#  define compress2   ipcomp_compress2
++#  define uncompress  ipcomp_uncompress
++#  define adler32     ipcomp_adler32
++#  define crc32               ipcomp_crc32
++#  define get_crc_table ipcomp_get_crc_table
++/* SSS: these also need to be prefixed to avoid clash with ppp_deflate and ext2compression */
++#  define inflate_blocks ipcomp_deflate_blocks
++#  define inflate_blocks_free ipcomp_deflate_blocks_free
++#  define inflate_blocks_new ipcomp_inflate_blocks_new
++#  define inflate_blocks_reset ipcomp_inflate_blocks_reset
++#  define inflate_blocks_sync_point ipcomp_inflate_blocks_sync_point
++#  define inflate_set_dictionary ipcomp_inflate_set_dictionary
++#  define inflate_codes ipcomp_inflate_codes
++#  define inflate_codes_free ipcomp_inflate_codes_free
++#  define inflate_codes_new ipcomp_inflate_codes_new
++#  define inflate_fast ipcomp_inflate_fast
++#  define inflate_trees_bits ipcomp_inflate_trees_bits
++#  define inflate_trees_dynamic ipcomp_inflate_trees_dynamic
++#  define inflate_trees_fixed ipcomp_inflate_trees_fixed
++#  define inflate_flush ipcomp_inflate_flush
++#  define inflate_mask ipcomp_inflate_mask
++#  define _dist_code _ipcomp_dist_code
++#  define _length_code _ipcomp_length_code
++#  define _tr_align _ipcomp_tr_align
++#  define _tr_flush_block _ipcomp_tr_flush_block
++#  define _tr_init _ipcomp_tr_init
++#  define _tr_stored_block _ipcomp_tr_stored_block
++#  define _tr_tally _ipcomp_tr_tally
++#  define zError ipcomp_zError
++#  define z_errmsg ipcomp_z_errmsg
++#  define zlibVersion ipcomp_zlibVersion
++#  define match_init ipcomp_match_init
++#  define longest_match ipcomp_longest_match
++#endif
++
++#ifdef Z_PREFIX
++#  define Byte                z_Byte
++#  define uInt                z_uInt
++#  define uLong               z_uLong
++#  define Bytef               z_Bytef
++#  define charf               z_charf
++#  define intf                z_intf
++#  define uIntf               z_uIntf
++#  define uLongf      z_uLongf
++#  define voidpf      z_voidpf
++#  define voidp               z_voidp
++#endif
++
++#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
++#  define WIN32
++#endif
++#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386)
++#  ifndef __32BIT__
++#    define __32BIT__
++#  endif
++#endif
++#if defined(__MSDOS__) && !defined(MSDOS)
++#  define MSDOS
++#endif
++
++/*
++ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
++ * than 64k bytes at a time (needed on systems with 16-bit int).
++ */
++#if defined(MSDOS) && !defined(__32BIT__)
++#  define MAXSEG_64K
++#endif
++#ifdef MSDOS
++#  define UNALIGNED_OK
++#endif
++
++#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32))  && !defined(STDC)
++#  define STDC
++#endif
++#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)
++#  ifndef STDC
++#    define STDC
++#  endif
++#endif
++
++#ifndef STDC
++#  ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
++#    define const
++#  endif
++#endif
++
++/* Some Mac compilers merge all .h files incorrectly: */
++#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__)
++#  define NO_DUMMY_DECL
++#endif
++
++/* Old Borland C incorrectly complains about missing returns: */
++#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500)
++#  define NEED_DUMMY_RETURN
++#endif
++
++
++/* Maximum value for memLevel in deflateInit2 */
++#ifndef MAX_MEM_LEVEL
++#  ifdef MAXSEG_64K
++#    define MAX_MEM_LEVEL 8
++#  else
++#    define MAX_MEM_LEVEL 9
++#  endif
++#endif
++
++/* Maximum value for windowBits in deflateInit2 and inflateInit2.
++ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
++ * created by gzip. (Files created by minigzip can still be extracted by
++ * gzip.)
++ */
++#ifndef MAX_WBITS
++#  define MAX_WBITS   15 /* 32K LZ77 window */
++#endif
++
++/* The memory requirements for deflate are (in bytes):
++            (1 << (windowBits+2)) +  (1 << (memLevel+9))
++ that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values)
++ plus a few kilobytes for small objects. For example, if you want to reduce
++ the default memory requirements from 256K to 128K, compile with
++     make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
++ Of course this will generally degrade compression (there's no free lunch).
++
++   The memory requirements for inflate are (in bytes) 1 << windowBits
++ that is, 32K for windowBits=15 (default value) plus a few kilobytes
++ for small objects.
++*/
++
++                        /* Type declarations */
++
++#ifndef OF /* function prototypes */
++#  ifdef STDC
++#    define OF(args)  args
++#  else
++#    define OF(args)  ()
++#  endif
++#endif
++
++/* The following definitions for FAR are needed only for MSDOS mixed
++ * model programming (small or medium model with some far allocations).
++ * This was tested only with MSC; for other MSDOS compilers you may have
++ * to define NO_MEMCPY in zutil.h.  If you don't need the mixed model,
++ * just define FAR to be empty.
++ */
++#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)
++   /* MSC small or medium model */
++#  define SMALL_MEDIUM
++#  ifdef _MSC_VER
++#    define FAR _far
++#  else
++#    define FAR far
++#  endif
++#endif
++#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
++#  ifndef __32BIT__
++#    define SMALL_MEDIUM
++#    define FAR _far
++#  endif
++#endif
++
++/* Compile with -DZLIB_DLL for Windows DLL support */
++#if defined(ZLIB_DLL)
++#  if defined(_WINDOWS) || defined(WINDOWS)
++#    ifdef FAR
++#      undef FAR
++#    endif
++#    include <windows.h>
++#    define ZEXPORT  WINAPI
++#    ifdef WIN32
++#      define ZEXPORTVA  WINAPIV
++#    else
++#      define ZEXPORTVA  FAR _cdecl _export
++#    endif
++#  endif
++#  if defined (__BORLANDC__)
++#    if (__BORLANDC__ >= 0x0500) && defined (WIN32)
++#      include <windows.h>
++#      define ZEXPORT __declspec(dllexport) WINAPI
++#      define ZEXPORTRVA __declspec(dllexport) WINAPIV
++#    else
++#      if defined (_Windows) && defined (__DLL__)
++#        define ZEXPORT _export
++#        define ZEXPORTVA _export
++#      endif
++#    endif
++#  endif
++#endif
++
++#if defined (__BEOS__)
++#  if defined (ZLIB_DLL)
++#    define ZEXTERN extern __declspec(dllexport)
++#  else
++#    define ZEXTERN extern __declspec(dllimport)
++#  endif
++#endif
++
++#ifndef ZEXPORT
++#  define ZEXPORT
++#endif
++#ifndef ZEXPORTVA
++#  define ZEXPORTVA
++#endif
++#ifndef ZEXTERN
++#  define ZEXTERN extern
++#endif
++
++#ifndef FAR
++#   define FAR
++#endif
++
++#if !defined(MACOS) && !defined(TARGET_OS_MAC)
++typedef unsigned char  Byte;  /* 8 bits */
++#endif
++typedef unsigned int   uInt;  /* 16 bits or more */
++typedef unsigned long  uLong; /* 32 bits or more */
++
++#ifdef SMALL_MEDIUM
++   /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
++#  define Bytef Byte FAR
++#else
++   typedef Byte  FAR Bytef;
++#endif
++typedef char  FAR charf;
++typedef int   FAR intf;
++typedef uInt  FAR uIntf;
++typedef uLong FAR uLongf;
++
++#ifdef STDC
++   typedef void FAR *voidpf;
++   typedef void     *voidp;
++#else
++   typedef Byte FAR *voidpf;
++   typedef Byte     *voidp;
++#endif
++
++#ifdef HAVE_UNISTD_H
++#  include <sys/types.h> /* for off_t */
++#  include <unistd.h>    /* for SEEK_* and off_t */
++#  define z_off_t  off_t
++#endif
++#ifndef SEEK_SET
++#  define SEEK_SET        0       /* Seek from beginning of file.  */
++#  define SEEK_CUR        1       /* Seek from current position.  */
++#  define SEEK_END        2       /* Set file pointer to EOF plus "offset" */
++#endif
++#ifndef z_off_t
++#  define  z_off_t long
++#endif
++
++/* MVS linker does not support external names larger than 8 bytes */
++#if defined(__MVS__)
++#   pragma map(deflateInit_,"DEIN")
++#   pragma map(deflateInit2_,"DEIN2")
++#   pragma map(deflateEnd,"DEEND")
++#   pragma map(inflateInit_,"ININ")
++#   pragma map(inflateInit2_,"ININ2")
++#   pragma map(inflateEnd,"INEND")
++#   pragma map(inflateSync,"INSY")
++#   pragma map(inflateSetDictionary,"INSEDI")
++#   pragma map(inflate_blocks,"INBL")
++#   pragma map(inflate_blocks_new,"INBLNE")
++#   pragma map(inflate_blocks_free,"INBLFR")
++#   pragma map(inflate_blocks_reset,"INBLRE")
++#   pragma map(inflate_codes_free,"INCOFR")
++#   pragma map(inflate_codes,"INCO")
++#   pragma map(inflate_fast,"INFA")
++#   pragma map(inflate_flush,"INFLU")
++#   pragma map(inflate_mask,"INMA")
++#   pragma map(inflate_set_dictionary,"INSEDI2")
++#   pragma map(ipcomp_inflate_copyright,"INCOPY")
++#   pragma map(inflate_trees_bits,"INTRBI")
++#   pragma map(inflate_trees_dynamic,"INTRDY")
++#   pragma map(inflate_trees_fixed,"INTRFI")
++#   pragma map(inflate_trees_free,"INTRFR")
++#endif
++
++#endif /* _ZCONF_H */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/zlib/zlib.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,893 @@
++/* zlib.h -- interface of the 'zlib' general purpose compression library
++  version 1.1.4, March 11th, 2002
++
++  Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler
++
++  This software is provided 'as-is', without any express or implied
++  warranty.  In no event will the authors be held liable for any damages
++  arising from the use of this software.
++
++  Permission is granted to anyone to use this software for any purpose,
++  including commercial applications, and to alter it and redistribute it
++  freely, subject to the following restrictions:
++
++  1. The origin of this software must not be misrepresented; you must not
++     claim that you wrote the original software. If you use this software
++     in a product, an acknowledgment in the product documentation would be
++     appreciated but is not required.
++  2. Altered source versions must be plainly marked as such, and must not be
++     misrepresented as being the original software.
++  3. This notice may not be removed or altered from any source distribution.
++
++  Jean-loup Gailly        Mark Adler
++  jloup@gzip.org          madler@alumni.caltech.edu
++
++
++  The data format used by the zlib library is described by RFCs (Request for
++  Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
++  (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
++*/
++
++#ifndef _ZLIB_H
++#define _ZLIB_H
++
++#include "zconf.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define ZLIB_VERSION "1.1.4"
++
++/* 
++     The 'zlib' compression library provides in-memory compression and
++  decompression functions, including integrity checks of the uncompressed
++  data.  This version of the library supports only one compression method
++  (deflation) but other algorithms will be added later and will have the same
++  stream interface.
++
++     Compression can be done in a single step if the buffers are large
++  enough (for example if an input file is mmap'ed), or can be done by
++  repeated calls of the compression function.  In the latter case, the
++  application must provide more input and/or consume the output
++  (providing more output space) before each call.
++
++     The library also supports reading and writing files in gzip (.gz) format
++  with an interface similar to that of stdio.
++
++     The library does not install any signal handler. The decoder checks
++  the consistency of the compressed data, so the library should never
++  crash even in case of corrupted input.
++*/
++
++typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
++typedef void   (*free_func)  OF((voidpf opaque, voidpf address));
++
++struct internal_state;
++
++typedef struct z_stream_s {
++    Bytef    *next_in;  /* next input byte */
++    uInt     avail_in;  /* number of bytes available at next_in */
++    uLong    total_in;  /* total nb of input bytes read so far */
++
++    Bytef    *next_out; /* next output byte should be put there */
++    uInt     avail_out; /* remaining free space at next_out */
++    uLong    total_out; /* total nb of bytes output so far */
++
++    const char     *msg;      /* last error message, NULL if no error */
++    struct internal_state FAR *state; /* not visible by applications */
++
++    alloc_func zalloc;  /* used to allocate the internal state */
++    free_func  zfree;   /* used to free the internal state */
++    voidpf     opaque;  /* private data object passed to zalloc and zfree */
++
++    int     data_type;  /* best guess about the data type: ascii or binary */
++    uLong   adler;      /* adler32 value of the uncompressed data */
++    uLong   reserved;   /* reserved for future use */
++} z_stream;
++
++typedef z_stream FAR *z_streamp;
++
++/*
++   The application must update next_in and avail_in when avail_in has
++   dropped to zero. It must update next_out and avail_out when avail_out
++   has dropped to zero. The application must initialize zalloc, zfree and
++   opaque before calling the init function. All other fields are set by the
++   compression library and must not be updated by the application.
++
++   The opaque value provided by the application will be passed as the first
++   parameter for calls of zalloc and zfree. This can be useful for custom
++   memory management. The compression library attaches no meaning to the
++   opaque value.
++
++   zalloc must return Z_NULL if there is not enough memory for the object.
++   If zlib is used in a multi-threaded application, zalloc and zfree must be
++   thread safe.
++
++   On 16-bit systems, the functions zalloc and zfree must be able to allocate
++   exactly 65536 bytes, but will not be required to allocate more than this
++   if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
++   pointers returned by zalloc for objects of exactly 65536 bytes *must*
++   have their offset normalized to zero. The default allocation function
++   provided by this library ensures this (see zutil.c). To reduce memory
++   requirements and avoid any allocation of 64K objects, at the expense of
++   compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
++
++   The fields total_in and total_out can be used for statistics or
++   progress reports. After compression, total_in holds the total size of
++   the uncompressed data and may be saved for use in the decompressor
++   (particularly if the decompressor wants to decompress everything in
++   a single step).
++*/
++
++                        /* constants */
++
++#define Z_NO_FLUSH      0
++#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
++#define Z_SYNC_FLUSH    2
++#define Z_FULL_FLUSH    3
++#define Z_FINISH        4
++/* Allowed flush values; see deflate() below for details */
++
++#define Z_OK            0
++#define Z_STREAM_END    1
++#define Z_NEED_DICT     2
++#define Z_ERRNO        (-1)
++#define Z_STREAM_ERROR (-2)
++#define Z_DATA_ERROR   (-3)
++#define Z_MEM_ERROR    (-4)
++#define Z_BUF_ERROR    (-5)
++#define Z_VERSION_ERROR (-6)
++/* Return codes for the compression/decompression functions. Negative
++ * values are errors, positive values are used for special but normal events.
++ */
++
++#define Z_NO_COMPRESSION         0
++#define Z_BEST_SPEED             1
++#define Z_BEST_COMPRESSION       9
++#define Z_DEFAULT_COMPRESSION  (-1)
++/* compression levels */
++
++#define Z_FILTERED            1
++#define Z_HUFFMAN_ONLY        2
++#define Z_DEFAULT_STRATEGY    0
++/* compression strategy; see deflateInit2() below for details */
++
++#define Z_BINARY   0
++#define Z_ASCII    1
++#define Z_UNKNOWN  2
++/* Possible values of the data_type field */
++
++#define Z_DEFLATED   8
++/* The deflate compression method (the only one supported in this version) */
++
++#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */
++
++#define zlib_version zlibVersion()
++/* for compatibility with versions < 1.0.2 */
++
++                        /* basic functions */
++
++ZEXTERN const char * ZEXPORT zlibVersion OF((void));
++/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
++   If the first character differs, the library code actually used is
++   not compatible with the zlib.h header file used by the application.
++   This check is automatically made by deflateInit and inflateInit.
++ */
++
++/* 
++ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
++
++     Initializes the internal stream state for compression. The fields
++   zalloc, zfree and opaque must be initialized before by the caller.
++   If zalloc and zfree are set to Z_NULL, deflateInit updates them to
++   use default allocation functions.
++
++     The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
++   1 gives best speed, 9 gives best compression, 0 gives no compression at
++   all (the input data is simply copied a block at a time).
++   Z_DEFAULT_COMPRESSION requests a default compromise between speed and
++   compression (currently equivalent to level 6).
++
++     deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
++   enough memory, Z_STREAM_ERROR if level is not a valid compression level,
++   Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
++   with the version assumed by the caller (ZLIB_VERSION).
++   msg is set to null if there is no error message.  deflateInit does not
++   perform any compression: this will be done by deflate().
++*/
++
++
++ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
++/*
++    deflate compresses as much data as possible, and stops when the input
++  buffer becomes empty or the output buffer becomes full. It may introduce some
++  output latency (reading input without producing any output) except when
++  forced to flush.
++
++    The detailed semantics are as follows. deflate performs one or both of the
++  following actions:
++
++  - Compress more input starting at next_in and update next_in and avail_in
++    accordingly. If not all input can be processed (because there is not
++    enough room in the output buffer), next_in and avail_in are updated and
++    processing will resume at this point for the next call of deflate().
++
++  - Provide more output starting at next_out and update next_out and avail_out
++    accordingly. This action is forced if the parameter flush is non zero.
++    Forcing flush frequently degrades the compression ratio, so this parameter
++    should be set only when necessary (in interactive applications).
++    Some output may be provided even if flush is not set.
++
++  Before the call of deflate(), the application should ensure that at least
++  one of the actions is possible, by providing more input and/or consuming
++  more output, and updating avail_in or avail_out accordingly; avail_out
++  should never be zero before the call. The application can consume the
++  compressed output when it wants, for example when the output buffer is full
++  (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
++  and with zero avail_out, it must be called again after making room in the
++  output buffer because there might be more output pending.
++
++    If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
++  flushed to the output buffer and the output is aligned on a byte boundary, so
++  that the decompressor can get all input data available so far. (In particular
++  avail_in is zero after the call if enough output space has been provided
++  before the call.)  Flushing may degrade compression for some compression
++  algorithms and so it should be used only when necessary.
++
++    If flush is set to Z_FULL_FLUSH, all output is flushed as with
++  Z_SYNC_FLUSH, and the compression state is reset so that decompression can
++  restart from this point if previous compressed data has been damaged or if
++  random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
++  the compression.
++
++    If deflate returns with avail_out == 0, this function must be called again
++  with the same value of the flush parameter and more output space (updated
++  avail_out), until the flush is complete (deflate returns with non-zero
++  avail_out).
++
++    If the parameter flush is set to Z_FINISH, pending input is processed,
++  pending output is flushed and deflate returns with Z_STREAM_END if there
++  was enough output space; if deflate returns with Z_OK, this function must be
++  called again with Z_FINISH and more output space (updated avail_out) but no
++  more input data, until it returns with Z_STREAM_END or an error. After
++  deflate has returned Z_STREAM_END, the only possible operations on the
++  stream are deflateReset or deflateEnd.
++  
++    Z_FINISH can be used immediately after deflateInit if all the compression
++  is to be done in a single step. In this case, avail_out must be at least
++  0.1% larger than avail_in plus 12 bytes.  If deflate does not return
++  Z_STREAM_END, then it must be called again as described above.
++
++    deflate() sets strm->adler to the adler32 checksum of all input read
++  so far (that is, total_in bytes).
++
++    deflate() may update data_type if it can make a good guess about
++  the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered
++  binary. This field is only for information purposes and does not affect
++  the compression algorithm in any manner.
++
++    deflate() returns Z_OK if some progress has been made (more input
++  processed or more output produced), Z_STREAM_END if all input has been
++  consumed and all output has been produced (only when flush is set to
++  Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
++  if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
++  (for example avail_in or avail_out was zero).
++*/
++
++
++ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
++/*
++     All dynamically allocated data structures for this stream are freed.
++   This function discards any unprocessed input and does not flush any
++   pending output.
++
++     deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
++   stream state was inconsistent, Z_DATA_ERROR if the stream was freed
++   prematurely (some input or output was discarded). In the error case,
++   msg may be set but then points to a static string (which must not be
++   deallocated).
++*/
++
++
++/* 
++ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
++
++     Initializes the internal stream state for decompression. The fields
++   next_in, avail_in, zalloc, zfree and opaque must be initialized before by
++   the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
++   value depends on the compression method), inflateInit determines the
++   compression method from the zlib header and allocates all data structures
++   accordingly; otherwise the allocation will be deferred to the first call of
++   inflate.  If zalloc and zfree are set to Z_NULL, inflateInit updates them to
++   use default allocation functions.
++
++     inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
++   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
++   version assumed by the caller.  msg is set to null if there is no error
++   message. inflateInit does not perform any decompression apart from reading
++   the zlib header if present: this will be done by inflate().  (So next_in and
++   avail_in may be modified, but next_out and avail_out are unchanged.)
++*/
++
++
++ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
++/*
++    inflate decompresses as much data as possible, and stops when the input
++  buffer becomes empty or the output buffer becomes full. It may some
++  introduce some output latency (reading input without producing any output)
++  except when forced to flush.
++
++  The detailed semantics are as follows. inflate performs one or both of the
++  following actions:
++
++  - Decompress more input starting at next_in and update next_in and avail_in
++    accordingly. If not all input can be processed (because there is not
++    enough room in the output buffer), next_in is updated and processing
++    will resume at this point for the next call of inflate().
++
++  - Provide more output starting at next_out and update next_out and avail_out
++    accordingly.  inflate() provides as much output as possible, until there
++    is no more input data or no more space in the output buffer (see below
++    about the flush parameter).
++
++  Before the call of inflate(), the application should ensure that at least
++  one of the actions is possible, by providing more input and/or consuming
++  more output, and updating the next_* and avail_* values accordingly.
++  The application can consume the uncompressed output when it wants, for
++  example when the output buffer is full (avail_out == 0), or after each
++  call of inflate(). If inflate returns Z_OK and with zero avail_out, it
++  must be called again after making room in the output buffer because there
++  might be more output pending.
++
++    If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much
++  output as possible to the output buffer. The flushing behavior of inflate is
++  not specified for values of the flush parameter other than Z_SYNC_FLUSH
++  and Z_FINISH, but the current implementation actually flushes as much output
++  as possible anyway.
++
++    inflate() should normally be called until it returns Z_STREAM_END or an
++  error. However if all decompression is to be performed in a single step
++  (a single call of inflate), the parameter flush should be set to
++  Z_FINISH. In this case all pending input is processed and all pending
++  output is flushed; avail_out must be large enough to hold all the
++  uncompressed data. (The size of the uncompressed data may have been saved
++  by the compressor for this purpose.) The next operation on this stream must
++  be inflateEnd to deallocate the decompression state. The use of Z_FINISH
++  is never required, but can be used to inform inflate that a faster routine
++  may be used for the single inflate() call.
++
++     If a preset dictionary is needed at this point (see inflateSetDictionary
++  below), inflate sets strm-adler to the adler32 checksum of the
++  dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise 
++  it sets strm->adler to the adler32 checksum of all output produced
++  so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or
++  an error code as described below. At the end of the stream, inflate()
++  checks that its computed adler32 checksum is equal to that saved by the
++  compressor and returns Z_STREAM_END only if the checksum is correct.
++
++    inflate() returns Z_OK if some progress has been made (more input processed
++  or more output produced), Z_STREAM_END if the end of the compressed data has
++  been reached and all uncompressed output has been produced, Z_NEED_DICT if a
++  preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
++  corrupted (input stream not conforming to the zlib format or incorrect
++  adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent
++  (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not
++  enough memory, Z_BUF_ERROR if no progress is possible or if there was not
++  enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR
++  case, the application may then call inflateSync to look for a good
++  compression block.
++*/
++
++
++ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
++/*
++     All dynamically allocated data structures for this stream are freed.
++   This function discards any unprocessed input and does not flush any
++   pending output.
++
++     inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
++   was inconsistent. In the error case, msg may be set but then points to a
++   static string (which must not be deallocated).
++*/
++
++                        /* Advanced functions */
++
++/*
++    The following functions are needed only in some special applications.
++*/
++
++/*   
++ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
++                                     int  level,
++                                     int  method,
++                                     int  windowBits,
++                                     int  memLevel,
++                                     int  strategy));
++
++     This is another version of deflateInit with more compression options. The
++   fields next_in, zalloc, zfree and opaque must be initialized before by
++   the caller.
++
++     The method parameter is the compression method. It must be Z_DEFLATED in
++   this version of the library.
++
++     The windowBits parameter is the base two logarithm of the window size
++   (the size of the history buffer).  It should be in the range 8..15 for this
++   version of the library. Larger values of this parameter result in better
++   compression at the expense of memory usage. The default value is 15 if
++   deflateInit is used instead.
++
++     The memLevel parameter specifies how much memory should be allocated
++   for the internal compression state. memLevel=1 uses minimum memory but
++   is slow and reduces compression ratio; memLevel=9 uses maximum memory
++   for optimal speed. The default value is 8. See zconf.h for total memory
++   usage as a function of windowBits and memLevel.
++
++     The strategy parameter is used to tune the compression algorithm. Use the
++   value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
++   filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no
++   string match).  Filtered data consists mostly of small values with a
++   somewhat random distribution. In this case, the compression algorithm is
++   tuned to compress them better. The effect of Z_FILTERED is to force more
++   Huffman coding and less string matching; it is somewhat intermediate
++   between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects
++   the compression ratio but not the correctness of the compressed output even
++   if it is not set appropriately.
++
++      deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
++   memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
++   method). msg is set to null if there is no error message.  deflateInit2 does
++   not perform any compression: this will be done by deflate().
++*/
++                            
++ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
++                                             const Bytef *dictionary,
++                                             uInt  dictLength));
++/*
++     Initializes the compression dictionary from the given byte sequence
++   without producing any compressed output. This function must be called
++   immediately after deflateInit, deflateInit2 or deflateReset, before any
++   call of deflate. The compressor and decompressor must use exactly the same
++   dictionary (see inflateSetDictionary).
++
++     The dictionary should consist of strings (byte sequences) that are likely
++   to be encountered later in the data to be compressed, with the most commonly
++   used strings preferably put towards the end of the dictionary. Using a
++   dictionary is most useful when the data to be compressed is short and can be
++   predicted with good accuracy; the data can then be compressed better than
++   with the default empty dictionary.
++
++     Depending on the size of the compression data structures selected by
++   deflateInit or deflateInit2, a part of the dictionary may in effect be
++   discarded, for example if the dictionary is larger than the window size in
++   deflate or deflate2. Thus the strings most likely to be useful should be
++   put at the end of the dictionary, not at the front.
++
++     Upon return of this function, strm->adler is set to the Adler32 value
++   of the dictionary; the decompressor may later use this value to determine
++   which dictionary has been used by the compressor. (The Adler32 value
++   applies to the whole dictionary even if only a subset of the dictionary is
++   actually used by the compressor.)
++
++     deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
++   parameter is invalid (such as NULL dictionary) or the stream state is
++   inconsistent (for example if deflate has already been called for this stream
++   or if the compression method is bsort). deflateSetDictionary does not
++   perform any compression: this will be done by deflate().
++*/
++
++ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
++                                    z_streamp source));
++/*
++     Sets the destination stream as a complete copy of the source stream.
++
++     This function can be useful when several compression strategies will be
++   tried, for example when there are several ways of pre-processing the input
++   data with a filter. The streams that will be discarded should then be freed
++   by calling deflateEnd.  Note that deflateCopy duplicates the internal
++   compression state which can be quite large, so this strategy is slow and
++   can consume lots of memory.
++
++     deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
++   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
++   (such as zalloc being NULL). msg is left unchanged in both source and
++   destination.
++*/
++
++ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
++/*
++     This function is equivalent to deflateEnd followed by deflateInit,
++   but does not free and reallocate all the internal compression state.
++   The stream will keep the same compression level and any other attributes
++   that may have been set by deflateInit2.
++
++      deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
++   stream state was inconsistent (such as zalloc or state being NULL).
++*/
++
++ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
++                                    int level,
++                                    int strategy));
++/*
++     Dynamically update the compression level and compression strategy.  The
++   interpretation of level and strategy is as in deflateInit2.  This can be
++   used to switch between compression and straight copy of the input data, or
++   to switch to a different kind of input data requiring a different
++   strategy. If the compression level is changed, the input available so far
++   is compressed with the old level (and may be flushed); the new level will
++   take effect only at the next call of deflate().
++
++     Before the call of deflateParams, the stream state must be set as for
++   a call of deflate(), since the currently available input may have to
++   be compressed and flushed. In particular, strm->avail_out must be non-zero.
++
++     deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
++   stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
++   if strm->avail_out was zero.
++*/
++
++/*   
++ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
++                                     int  windowBits));
++
++     This is another version of inflateInit with an extra parameter. The
++   fields next_in, avail_in, zalloc, zfree and opaque must be initialized
++   before by the caller.
++
++     The windowBits parameter is the base two logarithm of the maximum window
++   size (the size of the history buffer).  It should be in the range 8..15 for
++   this version of the library. The default value is 15 if inflateInit is used
++   instead. If a compressed stream with a larger window size is given as
++   input, inflate() will return with the error code Z_DATA_ERROR instead of
++   trying to allocate a larger window.
++
++      inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
++   memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative
++   memLevel). msg is set to null if there is no error message.  inflateInit2
++   does not perform any decompression apart from reading the zlib header if
++   present: this will be done by inflate(). (So next_in and avail_in may be
++   modified, but next_out and avail_out are unchanged.)
++*/
++
++ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
++                                             const Bytef *dictionary,
++                                             uInt  dictLength));
++/*
++     Initializes the decompression dictionary from the given uncompressed byte
++   sequence. This function must be called immediately after a call of inflate
++   if this call returned Z_NEED_DICT. The dictionary chosen by the compressor
++   can be determined from the Adler32 value returned by this call of
++   inflate. The compressor and decompressor must use exactly the same
++   dictionary (see deflateSetDictionary).
++
++     inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
++   parameter is invalid (such as NULL dictionary) or the stream state is
++   inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
++   expected one (incorrect Adler32 value). inflateSetDictionary does not
++   perform any decompression: this will be done by subsequent calls of
++   inflate().
++*/
++
++ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
++/* 
++    Skips invalid compressed data until a full flush point (see above the
++  description of deflate with Z_FULL_FLUSH) can be found, or until all
++  available input is skipped. No output is provided.
++
++    inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
++  if no more input was provided, Z_DATA_ERROR if no flush point has been found,
++  or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
++  case, the application may save the current current value of total_in which
++  indicates where valid compressed data was found. In the error case, the
++  application may repeatedly call inflateSync, providing more input each time,
++  until success or end of the input data.
++*/
++
++ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
++/*
++     This function is equivalent to inflateEnd followed by inflateInit,
++   but does not free and reallocate all the internal decompression state.
++   The stream will keep attributes that may have been set by inflateInit2.
++
++      inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
++   stream state was inconsistent (such as zalloc or state being NULL).
++*/
++
++
++                        /* utility functions */
++
++/*
++     The following utility functions are implemented on top of the
++   basic stream-oriented functions. To simplify the interface, some
++   default options are assumed (compression level and memory usage,
++   standard memory allocation functions). The source code of these
++   utility functions can easily be modified if you need special options.
++*/
++
++ZEXTERN int ZEXPORT compress OF((Bytef *dest,   uLongf *destLen,
++                                 const Bytef *source, uLong sourceLen));
++/*
++     Compresses the source buffer into the destination buffer.  sourceLen is
++   the byte length of the source buffer. Upon entry, destLen is the total
++   size of the destination buffer, which must be at least 0.1% larger than
++   sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the
++   compressed buffer.
++     This function can be used to compress a whole file at once if the
++   input file is mmap'ed.
++     compress returns Z_OK if success, Z_MEM_ERROR if there was not
++   enough memory, Z_BUF_ERROR if there was not enough room in the output
++   buffer.
++*/
++
++ZEXTERN int ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,
++                                  const Bytef *source, uLong sourceLen,
++                                  int level));
++/*
++     Compresses the source buffer into the destination buffer. The level
++   parameter has the same meaning as in deflateInit.  sourceLen is the byte
++   length of the source buffer. Upon entry, destLen is the total size of the
++   destination buffer, which must be at least 0.1% larger than sourceLen plus
++   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
++
++     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
++   memory, Z_BUF_ERROR if there was not enough room in the output buffer,
++   Z_STREAM_ERROR if the level parameter is invalid.
++*/
++
++ZEXTERN int ZEXPORT uncompress OF((Bytef *dest,   uLongf *destLen,
++                                   const Bytef *source, uLong sourceLen));
++/*
++     Decompresses the source buffer into the destination buffer.  sourceLen is
++   the byte length of the source buffer. Upon entry, destLen is the total
++   size of the destination buffer, which must be large enough to hold the
++   entire uncompressed data. (The size of the uncompressed data must have
++   been saved previously by the compressor and transmitted to the decompressor
++   by some mechanism outside the scope of this compression library.)
++   Upon exit, destLen is the actual size of the compressed buffer.
++     This function can be used to decompress a whole file at once if the
++   input file is mmap'ed.
++
++     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
++   enough memory, Z_BUF_ERROR if there was not enough room in the output
++   buffer, or Z_DATA_ERROR if the input data was corrupted.
++*/
++
++
++typedef voidp gzFile;
++
++ZEXTERN gzFile ZEXPORT gzopen  OF((const char *path, const char *mode));
++/*
++     Opens a gzip (.gz) file for reading or writing. The mode parameter
++   is as in fopen ("rb" or "wb") but can also include a compression level
++   ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
++   Huffman only compression as in "wb1h". (See the description
++   of deflateInit2 for more information about the strategy parameter.)
++
++     gzopen can be used to read a file which is not in gzip format; in this
++   case gzread will directly read from the file without decompression.
++
++     gzopen returns NULL if the file could not be opened or if there was
++   insufficient memory to allocate the (de)compression state; errno
++   can be checked to distinguish the two cases (if errno is zero, the
++   zlib error is Z_MEM_ERROR).  */
++
++ZEXTERN gzFile ZEXPORT gzdopen  OF((int fd, const char *mode));
++/*
++     gzdopen() associates a gzFile with the file descriptor fd.  File
++   descriptors are obtained from calls like open, dup, creat, pipe or
++   fileno (in the file has been previously opened with fopen).
++   The mode parameter is as in gzopen.
++     The next call of gzclose on the returned gzFile will also close the
++   file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
++   descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
++     gzdopen returns NULL if there was insufficient memory to allocate
++   the (de)compression state.
++*/
++
++ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
++/*
++     Dynamically update the compression level or strategy. See the description
++   of deflateInit2 for the meaning of these parameters.
++     gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
++   opened for writing.
++*/
++
++ZEXTERN int ZEXPORT    gzread  OF((gzFile file, voidp buf, unsigned len));
++/*
++     Reads the given number of uncompressed bytes from the compressed file.
++   If the input file was not in gzip format, gzread copies the given number
++   of bytes into the buffer.
++     gzread returns the number of uncompressed bytes actually read (0 for
++   end of file, -1 for error). */
++
++ZEXTERN int ZEXPORT    gzwrite OF((gzFile file, 
++                                 const voidp buf, unsigned len));
++/*
++     Writes the given number of uncompressed bytes into the compressed file.
++   gzwrite returns the number of uncompressed bytes actually written
++   (0 in case of error).
++*/
++
++ZEXTERN int ZEXPORTVA   gzprintf OF((gzFile file, const char *format, ...));
++/*
++     Converts, formats, and writes the args to the compressed file under
++   control of the format string, as in fprintf. gzprintf returns the number of
++   uncompressed bytes actually written (0 in case of error).
++*/
++
++ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
++/*
++      Writes the given null-terminated string to the compressed file, excluding
++   the terminating null character.
++      gzputs returns the number of characters written, or -1 in case of error.
++*/
++
++ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
++/*
++      Reads bytes from the compressed file until len-1 characters are read, or
++   a newline character is read and transferred to buf, or an end-of-file
++   condition is encountered.  The string is then terminated with a null
++   character.
++      gzgets returns buf, or Z_NULL in case of error.
++*/
++
++ZEXTERN int ZEXPORT    gzputc OF((gzFile file, int c));
++/*
++      Writes c, converted to an unsigned char, into the compressed file.
++   gzputc returns the value that was written, or -1 in case of error.
++*/
++
++ZEXTERN int ZEXPORT    gzgetc OF((gzFile file));
++/*
++      Reads one byte from the compressed file. gzgetc returns this byte
++   or -1 in case of end of file or error.
++*/
++
++ZEXTERN int ZEXPORT    gzflush OF((gzFile file, int flush));
++/*
++     Flushes all pending output into the compressed file. The parameter
++   flush is as in the deflate() function. The return value is the zlib
++   error number (see function gzerror below). gzflush returns Z_OK if
++   the flush parameter is Z_FINISH and all output could be flushed.
++     gzflush should be called only when strictly necessary because it can
++   degrade compression.
++*/
++
++ZEXTERN z_off_t ZEXPORT    gzseek OF((gzFile file,
++                                    z_off_t offset, int whence));
++/* 
++      Sets the starting position for the next gzread or gzwrite on the
++   given compressed file. The offset represents a number of bytes in the
++   uncompressed data stream. The whence parameter is defined as in lseek(2);
++   the value SEEK_END is not supported.
++     If the file is opened for reading, this function is emulated but can be
++   extremely slow. If the file is opened for writing, only forward seeks are
++   supported; gzseek then compresses a sequence of zeroes up to the new
++   starting position.
++
++      gzseek returns the resulting offset location as measured in bytes from
++   the beginning of the uncompressed stream, or -1 in case of error, in
++   particular if the file is opened for writing and the new starting position
++   would be before the current position.
++*/
++
++ZEXTERN int ZEXPORT    gzrewind OF((gzFile file));
++/*
++     Rewinds the given file. This function is supported only for reading.
++
++   gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
++*/
++
++ZEXTERN z_off_t ZEXPORT    gztell OF((gzFile file));
++/*
++     Returns the starting position for the next gzread or gzwrite on the
++   given compressed file. This position represents a number of bytes in the
++   uncompressed data stream.
++
++   gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
++*/
++
++ZEXTERN int ZEXPORT gzeof OF((gzFile file));
++/*
++     Returns 1 when EOF has previously been detected reading the given
++   input stream, otherwise zero.
++*/
++
++ZEXTERN int ZEXPORT    gzclose OF((gzFile file));
++/*
++     Flushes all pending output if necessary, closes the compressed file
++   and deallocates all the (de)compression state. The return value is the zlib
++   error number (see function gzerror below).
++*/
++
++ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
++/*
++     Returns the error message for the last error which occurred on the
++   given compressed file. errnum is set to zlib error number. If an
++   error occurred in the file system and not in the compression library,
++   errnum is set to Z_ERRNO and the application may consult errno
++   to get the exact error code.
++*/
++
++                        /* checksum functions */
++
++/*
++     These functions are not related to compression but are exported
++   anyway because they might be useful in applications using the
++   compression library.
++*/
++
++ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
++
++/*
++     Update a running Adler-32 checksum with the bytes buf[0..len-1] and
++   return the updated checksum. If buf is NULL, this function returns
++   the required initial value for the checksum.
++   An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
++   much faster. Usage example:
++
++     uLong adler = adler32(0L, Z_NULL, 0);
++
++     while (read_buffer(buffer, length) != EOF) {
++       adler = adler32(adler, buffer, length);
++     }
++     if (adler != original_adler) error();
++*/
++
++ZEXTERN uLong ZEXPORT crc32   OF((uLong crc, const Bytef *buf, uInt len));
++/*
++     Update a running crc with the bytes buf[0..len-1] and return the updated
++   crc. If buf is NULL, this function returns the required initial value
++   for the crc. Pre- and post-conditioning (one's complement) is performed
++   within this function so it shouldn't be done by the application.
++   Usage example:
++
++     uLong crc = crc32(0L, Z_NULL, 0);
++
++     while (read_buffer(buffer, length) != EOF) {
++       crc = crc32(crc, buffer, length);
++     }
++     if (crc != original_crc) error();
++*/
++
++
++                        /* various hacks, don't look :) */
++
++/* deflateInit and inflateInit are macros to allow checking the zlib version
++ * and the compiler's view of z_stream:
++ */
++ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
++                                     const char *version, int stream_size));
++ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
++                                     const char *version, int stream_size));
++ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int  level, int  method,
++                                      int windowBits, int memLevel,
++                                      int strategy, const char *version,
++                                      int stream_size));
++ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int  windowBits,
++                                      const char *version, int stream_size));
++#define deflateInit(strm, level) \
++        deflateInit_((strm), (level),       ZLIB_VERSION, sizeof(z_stream))
++#define inflateInit(strm) \
++        inflateInit_((strm),                ZLIB_VERSION, sizeof(z_stream))
++#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
++        deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
++                      (strategy),           ZLIB_VERSION, sizeof(z_stream))
++#define inflateInit2(strm, windowBits) \
++        inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
++
++
++#if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL)
++    struct internal_state {int dummy;}; /* hack for buggy compilers */
++#endif
++
++ZEXTERN const char   * ZEXPORT zError           OF((int err));
++ZEXTERN int            ZEXPORT inflateSyncPoint OF((z_streamp z));
++ZEXTERN const uLongf * ZEXPORT get_crc_table    OF((void));
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _ZLIB_H */
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/include/zlib/zutil.h     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,225 @@
++/* zutil.h -- internal interface and configuration of the compression library
++ * Copyright (C) 1995-2002 Jean-loup Gailly.
++ * For conditions of distribution and use, see copyright notice in zlib.h
++ */
++
++/* WARNING: this file should *not* be used by applications. It is
++   part of the implementation of the compression library and is
++   subject to change. Applications should only use zlib.h.
++ */
++
++/* @(#) $Id: zutil.h,v 1.4 2002/04/24 07:36:48 mcr Exp $ */
++
++#ifndef _Z_UTIL_H
++#define _Z_UTIL_H
++
++#include "zlib.h"
++
++#include <linux/string.h>
++#define HAVE_MEMCPY
++
++#if 0 // #ifdef STDC
++#  include <stddef.h>
++#  include <string.h>
++#  include <stdlib.h>
++#endif
++#ifndef __KERNEL__
++#ifdef NO_ERRNO_H
++    extern int errno;
++#else
++#   include <errno.h>
++#endif
++#endif
++
++#ifndef local
++#  define local static
++#endif
++/* compile with -Dlocal if your debugger can't find static symbols */
++
++typedef unsigned char  uch;
++typedef uch FAR uchf;
++typedef unsigned short ush;
++typedef ush FAR ushf;
++typedef unsigned long  ulg;
++
++extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
++/* (size given to avoid silly warnings with Visual C++) */
++
++#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
++
++#define ERR_RETURN(strm,err) \
++  return (strm->msg = ERR_MSG(err), (err))
++/* To be used only when the state is known to be valid */
++
++        /* common constants */
++
++#ifndef DEF_WBITS
++#  define DEF_WBITS MAX_WBITS
++#endif
++/* default windowBits for decompression. MAX_WBITS is for compression only */
++
++#if MAX_MEM_LEVEL >= 8
++#  define DEF_MEM_LEVEL 8
++#else
++#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL
++#endif
++/* default memLevel */
++
++#define STORED_BLOCK 0
++#define STATIC_TREES 1
++#define DYN_TREES    2
++/* The three kinds of block type */
++
++#define MIN_MATCH  3
++#define MAX_MATCH  258
++/* The minimum and maximum match lengths */
++
++#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
++
++        /* target dependencies */
++
++#ifdef MSDOS
++#  define OS_CODE  0x00
++#  if defined(__TURBOC__) || defined(__BORLANDC__)
++#    if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
++       /* Allow compilation with ANSI keywords only enabled */
++       void _Cdecl farfree( void *block );
++       void *_Cdecl farmalloc( unsigned long nbytes );
++#    else
++#     include <alloc.h>
++#    endif
++#  else /* MSC or DJGPP */
++#    include <malloc.h>
++#  endif
++#endif
++
++#ifdef OS2
++#  define OS_CODE  0x06
++#endif
++
++#ifdef WIN32 /* Window 95 & Windows NT */
++#  define OS_CODE  0x0b
++#endif
++
++#if defined(VAXC) || defined(VMS)
++#  define OS_CODE  0x02
++#  define F_OPEN(name, mode) \
++     fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
++#endif
++
++#ifdef AMIGA
++#  define OS_CODE  0x01
++#endif
++
++#if defined(ATARI) || defined(atarist)
++#  define OS_CODE  0x05
++#endif
++
++#if defined(MACOS) || defined(TARGET_OS_MAC)
++#  define OS_CODE  0x07
++#  if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
++#    include <unix.h> /* for fdopen */
++#  else
++#    ifndef fdopen
++#      define fdopen(fd,mode) NULL /* No fdopen() */
++#    endif
++#  endif
++#endif
++
++#ifdef __50SERIES /* Prime/PRIMOS */
++#  define OS_CODE  0x0F
++#endif
++
++#ifdef TOPS20
++#  define OS_CODE  0x0a
++#endif
++
++#if defined(_BEOS_) || defined(RISCOS)
++#  define fdopen(fd,mode) NULL /* No fdopen() */
++#endif
++
++#if (defined(_MSC_VER) && (_MSC_VER > 600))
++#  define fdopen(fd,type)  _fdopen(fd,type)
++#endif
++
++
++        /* Common defaults */
++
++#ifndef OS_CODE
++#  define OS_CODE  0x03  /* assume Unix */
++#endif
++
++#ifndef F_OPEN
++#  define F_OPEN(name, mode) fopen((name), (mode))
++#endif
++
++         /* functions */
++
++#ifdef HAVE_STRERROR
++   extern char *strerror OF((int));
++#  define zstrerror(errnum) strerror(errnum)
++#else
++#  define zstrerror(errnum) ""
++#endif
++
++#if defined(pyr)
++#  define NO_MEMCPY
++#endif
++#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
++ /* Use our own functions for small and medium model with MSC <= 5.0.
++  * You may have to use the same strategy for Borland C (untested).
++  * The __SC__ check is for Symantec.
++  */
++#  define NO_MEMCPY
++#endif
++#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)
++#  define HAVE_MEMCPY
++#endif
++#ifdef HAVE_MEMCPY
++#  ifdef SMALL_MEDIUM /* MSDOS small or medium model */
++#    define zmemcpy _fmemcpy
++#    define zmemcmp _fmemcmp
++#    define zmemzero(dest, len) _fmemset(dest, 0, len)
++#  else
++#    define zmemcpy memcpy
++#    define zmemcmp memcmp
++#    define zmemzero(dest, len) memset(dest, 0, len)
++#  endif
++#else
++   extern void zmemcpy  OF((Bytef* dest, const Bytef* source, uInt len));
++   extern int  zmemcmp  OF((const Bytef* s1, const Bytef* s2, uInt len));
++   extern void zmemzero OF((Bytef* dest, uInt len));
++#endif
++
++/* Diagnostic functions */
++#ifdef DEBUG
++#  include <stdio.h>
++   extern int z_verbose;
++   extern void z_error    OF((char *m));
++#  define Assert(cond,msg) {if(!(cond)) z_error(msg);}
++#  define Trace(x) {if (z_verbose>=0) fprintf x ;}
++#  define Tracev(x) {if (z_verbose>0) fprintf x ;}
++#  define Tracevv(x) {if (z_verbose>1) fprintf x ;}
++#  define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}
++#  define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}
++#else
++#  define Assert(cond,msg)
++#  define Trace(x)
++#  define Tracev(x)
++#  define Tracevv(x)
++#  define Tracec(c,x)
++#  define Tracecv(c,x)
++#endif
++
++
++typedef uLong (ZEXPORT *check_func) OF((uLong check, const Bytef *buf,
++                                     uInt len));
++voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));
++void   zcfree  OF((voidpf opaque, voidpf ptr));
++
++#define ZALLOC(strm, items, size) \
++           (*((strm)->zalloc))((strm)->opaque, (items), (size))
++#define ZFREE(strm, addr)  (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
++#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
++
++#endif /* _Z_UTIL_H */
+--- swan26/net/Kconfig.preipsec        2005-09-01 18:15:19.000000000 -0400
++++ swan26/net/Kconfig 2005-09-03 16:51:17.000000000 -0400
+@@ -215,2 +215,6 @@
++if INET
++source "net/ipsec/Kconfig"
++endif # if INET
++
+ endif   # if NET
+--- /distros/kernel/linux-2.6.3-rc4/net/Makefile       Mon Feb 16 21:22:12 2004
++++ ref26/net/Makefile Thu Feb 19 21:02:25 2004
+@@ -42,3 +42,6 @@
+ ifeq ($(CONFIG_NET),y)
+ obj-$(CONFIG_SYSCTL)          += sysctl_net.o
+ endif
++
++obj-$(CONFIG_KLIPS)             += ipsec/
++
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/net/ipsec/Kconfig     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,143 @@
++#
++# IPSEC configuration
++# Copyright (C) 2004 Michael Richardson <mcr@freeswan.org>
++# 
++# 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++# 
++# 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.
++#
++
++config KLIPS
++      tristate "Openswan IPsec (KLIPS)"
++      default n
++#     depends on NF_CONNTRACK && NETFILTER
++      help
++        KLIPS is the Openswan (www.openswan.org) Kernel Level IP Security
++        system. It is extensively tested, and has interoperated with
++        many other systems. 
++        It provides "ipsecX" devices on which one can do firewalling.
++        The Openswan userland, is compatible with both KLIPS and NETKEY
++        You cannot build KLIPS and NETKEY inline into the kernel.
++
++menu "KLIPS options"
++      depends on KLIPS
++
++config KLIPS_ESP
++      bool 'Encapsulating Security Payload - ESP ("VPN")'
++      default y
++      help
++         This option provides support for the IPSEC Encapsulation Security
++         Payload (IP protocol 50) which provides packet layer content
++           hiding, and content authentication.
++         It is recommended to enable this.  RFC2406
++
++config KLIPS_AH
++      bool 'Authentication Header - AH'
++      default n
++      help
++           This option provides support for the IPSEC Authentication Header
++           (IP protocol 51) which provides packet layer sender and content
++           authentication. It does not provide for confidentiality.
++         It is not recommended to enable this.  RFC2402
++
++config KLIPS_AUTH_HMAC_MD5
++      bool 'HMAC-MD5 authentication algorithm' 
++      default y
++      help
++           The HMAC-MD5 algorithm is used by ESP (and AH) to guarantee packet
++         integrity. There is little reason not to include it.
++
++config KLIPS_AUTH_HMAC_SHA1
++      bool 'HMAC-SHA1 authentication algorithm' 
++      default y
++      help
++           The HMAC-SHA1 algorithm is used by ESP (and AH) to guarantee packet
++         integrity. SHA1 is a little slower than MD5, but is said to be 
++         a bit more secure. There is little reason not to include it.
++
++config KLIPS_ALG
++      bool 'KLIPS_ALG software encryption'
++      default y
++      help
++         This option provides support for loading new algorithms into the 
++         kernel for crypto use. You may disable this if using the
++         CONFIG_KLIPS_OCF option for hardware offload.
++
++config KLIPS_ENC_CRYPTOAPI
++      bool 'CryptoAPI algorithm interface'
++      default n
++      depends on KLIPS_ALG
++      help
++         Enable the algorithm interface to make all CryptoAPI 1.0 algorithms
++         available to KLIPS.
++
++config KLIPS_ENC_1DES
++      bool 'Include 1DES with CryptoAPI'
++      default n
++      depends on KLIPS_ENC_CRYPTOAPI
++      help
++         The CryptoAPI interface does not include support for every algorithm
++         yet, and one that it doesn't support by default is the VERY WEAK
++         1DES. Select this if you are terminally stupid.
++      
++config KLIPS_ENC_3DES
++      bool '3DES encryption algorithm'
++      default y
++      help
++           The 3DES algorithm is used by ESP to provide for packet privacy.
++         3DES is 3-repeats of the DES algorithm. 3DES is widely supported,
++         and analyzed and is considered very secure. 1DES is not supported.
++
++config KLIPS_ENC_AES
++      bool 'AES encryption algorithm'
++      default y
++      depends on KLIPS_ALG
++      help
++           The AES algorithm is used by ESP to provide for packet privacy.
++         AES the NIST replacement for DES. AES is being widely analyzed,
++           and is very fast.
++
++config KLIPS_IPCOMP
++      bool 'IP compression'
++      default y
++      help
++           The IPcomp protocol is used prior to ESP to make the packet
++         smaller. Once encrypted, compression will fail, so any link
++         layer efforts (e.g. PPP) will not work. 
++
++config KLIPS_OCF
++      bool 'IPsec OCF Acceleration Support'
++      default n
++      help
++         OCF provides Asynchronous crypto acceleration for kernel and
++         user applications.   It supports various HW accelerators.
++         If you have OCF support enabled and wish IPsec to utilise
++         the hardware managed by OCF,  then enable this option.
++         OCF is a kernel patch, see http://ocf-linux.sourceforge.net/
++
++config KLIPS_DEBUG
++      bool 'IPsec debugging'
++      default y 
++      help
++           KLIPS includes a lot of debugging code. Unless there is a real
++         tangible benefit to removing this code, it should be left in place.
++         Debugging connections without access to kernel level debugging is
++         essentially impossible. Leave this on.
++
++config KLIPS_IF_MAX
++      int 'Maximum number of virtual interfaces'
++      default 64
++      range 4 256
++      help
++         KLIPS creates virtual interfaces for tunnel purposes. At present
++         it keeps track of certain items in an array (FIX ME), and needs
++         to preallocate this array. Only a pointer is used per item.
++
++endmenu
++
+--- /dev/null   Tue Mar 11 13:02:56 2003
++++ linux/net/ipsec/Makefile     Mon Feb  9 13:51:03 2004
+@@ -0,0 +1,192 @@
++# Makefile for KLIPS kernel code as a module    for 2.6 kernels
++#
++# Makefile for KLIPS kernel code as a module
++# Copyright (C) 1998, 1999, 2000,2001  Richard Guy Briggs.
++# Copyright (C) 2002-2004     Michael Richardson <mcr@freeswan.org>
++# 
++# 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.  See <http://www.fsf.org/copyleft/gpl.txt>.
++# 
++# 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.
++#
++# RCSID $Id: Makefile.fs2_6,v 1.8.2.1 2006/04/20 16:33:06 mcr Exp $
++#
++# Note! Dependencies are done automagically by 'make dep', which also
++# removes any old dependencies. DON'T put your own dependencies here
++# unless it's something special (ie not a .c file).
++#
++
++OPENSWANSRCDIR?=.
++KLIPS_TOP?=.
++
++-include ${OPENSWANSRCDIR}/Makefile.ver
++
++base-klips-objs := 
++
++base-klips-objs+= ipsec_init.o ipsec_sa.o ipsec_radij.o radij.o
++base-klips-objs+= ipsec_life.o ipsec_proc.o
++base-klips-objs+= ipsec_tunnel.o ipsec_xmit.o ipsec_rcv.o ipsec_ipip.o
++base-klips-objs+= ipsec_snprintf.o
++base-klips-objs+= ipsec_mast.o
++base-klips-objs+= sysctl_net_ipsec.o 
++base-klips-objs+= pfkey_v2.o pfkey_v2_parser.o pfkey_v2_ext_process.o 
++base-klips-objs+= version.o
++
++base-klips-objs+= satot.o
++base-klips-objs+= addrtot.o
++base-klips-objs+= ultot.o 
++base-klips-objs+= addrtypeof.o
++base-klips-objs+= anyaddr.o
++base-klips-objs+= initaddr.o
++base-klips-objs+= ultoa.o 
++base-klips-objs+= addrtoa.o 
++base-klips-objs+= subnettoa.o 
++base-klips-objs+= subnetof.o 
++base-klips-objs+= goodmask.o 
++base-klips-objs+= datatot.o 
++base-klips-objs+= rangetoa.o 
++base-klips-objs+= prng.o 
++base-klips-objs+= pfkey_v2_parse.o 
++base-klips-objs+= pfkey_v2_build.o 
++base-klips-objs+= pfkey_v2_debug.o 
++base-klips-objs+= pfkey_v2_ext_bits.o 
++base-klips-objs+= version.o
++
++obj-${CONFIG_KLIPS} += ipsec.o
++
++ipsec-objs += ${base-klips-objs}
++
++ipsec-$(CONFIG_KLIPS_ESP)     += ipsec_esp.o
++ipsec-$(CONFIG_KLIPS_OCF)     += ipsec_ocf.o
++ipsec-$(CONFIG_KLIPS_IPCOMP)  += ipsec_ipcomp.o
++ipsec-$(CONFIG_KLIPS_AUTH_HMAC_MD5)  += ipsec_md5c.o
++ipsec-$(CONFIG_KLIPS_AUTH_HMAC_SHA1) += ipsec_sha1.o
++
++# AH, if you really think you need it.
++ipsec-$(CONFIG_KLIPS_AH)   += ipsec_ah.o
++
++ipsec-$(CONFIG_KLIPS_ALG) += ipsec_alg.o 
++
++# include code from DES subdir
++crypto-$(CONFIG_KLIPS_ENC_3DES) += des/ipsec_alg_3des.o
++crypto-$(CONFIG_KLIPS_ENC_3DES) += des/cbc_enc.o
++crypto-$(CONFIG_KLIPS_ENC_3DES) += des/ecb_enc.o
++crypto-$(CONFIG_KLIPS_ENC_3DES) += des/set_key.o
++
++ifeq ($(strip ${SUBARCH}),)
++SUBARCH:=${ARCH}
++endif
++
++# the assembly version expects frame pointers, which are
++# optional in many kernel builds. If you want speed, you should
++# probably use cryptoapi code instead.
++USEASSEMBLY=${SUBARCH}${CONFIG_FRAME_POINTER}
++ifeq (${USEASSEMBLY},i386y)
++crypto-$(CONFIG_KLIPS_ENC_3DES) += des/dx86unix.o
++else
++crypto-$(CONFIG_KLIPS_ENC_3DES) += des/des_enc.o
++endif
++
++# include code from AES subdir
++crypto-$(CONFIG_KLIPS_ENC_AES) += aes/ipsec_alg_aes.o
++crypto-$(CONFIG_KLIPS_ENC_AES) += aes/aes_xcbc_mac.o
++crypto-$(CONFIG_KLIPS_ENC_AES) += aes/aes_cbc.o
++
++ifeq ($(strip ${SUBARCH}),)
++SUBARCH:=${ARCH}
++endif
++
++USEASSEMBLY=${SUBARCH}${CONFIG_FRAME_POINTER}
++ifeq (${USEASSEMBLY},i386y)
++crypto-$(CONFIG_KLIPS_ENC_AES) += aes/aes-i586.o
++else
++crypto-$(CONFIG_KLIPS_ENC_AES) += aes/aes.o
++endif
++
++ipsec-y += ${crypto-y}
++
++ipsec-$(CONFIG_KLIPS_ENC_CRYPTOAPI) += ipsec_alg_cryptoapi.o
++
++# IPcomp stuff
++base-ipcomp-objs := ipcomp.o 
++base-ipcomp-objs += adler32.o
++base-ipcomp-objs += deflate.o
++base-ipcomp-objs += infblock.o
++base-ipcomp-objs += infcodes.o
++base-ipcomp-objs += inffast.o
++base-ipcomp-objs += inflate.o
++base-ipcomp-objs += inftrees.o
++base-ipcomp-objs += infutil.o
++base-ipcomp-objs += trees.o
++base-ipcomp-objs += zutil.o
++asm-ipcomp-obj-$(CONFIG_M586)          += match586.o
++asm-ipcomp-obj-$(CONFIG_M586TSC)       += match586.o
++asm-ipcomp-obj-$(CONFIG_M586MMX)       += match586.o
++asm-ipcomp-obj-$(CONFIG_M686)          += match686.o
++asm-ipcomp-obj-$(CONFIG_MPENTIUMIII)   += match686.o
++asm-ipcomp-obj-$(CONFIG_MPENTIUM4)     += match686.o
++asm-ipcomp-obj-$(CONFIG_MK6)           += match586.o
++asm-ipcomp-obj-$(CONFIG_MK7)           += match686