int dhcp6_configure(Link *link) { sd_dhcp6_client *client = NULL; int r; assert(link); if (link->dhcp6_client) return 0; r = sd_dhcp6_client_new(&client); if (r < 0) return r; r = sd_dhcp6_client_attach_event(client, NULL, 0); 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); if (r < 0) goto error; r = sd_dhcp6_client_set_iaid(client, link->network->iaid); if (r < 0) goto error; if (link->network->duid_type != _DUID_TYPE_INVALID) r = sd_dhcp6_client_set_duid(client, link->network->dhcp_duid_type, link->network->dhcp_duid, link->network->dhcp_duid_len); else r = sd_dhcp6_client_set_duid(client, link->manager->dhcp_duid_type, link->manager->dhcp_duid, link->manager->dhcp_duid_len); if (r < 0) goto error; r = sd_dhcp6_client_set_index(client, link->ifindex); if (r < 0) goto error; r = sd_dhcp6_client_set_callback(client, dhcp6_handler, link); if (r < 0) goto error; link->dhcp6_client = client; return 0; error: sd_dhcp6_client_unref(client); return r; }
int dhcp6_configure(Link *link) { sd_dhcp6_client *client = NULL; int r; const DUID *duid; assert(link); if (link->dhcp6_client) return 0; r = sd_dhcp6_client_new(&client); if (r < 0) return r; r = sd_dhcp6_client_attach_event(client, NULL, 0); if (r < 0) goto error; r = sd_dhcp6_client_set_mac(client, (const uint8_t *) &link->mac, sizeof (link->mac), ARPHRD_ETHER); if (r < 0) goto error; r = sd_dhcp6_client_set_iaid(client, link->network->iaid); if (r < 0) goto error; duid = link_duid(link); r = sd_dhcp6_client_set_duid(client, duid->type, duid->raw_data_len > 0 ? duid->raw_data : NULL, duid->raw_data_len); if (r < 0) goto error; r = dhcp6_set_hostname(client, link); if (r < 0) goto error; r = sd_dhcp6_client_set_ifindex(client, link->ifindex); if (r < 0) goto error; r = sd_dhcp6_client_set_callback(client, dhcp6_handler, link); if (r < 0) goto error; link->dhcp6_client = client; return 0; error: sd_dhcp6_client_unref(client); return r; }