From 9243aa45fa0cfcd399aa7db1abd1e64e9ac515e3 Mon Sep 17 00:00:00 2001 From: tomty89 Date: Fri, 20 May 2016 18:20:24 +0800 Subject: [networkd-ndisc] set IPv6LL address in DHCP client Fix issue #3256 and probably #1982. Referenced link_acquire_ipv6_conf() in networkd-link.c. --- src/network/networkd-ndisc.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src/network') diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index b22c58bfe5..78f02cf746 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -157,6 +157,10 @@ static void ndisc_router_handler(sd_ndisc *nd, uint8_t flags, const struct in6_a if (flags & ND_RA_FLAG_MANAGED) dhcp6_request_address(link); + r = sd_dhcp6_client_set_local_address(link->dhcp6_client, &link->ipv6ll_address); + if (r < 0 && r != -EBUSY) + return log_link_warning_errno(link, r, "Could not set IPv6LL address in DHCP client: %m"); + r = sd_dhcp6_client_start(link->dhcp6_client); if (r < 0 && r != -EBUSY) log_link_warning_errno(link, r, "Starting DHCPv6 client on NDisc request failed: %m"); @@ -203,6 +207,10 @@ static void ndisc_handler(sd_ndisc *nd, int event, void *userdata) { case SD_NDISC_EVENT_TIMEOUT: dhcp6_request_address(link); + r = sd_dhcp6_client_set_local_address(link->dhcp6_client, &link->ipv6ll_address); + if (r < 0 && r != -EBUSY) + return log_link_warning_errno(link, r, "Could not set IPv6LL address in DHCP client: %m"); + r = sd_dhcp6_client_start(link->dhcp6_client); if (r < 0 && r != -EBUSY) log_link_warning_errno(link, r, "Starting DHCPv6 client after NDisc timeout failed: %m"); -- cgit v1.2.3-54-g00ecf From 59bc1530b8a06621bf29109984898daa3f8cc6ce Mon Sep 17 00:00:00 2001 From: tomty89 Date: Fri, 20 May 2016 18:28:30 +0800 Subject: [networkd-dhcp6] do not call sd_dhcp6_client_start() from dhcp6_request_address() Starting the DHCP client doesn't seem like dhcp6_request_address()'s responsibility anyway. Whenever it's called, sd_dhcp6_client_start() is unconditionally called outside of it as well. See ndisc_router_handler() and ndisc_handler() in networkd-ndisc.c. --- src/network/networkd-dhcp6.c | 6 ------ 1 file changed, 6 deletions(-) (limited to 'src/network') diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index 6085b28f86..37e13e639e 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -194,12 +194,6 @@ int dhcp6_request_address(Link *link) { if (r < 0) return r; - if (running) { - r = sd_dhcp6_client_start(link->dhcp6_client); - if (r < 0) - return r; - } - return 0; } -- cgit v1.2.3-54-g00ecf