Merge pull request #3409 from tomty89/update-2

networkd-dhcp6: DHCPv6 starting fixes
This commit is contained in:
Lennart Poettering 2016-06-03 17:57:04 +02:00
commit de4503c8d9
4 changed files with 30 additions and 40 deletions

View file

@ -164,19 +164,13 @@ static void dhcp6_handler(sd_dhcp6_client *client, int event, void *userdata) {
link_check_ready(link);
}
int dhcp6_request_address(Link *link) {
int dhcp6_request_address(Link *link, int ir) {
int r, inf_req;
bool running;
assert(link);
assert(link->dhcp6_client);
r = sd_dhcp6_client_get_information_request(link->dhcp6_client, &inf_req);
if (r < 0)
return r;
if (!inf_req)
return 0;
assert(in_addr_is_link_local(AF_INET6, (const union in_addr_union*)&link->ipv6ll_address) > 0);
r = sd_dhcp6_client_is_running(link->dhcp6_client);
if (r < 0)
@ -185,12 +179,27 @@ int dhcp6_request_address(Link *link) {
running = !!r;
if (running) {
r = sd_dhcp6_client_get_information_request(link->dhcp6_client, &inf_req);
if (r < 0)
return r;
if (inf_req == ir)
return 0;
r = sd_dhcp6_client_stop(link->dhcp6_client);
if (r < 0)
return r;
} else {
r = sd_dhcp6_client_set_local_address(link->dhcp6_client, &link->ipv6ll_address);
if (r < 0)
return r;
}
r = sd_dhcp6_client_set_information_request(link->dhcp6_client, false);
r = sd_dhcp6_client_set_information_request(link->dhcp6_client, ir);
if (r < 0)
return r;
r = sd_dhcp6_client_start(link->dhcp6_client);
if (r < 0)
return r;
@ -215,10 +224,6 @@ int dhcp6_configure(Link *link) {
if (r < 0)
goto error;
r = sd_dhcp6_client_set_information_request(client, true);
if (r < 0)
goto error;
r = sd_dhcp6_client_set_mac(client,
(const uint8_t *) &link->mac,
sizeof (link->mac), ARPHRD_ETHER);

View file

@ -1444,15 +1444,12 @@ static int link_acquire_ipv6_conf(Link *link) {
assert(link->dhcp6_client);
assert(in_addr_is_link_local(AF_INET6, (const union in_addr_union*)&link->ipv6ll_address) > 0);
log_link_debug(link, "Acquiring DHCPv6 lease");
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);
/* start DHCPv6 client in stateless mode */
r = dhcp6_request_address(link, true);
if (r < 0 && r != -EBUSY)
return log_link_warning_errno(link, r, "Could not acquire DHCPv6 lease: %m");
else
log_link_debug(link, "Acquiring DHCPv6 lease");
}
if (link_ipv6_accept_ra_enabled(link)) {

View file

@ -160,7 +160,7 @@ int link_set_timezone(Link *link, const char *timezone);
int ipv4ll_configure(Link *link);
int dhcp4_configure(Link *link);
int dhcp6_configure(Link *link);
int dhcp6_request_address(Link *link);
int dhcp6_request_address(Link *link, int ir);
int ndisc_configure(Link *link);
const char* link_state_to_string(LinkState s) _const_;

View file

@ -149,21 +149,19 @@ static void ndisc_router_handler(sd_ndisc *nd, uint8_t flags, const struct in6_a
assert(link);
assert(link->network);
assert(link->manager);
assert(link->dhcp6_client);
assert(in_addr_is_link_local(AF_INET6, (const union in_addr_union*)&link->ipv6ll_address) > 0);
if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
return;
if (flags & (ND_RA_FLAG_MANAGED | ND_RA_FLAG_OTHER)) {
if (flags & ND_RA_FLAG_MANAGED)
dhcp6_request_address(link);
r = sd_dhcp6_client_set_local_address(link->dhcp6_client, &link->ipv6ll_address);
/* (re)start DHCPv6 client in stateful or stateless mode according to RA flags */
r = dhcp6_request_address(link, flags & ND_RA_FLAG_MANAGED ? false : true);
if (r < 0 && r != -EBUSY)
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");
log_link_warning_errno(link, r, "Could not acquire DHCPv6 lease on NDisc request: %m");
else
log_link_debug(link, "Acquiring DHCPv6 lease on NDisc request");
}
if (!gateway)
@ -205,16 +203,6 @@ static void ndisc_handler(sd_ndisc *nd, int event, void *userdata) {
switch (event) {
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)
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");
link->ndisc_configured = true;
link_check_ready(link);