diff options
Diffstat (limited to 'wg-dynamic-server.c')
-rw-r--r-- | wg-dynamic-server.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/wg-dynamic-server.c b/wg-dynamic-server.c index 3b4b1f1..7502aaa 100644 --- a/wg-dynamic-server.c +++ b/wg-dynamic-server.c @@ -262,16 +262,23 @@ static bool send_response(struct wg_dynamic_connection *con) lease = set_lease(con->pubkey, leasetime, &con->lladdr, ip4, ip6); - if (lease) { + + if (lease->ipv4.s_addr) { + ans.has_ipv4 = true; memcpy(&ans.ipv4, &lease->ipv4, sizeof ans.ipv4); + } + if (!IN6_IS_ADDR_UNSPECIFIED(&lease->ipv6)) { + ans.has_ipv6 = true; memcpy(&ans.ipv6, &lease->ipv6, sizeof ans.ipv6); - ans.has_ipv4 = ans.has_ipv6 = true; - ans.start = lease->start_real; - ans.leasetime = lease->leasetime; - } else { - ans.wg_errno = E_IP_UNAVAIL; } + if ((!ans.has_ipv4 && rip->has_ipv4) || + (!ans.has_ipv6 && rip->has_ipv6)) + ans.wg_errno = E_IP_UNAVAIL; + + ans.start = lease->start_real; + ans.leasetime = lease->leasetime; + msglen = serialize_request_ip(false, buf, sizeof buf, &ans); break; default: |