move more extra packages from ./trunk to ./packages
[openwrt/staging/dedeckeh.git] / package / isakmpd / patches / 010-debian_3.patch
diff --git a/package/isakmpd/patches/010-debian_3.patch b/package/isakmpd/patches/010-debian_3.patch
deleted file mode 100644 (file)
index 0f50cf9..0000000
+++ /dev/null
@@ -1,1753 +0,0 @@
-Index: isakmpd-20041012.orig/dpd.c
-===================================================================
---- isakmpd-20041012.orig.orig/dpd.c   2007-06-04 13:22:39.088912864 +0200
-+++ isakmpd-20041012.orig/dpd.c        2007-06-04 13:22:39.282883376 +0200
-@@ -26,6 +26,7 @@
- #include <sys/types.h>
- #include <stdlib.h>
-+#include <memory.h>
- #include "sysdep.h"
-@@ -174,6 +175,7 @@
-               }
-               break;
-       default:
-+      ;
-       }
-       /* Mark handled.  */
-@@ -223,6 +225,7 @@
-                   dpd_check_event, sa, &tv);
-               break;
-       default:
-+      ;
-       }
-       if (!sa->dpd_event) 
-               log_print("dpd_timer_reset: timer_add_event failed");
-Index: isakmpd-20041012.orig/ipsec.c
-===================================================================
---- isakmpd-20041012.orig.orig/ipsec.c 2007-06-04 13:22:39.093912104 +0200
-+++ isakmpd-20041012.orig/ipsec.c      2007-06-04 13:22:39.283883224 +0200
-@@ -1020,6 +1020,52 @@
-       }
- }
-+/*
-+ * deal with a NOTIFY of INVALID_SPI
-+ */
-+static void
-+ipsec_invalid_spi (struct message *msg, struct payload *p)
-+{
-+  struct sockaddr *dst;
-+  int invspisz, off;
-+  u_int32_t spi;
-+  u_int16_t totsiz;
-+  u_int8_t spisz;
-+
-+  /* Any notification that make us do something should be protected */
-+  if(!TAILQ_FIRST (&msg->payload[ISAKMP_PAYLOAD_HASH]))
-+    {
-+      LOG_DBG ((LOG_SA, 40,
-+                     "ipsec_invalid_spi: missing HASH payload in INVALID_SPI"
-+                     " notification"));
-+      return;
-+    }
-+
-+  /*
-+   * get the invalid spi out of the variable sized notification data
-+   * field, which is after the variable sized SPI field [which specifies
-+   * the receiving entity's phase-1 SPI, not the invalid spi]
-+   */
-+  totsiz = GET_ISAKMP_GEN_LENGTH (p->p);
-+  spisz = GET_ISAKMP_NOTIFY_SPI_SZ (p->p);
-+  off = ISAKMP_NOTIFY_SPI_OFF + spisz;
-+  invspisz = totsiz - off;
-+
-+  if (invspisz != sizeof spi)
-+    {
-+      LOG_DBG ((LOG_SA, 40,
-+             "ipsec_invalid_spi: SPI size %d in INVALID_SPI "
-+             "payload unsupported", spisz));
-+       return;
-+    }
-+  memcpy (&spi, p->p + off, sizeof spi);
-+
-+  msg->transport->vtbl->get_dst (msg->transport, &dst);
-+
-+  /* delete matching SPI's from this peer */
-+  ipsec_delete_spi_list (dst, 0, (u_int8_t *)&spi, 1, "INVALID_SPI");
-+}
-+
- static int
- ipsec_responder(struct message *msg)
- {
-@@ -1205,7 +1251,9 @@
-                       return dv != IPSEC_ENCAP_TUNNEL
-                           && dv != IPSEC_ENCAP_TRANSPORT
-                           && dv != IPSEC_ENCAP_UDP_ENCAP_TUNNEL
--                          && dv != IPSEC_ENCAP_UDP_ENCAP_TRANSPORT;
-+                          && dv != IPSEC_ENCAP_UDP_ENCAP_TRANSPORT
-+                          && dv != IPSEC_ENCAP_UDP_ENCAP_TUNNEL_DRAFT
-+                          && dv != IPSEC_ENCAP_UDP_ENCAP_TRANSPORT_DRAFT;
- #else
-                       return dv < IPSEC_ENCAP_TUNNEL
-                           || dv > IPSEC_ENCAP_TRANSPORT;
-@@ -1837,7 +1885,7 @@
- ipsec_get_id(char *section, int *id, struct sockaddr **addr,
-     struct sockaddr **mask, u_int8_t *tproto, u_int16_t *port)
- {
--      char    *type, *address, *netmask;
-+    char      *type, *address, *netmask;
-       type = conf_get_str(section, "ID-type");
-       if (!type) {
-Index: isakmpd-20041012.orig/GNUmakefile
-===================================================================
---- isakmpd-20041012.orig.orig/GNUmakefile     2007-06-04 13:22:39.099911192 +0200
-+++ isakmpd-20041012.orig/GNUmakefile  2007-06-04 13:22:39.283883224 +0200
-@@ -40,12 +40,12 @@
- # integrated, freebsd/netbsd means FreeBSD/NetBSD with KAME IPsec.
- # darwin means MacOS X 10.2 and later with KAME IPsec. linux means Linux-2.5
- # and later with native IPSec support.
--OS=           openbsd
-+#OS=          openbsd
- #OS=          netbsd
- #OS=          freebsd
- #OS=          freeswan
- #OS=          darwin
--#OS=          linux
-+OS=           linux
- .CURDIR:=     $(shell pwd)
- VPATH=                ${.CURDIR}/sysdep/${OS}
-@@ -55,9 +55,10 @@
- ifndef BINDIR
- BINDIR=               /sbin
- endif
--ifndef LDSTATIC
--LDSTATIC=     -static
--endif
-+
-+#ifndef LDSTATIC
-+#LDSTATIC=    -static
-+#endif
- SRCS=         app.c attribute.c cert.c connection.c \
-               constants.c conf.c cookie.c crypto.c dh.c doi.c exchange.c \
-@@ -131,11 +132,14 @@
- ifneq ($(findstring install,$(MAKECMDGOALS)),install)
- # Skip 'regress' until the regress/ structure has gmake makefiles for it.
- #SUBDIR:=     regress
--SUBDIR:=
-+#SUBDIR:=     apps/certpatch
- mksubdirs:
-       $(foreach DIR, ${SUBDIR}, \
--              cd ${DIR}; ${MAKE} ${MAKEFLAGS} CFLAGS="${CFLAGS}" \
--                      MKDEP="${MKDEP}" ${MAKECMDGOALS})
-+              cd ${.CURDIR}/${DIR}; ${MAKE} ${MAKECMDGOALS};)
-+              
-+#     $(foreach DIR, ${SUBDIR}, \
-+#             cd ${DIR}; ${MAKE} CFLAGS="${CFLAGS}" \
-+#                     MKDEP="${MKDEP}" ${MAKECMDGOALS})
- else
- mksubdirs:
- endif
-@@ -173,7 +177,7 @@
- endif
- SRCS+=                ${IPSEC_SRCS} ${X509} ${POLICY} ${EC} ${AGGRESSIVE} ${DNSSEC} \
--              $(ISAKMP_CFG)
-+                      $(ISAKMP_CFG) ${DPD} ${NAT_TRAVERSAL}
- CFLAGS+=      ${IPSEC_CFLAGS}
- LDADD+=               ${DESLIB}
- DPADD+=               ${DESLIBDEP}
-Index: isakmpd-20041012.orig/exchange.h
-===================================================================
---- isakmpd-20041012.orig.orig/exchange.h      2007-06-04 13:22:39.104910432 +0200
-+++ isakmpd-20041012.orig/exchange.h   2007-06-04 13:22:39.283883224 +0200
-@@ -221,6 +221,8 @@
- #define EXCHANGE_FLAG_NAT_T_ENABLE    0x10    /* We are doing NAT-T.  */
- #define EXCHANGE_FLAG_NAT_T_KEEPALIVE 0x20    /* We are the NAT:ed peer.  */
- #define EXCHANGE_FLAG_DPD_CAP_PEER    0x40    /* Peer is DPD capable.  */
-+#define EXCHANGE_FLAG_NAT_T_RFC               0x0080  /* Peer does RFC NAT-T. */
-+#define EXCHANGE_FLAG_NAT_T_DRAFT     0x0100  /* Peer does draft NAT-T.*/
- extern int      exchange_add_certs(struct message *);
- extern void     exchange_finalize(struct message *);
-Index: isakmpd-20041012.orig/log.c
-===================================================================
---- isakmpd-20041012.orig.orig/log.c   2007-06-04 13:22:39.110909520 +0200
-+++ isakmpd-20041012.orig/log.c        2007-06-04 13:22:39.284883072 +0200
-@@ -79,7 +79,6 @@
- struct packhdr {
-       struct pcap_pkthdr pcap;/* pcap file packet header */
--      u_int32_t sa_family;    /* address family */
-       union {
-               struct ip       ip4;    /* IPv4 header (w/o options) */
-               struct ip6_hdr  ip6;    /* IPv6 header */
-@@ -97,7 +96,7 @@
- static u_int8_t *packet_buf = NULL;
- static int      udp_cksum(struct packhdr *, const struct udphdr *,
--    u_int16_t *);
-+    u_int16_t *, int);
- static u_int16_t in_cksum(const u_int16_t *, int);
- #endif                                /* USE_DEBUG */
-@@ -539,11 +538,9 @@
-       udp.uh_ulen = htons(datalen);
-       /* ip */
--      hdr.sa_family = htonl(src->sa_family);
-       switch (src->sa_family) {
-       default:
-               /* Assume IPv4. XXX Can 'default' ever happen here?  */
--              hdr.sa_family = htonl(AF_INET);
-               hdr.ip.ip4.ip_src.s_addr = 0x02020202;
-               hdr.ip.ip4.ip_dst.s_addr = 0x01010101;
-               /* The rest of the setup is common to AF_INET.  */
-@@ -584,9 +581,7 @@
-       }
-       /* Calculate UDP checksum.  */
--      udp.uh_sum = udp_cksum(&hdr, &udp, (u_int16_t *) packet_buf);
--      hdrlen += sizeof hdr.sa_family;
--
-+      udp.uh_sum = udp_cksum(&hdr, &udp, (u_int16_t *) packet_buf, src->sa_family);
-       /* pcap file packet header */
-       gettimeofday(&tv, 0);
-       hdr.pcap.ts.tv_sec = tv.tv_sec;
-@@ -610,7 +605,7 @@
- /* Copied from tcpdump/print-udp.c, mostly rewritten.  */
- static int
--udp_cksum(struct packhdr *hdr, const struct udphdr *u, u_int16_t *d)
-+udp_cksum(struct packhdr *hdr, const struct udphdr *u, u_int16_t *d, int af)
- {
-       struct ip       *ip4;
-       struct ip6_hdr  *ip6;
-@@ -639,7 +634,7 @@
-       /* Setup pseudoheader.  */
-       memset(phu.pa, 0, sizeof phu);
--      switch (ntohl(hdr->sa_family)) {
-+      switch (af) {
-       case AF_INET:
-               ip4 = &hdr->ip.ip4;
-               memcpy(&phu.ip4p.src, &ip4->ip_src, sizeof(struct in_addr));
-@@ -664,7 +659,7 @@
-       /* IPv6 wants a 0xFFFF checksum "on error", not 0x0.  */
-       if (tlen < 0)
--              return (ntohl(hdr->sa_family) == AF_INET ? 0 : 0xFFFF);
-+              return (af == AF_INET ? 0 : 0xFFFF);
-       sum = 0;
-       for (i = 0; i < hdrlen; i += 2)
-Index: isakmpd-20041012.orig/nat_traversal.c
-===================================================================
---- isakmpd-20041012.orig.orig/nat_traversal.c 2007-06-04 13:22:39.115908760 +0200
-+++ isakmpd-20041012.orig/nat_traversal.c      2007-06-04 13:22:39.284883072 +0200
-@@ -1,4 +1,4 @@
--/*    $OpenBSD: nat_traversal.c,v 1.7 2004/08/08 19:11:06 deraadt Exp $       */
-+/*    $OpenBSD: nat_traversal.c,v 1.17 2006/06/14 14:03:33 hshoexer Exp $     */
- /*
-  * Copyright (c) 2004 HÃ¥kan Olsson.  All rights reserved.
-@@ -48,40 +48,40 @@
- #include "util.h"
- #include "virtual.h"
-+int   disable_nat_t = 0;
-+
- /*
-- * XXX According to draft-ietf-ipsec-nat-t-ike-07.txt, the NAT-T
-- * capability of the other peer is determined by a particular vendor ID
-- * sent as the first message. This vendor ID string is supposed to be a
-- * MD5 hash of "RFC XXXX", where XXXX is the future RFC number.
-+ * NAT-T capability of the other peer is determined by a particular vendor
-+ * ID sent in the first message. This vendor ID string is supposed to be a
-+ * MD5 hash of "RFC 3947".
-  *
-  * These seem to be the "well" known variants of this string in use by
-  * products today.
-  */
--static const char *isakmp_nat_t_cap_text[] = {
--      "draft-ietf-ipsec-nat-t-ike-00",        /* V1 (XXX: may be obsolete) */
--      "draft-ietf-ipsec-nat-t-ike-02\n",      /* V2 */
--      "draft-ietf-ipsec-nat-t-ike-03",        /* V3 */
--#ifdef notyet
--      "RFC XXXX",
--#endif
-+
-+static struct nat_t_cap isakmp_nat_t_cap[] = {
-+      { VID_DRAFT_V2_N, EXCHANGE_FLAG_NAT_T_DRAFT,
-+        "draft-ietf-ipsec-nat-t-ike-02\n", NULL, 0 },
-+      { VID_DRAFT_V3, EXCHANGE_FLAG_NAT_T_DRAFT,
-+        "draft-ietf-ipsec-nat-t-ike-03", NULL, 0 },
-+      { VID_RFC3947, EXCHANGE_FLAG_NAT_T_RFC,
-+        "RFC 3947", NULL, 0 },
- };
-+#define NUMNATTCAP    (sizeof isakmp_nat_t_cap / sizeof isakmp_nat_t_cap[0])
-+
- /* In seconds. Recommended in draft-ietf-ipsec-udp-encaps-09.  */
- #define NAT_T_KEEPALIVE_INTERVAL      20
--/* The MD5 hashes of the above strings is put in this array.  */
--static char   **nat_t_hashes;
--static size_t   nat_t_hashsize;
--
- static int    nat_t_setup_hashes(void);
--static int    nat_t_add_vendor_payload(struct message *, char *);
-+static int    nat_t_add_vendor_payload(struct message *, struct nat_t_cap *);
- static int    nat_t_add_nat_d(struct message *, struct sockaddr *);
- static int    nat_t_match_nat_d_payload(struct message *, struct sockaddr *);
- void
- nat_t_init(void)
- {
--      nat_t_hashes = (char **)NULL;
-+      nat_t_setup_hashes();
- }
- /* Generate the NAT-T capability marker hashes. Executed only once.  */
-@@ -89,7 +89,7 @@
- nat_t_setup_hashes(void)
- {
-       struct hash *hash;
--      int n = sizeof isakmp_nat_t_cap_text / sizeof isakmp_nat_t_cap_text[0];
-+      int n = NUMNATTCAP;
-       int i;
-       /* The draft says to use MD5.  */
-@@ -100,56 +100,49 @@
-                   "could not find MD5 hash structure!");
-               return -1;
-       }
--      nat_t_hashsize = hash->hashsize;
--      /* Allocate one more than is necessary, i.e NULL terminated.  */
--      nat_t_hashes = (char **)calloc((size_t)(n + 1), sizeof(char *));
--      if (!nat_t_hashes) {
--              log_error("nat_t_setup_hashes: calloc (%lu,%lu) failed",
--                  (unsigned long)n, (unsigned long)sizeof(char *));
--              return -1;
--      }
--
--      /* Populate with hashes.  */
-+      /* Populate isakmp_nat_t_cap with hashes.  */
-       for (i = 0; i < n; i++) {
--              nat_t_hashes[i] = (char *)malloc(nat_t_hashsize);
--              if (!nat_t_hashes[i]) {
-+              isakmp_nat_t_cap[i].hashsize = hash->hashsize;
-+              isakmp_nat_t_cap[i].hash = (char *)malloc(hash->hashsize);
-+              if (!isakmp_nat_t_cap[i].hash) {
-                       log_error("nat_t_setup_hashes: malloc (%lu) failed",
--                          (unsigned long)nat_t_hashsize);
-+                          (unsigned long)hash->hashsize);
-                       goto errout;
-               }
-               hash->Init(hash->ctx);
-               hash->Update(hash->ctx,
--                  (unsigned char *)isakmp_nat_t_cap_text[i],
--                  strlen(isakmp_nat_t_cap_text[i]));
--              hash->Final(nat_t_hashes[i], hash->ctx);
-+                  (unsigned char *)isakmp_nat_t_cap[i].text,
-+                  strlen(isakmp_nat_t_cap[i].text));
-+              hash->Final(isakmp_nat_t_cap[i].hash, hash->ctx);
-               LOG_DBG((LOG_EXCHANGE, 50, "nat_t_setup_hashes: "
--                  "MD5(\"%s\") (%lu bytes)", isakmp_nat_t_cap_text[i],
--                  (unsigned long)nat_t_hashsize));
-+                  "MD5(\"%s\") (%lu bytes)", isakmp_nat_t_cap[i].text,
-+                  (unsigned long)hash->hashsize));
-               LOG_DBG_BUF((LOG_EXCHANGE, 50, "nat_t_setup_hashes",
--                  nat_t_hashes[i], nat_t_hashsize));
-+                  isakmp_nat_t_cap[i].hash, hash->hashsize));
-       }
-       return 0;
--  errout:
-+errout:
-       for (i = 0; i < n; i++)
--              if (nat_t_hashes[i])
--                      free(nat_t_hashes[i]);
--      free(nat_t_hashes);
--      nat_t_hashes = NULL;
-+              if (isakmp_nat_t_cap[i].hash)
-+                      free(isakmp_nat_t_cap[i].hash);
-       return -1;
- }
- /* Add one NAT-T VENDOR payload.  */
- static int
--nat_t_add_vendor_payload(struct message *msg, char *hash)
-+nat_t_add_vendor_payload(struct message *msg, struct nat_t_cap *cap)
- {
--      size_t   buflen = nat_t_hashsize + ISAKMP_GEN_SZ;
-+      size_t    buflen = cap->hashsize + ISAKMP_GEN_SZ;
-       u_int8_t *buf;
-+      if (disable_nat_t)
-+              return 0;
-+
-       buf = malloc(buflen);
-       if (!buf) {
-               log_error("nat_t_add_vendor_payload: malloc (%lu) failed",
-@@ -158,12 +151,11 @@
-       }
-       SET_ISAKMP_GEN_LENGTH(buf, buflen);
--      memcpy(buf + ISAKMP_VENDOR_ID_OFF, hash, nat_t_hashsize);
-+      memcpy(buf + ISAKMP_VENDOR_ID_OFF, cap->hash, cap->hashsize);
-       if (message_add_payload(msg, ISAKMP_PAYLOAD_VENDOR, buf, buflen, 1)) {
-               free(buf);
-               return -1;
-       }
--
-       return 0;
- }
-@@ -171,16 +163,14 @@
- int
- nat_t_add_vendor_payloads(struct message *msg)
- {
--      int i = 0;
-+      int i;
--      if (!nat_t_hashes)
--              if (nat_t_setup_hashes())
--                      return 0;  /* XXX should this be an error?  */
-+      if (disable_nat_t)
-+              return 0;
--      while (nat_t_hashes[i])
--              if (nat_t_add_vendor_payload(msg, nat_t_hashes[i++]))
-+      for (i = 0; i < NUMNATTCAP; i++)
-+              if (nat_t_add_vendor_payload(msg, &isakmp_nat_t_cap[i]))
-                       return -1;
--
-       return 0;
- }
-@@ -192,36 +182,31 @@
- {
-       u_int8_t *pbuf = p->p;
-       size_t    vlen;
--      int       i = 0;
-+      int       i;
--      /* Already checked? */
--      if (p->flags & PL_MARK ||
--          msg->exchange->flags & EXCHANGE_FLAG_NAT_T_CAP_PEER)
-+      if (disable_nat_t)
-               return;
--      if (!nat_t_hashes)
--              if (nat_t_setup_hashes())
--                      return;
--
-       vlen = GET_ISAKMP_GEN_LENGTH(pbuf) - ISAKMP_GEN_SZ;
--      if (vlen != nat_t_hashsize) {
--              LOG_DBG((LOG_EXCHANGE, 50, "nat_t_check_vendor_payload: "
--                  "bad size %lu != %lu", (unsigned long)vlen,
--                  (unsigned long)nat_t_hashsize));
--              return;
--      }
--      while (nat_t_hashes[i])
--              if (memcmp(nat_t_hashes[i++], pbuf + ISAKMP_GEN_SZ,
-+      for (i = 0; i < NUMNATTCAP; i++) {
-+              if (vlen != isakmp_nat_t_cap[i].hashsize) {
-+                      LOG_DBG((LOG_EXCHANGE, 50, "nat_t_check_vendor_payload: "
-+                          "bad size %lu != %lu", (unsigned long)vlen,
-+                          (unsigned long)isakmp_nat_t_cap[i].hashsize));
-+                      continue;
-+              }
-+              if (memcmp(isakmp_nat_t_cap[i].hash, pbuf + ISAKMP_GEN_SZ,
-                   vlen) == 0) {
-                       /* This peer is NAT-T capable.  */
-                       msg->exchange->flags |= EXCHANGE_FLAG_NAT_T_CAP_PEER;
-+                      msg->exchange->flags |= isakmp_nat_t_cap[i].flags;
-                       LOG_DBG((LOG_EXCHANGE, 10,
-                           "nat_t_check_vendor_payload: "
-                           "NAT-T capable peer detected"));
-                       p->flags |= PL_MARK;
--                      return;
-               }
-+      }
-       return;
- }
-@@ -233,10 +218,8 @@
- {
-       struct ipsec_exch *ie = (struct ipsec_exch *)msg->exchange->data;
-       struct hash      *hash;
--      struct prf       *prf;
-       u_int8_t         *res;
-       in_port_t         port;
--      int               prf_type = PRF_HMAC; /* XXX */
-       hash = hash_get(ie->hash->type);
-       if (hash == NULL) {
-@@ -244,31 +227,25 @@
-               return NULL;
-       }
--      prf = prf_alloc(prf_type, hash->type, msg->exchange->cookies,
--          ISAKMP_HDR_COOKIES_LEN);
--      if(!prf) {
--              log_print("nat_t_generate_nat_d_hash: prf_alloc failed");
--              return NULL;
--      }
-+      *hashlen = hash->hashsize;
--      *hashlen = prf->blocksize;
-       res = (u_int8_t *)malloc((unsigned long)*hashlen);
-       if (!res) {
-               log_print("nat_t_generate_nat_d_hash: malloc (%lu) failed",
-                   (unsigned long)*hashlen);
--              prf_free(prf);
-               *hashlen = 0;
-               return NULL;
-       }
-       port = sockaddr_port(sa);
--      memset(res, 0, *hashlen);
--
--      prf->Update(prf->prfctx, sockaddr_addrdata(sa), sockaddr_addrlen(sa));
--      prf->Update(prf->prfctx, (unsigned char *)&port, sizeof port);
--      prf->Final(res, prf->prfctx);
--      prf_free (prf);
-+      bzero(res, *hashlen);
-+      hash->Init(hash->ctx);
-+      hash->Update(hash->ctx, msg->exchange->cookies,
-+          sizeof msg->exchange->cookies);
-+      hash->Update(hash->ctx, sockaddr_addrdata(sa), sockaddr_addrlen(sa));
-+      hash->Update(hash->ctx, (unsigned char *)&port, sizeof port);
-+      hash->Final(res, hash->ctx);
-       return res;
- }
-@@ -276,6 +253,7 @@
- static int
- nat_t_add_nat_d(struct message *msg, struct sockaddr *sa)
- {
-+      int       ret;
-       u_int8_t *hbuf, *buf;
-       size_t    hbuflen, buflen;
-@@ -298,11 +276,19 @@
-       memcpy(buf + ISAKMP_NAT_D_DATA_OFF, hbuf, hbuflen);
-       free(hbuf);
--      if (message_add_payload(msg, ISAKMP_PAYLOAD_NAT_D, buf, buflen, 1)) {
-+      if (msg->exchange->flags & EXCHANGE_FLAG_NAT_T_RFC)
-+              ret = message_add_payload(msg, ISAKMP_PAYLOAD_NAT_D, buf,
-+                  buflen, 1);
-+      else if (msg->exchange->flags & EXCHANGE_FLAG_NAT_T_DRAFT)
-+              ret = message_add_payload(msg, ISAKMP_PAYLOAD_NAT_D_DRAFT,
-+                  buf, buflen, 1);
-+      else
-+              ret = -1;
-+              
-+      if (ret) {
-               free(buf);
-               return -1;
-       }
--
-       return 0;
- }
-@@ -312,14 +298,14 @@
- {
-       struct sockaddr *sa;
--      msg->transport->vtbl->get_src(msg->transport, &sa);
-+      /* Remote address first. */
-+      msg->transport->vtbl->get_dst(msg->transport, &sa);
-       if (nat_t_add_nat_d(msg, sa))
-               return -1;
--      msg->transport->vtbl->get_dst(msg->transport, &sa);
-+      msg->transport->vtbl->get_src(msg->transport, &sa);
-       if (nat_t_add_nat_d(msg, sa))
-               return -1;
--
-       return 0;
- }
-@@ -336,8 +322,8 @@
-        * If there are no NAT-D payloads in the message, return "found"
-        * as this will avoid NAT-T (see nat_t_exchange_check_nat_d()).
-        */
--      p = payload_first(msg, ISAKMP_PAYLOAD_NAT_D);
--      if (!p)
-+      if ((p = payload_first(msg, ISAKMP_PAYLOAD_NAT_D_DRAFT)) == NULL &&
-+          (p = payload_first(msg, ISAKMP_PAYLOAD_NAT_D)) == NULL)
-               return 1;
-       hbuf = nat_t_generate_nat_d_hash(msg, sa, &hbuflen);
-Index: isakmpd-20041012.orig/udp_encap.c
-===================================================================
---- isakmpd-20041012.orig.orig/udp_encap.c     2007-06-04 13:22:39.121907848 +0200
-+++ isakmpd-20041012.orig/udp_encap.c  2007-06-04 13:22:39.284883072 +0200
-@@ -61,6 +61,11 @@
- #define UDP_SIZE 65536
-+#if defined(USE_NAT_TRAVERSAL) && defined (LINUX_IPSEC)
-+#include <linux/socket.h>
-+#include <linux/udp.h>
-+#endif
-+
- /* If a system doesn't have SO_REUSEPORT, SO_REUSEADDR will have to do.  */
- #ifndef SO_REUSEPORT
- #define SO_REUSEPORT SO_REUSEADDR
-@@ -134,6 +139,18 @@
-       if (sysdep_cleartext(s, laddr->sa_family) == -1)
-               goto err;
-+#if defined(USE_NAT_TRAVERSAL) && defined (LINUX_IPSEC)
-+    {
-+#ifndef SOL_UDP
-+#define SOL_UDP 17
-+#endif
-+        int option = UDP_ENCAP_ESPINUDP;
-+        if(setsockopt(s, SOL_UDP, UDP_ENCAP, &option,
-+                      sizeof (option)) < 0)
-+            goto err;
-+    }
-+#endif
-+
-       /* Wildcard address ?  */
-       switch (laddr->sa_family) {
-       case AF_INET:
-Index: isakmpd-20041012.orig/apps/Makefile
-===================================================================
---- isakmpd-20041012.orig.orig/apps/Makefile   2007-06-04 13:22:39.126907088 +0200
-+++ isakmpd-20041012.orig/apps/Makefile        2007-06-04 13:22:39.285882920 +0200
-@@ -31,4 +31,4 @@
- SUBDIR= certpatch
--.include <bsd.subdir.mk>
-+#.include <bsd.subdir.mk>
-Index: isakmpd-20041012.orig/apps/certpatch/GNUmakefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ isakmpd-20041012.orig/apps/certpatch/GNUmakefile   2007-06-04 13:22:39.285882920 +0200
-@@ -0,0 +1,55 @@
-+#     $OpenBSD: Makefile,v 1.7 2003/06/03 14:35:00 ho Exp $
-+#     $EOM: Makefile,v 1.6 2000/03/28 21:22:06 ho Exp $
-+
-+#
-+# Copyright (c) 1999 Niels Provos.  All rights reserved.
-+# Copyright (c) 2001 Niklas Hallqvist.  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.
-+#
-+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
-+#
-+
-+#
-+# This code was written under funding by Ericsson Radio Systems.
-+#
-+
-+PROG=         certpatch
-+SRCS=         certpatch.c
-+BINDIR?=      /usr/sbin
-+TOPSRC=               ${.CURDIR}../..
-+TOPOBJ!=      cd ${TOPSRC}; printf "all:\n\t@pwd\n" |${MAKE} -f-
-+OS=                   linux
-+FEATURES!=    awk '/^FEATURES=/ { print $$0 }' ${.CURDIR}/../../Makefile | sed 's/FEATURES=.//'
-+.PATH:                ${TOPSRC} ${TOPSRC}/sysdep/${OS} ${TOPOBJ}
-+CFLAGS+=      -I${TOPSRC} -I${TOPSRC}/sysdep/${OS} -I${TOPOBJ} -Wall
-+LDFLAGS+=     -lcrypto -lssl -lgmp
-+MAN=          certpatch.8
-+
-+CFLAGS+=      -DMP_FLAVOUR=MP_FLAVOUR_GMP
-+LDADD+=               -lgmp
-+DPADD+=               ${LIBGMP}
-+
-+# Override LIBSYSDEPDIR definition from Makefile.sysdep
-+LIBSYSDEPDIR= ${TOPSRC}/sysdep/common/libsysdep
-+
-+all:  ${PROG}
-+
-+clean:        
-+      rm -f ${PROG}
-Index: isakmpd-20041012.orig/pf_key_v2.c
-===================================================================
---- isakmpd-20041012.orig.orig/pf_key_v2.c     2007-06-04 13:22:39.137905416 +0200
-+++ isakmpd-20041012.orig/pf_key_v2.c  2007-06-04 13:22:39.287882616 +0200
-@@ -1055,6 +1055,10 @@
- #endif
- #if defined (USE_NAT_TRAVERSAL) && defined (SADB_X_EXT_UDPENCAP)
-       struct sadb_x_udpencap udpencap;
-+#elif defined (USE_NAT_TRAVERSAL) && defined (SADB_X_EXT_NAT_T_TYPE)
-+      struct sadb_x_nat_t_type nat_t_type;
-+      struct sadb_x_nat_t_port nat_t_sport;
-+      struct sadb_x_nat_t_port nat_t_dport;
- #endif
- #ifdef USE_DEBUG
-       char           *addr_str;
-@@ -1273,10 +1277,15 @@
-               log_print("pf_key_v2_set_spi: invalid proto %d", proto->proto);
-               goto cleanup;
-       }
--      if (incoming)
-+      if (incoming) {
-               sa->transport->vtbl->get_src(sa->transport, &dst);
--      else
-+              sa->transport->vtbl->get_dst(sa->transport, &src);
-+      }
-+      else {
-               sa->transport->vtbl->get_dst(sa->transport, &dst);
-+              sa->transport->vtbl->get_src(sa->transport, &src);
-+      }
-+
- #ifdef KAME
-       msg.sadb_msg_seq = (incoming ?
-           pf_key_v2_seq_by_sa(proto->spi[incoming], sizeof ssa.sadb_sa_spi,
-@@ -1319,12 +1328,13 @@
-       ssa.sadb_sa_flags = 0;
- #ifdef SADB_X_SAFLAGS_TUNNEL
-       if (iproto->encap_mode == IPSEC_ENCAP_TUNNEL ||
--          iproto->encap_mode == IPSEC_ENCAP_UDP_ENCAP_TUNNEL)
-+          iproto->encap_mode == IPSEC_ENCAP_UDP_ENCAP_TUNNEL ||
-+          iproto->encap_mode == IPSEC_ENCAP_UDP_ENCAP_TUNNEL_DRAFT)
-               ssa.sadb_sa_flags = SADB_X_SAFLAGS_TUNNEL;
- #endif
--#if defined (USE_NAT_TRAVERSAL) && defined (SADB_X_EXT_UDPENCAP)
-       if (isakmp_sa->flags & SA_FLAG_NAT_T_ENABLE) {
-+#if defined (USE_NAT_TRAVERSAL) && defined (SADB_X_EXT_UDPENCAP)
-               memset(&udpencap, 0, sizeof udpencap);
-               ssa.sadb_sa_flags |= SADB_X_SAFLAGS_UDPENCAP;
-               udpencap.sadb_x_udpencap_exttype = SADB_X_EXT_UDPENCAP;
-@@ -1334,8 +1344,40 @@
-               if (pf_key_v2_msg_add(update, (struct sadb_ext *)&udpencap, 0)
-                   == -1)
-                       goto cleanup;
--      }
-+#elif defined (USE_NAT_TRAVERSAL) && defined (SADB_X_EXT_NAT_T_TYPE)
-+#ifndef UDP_ENCAP_ESPINUDP
-+#define UDP_ENCAP_ESPINUDP    2
-+#endif
-+              memset(&nat_t_type, 0, sizeof nat_t_type);
-+              memset(&nat_t_sport, 0, sizeof nat_t_sport);
-+              memset(&nat_t_dport, 0, sizeof nat_t_dport);
-+
-+              /* type = draft-udp-encap-06 */
-+              nat_t_type.sadb_x_nat_t_type_len = sizeof nat_t_type / PF_KEY_V2_CHUNK;
-+              nat_t_type.sadb_x_nat_t_type_exttype = SADB_X_EXT_NAT_T_TYPE;
-+              nat_t_type.sadb_x_nat_t_type_type = UDP_ENCAP_ESPINUDP;
-+              if(pf_key_v2_msg_add(update, (struct sadb_ext *)&nat_t_type, 0) == -1)
-+                      goto cleanup;
-+
-+              /* source port */
-+              nat_t_sport.sadb_x_nat_t_port_len = sizeof nat_t_sport / 
-+                                                         PF_KEY_V2_CHUNK;
-+              nat_t_sport.sadb_x_nat_t_port_exttype = SADB_X_EXT_NAT_T_SPORT;
-+              nat_t_sport.sadb_x_nat_t_port_port = sockaddr_port(src);
-+              if(pf_key_v2_msg_add(update, (struct sadb_ext *)&nat_t_sport, 0) == -1)
-+                      goto cleanup;
-+
-+              /* destination port */
-+              nat_t_dport.sadb_x_nat_t_port_len = sizeof nat_t_dport / 
-+                                                         PF_KEY_V2_CHUNK;
-+              nat_t_dport.sadb_x_nat_t_port_exttype = SADB_X_EXT_NAT_T_DPORT;
-+              nat_t_dport.sadb_x_nat_t_port_port = sockaddr_port(dst);
-+              if(pf_key_v2_msg_add(update, (struct sadb_ext *)&nat_t_dport, 0) == -1)
-+                      goto cleanup;
-+
-+              /* original address (transport mode checksum missing info) goes here */
- #endif
-+    }
-       if (pf_key_v2_msg_add(update, (struct sadb_ext *)&ssa, 0) == -1)
-               goto cleanup;
-@@ -1395,10 +1437,6 @@
-       /*
-        * Setup the ADDRESS extensions.
-          */
--      if (incoming)
--              sa->transport->vtbl->get_dst(sa->transport, &src);
--      else
--              sa->transport->vtbl->get_src(sa->transport, &src);
-       len = sizeof *addr + PF_KEY_V2_ROUND(sysdep_sa_len(src));
-       addr = calloc(1, len);
-       if (!addr)
-@@ -2167,7 +2205,7 @@
-               pf_key_v2_msg_free(ret);
-       return -1;
--#elif defined (SADB_X_SPDADD) && defined (SADB_X_SPDDELETE)
-+#elif defined (SADB_X_SPDUPDATE) && defined (SADB_X_SPDDELETE)
-       struct sadb_msg msg;
-       struct sadb_x_policy *policy = 0;
-       struct sadb_x_ipsecrequest *ipsecrequest;
-@@ -2181,7 +2219,7 @@
-       struct sockaddr_in *ip4_sa;
-       struct sockaddr_in6 *ip6_sa;
--      msg.sadb_msg_type = delete ? SADB_X_SPDDELETE : SADB_X_SPDADD;
-+      msg.sadb_msg_type = delete ? SADB_X_SPDDELETE : SADB_X_SPDUPDATE;
-       msg.sadb_msg_satype = SADB_SATYPE_UNSPEC;
-       msg.sadb_msg_seq = 0;
-       flow = pf_key_v2_msg_new(&msg, 0);
-Index: isakmpd-20041012.orig/isakmp_num.cst
-===================================================================
---- isakmpd-20041012.orig.orig/isakmp_num.cst  2007-06-04 13:22:39.143904504 +0200
-+++ isakmpd-20041012.orig/isakmp_num.cst       2007-06-04 13:22:39.287882616 +0200
-@@ -57,15 +57,18 @@
-   KD                          17      # RFC 3547, Key Download
-   SEQ                         18      # RFC 3547, Sequence Number
-   POP                         19      # RFC 3547, Proof of possession
--  RESERVED_MIN                        20
-+  NAT_D                               20      # RFC 3947, NAT Discovery payload
-+  NAT_OA                      21      # RFC 3947, NAT Original Address payload
-+  RESERVED_MIN                        22
-   RESERVED_MAX                        127
-   PRIVATE_MIN                 128
- # XXX values from draft-ietf-ipsec-nat-t-ike-01,02,03. Later drafts specify
- # XXX NAT_D as payload 15 and NAT_OA as 16, but these are allocated by RFC
- # XXX 3547 as seen above.
--  NAT_D                               130     # NAT Discovery payload
--  NAT_OA                      131     # NAT Original Address payload
-+  NAT_D_DRAFT                 130     # NAT Discovery payload
-+  NAT_OA_DRAFT                        131     # NAT Original Address payload
-   PRIVATE_MAX                 255
-+  MAX                         255
- .
- # ISAKMP exchange types.
-Index: isakmpd-20041012.orig/ipsec_num.cst
-===================================================================
---- isakmpd-20041012.orig.orig/ipsec_num.cst   2007-06-04 13:22:39.149903592 +0200
-+++ isakmpd-20041012.orig/ipsec_num.cst        2007-06-04 13:22:39.287882616 +0200
-@@ -62,10 +62,10 @@
- IPSEC_ENCAP
-   TUNNEL                              1
-   TRANSPORT                           2
--  FUTURE_UDP_ENCAP_TUNNEL             3       # XXX Not yet assigned
--  FUTURE_UDP_ENCAP_TRANSPORT          4       # XXX Not yet assigned
--  UDP_ENCAP_TUNNEL                    61443   # draft-ietf-ipsec-nat-t-ike
--  UDP_ENCAP_TRANSPORT                 61443   # draft-ietf-ipsec-nat-t-ike
-+  UDP_ENCAP_TUNNEL                    3
-+  UDP_ENCAP_TRANSPORT                 4
-+  UDP_ENCAP_TUNNEL_DRAFT              61443   # draft-ietf-ipsec-nat-t-ike
-+  UDP_ENCAP_TRANSPORT_DRAFT           61443   # draft-ietf-ipsec-nat-t-ike
- .
- # IPSEC authentication algorithm.
-Index: isakmpd-20041012.orig/nat_traversal.h
-===================================================================
---- isakmpd-20041012.orig.orig/nat_traversal.h 2007-06-04 13:22:39.154902832 +0200
-+++ isakmpd-20041012.orig/nat_traversal.h      2007-06-04 13:22:39.287882616 +0200
-@@ -1,4 +1,4 @@
--/*    $OpenBSD: nat_traversal.h,v 1.2 2004/06/21 23:27:10 ho Exp $    */
-+/*    $OpenBSD: nat_traversal.h,v 1.4 2005/07/25 15:03:47 hshoexer Exp $      */
- /*
-  * Copyright (c) 2004 HÃ¥kan Olsson.  All rights reserved.
-@@ -27,6 +27,24 @@
- #ifndef _NAT_TRAVERSAL_H_
- #define _NAT_TRAVERSAL_H_
-+#define VID_DRAFT_V2  0
-+#define VID_DRAFT_V2_N        1
-+#define VID_DRAFT_V3  2
-+#define VID_RFC3947   3
-+
-+struct nat_t_cap {
-+      int              id;
-+      u_int32_t        flags;
-+      const char      *text;
-+      char            *hash;
-+      size_t           hashsize;
-+};
-+
-+/*
-+ * Set if -T is given on the command line to disable NAT-T support.
-+ */
-+extern int    disable_nat_t;
-+
- void  nat_t_init(void);
- int   nat_t_add_vendor_payloads(struct message *);
- void  nat_t_check_vendor_payload(struct message *, struct payload *);
-Index: isakmpd-20041012.orig/message.c
-===================================================================
---- isakmpd-20041012.orig.orig/message.c       2007-06-04 13:22:39.160901920 +0200
-+++ isakmpd-20041012.orig/message.c    2007-06-04 13:22:39.288882464 +0200
-@@ -112,6 +112,7 @@
-       message_validate_hash, message_validate_sig, message_validate_nonce,
-       message_validate_notify, message_validate_delete,
-       message_validate_vendor, message_validate_attribute,
-+      message_validate_nat_d, message_validate_nat_oa,
-       message_validate_nat_d, message_validate_nat_oa
- };
-@@ -120,7 +121,7 @@
-       isakmp_id_fld, isakmp_cert_fld, isakmp_certreq_fld, isakmp_hash_fld,
-       isakmp_sig_fld, isakmp_nonce_fld, isakmp_notify_fld, isakmp_delete_fld,
-       isakmp_vendor_fld, isakmp_attribute_fld, isakmp_nat_d_fld,
--      isakmp_nat_oa_fld
-+      isakmp_nat_oa_fld, isakmp_nat_d_fld, isakmp_nat_oa_fld
- };
- /*
-@@ -138,7 +139,8 @@
-       ISAKMP_PAYLOAD_SAK, ISAKMP_PAYLOAD_SAT, ISAKMP_PAYLOAD_KD,
-       ISAKMP_PAYLOAD_SEQ, ISAKMP_PAYLOAD_POP
- #endif
--      ISAKMP_PAYLOAD_NAT_D, ISAKMP_PAYLOAD_NAT_OA
-+      ISAKMP_PAYLOAD_NAT_D, ISAKMP_PAYLOAD_NAT_OA, 
-+      ISAKMP_PAYLOAD_NAT_D_DRAFT, ISAKMP_PAYLOAD_NAT_OA_DRAFT
- };
- static u_int8_t payload_map[256];
-@@ -347,8 +349,8 @@
-               }
-               /* Ignore most private payloads.  */
-               if (next >= ISAKMP_PAYLOAD_PRIVATE_MIN &&
--                  next != ISAKMP_PAYLOAD_NAT_D &&
--                  next != ISAKMP_PAYLOAD_NAT_OA) {
-+                  next != ISAKMP_PAYLOAD_NAT_D_DRAFT &&
-+                  next != ISAKMP_PAYLOAD_NAT_OA_DRAFT) {
-                       LOG_DBG((LOG_MESSAGE, 30, "message_parse_payloads: "
-                           "private next payload type %s in payload of "
-                           "type %d ignored",
-@@ -460,8 +462,10 @@
-               return ISAKMP_ATTRIBUTE_SZ;
- #if defined (USE_NAT_TRAVERSAL)
-       case ISAKMP_PAYLOAD_NAT_D:
-+      case ISAKMP_PAYLOAD_NAT_D_DRAFT:
-               return ISAKMP_NAT_D_SZ;
-       case ISAKMP_PAYLOAD_NAT_OA:
-+      case ISAKMP_PAYLOAD_NAT_OA_DRAFT:
-               return ISAKMP_NAT_OA_SZ;
- #endif
-       /* Not yet supported and any other unknown payloads. */
-Index: isakmpd-20041012.orig/policy.c
-===================================================================
---- isakmpd-20041012.orig.orig/policy.c        2007-06-04 13:22:39.165901160 +0200
-+++ isakmpd-20041012.orig/policy.c     2007-06-04 13:22:39.289882312 +0200
-@@ -511,7 +511,10 @@
-                                                       break;
-                                               }
- #if defined (USE_NAT_TRAVERSAL)
--                                      else if (decode_16(value) == IPSEC_ENCAP_UDP_ENCAP_TUNNEL)
-+                                      else if (decode_16(value) ==
-+                                          IPSEC_ENCAP_UDP_ENCAP_TUNNEL ||
-+                                          decode_16(value) ==
-+                                          IPSEC_ENCAP_UDP_ENCAP_TUNNEL_DRAFT)
-                                               switch (proto->proto) {
-                                               case IPSEC_PROTO_IPSEC_AH:
-                                                       ah_encapsulation = "udp-encap-tunnel";
-@@ -1932,7 +1935,7 @@
- void
- policy_init(void)
- {
--      char           *ptr, *policy_file;
-+      char           *ptr, *policy_file, *use_keynote;
-       char          **asserts;
-       size_t          sz, len;
-       int             fd, i;
-@@ -1940,10 +1943,11 @@
-       LOG_DBG((LOG_POLICY, 30, "policy_init: initializing"));
-       /* Do we want to use the policy modules?  */
--      if (ignore_policy ||
--          strncmp("yes", conf_get_str("General", "Use-Keynote"), 3))
--              return;
--
-+      use_keynote = conf_get_str("General", "Use-Keynote");
-+      if (ignore_policy || 
-+              (use_keynote && strncmp("yes", use_keynote, 3)))
-+               return;
-+ 
-       /* Get policy file from configuration.  */
-       policy_file = conf_get_str("General", "Policy-file");
-       if (!policy_file)
-Index: isakmpd-20041012.orig/ike_phase_1.c
-===================================================================
---- isakmpd-20041012.orig.orig/ike_phase_1.c   2007-06-04 13:22:39.170900400 +0200
-+++ isakmpd-20041012.orig/ike_phase_1.c        2007-06-04 13:22:39.290882160 +0200
-@@ -1040,9 +1040,9 @@
-               /* Compare expected/desired and received remote ID */
-               if (bcmp(rid, payload->p + ISAKMP_ID_DATA_OFF, sz)) {
--                      free(rid);
-                       log_print("ike_phase_1_recv_ID: "
--                          "received remote ID other than expected %s", p);
-+                          "received remote ID other than expected %s - %s", p, payload->p);
-+                      free(rid);
-                       return -1;
-               }
-               free(rid);
-Index: isakmpd-20041012.orig/x509.c
-===================================================================
---- isakmpd-20041012.orig.orig/x509.c  2007-06-04 13:22:39.176899488 +0200
-+++ isakmpd-20041012.orig/x509.c       2007-06-04 13:22:39.290882160 +0200
-@@ -910,7 +910,11 @@
-       X509_STORE_CTX_init(&csc, x509_cas, cert, NULL);
- #if OPENSSL_VERSION_NUMBER >= 0x00907000L
-       /* XXX See comment in x509_read_crls_from_dir.  */
-+#if OPENSSL_VERSION_NUMBER >= 0x00908000L
-+      if (x509_cas->param->flags & X509_V_FLAG_CRL_CHECK) {
-+#else
-       if (x509_cas->flags & X509_V_FLAG_CRL_CHECK) {
-+#endif
-               X509_STORE_CTX_set_flags(&csc, X509_V_FLAG_CRL_CHECK);
-               X509_STORE_CTX_set_flags(&csc, X509_V_FLAG_CRL_CHECK_ALL);
-       }
-Index: isakmpd-20041012.orig/sysdep/linux/sysdep.c
-===================================================================
---- isakmpd-20041012.orig.orig/sysdep/linux/sysdep.c   2007-06-04 13:22:39.182898576 +0200
-+++ isakmpd-20041012.orig/sysdep/linux/sysdep.c        2007-06-04 13:22:39.291882008 +0200
-@@ -169,22 +169,22 @@
-     return 0;
-   if (!(af == AF_INET || af == AF_INET6))
--    {
-+    { 
-       log_print ("sysdep_cleartext: unsupported protocol family %d", af);
-       return -1;
-     }
-   if (setsockopt (fd, af == AF_INET ? IPPROTO_IP : IPPROTO_IPV6,
--                af == AF_INET ? IP_IPSEC_POLICY : IPV6_IPSEC_POLICY,
--                &pol_in, sizeof pol_in) < 0 ||
-+          af == AF_INET ? IP_IPSEC_POLICY : IPV6_IPSEC_POLICY,
-+          &pol_in, sizeof pol_in) < 0 ||
-       setsockopt (fd, af == AF_INET ? IPPROTO_IP : IPPROTO_IPV6,
--                af == AF_INET ? IP_IPSEC_POLICY : IPV6_IPSEC_POLICY,
--                &pol_out, sizeof pol_out) < 0)
--    {
-+          af == AF_INET ? IP_IPSEC_POLICY : IPV6_IPSEC_POLICY,
-+          &pol_out, sizeof pol_out) < 0)
-+    { 
-       log_error ("sysdep_cleartext: "
--               "setsockopt (%d, IPPROTO_IP%s, IP%s_IPSEC_POLICY, ...) "
--               "failed", fd, af == AF_INET ? "" : "V6",
--               af == AF_INET ? "" : "V6");
-+         "setsockopt (%d, IPPROTO_IP%s, IP%s_IPSEC_POLICY, ...) "
-+         "failed", fd, af == AF_INET ? "" : "V6",
-+         af == AF_INET ? "" : "V6");
-       return -1;
-     }
-   return 0;
-Index: isakmpd-20041012.orig/sysdep/linux/GNUmakefile.sysdep
-===================================================================
---- isakmpd-20041012.orig.orig/sysdep/linux/GNUmakefile.sysdep 2007-06-04 13:22:39.187897816 +0200
-+++ isakmpd-20041012.orig/sysdep/linux/GNUmakefile.sysdep      2007-06-04 13:22:39.291882008 +0200
-@@ -33,13 +33,13 @@
- LDADD+=               -lgmp ${LIBSYSDEP} ${LIBCRYPTO}
- DPADD+=               ${LIBGMP} ${LIBSYSDEP}
--CFLAGS+=      -DUSE_OLD_SOCKADDR -DHAVE_PCAP \
--              -DNEED_SYSDEP_APP -DMP_FLAVOUR=MP_FLAVOUR_GMP \
--              -I/usr/src/linux/include -I${.CURDIR}/sysdep/common \
-+CFLAGS+=      -DHAVE_GETNAMEINFO -DUSE_OLD_SOCKADDR -DHAVE_PCAP \
-+              -DNEED_SYSDEP_APP -DMP_FLAVOUR=MP_FLAVOUR_GMP -DUSE_AES \
-+              -I${.CURDIR}/sysdep/linux/include -I${.CURDIR}/sysdep/common \
-               -I/usr/include/openssl
- FEATURES=     debug tripledes blowfish cast ec aggressive x509 policy
--FEATURES+=    des aes
-+FEATURES+=    dpd nat_traversal isakmp_cfg des aes
- IPSEC_SRCS=   pf_key_v2.c
- IPSEC_CFLAGS= -DUSE_PF_KEY_V2
-@@ -51,7 +51,7 @@
- # hack libsysdep.a dependenc
- ${LIBSYSDEPDIR}/.depend ${LIBSYSDEP}:
-       cd ${LIBSYSDEPDIR} && \
--              ${MAKE} --no-print-directory ${MAKEFLAGS} \
-+              ${MAKE} --no-print-directory \
-                       CFLAGS="${CFLAGS}" MKDEP="${MKDEP}" ${MAKECMDGOALS}
- ifeq ($(findstring clean,$(MAKECMDGOALS)),clean)
-Index: isakmpd-20041012.orig/sysdep/linux/include/bitstring.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ isakmpd-20041012.orig/sysdep/linux/include/bitstring.h     2007-06-04 13:22:39.291882008 +0200
-@@ -0,0 +1,132 @@
-+/*    $OpenBSD: bitstring.h,v 1.4 2002/06/19 02:50:10 millert Exp $   */
-+/*    $NetBSD: bitstring.h,v 1.5 1997/05/14 15:49:55 pk Exp $ */
-+
-+/*
-+ * Copyright (c) 1989, 1993
-+ *    The Regents of the University of California.  All rights reserved.
-+ *
-+ * This code is derived from software contributed to Berkeley by
-+ * Paul Vixie.
-+ *
-+ * 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.
-+ *
-+ *    @(#)bitstring.h 8.1 (Berkeley) 7/19/93
-+ */
-+
-+#ifndef _BITSTRING_H_
-+#define       _BITSTRING_H_
-+
-+/* modified for SV/AT and bitstring bugfix by M.R.Murphy, 11oct91
-+ * bitstr_size changed gratuitously, but shorter
-+ * bit_alloc   spelling error fixed
-+ * the following were efficient, but didn't work, they've been made to
-+ * work, but are no longer as efficient :-)
-+ * bit_nclear, bit_nset, bit_ffc, bit_ffs
-+ */
-+typedef       unsigned char bitstr_t;
-+
-+/* internal macros */
-+                              /* byte of the bitstring bit is in */
-+#define       _bit_byte(bit) \
-+      ((bit) >> 3)
-+
-+                              /* mask for the bit within its byte */
-+#define       _bit_mask(bit) \
-+      (1 << ((bit)&0x7))
-+
-+/* external macros */
-+                              /* bytes in a bitstring of nbits bits */
-+#define       bitstr_size(nbits) \
-+      (((nbits) + 7) >> 3)
-+
-+                              /* allocate a bitstring */
-+#define       bit_alloc(nbits) \
-+      (bitstr_t *)calloc((size_t)bitstr_size(nbits), sizeof(bitstr_t))
-+
-+                              /* allocate a bitstring on the stack */
-+#define       bit_decl(name, nbits) \
-+      ((name)[bitstr_size(nbits)])
-+
-+                              /* is bit N of bitstring name set? */
-+#define       bit_test(name, bit) \
-+      ((name)[_bit_byte(bit)] & _bit_mask(bit))
-+
-+                              /* set bit N of bitstring name */
-+#define       bit_set(name, bit) \
-+      ((name)[_bit_byte(bit)] |= _bit_mask(bit))
-+
-+                              /* clear bit N of bitstring name */
-+#define       bit_clear(name, bit) \
-+      ((name)[_bit_byte(bit)] &= ~_bit_mask(bit))
-+
-+                              /* clear bits start ... stop in bitstring */
-+#define       bit_nclear(name, start, stop) do { \
-+      register bitstr_t *_name = name; \
-+      register int _start = start, _stop = stop; \
-+      while (_start <= _stop) { \
-+              bit_clear(_name, _start); \
-+              _start++; \
-+              } \
-+} while(0)
-+
-+                              /* set bits start ... stop in bitstring */
-+#define       bit_nset(name, start, stop) do { \
-+      register bitstr_t *_name = name; \
-+      register int _start = start, _stop = stop; \
-+      while (_start <= _stop) { \
-+              bit_set(_name, _start); \
-+              _start++; \
-+              } \
-+} while(0)
-+
-+                              /* find first bit clear in name */
-+#define       bit_ffc(name, nbits, value) do { \
-+      register bitstr_t *_name = name; \
-+      register int _bit, _nbits = nbits, _value = -1; \
-+      for (_bit = 0; _bit < _nbits; ++_bit) \
-+              if (!bit_test(_name, _bit)) { \
-+                      _value = _bit; \
-+                      break; \
-+              } \
-+      *(value) = _value; \
-+} while(0)
-+
-+                              /* find first bit set in name */
-+#define       bit_ffs(name, nbits, value) do { \
-+      register bitstr_t *_name = name; \
-+      register int _bit, _nbits = nbits, _value = -1; \
-+      for (_bit = 0; _bit < _nbits; ++_bit) \
-+              if (bit_test(_name, _bit)) { \
-+                      _value = _bit; \
-+                      break; \
-+              } \
-+      *(value) = _value; \
-+} while(0)
-+
-+#endif /* !_BITSTRING_H_ */
-Index: isakmpd-20041012.orig/sysdep/linux/include/sys/queue.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ isakmpd-20041012.orig/sysdep/linux/include/sys/queue.h     2007-06-04 13:22:39.292881856 +0200
-@@ -0,0 +1,453 @@
-+/*
-+ * Copyright (c) 1991, 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.
-+ *
-+ *    @(#)queue.h     8.5 (Berkeley) 8/20/94
-+ * $FreeBSD: src/sys/sys/queue.h,v 1.45 2001/12/11 11:49:58 sheldonh Exp $
-+ */
-+
-+#ifndef _SYS_QUEUE_H_
-+#define       _SYS_QUEUE_H_
-+
-+//#include <machine/ansi.h>   /* for __offsetof */
-+
-+/*
-+ * This file defines four types of data structures: singly-linked lists,
-+ * singly-linked tail queues, lists and tail queues.
-+ *
-+ * A singly-linked list is headed by a single forward pointer. The elements
-+ * are singly linked for minimum space and pointer manipulation overhead at
-+ * the expense of O(n) removal for arbitrary elements. New elements can be
-+ * added to the list after an existing element or at the head of the list.
-+ * Elements being removed from the head of the list should use the explicit
-+ * macro for this purpose for optimum efficiency. A singly-linked list may
-+ * only be traversed in the forward direction.  Singly-linked lists are ideal
-+ * for applications with large datasets and few or no removals or for
-+ * implementing a LIFO queue.
-+ *
-+ * A singly-linked tail queue is headed by a pair of pointers, one to the
-+ * head of the list and the other to the tail of the list. The elements are
-+ * singly linked for minimum space and pointer manipulation overhead at the
-+ * expense of O(n) removal for arbitrary elements. New elements can be added
-+ * to the list after an existing element, at the head of the list, or at the
-+ * end of the list. Elements being removed from the head of the tail queue
-+ * should use the explicit macro for this purpose for optimum efficiency.
-+ * A singly-linked tail queue may only be traversed in the forward direction.
-+ * Singly-linked tail queues are ideal for applications with large datasets
-+ * and few or no removals or for implementing a FIFO queue.
-+ *
-+ * A list is headed by a single forward pointer (or an array of forward
-+ * pointers for a hash table header). The elements are doubly linked
-+ * so that an arbitrary element can be removed without a need to
-+ * traverse the list. New elements can be added to the list before
-+ * or after an existing element or at the head of the list. A list
-+ * may only be traversed in the forward direction.
-+ *
-+ * A tail queue is headed by a pair of pointers, one to the head of the
-+ * list and the other to the tail of the list. The elements are doubly
-+ * linked so that an arbitrary element can be removed without a need to
-+ * traverse the list. New elements can be added to the list before or
-+ * after an existing element, at the head of the list, or at the end of
-+ * the list. A tail queue may be traversed in either direction.
-+ *
-+ * For details on the use of these macros, see the queue(3) manual page.
-+ *
-+ *
-+ *                    SLIST   LIST    STAILQ  TAILQ
-+ * _HEAD              +       +       +       +
-+ * _HEAD_INITIALIZER  +       +       +       +
-+ * _ENTRY             +       +       +       +
-+ * _INIT              +       +       +       +
-+ * _EMPTY             +       +       +       +
-+ * _FIRST             +       +       +       +
-+ * _NEXT              +       +       +       +
-+ * _PREV              -       -       -       +
-+ * _LAST              -       -       +       +
-+ * _FOREACH           +       +       +       +
-+ * _FOREACH_REVERSE   -       -       -       +
-+ * _INSERT_HEAD               +       +       +       +
-+ * _INSERT_BEFORE     -       +       -       +
-+ * _INSERT_AFTER      +       +       +       +
-+ * _INSERT_TAIL               -       -       +       +
-+ * _REMOVE_HEAD               +       -       +       -
-+ * _REMOVE            +       +       +       +
-+ *
-+ */
-+
-+/*
-+ * Singly-linked List declarations.
-+ */
-+#define       SLIST_HEAD(name, type)                                          \
-+struct name {                                                         \
-+      struct type *slh_first; /* first element */                     \
-+}
-+
-+#define       SLIST_HEAD_INITIALIZER(head)                                    \
-+      { NULL }
-+ 
-+#define       SLIST_ENTRY(type)                                               \
-+struct {                                                              \
-+      struct type *sle_next;  /* next element */                      \
-+}
-+ 
-+/*
-+ * Singly-linked List functions.
-+ */
-+#define       SLIST_EMPTY(head)       ((head)->slh_first == NULL)
-+
-+#define       SLIST_FIRST(head)       ((head)->slh_first)
-+
-+#define       SLIST_FOREACH(var, head, field)                                 \
-+      for ((var) = SLIST_FIRST((head));                               \
-+          (var);                                                      \
-+          (var) = SLIST_NEXT((var), field))
-+
-+#define       SLIST_INIT(head) do {                                           \
-+      SLIST_FIRST((head)) = NULL;                                     \
-+} while (0)
-+
-+#define       SLIST_INSERT_AFTER(slistelm, elm, field) do {                   \
-+      SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field);       \
-+      SLIST_NEXT((slistelm), field) = (elm);                          \
-+} while (0)
-+
-+#define       SLIST_INSERT_HEAD(head, elm, field) do {                        \
-+      SLIST_NEXT((elm), field) = SLIST_FIRST((head));                 \
-+      SLIST_FIRST((head)) = (elm);                                    \
-+} while (0)
-+
-+#define       SLIST_NEXT(elm, field)  ((elm)->field.sle_next)
-+
-+#define       SLIST_REMOVE(head, elm, type, field) do {                       \
-+      if (SLIST_FIRST((head)) == (elm)) {                             \
-+              SLIST_REMOVE_HEAD((head), field);                       \
-+      }                                                               \
-+      else {                                                          \
-+              struct type *curelm = SLIST_FIRST((head));              \
-+              while (SLIST_NEXT(curelm, field) != (elm))              \
-+                      curelm = SLIST_NEXT(curelm, field);             \
-+              SLIST_NEXT(curelm, field) =                             \
-+                  SLIST_NEXT(SLIST_NEXT(curelm, field), field);       \
-+      }                                                               \
-+} while (0)
-+
-+#define       SLIST_REMOVE_HEAD(head, field) do {                             \
-+      SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field);   \
-+} while (0)
-+
-+/*
-+ * Singly-linked Tail queue declarations.
-+ */
-+#define       STAILQ_HEAD(name, type)                                         \
-+struct name {                                                         \
-+      struct type *stqh_first;/* first element */                     \
-+      struct type **stqh_last;/* addr of last next element */         \
-+}
-+
-+#define       STAILQ_HEAD_INITIALIZER(head)                                   \
-+      { NULL, &(head).stqh_first }
-+
-+#define       STAILQ_ENTRY(type)                                              \
-+struct {                                                              \
-+      struct type *stqe_next; /* next element */                      \
-+}
-+
-+/*
-+ * Singly-linked Tail queue functions.
-+ */
-+#define       STAILQ_EMPTY(head)      ((head)->stqh_first == NULL)
-+
-+#define       STAILQ_FIRST(head)      ((head)->stqh_first)
-+
-+#define       STAILQ_FOREACH(var, head, field)                                \
-+      for((var) = STAILQ_FIRST((head));                               \
-+         (var);                                                       \
-+         (var) = STAILQ_NEXT((var), field))
-+
-+#define       STAILQ_INIT(head) do {                                          \
-+      STAILQ_FIRST((head)) = NULL;                                    \
-+      (head)->stqh_last = &STAILQ_FIRST((head));                      \
-+} while (0)
-+
-+#define       STAILQ_INSERT_AFTER(head, tqelm, elm, field) do {               \
-+      if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\
-+              (head)->stqh_last = &STAILQ_NEXT((elm), field);         \
-+      STAILQ_NEXT((tqelm), field) = (elm);                            \
-+} while (0)
-+
-+#define       STAILQ_INSERT_HEAD(head, elm, field) do {                       \
-+      if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \
-+              (head)->stqh_last = &STAILQ_NEXT((elm), field);         \
-+      STAILQ_FIRST((head)) = (elm);                                   \
-+} while (0)
-+
-+#define       STAILQ_INSERT_TAIL(head, elm, field) do {                       \
-+      STAILQ_NEXT((elm), field) = NULL;                               \
-+      *(head)->stqh_last = (elm);                                     \
-+      (head)->stqh_last = &STAILQ_NEXT((elm), field);                 \
-+} while (0)
-+
-+#define       STAILQ_LAST(head, type, field)                                  \
-+      (STAILQ_EMPTY(head) ?                                           \
-+              NULL :                                                  \
-+              ((struct type *)                                        \
-+              ((char *)((head)->stqh_last) - __offsetof(struct type, field))))
-+
-+#define       STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
-+
-+#define       STAILQ_REMOVE(head, elm, type, field) do {                      \
-+      if (STAILQ_FIRST((head)) == (elm)) {                            \
-+              STAILQ_REMOVE_HEAD(head, field);                        \
-+      }                                                               \
-+      else {                                                          \
-+              struct type *curelm = STAILQ_FIRST((head));             \
-+              while (STAILQ_NEXT(curelm, field) != (elm))             \
-+                      curelm = STAILQ_NEXT(curelm, field);            \
-+              if ((STAILQ_NEXT(curelm, field) =                       \
-+                   STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL)\
-+                      (head)->stqh_last = &STAILQ_NEXT((curelm), field);\
-+      }                                                               \
-+} while (0)
-+
-+#define       STAILQ_REMOVE_HEAD(head, field) do {                            \
-+      if ((STAILQ_FIRST((head)) =                                     \
-+           STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL)         \
-+              (head)->stqh_last = &STAILQ_FIRST((head));              \
-+} while (0)
-+
-+#define       STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do {                 \
-+      if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL) \
-+              (head)->stqh_last = &STAILQ_FIRST((head));              \
-+} while (0)
-+
-+/*
-+ * List declarations.
-+ */
-+#define       LIST_HEAD(name, type)                                           \
-+struct name {                                                         \
-+      struct type *lh_first;  /* first element */                     \
-+}
-+
-+#define       LIST_HEAD_INITIALIZER(head)                                     \
-+      { NULL }
-+
-+#define       LIST_ENTRY(type)                                                \
-+struct {                                                              \
-+      struct type *le_next;   /* next element */                      \
-+      struct type **le_prev;  /* address of previous next element */  \
-+}
-+
-+/*
-+ * List functions.
-+ */
-+
-+#define       LIST_EMPTY(head)        ((head)->lh_first == NULL)
-+
-+#define       LIST_FIRST(head)        ((head)->lh_first)
-+
-+#define       LIST_FOREACH(var, head, field)                                  \
-+      for ((var) = LIST_FIRST((head));                                \
-+          (var);                                                      \
-+          (var) = LIST_NEXT((var), field))
-+
-+#define       LIST_INIT(head) do {                                            \
-+      LIST_FIRST((head)) = NULL;                                      \
-+} while (0)
-+
-+#define       LIST_INSERT_AFTER(listelm, elm, field) do {                     \
-+      if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\
-+              LIST_NEXT((listelm), field)->field.le_prev =            \
-+                  &LIST_NEXT((elm), field);                           \
-+      LIST_NEXT((listelm), field) = (elm);                            \
-+      (elm)->field.le_prev = &LIST_NEXT((listelm), field);            \
-+} while (0)
-+
-+#define       LIST_INSERT_BEFORE(listelm, elm, field) do {                    \
-+      (elm)->field.le_prev = (listelm)->field.le_prev;                \
-+      LIST_NEXT((elm), field) = (listelm);                            \
-+      *(listelm)->field.le_prev = (elm);                              \
-+      (listelm)->field.le_prev = &LIST_NEXT((elm), field);            \
-+} while (0)
-+
-+#define       LIST_INSERT_HEAD(head, elm, field) do {                         \
-+      if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL)     \
-+              LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\
-+      LIST_FIRST((head)) = (elm);                                     \
-+      (elm)->field.le_prev = &LIST_FIRST((head));                     \
-+} while (0)
-+
-+#define       LIST_NEXT(elm, field)   ((elm)->field.le_next)
-+
-+#define       LIST_REMOVE(elm, field) do {                                    \
-+      if (LIST_NEXT((elm), field) != NULL)                            \
-+              LIST_NEXT((elm), field)->field.le_prev =                \
-+                  (elm)->field.le_prev;                               \
-+      *(elm)->field.le_prev = LIST_NEXT((elm), field);                \
-+} while (0)
-+
-+/*
-+ * Tail queue declarations.
-+ */
-+#define       TAILQ_HEAD(name, type)                                          \
-+struct name {                                                         \
-+      struct type *tqh_first; /* first element */                     \
-+      struct type **tqh_last; /* addr of last next element */         \
-+}
-+
-+#define       TAILQ_HEAD_INITIALIZER(head)                                    \
-+      { NULL, &(head).tqh_first }
-+
-+#define       TAILQ_ENTRY(type)                                               \
-+struct {                                                              \
-+      struct type *tqe_next;  /* next element */                      \
-+      struct type **tqe_prev; /* address of previous next element */  \
-+}
-+
-+/*
-+ * Tail queue functions.
-+ */
-+#define       TAILQ_EMPTY(head)       ((head)->tqh_first == NULL)
-+
-+#define       TAILQ_FIRST(head)       ((head)->tqh_first)
-+
-+#define       TAILQ_FOREACH(var, head, field)                                 \
-+      for ((var) = TAILQ_FIRST((head));                               \
-+          (var);                                                      \
-+          (var) = TAILQ_NEXT((var), field))
-+
-+#define       TAILQ_FOREACH_REVERSE(var, head, headname, field)               \
-+      for ((var) = TAILQ_LAST((head), headname);                      \
-+          (var);                                                      \
-+          (var) = TAILQ_PREV((var), headname, field))
-+
-+#define       TAILQ_INIT(head) do {                                           \
-+      TAILQ_FIRST((head)) = NULL;                                     \
-+      (head)->tqh_last = &TAILQ_FIRST((head));                        \
-+} while (0)
-+
-+#define       TAILQ_INSERT_AFTER(head, listelm, elm, field) do {              \
-+      if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\
-+              TAILQ_NEXT((elm), field)->field.tqe_prev =              \
-+                  &TAILQ_NEXT((elm), field);                          \
-+      else                                                            \
-+              (head)->tqh_last = &TAILQ_NEXT((elm), field);           \
-+      TAILQ_NEXT((listelm), field) = (elm);                           \
-+      (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field);          \
-+} while (0)
-+
-+#define       TAILQ_INSERT_BEFORE(listelm, elm, field) do {                   \
-+      (elm)->field.tqe_prev = (listelm)->field.tqe_prev;              \
-+      TAILQ_NEXT((elm), field) = (listelm);                           \
-+      *(listelm)->field.tqe_prev = (elm);                             \
-+      (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field);          \
-+} while (0)
-+
-+#define       TAILQ_INSERT_HEAD(head, elm, field) do {                        \
-+      if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL)   \
-+              TAILQ_FIRST((head))->field.tqe_prev =                   \
-+                  &TAILQ_NEXT((elm), field);                          \
-+      else                                                            \
-+              (head)->tqh_last = &TAILQ_NEXT((elm), field);           \
-+      TAILQ_FIRST((head)) = (elm);                                    \
-+      (elm)->field.tqe_prev = &TAILQ_FIRST((head));                   \
-+} while (0)
-+
-+#define       TAILQ_INSERT_TAIL(head, elm, field) do {                        \
-+      TAILQ_NEXT((elm), field) = NULL;                                \
-+      (elm)->field.tqe_prev = (head)->tqh_last;                       \
-+      *(head)->tqh_last = (elm);                                      \
-+      (head)->tqh_last = &TAILQ_NEXT((elm), field);                   \
-+} while (0)
-+
-+#define       TAILQ_LAST(head, headname)                                      \
-+      (*(((struct headname *)((head)->tqh_last))->tqh_last))
-+
-+#define       TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
-+
-+#define       TAILQ_PREV(elm, headname, field)                                \
-+      (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
-+
-+#define       TAILQ_REMOVE(head, elm, field) do {                             \
-+      if ((TAILQ_NEXT((elm), field)) != NULL)                         \
-+              TAILQ_NEXT((elm), field)->field.tqe_prev =              \
-+                  (elm)->field.tqe_prev;                              \
-+      else                                                            \
-+              (head)->tqh_last = (elm)->field.tqe_prev;               \
-+      *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field);              \
-+} while (0)
-+
-+
-+#ifdef _KERNEL
-+
-+/*
-+ * XXX insque() and remque() are an old way of handling certain queues.
-+ * They bogusly assumes that all queue heads look alike.
-+ */
-+
-+struct quehead {
-+      struct quehead *qh_link;
-+      struct quehead *qh_rlink;
-+};
-+
-+#ifdef        __GNUC__
-+
-+static __inline void
-+insque(void *a, void *b)
-+{
-+      struct quehead *element = (struct quehead *)a,
-+               *head = (struct quehead *)b;
-+
-+      element->qh_link = head->qh_link;
-+      element->qh_rlink = head;
-+      head->qh_link = element;
-+      element->qh_link->qh_rlink = element;
-+}
-+
-+static __inline void
-+remque(void *a)
-+{
-+      struct quehead *element = (struct quehead *)a;
-+
-+      element->qh_link->qh_rlink = element->qh_rlink;
-+      element->qh_rlink->qh_link = element->qh_link;
-+      element->qh_rlink = 0;
-+}
-+
-+#else /* !__GNUC__ */
-+
-+void  insque __P((void *a, void *b));
-+void  remque __P((void *a));
-+
-+#endif /* __GNUC__ */
-+
-+#endif /* _KERNEL */
-+
-+#endif /* !_SYS_QUEUE_H_ */
-Index: isakmpd-20041012.orig/sysdep/common/pcap.h
-===================================================================
---- isakmpd-20041012.orig.orig/sysdep/common/pcap.h    2007-06-04 13:22:39.203895384 +0200
-+++ isakmpd-20041012.orig/sysdep/common/pcap.h 2007-06-04 13:22:39.292881856 +0200
-@@ -55,8 +55,13 @@
-       u_int32_t linktype;     /* data link type (DLT_*) */
- };
-+struct pcap_timeval {
-+      int32_t tv_sec;         /* seconds */
-+      int32_t tv_usec;        /* microseconds */
-+};
-+
- struct pcap_pkthdr {
--      struct timeval ts;      /* time stamp */
-+      struct pcap_timeval ts; /* time stamp */
-       u_int32_t caplen;       /* length of portion present */
-       u_int32_t len;          /* length this packet (off wire) */
- };
-Index: isakmpd-20041012.orig/sysdep/common/libsysdep/arc4random.c
-===================================================================
---- isakmpd-20041012.orig.orig/sysdep/common/libsysdep/arc4random.c    2007-06-04 13:22:39.211894168 +0200
-+++ isakmpd-20041012.orig/sysdep/common/libsysdep/arc4random.c 2007-06-04 13:22:39.292881856 +0200
-@@ -78,7 +78,7 @@
- static void
- arc4_stir(struct arc4_stream *as)
- {
--      int     fd;
-+      int     fd, i;
-       struct {
-               struct timeval tv;
-               u_int8_t rnd[128 - sizeof(struct timeval)];
-Index: isakmpd-20041012.orig/x509v3.cnf
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ isakmpd-20041012.orig/x509v3.cnf   2007-06-04 13:22:39.293881704 +0200
-@@ -0,0 +1,26 @@
-+# default settings
-+CERTPATHLEN             = 1
-+CERTUSAGE               = digitalSignature,keyCertSign
-+CERTIP                  = 0.0.0.0
-+CERTFQDN                = nohost.nodomain
-+
-+# This section should be referenced when building an x509v3 CA
-+# Certificate.
-+# The default path length and the key usage can be overriden
-+# modified by setting the CERTPATHLEN and CERTUSAGE environment 
-+# variables.
-+[x509v3_CA]
-+basicConstraints=critical,CA:true,pathlen:$ENV::CERTPATHLEN
-+keyUsage=$ENV::CERTUSAGE
-+
-+# This section should be referenced to add an IP Address
-+# as an alternate subject name, needed by isakmpd
-+# The address must be provided in the CERTIP environment variable
-+[x509v3_IPAddr]
-+subjectAltName=IP:$ENV::CERTIP
-+
-+# This section should be referenced to add a FQDN hostname
-+# as an alternate subject name, needed by isakmpd
-+# The address must be provided in the CERTFQDN environment variable
-+[x509v3_FQDN]
-+subjectAltName=DNS:$ENV::CERTFQDN