From: Heiko Hund Date: Wed, 25 Nov 2015 16:46:49 +0000 (+0100) Subject: put virtual IPv6 addresses into env X-Git-Tag: v2.4_alpha1~181 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a8f8b9267183c3cfc065f344d61effe6c55c3da6;p=thirdparty%2Fopenvpn.git put virtual IPv6 addresses into env Add missing environment variables for IPv6 virtual addresses: * ifconfig_pool_local_ip6 * ifconfig_pool_remote_ip6 * ifconfig_pool_ip6_netbits Signed-off-by: Heiko Hund Acked-by: Gert Doering Message-Id: <1448470009-5243-1-git-send-email-heiko.hund@sophos.com> URL: http://article.gmane.org/gmane.network.openvpn.devel/10613 Signed-off-by: Gert Doering --- diff --git a/src/openvpn/multi.c b/src/openvpn/multi.c index a2ab16ecb..6e6d45772 100644 --- a/src/openvpn/multi.c +++ b/src/openvpn/multi.c @@ -1506,10 +1506,24 @@ multi_set_virtual_addr_env (struct multi_context *m, struct multi_instance *mi) } } - /* 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? - */ + setenv_del (mi->context.c2.es, "ifconfig_pool_local_ip6"); + setenv_del (mi->context.c2.es, "ifconfig_pool_remote_ip6"); + setenv_del (mi->context.c2.es, "ifconfig_pool_ip6_netbits"); + + if (mi->context.c1.tuntap->ipv6 && mi->context.c2.push_ifconfig_ipv6_defined) + { + setenv_in6_addr (mi->context.c2.es, + "ifconfig_pool_remote", + &mi->context.c2.push_ifconfig_ipv6_local, + SA_SET_IF_NONZERO); + setenv_in6_addr (mi->context.c2.es, + "ifconfig_pool_local", + &mi->context.c2.push_ifconfig_ipv6_remote, + SA_SET_IF_NONZERO); + setenv_int (mi->context.c2.es, + "ifconfig_pool_ip6_netbits", + mi->context.c2.push_ifconfig_ipv6_netbits); + } } /* diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c index 13c05e076..396fa5427 100644 --- a/src/openvpn/socket.c +++ b/src/openvpn/socket.c @@ -2619,6 +2619,22 @@ 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, + const struct in6_addr *addr, + const unsigned int flags) +{ + if (!IN6_IS_ADDR_UNSPECIFIED (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, diff --git a/src/openvpn/socket.h b/src/openvpn/socket.h index a8e0e816c..b154bc021 100644 --- a/src/openvpn/socket.h +++ b/src/openvpn/socket.h @@ -403,6 +403,11 @@ void setenv_in_addr_t (struct env_set *es, in_addr_t addr, const unsigned int flags); +void setenv_in6_addr (struct env_set *es, + const char *name_prefix, + const struct in6_addr *addr, + const unsigned int flags); + void setenv_link_socket_actual (struct env_set *es, const char *name_prefix, const struct link_socket_actual *act,