diff --git a/src/ipc.proto b/src/ipc.proto index f2498bca..b5242872 100644 --- a/src/ipc.proto +++ b/src/ipc.proto @@ -48,6 +48,8 @@ message auth_reply_msg repeated string nbns = 23; optional bool no_udp = 24 [default = false]; optional string xml_config_file = 26; + optional string ipv4_network = 27; + optional string ipv6_network = 28; } /* RESUME_FETCH_REQ + RESUME_DELETE_REQ */ diff --git a/src/main-auth.c b/src/main-auth.c index 9d2a9856..5bda1c26 100644 --- a/src/main-auth.c +++ b/src/main-auth.c @@ -85,6 +85,10 @@ int send_cookie_auth_reply(main_server_st* s, struct proc_st* proc, msg.ipv4_netmask = proc->config.ipv4_netmask; msg.ipv6_netmask = proc->config.ipv6_netmask; + + msg.ipv4_network = proc->config.ipv4_network; + msg.ipv6_network = proc->config.ipv6_network; + msg.ipv6_prefix = proc->config.ipv6_prefix; if (proc->config.rx_per_sec != 0) { msg.has_rx_per_sec = 1; diff --git a/src/vpn.h b/src/vpn.h index 593341a5..d5446df6 100644 --- a/src/vpn.h +++ b/src/vpn.h @@ -156,9 +156,11 @@ struct group_cfg_st { struct vpn_st { char name[IFNAMSIZ]; char *ipv4_netmask; + char *ipv4_network; char *ipv4; char *ipv4_local; /* local IPv4 address */ char *ipv6_netmask; + char *ipv6_network; unsigned ipv6_prefix; char *ipv6; diff --git a/src/worker-auth.c b/src/worker-auth.c index dca9e867..4cbc667f 100644 --- a/src/worker-auth.c +++ b/src/worker-auth.c @@ -554,6 +554,18 @@ static int recv_cookie_auth_reply(worker_st * ws) talloc_strdup(ws, msg->ipv6_netmask); } + if (msg->ipv4_network != NULL) { + talloc_free(ws->config->network.ipv4_network); + ws->config->network.ipv4_network = + talloc_strdup(ws, msg->ipv4_network); + } + + if (msg->ipv6_network != NULL) { + talloc_free(ws->config->network.ipv6_network); + ws->config->network.ipv6_network = + talloc_strdup(ws, msg->ipv6_network); + } + ws->config->network.ipv6_prefix = msg->ipv6_prefix; if (msg->has_rx_per_sec) diff --git a/src/worker-misc.c b/src/worker-misc.c index bde24d7d..db16f4cf 100644 --- a/src/worker-misc.c +++ b/src/worker-misc.c @@ -224,6 +224,9 @@ int complete_vpn_info(worker_st * ws, struct vpn_st *vinfo) if (check_if_default_route(vinfo->routes, vinfo->routes_size)) ws->default_route = 1; + vinfo->ipv4_network = ws->config->network.ipv4_network; + vinfo->ipv6_network = ws->config->network.ipv6_network; + vinfo->ipv4_netmask = ws->config->network.ipv4_netmask; vinfo->ipv6_netmask = ws->config->network.ipv6_netmask; vinfo->ipv6_prefix = ws->config->network.ipv6_prefix; diff --git a/src/worker-vpn.c b/src/worker-vpn.c index e5a95ac5..a842976c 100644 --- a/src/worker-vpn.c +++ b/src/worker-vpn.c @@ -1514,14 +1514,14 @@ static int connect_handler(worker_st * ws) tls_printf(ws->session, "X-CSTP-Address: %s\r\n", ws->vinfo.ipv6); SEND_ERR(ret); + } - if (ws->vinfo.ipv6_netmask) { - ret = - tls_printf(ws->session, - "X-CSTP-Netmask: %u\r\n", - ws->vinfo.ipv6_prefix); - SEND_ERR(ret); - } + if (ws->vinfo.ipv6_network && ws->vinfo.ipv6_prefix != 0) { + ret = + tls_printf(ws->session, + "X-CSTP-Netmask: %s/%u\r\n", + ws->vinfo.ipv6_network, ws->vinfo.ipv6_prefix); + SEND_ERR(ret); } }