Patch attached, with detached GPG sig. The patch description follows: This adds missing IPv6 pool support in the env-vars provided to scripts. Also adds a setenv_in6_addr() function to socket.c that provides a v6-version of setenv_in_addr_t().
The ifconfig_ipv6_pool_netbits will in most cases be exactly the same as ifconfig_ipv6_netbits. However, the code does allow the client to be pushed a different CIDR range. To support this, and match handling of IPv4, this is exposed to client scripts. Should this design change in the future, it is likely both the ifconfig_ipv6_pool_netbits and ifconfig_pool_netmask can be removed. This patch makes no attempt to resolve these larger issues. Aside from the netbits. the ifconfig_ipv6_pool_local_ip is useful to expose as well. In a p2p topology, the pair of IPs pushed is completely arbitrary and need not match the IP the server is using. It often will out of convention, but since an --ifconfig-ipv6-push can supply arbitrary values, this should again be available to scripts wishing to take advantage of it. This fixes #230. Signed-off-by: Josh Cepek <josh.ce...@usa.net>
>From 257c18edbe0c0b194f1130a842bc9306c1baee75 Mon Sep 17 00:00:00 2001 From: Josh Cepek <josh.ce...@usa.net> List-Post: openvpn-devel@lists.sourceforge.net Date: Fri, 7 Feb 2014 11:40:29 -0600 Subject: [PATCH] Support IPv6 env-vars for server-provided IPs This adds missing IPv6 pool support in the env-vars provided to scripts. Also adds a setenv_in6_addr() function to socket.c that provides a v6-version of setenv_in_addr_t(). The ifconfig_ipv6_pool_netbits will in most cases be exactly the same as ifconfig_ipv6_netbits. However, the code does allow the client to be pushed a different CIDR range. To support this, and match handling of IPv4, this is exposed to client scripts. Should this design change in the future, it is likely both the ifconfig_ipv6_pool_netbits and ifconfig_pool_netmask can be removed. This patch makes no attempt to resolve these larger issues. Aside from the netbits. the ifconfig_ipv6_pool_local_ip is useful to expose as well. In a p2p topology, the pair of IPs pushed is completely arbitrary and need not match the IP the server is using. It often will out of convention, but since an --ifconfig-ipv6-push can supply arbitrary values, this should again be available to scripts wishing to take advantage of it. This fixes #230. Signed-off-by: Josh Cepek <josh.ce...@usa.net> --- src/openvpn/multi.c | 37 ++++++++++++++++++++++++++++++++----- src/openvpn/socket.c | 13 +++++++++++++ 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/openvpn/multi.c b/src/openvpn/multi.c index 5910154..6c18db6 100644 --- a/src/openvpn/multi.c +++ b/src/openvpn/multi.c @@ -1403,6 +1403,14 @@ multi_select_virtual_addr (struct multi_context *m, struct multi_instance *mi) static void multi_set_virtual_addr_env (struct multi_context *m, struct multi_instance *mi) { + const bool have_v6 = mi->context.c2.push_ifconfig_ipv6_defined; + + if (have_v6) + { + setenv_del (mi->context.c2.es, "ifconfig_ipv6_pool_local_ip"); + setenv_del (mi->context.c2.es, "ifconfig_ipv6_pool_remote_ip"); + setenv_del (mi->context.c2.es, "ifconfig_ipv6_pool_netbits"); + } setenv_del (mi->context.c2.es, "ifconfig_pool_local_ip"); setenv_del (mi->context.c2.es, "ifconfig_pool_remote_ip"); setenv_del (mi->context.c2.es, "ifconfig_pool_netmask"); @@ -1417,12 +1425,28 @@ multi_set_virtual_addr_env (struct multi_context *m, struct multi_instance *mi) mi->context.c2.push_ifconfig_local, SA_SET_IF_NONZERO); + if (have_v6) + { + setenv_in6_addr (mi->context.c2.es, + "ifconfig_ipv6_pool_remote_ip", + mi->context.c2.push_ifconfig_ipv6_local, + SA_SET_IF_NONZERO); + } + if (tunnel_type == DEV_TYPE_TAP || (tunnel_type == DEV_TYPE_TUN && tunnel_topology == TOP_SUBNET)) { setenv_in_addr_t (mi->context.c2.es, "ifconfig_pool_netmask", mi->context.c2.push_ifconfig_remote_netmask, SA_SET_IF_NONZERO); + + if (have_v6) + { + setenv_int (mi->context.c2.es, + "ifconfig_ipv6_pool_netbits", + mi->context.c2.push_ifconfig_ipv6_netbits); + } + } else if (tunnel_type == DEV_TYPE_TUN) { @@ -1430,13 +1454,16 @@ multi_set_virtual_addr_env (struct multi_context *m, struct multi_instance *mi) "ifconfig_pool_local_ip", mi->context.c2.push_ifconfig_remote_netmask, SA_SET_IF_NONZERO); + + if (have_v6) + { + setenv_in6_addr (mi->context.c2.es, + "ifconfig_ipv6_pool_local_ip", + mi->context.c2.push_ifconfig_ipv6_remote, + SA_SET_IF_NONZERO); + } } } - - /* TODO: I'm not exactly sure what these environment variables are - * used for, but if we have them for IPv4, we should also have - * them for IPv6, no? - */ } /* diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c index 9e6bd10..b0065ca 100644 --- a/src/openvpn/socket.c +++ b/src/openvpn/socket.c @@ -2593,6 +2593,19 @@ setenv_in_addr_t (struct env_set *es, const char *name_prefix, in_addr_t addr, c } void +setenv_in6_addr (struct env_set *es, const char *name_prefix, struct in6_addr addr, const unsigned int flags) +{ + if (addr.s6_addr || !(flags & SA_SET_IF_NONZERO)) + { + struct openvpn_sockaddr si; + CLEAR (si); + si.addr.in6.sin6_family = AF_INET6; + si.addr.in6.sin6_addr = addr; + setenv_sockaddr (es, name_prefix, &si, flags); + } +} + +void setenv_link_socket_actual (struct env_set *es, const char *name_prefix, const struct link_socket_actual *act, -- 1.9.1
-----BEGIN PGP SIGNATURE----- Version: GnuPG iQGcBAABAgAGBQJTzAcPAAoJENcx2Xpgb9RjmpgMAKt/u5gXGBtf5xQtmu59MuDP HzFetN52BvP1FIHMR0LulOKkUmWDKCWuorSN9dGir7mk13ob/6pNL6eLi/X0J4BD +Zi97wXVrJz7TdAcdKQKBwhNiAkl2f2RUDrKeOK60AuA3fL7Bv7EMNpSzo94Q25y h4TMQul9N3M8le6Oqc5bq6RnBwnV/9KacN6GvSp3OP9lEpOB+9dB0uC3JMnh2CA0 rpX7GY/3rHF9DmpsKtZz05Txg4EmYJfj5uwdqJNKss04bvxuD0UrADaTH932N9o4 pSiEfZq1OGzHUitcMOKkUMKjbbFN1vBzMUR7Kyk5aLug+tlycJiw16ov1g/CBM+Q 8kZHQEa4uVPa33aXj4Ji7ec4KDHh2DMeinAY3hPV8NU2bcxdS6vGaVkz8EXKEkyu SrXId1CvRltnu5fnh5QSfAnPcdQcig06OSsfWXfodGfCySIsPki3BCEYKh51oKfl vcJAMaXvIHKyrM8HXqxqsND+Yb9PE+en8oBUjqqBbA== =rceb -----END PGP SIGNATURE-----