struct vpn_option *old_dtls_opts = vpninfo->dtls_options;
const char *old_addr = vpninfo->vpn_addr;
const char *old_netmask = vpninfo->vpn_netmask;
+ const char *old_addr6 = vpninfo->vpn_addr6;
+ const char *old_netmask6 = vpninfo->vpn_netmask6;
struct split_include *inc;
/* Clear old options which will be overwritten */
vpninfo->vpn_addr = vpninfo->vpn_netmask = NULL;
+ vpninfo->vpn_addr6 = vpninfo->vpn_netmask6 = NULL;
vpninfo->cstp_options = vpninfo->dtls_options = NULL;
vpninfo->vpn_domain = vpninfo->vpn_proxy_pac = NULL;
} else if (!strcmp(buf + 7, "MTU")) {
vpninfo->mtu = atol(colon);
} else if (!strcmp(buf + 7, "Address")) {
- vpninfo->vpn_addr = new_option->value;
+ if (strchr(new_option->value, ':'))
+ vpninfo->vpn_addr6 = new_option->value;
+ else
+ vpninfo->vpn_addr = new_option->value;
} else if (!strcmp(buf + 7, "Netmask")) {
- vpninfo->vpn_netmask = new_option->value;
+ if (strchr(new_option->value, ':'))
+ vpninfo->vpn_netmask6 = new_option->value;
+ else
+ vpninfo->vpn_netmask = new_option->value;
} else if (!strcmp(buf + 7, "DNS")) {
int j;
for (j = 0; j < 3; j++) {
}
}
- if (!vpninfo->vpn_addr) {
+ if (!vpninfo->vpn_addr && !vpninfo->vpn_addr6) {
vpninfo->progress(vpninfo, PRG_ERR, "No IP address received. Aborting\n");
return -EINVAL;
}
- if (!vpninfo->vpn_netmask)
+ if (vpninfo->vpn_addr && !vpninfo->vpn_netmask)
vpninfo->vpn_netmask = "255.255.255.255";
if (old_addr) {
if (strcmp(old_addr, vpninfo->vpn_addr)) {
- vpninfo->progress(vpninfo, PRG_ERR, "Reconnect gave different IP address (%s != %s)\n",
+ vpninfo->progress(vpninfo, PRG_ERR, "Reconnect gave different Legacy IP address (%s != %s)\n",
vpninfo->vpn_addr, old_addr);
return -EINVAL;
}
}
if (old_netmask) {
if (strcmp(old_netmask, vpninfo->vpn_netmask)) {
- vpninfo->progress(vpninfo, PRG_ERR, "Reconnect gave different netmask (%s != %s)\n",
+ vpninfo->progress(vpninfo, PRG_ERR, "Reconnect gave different Legacy IP netmask (%s != %s)\n",
vpninfo->vpn_netmask, old_netmask);
return -EINVAL;
}
}
+ if (old_addr6) {
+ if (strcmp(old_addr6, vpninfo->vpn_addr6)) {
+ vpninfo->progress(vpninfo, PRG_ERR, "Reconnect gave different IPv6 address (%s != %s)\n",
+ vpninfo->vpn_addr6, old_addr6);
+ return -EINVAL;
+ }
+ }
+ if (old_netmask6) {
+ if (strcmp(old_netmask6, vpninfo->vpn_netmask6)) {
+ vpninfo->progress(vpninfo, PRG_ERR, "Reconnect gave different IPv6 netmask (%s != %s)\n",
+ vpninfo->vpn_netmask6, old_netmask6);
+ return -EINVAL;
+ }
+ }
while (old_dtls_opts) {
struct vpn_option *tmp = old_dtls_opts;
fprintf(stderr, "Set up DTLS failed; using SSL instead\n");
vpninfo->progress(vpninfo, PRG_INFO,
- "Connected %s as %s, using %s\n", vpninfo->ifname,
- vpninfo->vpn_addr,
+ "Connected %s as %s%s%s, using %s\n", vpninfo->ifname,
+ vpninfo->vpn_addr?:"",
+ (vpninfo->vpn_addr6 && vpninfo->vpn_addr)?" + ":"",
+ vpninfo->vpn_addr6?:"",
(vpninfo->dtls_fd == -1) ?
(vpninfo->deflate ? "SSL + deflate" : "SSL")
: "DTLS");
setenv_int("INTERNAL_IP4_MTU", vpninfo->mtu);
- setenv("INTERNAL_IP4_ADDRESS", vpninfo->vpn_addr, 1);
- setenv("INTERNAL_IP4_NETMASK", vpninfo->vpn_netmask, 1);
+ if (vpninfo->vpn_addr) {
+ setenv("INTERNAL_IP4_ADDRESS", vpninfo->vpn_addr, 1);
+ setenv("INTERNAL_IP4_NETMASK", vpninfo->vpn_netmask, 1);
+ }
+ if (vpninfo->vpn_addr6) {
+ setenv("INTERNAL_IP6_ADDRESS", vpninfo->vpn_addr6, 1);
+ setenv("INTERNAL_IP6_NETMASK", vpninfo->vpn_netmask6, 1);
+ }
if (vpninfo->vpn_dns[0])
setenv("INTERNAL_IP4_DNS", vpninfo->vpn_dns[0], 1);
static int script_config_tun(struct openconnect_info *vpninfo)
{
- if (vpninfo->peer_addr->sa_family != AF_INET) {
- vpninfo->progress(vpninfo, PRG_ERR, "Script cannot handle anything but Legacy IP\n");
+ if (vpninfo->peer_addr->sa_family != AF_INET || !vpninfo->vpn_addr) {
+ vpninfo->progress(vpninfo, PRG_ERR,
+ "Script can only handle Legacy IP\n");
return -EINVAL;
}