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;
