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 )

Reply via email to