From 31fb3b680ffb1a3f0ed65fe1e0db66aec26b966c Mon Sep 17 00:00:00 2001 From: Nikos Mavrogiannopoulos Date: Mon, 16 Feb 2015 15:13:30 +0100 Subject: [PATCH] In IPv6 use the network address + 1 as the tun address --- src/ip-lease.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ip-lease.c b/src/ip-lease.c index bbfa6329..2077220a 100644 --- a/src/ip-lease.c +++ b/src/ip-lease.c @@ -400,9 +400,10 @@ int get_ipv6_lease(main_server_st* s, struct proc_st* proc) goto fail; } - /* LIP = 1st network address */ + /* LIP = network address + 1 */ memcpy(&proc->ipv6->lip, &network, sizeof(struct sockaddr_in6)); proc->ipv6->lip_len = sizeof(struct sockaddr_in6); + SA_IN6_U8_P(&proc->ipv6->lip)[15] |= 1; if (memcmp(SA_IN6_U8_P(&proc->ipv6->lip), SA_IN6_U8_P(&proc->ipv6->rip), sizeof(struct in6_addr)) == 0) { mslog(s, NULL, LOG_ERR, "cannot assign explicit IP %s; network %s", proc->config.explicit_ipv6, c_network); @@ -460,9 +461,10 @@ int get_ipv6_lease(main_server_st* s, struct proc_st* proc) proc->ipv6->rip_len = sizeof(struct sockaddr_in6); memcpy(&proc->ipv6->rip, &rnd, proc->ipv6->rip_len); - /* LIP = 1st network address */ + /* LIP = network address + 1 */ memcpy(&proc->ipv6->lip, &network, sizeof(struct sockaddr_in6)); proc->ipv6->lip_len = sizeof(struct sockaddr_in6); + SA_IN6_U8_P(&proc->ipv6->lip)[15] |= 1; if (memcmp(SA_IN6_U8_P(&proc->ipv6->lip), SA_IN6_U8_P(&proc->ipv6->rip), sizeof(struct in6_addr)) == 0) { continue;