On Sep 19, 2011, at 16:05:27, JuanJo wrote: > On Mon, Sep 19, 2011 at 5:56 PM, JuanJo Ciarlante <jjo...@google.com> wrote: >> On Mon, Sep 19, 2011 at 4:46 PM, Eric Crist <ecr...@secure-computing.net> >> wrote: >>> After testing, this appears to compile and function, with David's >>> tun-stuff.patch, which was attached to the first message. > > FYI indeed had to add tun-stuff.patch to compile under freebsd, quickly > tested ok also. > >> >> Great! ... thanks Eric for testing this (fwiw checked building+test under >> openbsd ok - just to assert that I didn't broke any BSDism). >> >> Cheers,
JuanJo, I forgot to mention the FreeBSD bit, that was something I already knew, sorry for wasting your time by not saying something. For posterity, I've attached the patches here, and added the openvpn-devel list as a CC. Eric Crist
From f11d7ddb965c6bd65d7dd02cc57539ea4f1c5598 Mon Sep 17 00:00:00 2001 From: JuanJo Ciarlante <jjo...@google.com> List-Post: openvpn-devel@lists.sourceforge.net Date: Mon, 19 Sep 2011 16:07:14 +0200 Subject: [PATCH] fix ipv6 compilation under macosx >= 1070 - v3 - use __APPLE_USE_RFC_3542 for macosx build environment >= 1070 - define SOL_IP from IPPROTO_IP if it's missing In Linux man 7 ip says: "Using SOL_IP socket options level isn't portable, BSD-based stacks use IPPROTO_IP level." Signed-off-by: JuanJo Ciarlante <jjo...@google.com> --- socket.c | 3 +-- socket.h | 6 ++---- syshead.h | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/socket.c b/socket.c index a2f9511..47e44ed 100644 --- a/socket.c +++ b/socket.c @@ -2878,8 +2878,7 @@ struct openvpn_in4_pktinfo struct cmsghdr cmsghdr; #ifdef HAVE_IN_PKTINFO struct in_pktinfo pi4; -#endif -#ifdef IP_RECVDSTADDR +#elif defined(IP_RECVDSTADDR) struct in_addr pi4; #endif }; diff --git a/socket.h b/socket.h index a9a29c5..4a4f75d 100644 --- a/socket.h +++ b/socket.h @@ -86,8 +86,7 @@ struct link_socket_actual union { #ifdef HAVE_IN_PKTINFO struct in_pktinfo in4; -#endif -#ifdef IP_RECVDSTADDR +#elif defined(IP_RECVDSTADDR) struct in_addr in4; #endif struct in6_pktinfo in6; @@ -589,8 +588,7 @@ addr_defined_ipi (const struct link_socket_actual *lsa) switch (lsa->dest.addr.sa.sa_family) { #ifdef HAVE_IN_PKTINFO case AF_INET: return lsa->pi.in4.ipi_spec_dst.s_addr != 0; -#endif -#ifdef IP_RECVDSTADDR +#elif defined(IP_RECVDSTADDR) case AF_INET: return lsa->pi.in4.s_addr != 0; #endif case AF_INET6: return !IN6_IS_ADDR_UNSPECIFIED(&lsa->pi.in6.ipi6_addr); diff --git a/syshead.h b/syshead.h index e208d4c..66a2538 100644 --- a/syshead.h +++ b/syshead.h @@ -57,6 +57,12 @@ #define srandom srand #endif +#if defined(__APPLE__) +#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1070 +#define __APPLE_USE_RFC_3542 1 +#endif +#endif + #ifdef HAVE_SYS_TYPES_H #include <sys/types.h> #endif @@ -401,6 +407,14 @@ #endif /* + * Does this platform define SOL_IP + * or only bsd-style IPPROTO_IP ? + */ +#ifndef SOL_IP +#define SOL_IP IPPROTO_IP +#endif + +/* * Disable ESEC */ #if 0 -- 1.7.3.1
diff --git a/tun.c b/tun.c index aa17c36..5185f73 100644 --- a/tun.c +++ b/tun.c @@ -865,13 +865,13 @@ do_ifconfig (struct tuntap *tt, /* Add a network route for the local tun interface */ struct route r; CLEAR (r); - r.defined = true; + r.flags = RT_DEFINED r.network = tt->local & tt->remote_netmask; r.netmask = tt->remote_netmask; r.gateway = tt->local; r.metric_defined = true; r.metric = 0; - add_route (&r, tt, 0, es); + add_route (&r, tt, 0, NULL, es); } tt->did_ifconfig = true; @@ -1061,11 +1061,11 @@ do_ifconfig (struct tuntap *tt, { struct route r; CLEAR (r); - r.defined = true; + r.flags = RT_DEFINED; r.network = tt->local & tt->remote_netmask; r.netmask = tt->remote_netmask; r.gateway = tt->local; - add_route (&r, tt, 0, es); + add_route (&r, tt, 0, NULL, es); } if ( do_ipv6 ) @@ -1105,21 +1105,21 @@ do_ifconfig (struct tuntap *tt, ifconfig_remote_netmask, tun_mtu ); - + argv_msg (M_INFO, &argv); openvpn_execve_check (&argv, es, S_FATAL, "FreeBSD ifconfig failed"); tt->did_ifconfig = true; /* Add a network route for the local tun interface */ if (!tun && tt->topology == TOP_SUBNET) - { + { struct route r; - CLEAR (r); - r.defined = true; + CLEAR (r); + r.flags = RT_DEFINED; r.network = tt->local & tt->remote_netmask; r.netmask = tt->remote_netmask; - r.gateway = tt->local; - add_route (&r, tt, 0, es); + r.gateway = tt->local; + add_route (&r, tt, 0, NULL, es); } if ( do_ipv6 )