sd-dhcp6-lease.c revision 7bd8e95d44977833d0de3fc4e893eb3bc84351d6
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering/***
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering This file is part of systemd.
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering Copyright (C) 2014 Tom Gundersen
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering Copyright (C) 2014 Intel Corporation. All rights reserved.
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering systemd is free software; you can redistribute it and/or modify it
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering under the terms of the GNU Lesser General Public License as published by
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering the Free Software Foundation; either version 2.1 of the License, or
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering (at your option) any later version.
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering systemd is distributed in the hope that it will be useful, but
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering Lesser General Public License for more details.
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering You should have received a copy of the GNU Lesser General Public License
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering***/
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#include <errno.h>
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#include "util.h"
3ffd4af22052963e7a29431721ee204e634bea75Lennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering#include "dhcp6-lease-internal.h"
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint dhcp6_lease_clear_timers(DHCP6IA *ia) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(ia, -EINVAL);
3ffd4af22052963e7a29431721ee204e634bea75Lennart Poettering
6bedfcbb2970e06a4d3280c8fb62083d252ede73Lennart Poettering ia->timeout_t1 = sd_event_source_unref(ia->timeout_t1);
2583fbea8e762d2e915582af60560f884d5093f5Lennart Poettering ia->timeout_t2 = sd_event_source_unref(ia->timeout_t2);
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering
07630cea1f3a845c09309f197ac7c4f11edd3b62Lennart Poettering return 0;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint dhcp6_lease_ia_rebind_expire(const DHCP6IA *ia, uint32_t *expire) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering DHCP6Address *addr;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering uint32_t valid = 0, t;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(ia, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(expire, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering LIST_FOREACH(addresses, addr, ia->addresses) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering t = be32toh(addr->iaaddr.lifetime_valid);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering if (valid < t)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering valid = t;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering }
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering t = be32toh(ia->lifetime_t2);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering if (t > valid)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return -EINVAL;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering *expire = valid - t;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return 0;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart PoetteringDHCP6IA *dhcp6_lease_free_ia(DHCP6IA *ia) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering DHCP6Address *address;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering if (!ia)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return NULL;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering dhcp6_lease_clear_timers(ia);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering while (ia->addresses) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering address = ia->addresses;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering LIST_REMOVE(addresses, ia->addresses, address);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering free(address);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering }
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return NULL;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint dhcp6_lease_set_serverid(sd_dhcp6_lease *lease, const uint8_t *id,
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering size_t len) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(lease, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(id, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering free(lease->serverid);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering lease->serverid = memdup(id, len);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering if (!lease->serverid)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return -EINVAL;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering lease->serverid_len = len;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return 0;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint dhcp6_lease_get_serverid(sd_dhcp6_lease *lease, uint8_t **id, size_t *len) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(lease, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(id, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(len, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering *id = lease->serverid;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering *len = lease->serverid_len;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return 0;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint dhcp6_lease_set_preference(sd_dhcp6_lease *lease, uint8_t preference) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(lease, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering lease->preference = preference;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return 0;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint dhcp6_lease_get_preference(sd_dhcp6_lease *lease, uint8_t *preference) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(preference, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering if (!lease)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return -EINVAL;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering *preference = lease->preference;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return 0;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint dhcp6_lease_set_rapid_commit(sd_dhcp6_lease *lease) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(lease, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering lease->rapid_commit = true;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return 0;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint dhcp6_lease_get_rapid_commit(sd_dhcp6_lease *lease, bool *rapid_commit) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(lease, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(rapid_commit, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering *rapid_commit = lease->rapid_commit;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return 0;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint dhcp6_lease_get_iaid(sd_dhcp6_lease *lease, be32_t *iaid) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(lease, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(iaid, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering *iaid = lease->ia.id;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return 0;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint sd_dhcp6_lease_get_address(sd_dhcp6_lease *lease, struct in6_addr *addr,
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering uint32_t *lifetime_preferred,
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering uint32_t *lifetime_valid) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(lease, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(addr, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(lifetime_preferred, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(lifetime_valid, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering if (!lease->addr_iter)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return -ENOMSG;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering memcpy(addr, &lease->addr_iter->iaaddr.address,
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering sizeof(struct in6_addr));
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering *lifetime_preferred =
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering be32toh(lease->addr_iter->iaaddr.lifetime_preferred);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering *lifetime_valid = be32toh(lease->addr_iter->iaaddr.lifetime_valid);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering lease->addr_iter = lease->addr_iter->addresses_next;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return 0;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringvoid sd_dhcp6_lease_reset_address_iter(sd_dhcp6_lease *lease) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering if (lease)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering lease->addr_iter = lease->ia.addresses;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint dhcp6_lease_set_dns(sd_dhcp6_lease *lease, uint8_t *optval, size_t optlen) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering int r;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(lease, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_return(optval, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering if (!optlen)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return 0;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering r = dhcp6_option_parse_ip6addrs(optval, optlen, &lease->dns,
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering lease->dns_count,
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering &lease->dns_allocated);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering if (r < 0) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering log_dhcp6_client(client, "Invalid DNS server option: %s",
d960371482d75711e61896f27ea0d3740ea69fe0David Herrmann strerror(-r));
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return r;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering }
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering lease->dns_count = r;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return 0;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
3ee897d6c2401effbc82f5eef35fce405781d6c8Lennart Poetteringint sd_dhcp6_lease_get_dns(sd_dhcp6_lease *lease, struct in6_addr **addrs) {
d960371482d75711e61896f27ea0d3740ea69fe0David Herrmann assert_return(lease, -EINVAL);
d960371482d75711e61896f27ea0d3740ea69fe0David Herrmann assert_return(addrs, -EINVAL);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering if (lease->dns_count) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering *addrs = lease->dns;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return lease->dns_count;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering }
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return -ENOENT;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringsd_dhcp6_lease *sd_dhcp6_lease_ref(sd_dhcp6_lease *lease) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering if (lease)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering assert_se(REFCNT_INC(lease->n_ref) >= 2);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return lease;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringsd_dhcp6_lease *sd_dhcp6_lease_unref(sd_dhcp6_lease *lease) {
3ee897d6c2401effbc82f5eef35fce405781d6c8Lennart Poettering if (lease && REFCNT_DEC(lease->n_ref) == 0) {
d960371482d75711e61896f27ea0d3740ea69fe0David Herrmann free(lease->serverid);
d960371482d75711e61896f27ea0d3740ea69fe0David Herrmann dhcp6_lease_free_ia(&lease->ia);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering free(lease->dns);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering free(lease);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering }
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return NULL;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poetteringint dhcp6_lease_new(sd_dhcp6_lease **ret) {
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering sd_dhcp6_lease *lease;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering lease = new0(sd_dhcp6_lease, 1);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering if (!lease)
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return -ENOMEM;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering lease->n_ref = REFCNT_INIT;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering LIST_HEAD_INIT(lease->ia.addresses);
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering *ret = lease;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering return 0;
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering}
7a8f63251df2202e59a76e537a688fe7500cb1adLennart Poettering