networkd-dhcp6.c revision be3a09b7ffe62b52658e77ae4d6638d1b0dae654
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering This file is part of systemd.
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering Copyright (C) 2014 Intel Corporation. All rights reserved.
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering systemd is free software; you can redistribute it and/or modify it
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering under the terms of the GNU Lesser General Public License as published by
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering the Free Software Foundation; either version 2.1 of the License, or
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering (at your option) any later version.
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering systemd is distributed in the hope that it will be useful, but
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering Lesser General Public License for more details.
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering You should have received a copy of the GNU Lesser General Public License
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poetteringstatic int dhcp6_lease_address_acquired(sd_dhcp6_client *client, Link *link);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poetteringstatic int dhcp6_lease_information_acquired(sd_dhcp6_client *client,
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poetteringstatic int dhcp6_address_handler(sd_rtnl *rtnl, sd_rtnl_message *m,
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering _cleanup_link_unref_ Link *link = userdata;
c3bc53e62459d7e566ffffeade41cd82bc6754f5Lennart Poettering if (r < 0 && r != -EEXIST) {
c3bc53e62459d7e566ffffeade41cd82bc6754f5Lennart Poettering log_link_warning(link, "Could not set extended netlink attributes, reverting to fallback mechanism");
c3bc53e62459d7e566ffffeade41cd82bc6754f5Lennart Poettering dhcp6_lease_address_acquired(link->dhcp6_client, link);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering log_link_error(link, "Could not set DHCPv6 address: %s",
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering } else if (r >= 0)
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering link_rtnl_process_address(rtnl, m, link->manager);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poetteringstatic int dhcp6_address_update(Link *link, struct in6_addr *ip6_addr,
ae6a4bbf318e197813227e50c245a00de03784a2Lennart Poettering uint8_t prefixlen, uint32_t lifetime_preferred,
c3bc53e62459d7e566ffffeade41cd82bc6754f5Lennart Poettering _cleanup_address_free_ Address *addr = NULL;
4667e00a61c2f60922558bc5e33ac9d3073a482cLennart Poettering memcpy(&addr->in_addr.in6, ip6_addr, sizeof(*ip6_addr));
8300ba218e3cf5049496937be8bce10f22d09bbcTom Gundersen addr->cinfo.ifa_prefered = lifetime_preferred;
be808ea083fa07271116b4519c3c27fd20c5f077Tom Gundersen log_link_struct(link, LOG_INFO, "MESSAGE=%-*s: DHCPv6 address "SD_ICMP6_ADDRESS_FORMAT_STR"/%d timeout preferred %d valid %d",
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering link->ifname, SD_ICMP6_ADDRESS_FORMAT_VAL(addr->in_addr.in6),
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering addr->prefixlen, lifetime_preferred, lifetime_valid,
801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47ddLennart Poettering r = address_update(addr, link, dhcp6_address_handler);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering log_link_warning(link, "Could not assign DHCPv6 address: %s",
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poetteringstatic int dhcp6_lease_address_acquired(sd_dhcp6_client *client, Link *link) {
f52e61da047d7fc74e83f12dbbf87e0cbcc51c73Lennart Poettering uint32_t lifetime_preferred, lifetime_valid;
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering r = sd_dhcp6_client_get_lease(client, &lease);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering sd_dhcp6_lease_reset_address_iter(lease);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering while (sd_dhcp6_lease_get_address(lease, &ip6_addr,
c3bc53e62459d7e566ffffeade41cd82bc6754f5Lennart Poettering r = sd_icmp6_ra_get_prefixlen(link->icmp6_router_discovery,
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering if (r < 0 && r != -EADDRNOTAVAIL) {
6e0684729420912df019cc64d3f8a3c8290cc5f1Lennart Poettering log_link_warning(link, "Could not get prefix information: %s",
c3bc53e62459d7e566ffffeade41cd82bc6754f5Lennart Poettering r = dhcp6_address_update(link, &ip6_addr, prefixlen,
switch(event) {
case DHCP6_EVENT_STOP:
case DHCP6_EVENT_RETRANS_MAX:
case DHCP6_EVENT_IP_ACQUIRE:
if (event < 0)
event);
bool information_request;
strerror(-r));
if (!information_request)
strerror(-r));
strerror(-r));
link);
&lifetime_valid) >= 0) {
&ip6_addr);
NULL);
switch(event) {
if (event < 0)
event);