Hi,

OpenVPN copies part of the net/route.h header file into their route.c
source file.  They cannot include it, because the kernel route
structure has a name conflict with the openvpn route structure.

The obvious solution is to rename the openvpn route.  It would be
great if we could get that upstream.  According to the sources,
NetBSD, FreeBSD and Dragonfly also suffer from that.

I need that diff for the upcomming routing message change.  Could
somebody test it please as I don't have an OpenVPN setup.  I have
just compile tested it.

ok?

bluhm

Index: net/openvpn/Makefile
===================================================================
RCS file: /data/mirror/openbsd/cvs/ports/net/openvpn/Makefile,v
retrieving revision 1.46
diff -u -p -u -p -r1.46 Makefile
--- net/openvpn/Makefile        1 May 2013 15:40:33 -0000       1.46
+++ net/openvpn/Makefile        17 Oct 2013 15:50:40 -0000
@@ -4,7 +4,7 @@ COMMENT=        easy-to-use, robust, and highly
 
 DISTNAME=      openvpn-2.3.1
 CATEGORIES=    net security
-REVISION=      2
+REVISION=      3
 
 HOMEPAGE=      http://openvpn.net/
 
Index: net/openvpn/patches/patch-src_openvpn_route_c
===================================================================
RCS file: 
/data/mirror/openbsd/cvs/ports/net/openvpn/patches/patch-src_openvpn_route_c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 patch-src_openvpn_route_c
--- net/openvpn/patches/patch-src_openvpn_route_c       1 May 2013 15:40:33 
-0000       1.1
+++ net/openvpn/patches/patch-src_openvpn_route_c       19 Oct 2013 14:01:35 
-0000
@@ -1,6 +1,168 @@
 $OpenBSD: patch-src_openvpn_route_c,v 1.1 2013/05/01 15:40:33 sthen Exp $
