aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Steffen <andreas.steffen@strongswan.org>2008-07-15 15:28:00 +0000
committerAndreas Steffen <andreas.steffen@strongswan.org>2008-07-15 15:28:00 +0000
commiteb0cc33886152940e53d37eba541aefb982cb247 (patch)
tree76b39ea1acea8caf5e8923ea7553cda394ae0f87
parent66d4745f8e1dbe5865cd2693e62bc380c04b2aa6 (diff)
downloadstrongswan-eb0cc33886152940e53d37eba541aefb982cb247.tar.bz2
strongswan-eb0cc33886152940e53d37eba541aefb982cb247.tar.xz
The XFRM_STATE_AF_UNSPEC flag added to xfrm.h allows IPv4-over-IPv6 and IPv6-over-IPv6 tunnels with the 2.6.26 and later Linux kernels
-rw-r--r--NEWS3
-rw-r--r--src/charon/kernel/kernel_interface.c8
-rw-r--r--src/include/linux/xfrm.h1
3 files changed, 11 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index f3ff4cc95..b3dc65277 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,9 @@
strongswan-4.2.5
----------------
+- The XFRM_STATE_AF_UNSPEC flag added to xfrm.h allows IPv4-over-IPv6
+ and IPv6-over-IPv6 tunnels with the 2.6.26 and later Linux kernels.
+
- management of different virtual IP pools for different
network interfaces have become possible.
diff --git a/src/charon/kernel/kernel_interface.c b/src/charon/kernel/kernel_interface.c
index d34c16017..7a83a1ef6 100644
--- a/src/charon/kernel/kernel_interface.c
+++ b/src/charon/kernel/kernel_interface.c
@@ -48,6 +48,11 @@
#include <processing/jobs/callback_job.h>
#include <processing/jobs/roam_job.h>
+/** required for Linux 2.6.26 kernel and later */
+#ifndef XFRM_STATE_AF_UNSPEC
+#define XFRM_STATE_AF_UNSPEC 32
+#endif
+
/** routing table for routes installed by us */
#ifndef IPSEC_ROUTING_TABLE
#define IPSEC_ROUTING_TABLE 100
@@ -505,7 +510,7 @@ static struct xfrm_selector ts2selector(traffic_selector_t *src,
struct xfrm_selector sel;
memset(&sel, 0, sizeof(sel));
- sel.family = src->get_type(src) == TS_IPV4_ADDR_RANGE ? AF_INET : AF_INET6;
+ sel.family = (src->get_type(src) == TS_IPV4_ADDR_RANGE) ? AF_INET : AF_INET6;
/* src or dest proto may be "any" (0), use more restrictive one */
sel.proto = max(src->get_protocol(src), dst->get_protocol(dst));
ts2subnet(dst, &sel.daddr, &sel.prefixlen_d);
@@ -2041,6 +2046,7 @@ static status_t add_sa(private_kernel_interface_t *this,
sa->family = src->get_family(src);
sa->mode = mode;
sa->replay_window = (protocol == IPPROTO_COMP) ? 0 : 32;
+ sa->flags |= XFRM_STATE_AF_UNSPEC;
sa->reqid = reqid;
/* we currently do not expire SAs by volume/packet count */
sa->lft.soft_byte_limit = XFRM_INF;
diff --git a/src/include/linux/xfrm.h b/src/include/linux/xfrm.h
index e31b8c84f..d4e9e50a8 100644
--- a/src/include/linux/xfrm.h
+++ b/src/include/linux/xfrm.h
@@ -338,6 +338,7 @@ struct xfrm_usersa_info {
#define XFRM_STATE_NOPMTUDISC 4
#define XFRM_STATE_WILDRECV 8
#define XFRM_STATE_ICMP 16
+#define XFRM_STATE_AF_UNSPEC 32
};
struct xfrm_usersa_id {