diff options
Diffstat (limited to 'package/isakmpd/patches/010-debian_3.patch')
-rw-r--r-- | package/isakmpd/patches/010-debian_3.patch | 1753 |
1 files changed, 0 insertions, 1753 deletions
diff --git a/package/isakmpd/patches/010-debian_3.patch b/package/isakmpd/patches/010-debian_3.patch deleted file mode 100644 index 0f50cf9c07..0000000000 --- a/package/isakmpd/patches/010-debian_3.patch +++ /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 |