---- src/openvpn/route.c.orig   Wed May  1 09:55:36 2013
-+++ src/openvpn/route.c        Wed May  1 09:58:14 2013
+--- src/openvpn/route.c.orig   Thu Mar 28 10:31:03 2013
++++ src/openvpn/route.c        Sat Oct 19 16:00:06 2013
+@@ -49,7 +49,7 @@
+ #define METRIC_NOT_USED ((DWORD)-1)
+ #endif
+ 
+-static void delete_route (struct route *r, const struct tuntap *tt, unsigned 
int flags, const struct route_gateway_info *rgi, const struct env_set *es);
++static void delete_route (struct route_base *r, const struct tuntap *tt, 
unsigned int flags, const struct route_gateway_info *rgi, const struct env_set 
*es);
+ 
+ static void get_bypass_addresses (struct route_bypass *rb, const unsigned int 
flags);
+ 
+@@ -150,7 +150,7 @@ struct route_list *
+ new_route_list (const int max_routes, struct gc_arena *a)
+ {
+   struct route_list *ret;
+-  ALLOC_VAR_ARRAY_CLEAR_GC (ret, struct route_list, struct route, max_routes, 
a);
++  ALLOC_VAR_ARRAY_CLEAR_GC (ret, struct route_list, struct route_base, 
max_routes, a);
+   ret->capacity = max_routes;
+   return ret;
+ }
+@@ -165,7 +165,7 @@ new_route_ipv6_list (const int max_routes, struct gc_a
+ }
+ 
+ static const char *
+-route_string (const struct route *r, struct gc_arena *gc)
++route_string (const struct route_base *r, struct gc_arena *gc)
+ {
+   struct buffer out = alloc_buf_gc (256, gc);
+   buf_printf (&out, "ROUTE network %s netmask %s gateway %s",
+@@ -267,7 +267,7 @@ is_special_addr (const char *addr_str)
+ }
+ 
+ static bool
+-init_route (struct route *r,
++init_route (struct route_base *r,
+           struct addrinfo **network_list,
+           const struct route_option *ro,
+           const struct route_list *rl)
+@@ -484,7 +484,7 @@ void
+ clear_route_list (struct route_list *rl)
+ {
+   const int capacity = rl->capacity;
+-  const size_t rl_size = array_mult_safe (sizeof(struct route), capacity, 
sizeof(struct route_list));
++  const size_t rl_size = array_mult_safe (sizeof(struct route_base), 
capacity, sizeof(struct route_list));
+   memset(rl, 0, rl_size);
+   rl->capacity = capacity;
+ }
+@@ -518,7 +518,7 @@ add_block_local_item (struct route_list *rl,
+       && rl->rgi.gateway.netmask < 0xFFFFFFFF
+       && (rl->n)+2 <= rl->capacity)
+     {
+-      struct route r;
++      struct route_base r;
+       unsigned int l2;
+ 
+       /* split a route into two smaller blocking routes, and direct them to 
target */
+@@ -648,7 +648,7 @@ init_route_list (struct route_list *rl,
+     for (i = 0; i < opt->n; ++i)
+       {
+         struct addrinfo* netlist;
+-      struct route r;
++      struct route_base r;
+ 
+       if (!init_route (&r,
+                        &netlist,
+@@ -759,7 +759,7 @@ add_route3 (in_addr_t network,
+           const struct route_gateway_info *rgi,
+           const struct env_set *es)
+ {
+-  struct route r;
++  struct route_base r;
+   CLEAR (r);
+   r.flags = RT_DEFINED;
+   r.network = network;
+@@ -777,7 +777,7 @@ del_route3 (in_addr_t network,
+           const struct route_gateway_info *rgi,
+           const struct env_set *es)
+ {
+-  struct route r;
++  struct route_base r;
+   CLEAR (r);
+   r.flags = RT_DEFINED|RT_ADDED;
+   r.network = network;
+@@ -1027,7 +1027,7 @@ add_routes (struct route_list *rl, struct route_ipv6_l
+       
+       for (i = 0; i < rl->n; ++i)
+       {
+-        struct route *r = &rl->routes[i];
++        struct route_base *r = &rl->routes[i];
+         check_subnet_conflict (r->network, r->netmask, "route");
+         if (flags & ROUTE_DELETE_FIRST)
+           delete_route (r, tt, flags, &rl->rgi, es);
+@@ -1059,7 +1059,7 @@ delete_routes (struct route_list *rl, struct route_ipv
+       int i;
+       for (i = rl->n - 1; i >= 0; --i)
+       {
+-        struct route * r = &rl->routes[i];
++        struct route_base * r = &rl->routes[i];
+         delete_route (r, tt, flags, &rl->rgi, es);
+       }
+       rl->iflags &= ~RL_ROUTES_ADDED;
+@@ -1153,7 +1153,7 @@ print_default_gateway(const int msglevel, const struct
+ #endif
+ 
+ static void
+-print_route (const struct route *r, int level)
++print_route (const struct route_base *r, int level)
+ {
+   struct gc_arena gc = gc_new ();
+   if (r->flags & RT_DEFINED)
+@@ -1170,7 +1170,7 @@ print_routes (const struct route_list *rl, int level)
+ }
+ 
+ static void
+-setenv_route (struct env_set *es, const struct route *r, int i)
++setenv_route (struct env_set *es, const struct route_base *r, int i)
+ {
+   struct gc_arena gc = gc_new ();
+   if (r->flags & RT_DEFINED)
+@@ -1287,7 +1287,7 @@ is_on_link (const int is_local_route, const unsigned i
+ }
+ 
+ void
+-add_route (struct route *r,
++add_route (struct route_base *r,
+          const struct tuntap *tt,
+          unsigned int flags,
+          const struct route_gateway_info *rgi, /* may be NULL */
+@@ -1727,7 +1727,7 @@ add_route_ipv6 (struct route_ipv6 *r6, const struct tu
+ }
+ 
+ static void
+-delete_route (struct route *r,
++delete_route (struct route_base *r,
+             const struct tuntap *tt,
+             unsigned int flags,
+             const struct route_gateway_info *rgi,
+@@ -2231,7 +2231,7 @@ get_default_gateway (struct route_gateway_info *rgi)
+ }
+ 
+ static DWORD
+-windows_route_find_if_index (const struct route *r, const struct tuntap *tt)
++windows_route_find_if_index (const struct route_base *r, const struct tuntap 
*tt)
+ {
+   struct gc_arena gc = gc_new ();
+   DWORD ret = TUN_ADAPTER_INDEX_INVALID;
+@@ -2276,7 +2276,7 @@ windows_route_find_if_index (const struct route *r, co
+ }
+ 
+ bool
+-add_route_ipapi (const struct route *r, const struct tuntap *tt, DWORD 
adapter_index)
++add_route_ipapi (const struct route_base *r, const struct tuntap *tt, DWORD 
adapter_index)
+ {
+   struct gc_arena gc = gc_new ();
+   bool ret = false;
+@@ -2350,7 +2350,7 @@ add_route_ipapi (const struct route *r, const struct t
+ }
+ 
+ bool
+-del_route_ipapi (const struct route *r, const struct tuntap *tt)
++del_route_ipapi (const struct route_base *r, const struct tuntap *tt)
+ {
+   struct gc_arena gc = gc_new ();
+   bool ret = false;
 @@ -2957,7 +2957,7 @@ get_default_gateway (struct route_gateway_info *rgi)
  
  #undef max
@@ -10,12 +172,10 @@ $OpenBSD: patch-src_openvpn_route_c,v 1.
  
  #include <sys/types.h>
  #include <sys/socket.h>
-@@ -3006,6 +3006,169 @@ struct rt_msghdr {
-       int     rtm_errno;      /* why failed */
-       int     rtm_use;        /* from rtentry */
+@@ -3008,6 +3008,119 @@ struct rt_msghdr {
        u_long  rtm_inits;      /* which metrics we are initializing */
-+      struct  rt_metrics rtm_rmx; /* metrics themselves */
-+};
+       struct  rt_metrics rtm_rmx; /* metrics themselves */
+ };
 +
 +struct {
 +  struct rt_msghdr m_rtm;
@@ -128,55 +288,7 @@ $OpenBSD: patch-src_openvpn_route_c,v 1.
 +#include <sys/socket.h>
 +#include <netinet/in.h>
 +
-+/* all of this is taken from <net/route.h> in OpenBSD 5.3 */
-+#define RTA_DST               0x1     /* destination sockaddr present */
-+#define RTA_GATEWAY   0x2     /* gateway sockaddr present */
-+#define RTA_NETMASK   0x4     /* netmask sockaddr present */
-+
-+#define RTM_GET               0x4     /* Report Metrics */
-+
-+#define RTM_VERSION   4       /* Up the ante and ignore older versions */
-+
-+#define       RTF_UP          0x1     /* route usable */
-+#define       RTF_GATEWAY     0x2     /* destination is a gateway */
-+
-+/*
-+ * Huge version for userland compatibility.
-+ */
-+struct rt_metrics {
-+      u_int64_t       rmx_pksent;     /* packets sent using this route */
-+      u_int           rmx_locks;      /* Kernel must leave these values */
-+      u_int           rmx_mtu;        /* MTU for this path */
-+      u_int           rmx_expire;     /* lifetime for route, e.g. redirect */
-+      u_int           rmx_refcnt;     /* # references hold */
-+      /* some apps may still need these no longer used metrics */
-+      u_int           rmx_hopcount;   /* max hops expected */
-+      u_int           rmx_recvpipe;   /* inbound delay-bandwidth product */
-+      u_int           rmx_sendpipe;   /* outbound delay-bandwidth product */
-+      u_int           rmx_ssthresh;   /* outbound gateway buffer limit */
-+      u_int           rmx_rtt;        /* estimated round trip time */
-+      u_int           rmx_rttvar;     /* estimated rtt variance */
-+};
-+
-+/*
-+ * Structures for routing messages.
-+ */
-+struct rt_msghdr {
-+      u_short rtm_msglen;     /* to skip over non-understood messages */
-+      u_char  rtm_version;    /* future binary compatibility */
-+      u_char  rtm_type;       /* message type */
-+      u_short rtm_hdrlen;     /* sizeof(rt_msghdr) to skip over the header */
-+      u_short rtm_index;      /* index for associated ifp */
-+      u_short rtm_tableid;    /* routing table id */
-+      u_char  rtm_priority;   /* routing priority */
-+      u_char  rtm_mpls;       /* MPLS additional infos */
-+      int     rtm_addrs;      /* bitmask identifying sockaddrs in msg */
-+      int     rtm_flags;      /* flags, incl. kern & message, e.g. DONE */
-+      int     rtm_fmask;      /* bitmask used in RTM_CHANGE message */
-+      pid_t   rtm_pid;        /* identify sender */
-+      int     rtm_seq;        /* for sender to identify action */
-+      int     rtm_errno;      /* why failed */
-+      u_int   rtm_inits;      /* which metrics we are initializing */
-       struct  rt_metrics rtm_rmx; /* metrics themselves */
- };
++#include <net/route.h>
  
+ struct {
+   struct rt_msghdr m_rtm;
Index: net/openvpn/patches/patch-src_openvpn_route_h
===================================================================
RCS file: net/openvpn/patches/patch-src_openvpn_route_h
diff -N net/openvpn/patches/patch-src_openvpn_route_h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ net/openvpn/patches/patch-src_openvpn_route_h       19 Oct 2013 13:56:34 
-0000
@@ -0,0 +1,41 @@
+$OpenBSD$
+--- src/openvpn/route.h.orig   Wed Mar 20 09:28:14 2013
++++ src/openvpn/route.h        Sat Oct 19 15:54:29 2013
+@@ -110,7 +110,7 @@ struct route_ipv6_option_list {
+   struct route_ipv6_option routes_ipv6[EMPTY_ARRAY_SIZE];
+ };
+ 
+-struct route {
++struct route_base {
+ # define RT_DEFINED        (1<<0)
+ # define RT_ADDED          (1<<1)
+ # define RT_METRIC_DEFINED (1<<2)
+@@ -190,7 +190,7 @@ struct route_list {
+   unsigned int flags;     /* RG_x flags */
+   int capacity;
+   int n;
+-  struct route routes[EMPTY_ARRAY_SIZE];
++  struct route_base routes[EMPTY_ARRAY_SIZE];
+ };
+ 
+ #if P2MP
+@@ -223,7 +223,7 @@ struct route_ipv6_list *new_route_ipv6_list (const int
+ void add_route_ipv6 (struct route_ipv6 *r, const struct tuntap *tt, unsigned 
int flags, const struct env_set *es);
+ void delete_route_ipv6 (const struct route_ipv6 *r, const struct tuntap *tt, 
unsigned int flags, const struct env_set *es);
+ 
+-void add_route (struct route *r,
++void add_route (struct route_base *r,
+               const struct tuntap *tt,
+               unsigned int flags,
+               const struct route_gateway_info *rgi,
+@@ -301,8 +301,8 @@ void print_routes (const struct route_list *rl, int le
+ 
+ void show_routes (int msglev);
+ bool test_routes (const struct route_list *rl, const struct tuntap *tt);
+-bool add_route_ipapi (const struct route *r, const struct tuntap *tt, DWORD 
adapter_index);
+-bool del_route_ipapi (const struct route *r, const struct tuntap *tt);
++bool add_route_ipapi (const struct route_base *r, const struct tuntap *tt, 
DWORD adapter_index);
++bool del_route_ipapi (const struct route_base *r, const struct tuntap *tt);
+ 
+ #else
+ static inline bool test_routes (const struct route_list *rl, const struct 
tuntap *tt) { return true; }
Index: net/openvpn/patches/patch-src_openvpn_tun_c
===================================================================
RCS file: 
/data/mirror/openbsd/cvs/ports/net/openvpn/patches/patch-src_openvpn_tun_c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 patch-src_openvpn_tun_c
--- net/openvpn/patches/patch-src_openvpn_tun_c 20 Apr 2013 16:22:55 -0000      
1.1
+++ net/openvpn/patches/patch-src_openvpn_tun_c 19 Oct 2013 13:54:46 -0000
@@ -1,6 +1,15 @@
 $OpenBSD: patch-src_openvpn_tun_c,v 1.1 2013/04/20 16:22:55 sthen Exp $
 --- src/openvpn/tun.c.orig     Wed Mar 20 09:28:14 2013
-+++ src/openvpn/tun.c  Mon Apr  1 17:55:36 2013
++++ src/openvpn/tun.c  Sat Oct 19 15:53:44 2013
+@@ -867,7 +867,7 @@ do_ifconfig (struct tuntap *tt,
+       if (!tun && tt->topology == TOP_SUBNET)
+       {
+         /* Add a network route for the local tun interface */
+-        struct route r;
++        struct route_base r;
+         CLEAR (r);      
+         r.flags = RT_DEFINED | RT_METRIC_DEFINED;
+         r.network = tt->local & tt->remote_netmask;
 @@ -911,7 +911,19 @@ do_ifconfig (struct tuntap *tt,
                          );
        }
@@ -30,15 +39,14 @@ $OpenBSD: patch-src_openvpn_tun_c,v 1.1 
        argv_msg (M_INFO, &argv);
        openvpn_execve_check (&argv, es, S_FATAL, "OpenBSD ifconfig failed");
        if ( do_ipv6 )
-@@ -938,6 +951,18 @@ do_ifconfig (struct tuntap *tt,
-         add_route_connected_v6_net(tt, es);
+@@ -939,6 +952,18 @@ do_ifconfig (struct tuntap *tt,
        }
        tt->did_ifconfig = true;
-+
+ 
 +      /* Add a network route for the local tun interface */
 +      if (!tun && tt->topology == TOP_SUBNET)
 +        {
-+          struct route r;
++          struct route_base r;
 +          CLEAR (r);
 +          r.flags = RT_DEFINED;
 +          r.network = tt->local & tt->remote_netmask;
@@ -46,6 +54,25 @@ $OpenBSD: patch-src_openvpn_tun_c,v 1.1 
 +          r.gateway = tt->local;
 +          add_route (&r, tt, 0, NULL, es);
 +        }
- 
++
  #elif defined(TARGET_NETBSD)
  
+ /* whether or not NetBSD can do IPv6 can be seen by the availability of
+@@ -1064,7 +1089,7 @@ do_ifconfig (struct tuntap *tt,
+       /* Add a network route for the local tun interface */
+       if (!tun && tt->topology == TOP_SUBNET)
+       {
+-        struct route r;
++        struct route_base r;
+         CLEAR (r);
+         r.flags = RT_DEFINED;
+         r.network = tt->local & tt->remote_netmask;
+@@ -1130,7 +1155,7 @@ do_ifconfig (struct tuntap *tt,
+       /* Add a network route for the local tun interface */
+       if (!tun && tt->topology == TOP_SUBNET)
+         {
+-          struct route r;
++          struct route_base r;
+           CLEAR (r);
+           r.flags = RT_DEFINED;
+           r.network = tt->local & tt->remote_netmask;

Reply via email to