mirror of
https://github.com/systemd/systemd.git
synced 2025-01-26 14:04:03 +03:00
network: introduce dhcp6_update_mac()
This commit is contained in:
parent
d947f7f977
commit
eebba6dc24
@ -1344,12 +1344,43 @@ static bool dhcp6_enable_prefix_delegation(Link *dhcp6_link) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int dhcp6_set_identifier(Link *link, sd_dhcp6_client *client) {
|
||||||
|
const DUID *duid;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert(link);
|
||||||
|
assert(link->network);
|
||||||
|
assert(client);
|
||||||
|
|
||||||
|
r = sd_dhcp6_client_set_mac(client, (const uint8_t *) &link->mac, sizeof (link->mac), ARPHRD_ETHER);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
if (link->network->iaid_set) {
|
||||||
|
r = sd_dhcp6_client_set_iaid(client, link->network->iaid);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
duid = link_get_duid(link);
|
||||||
|
if (duid->type == DUID_TYPE_LLT && duid->raw_data_len == 0)
|
||||||
|
r = sd_dhcp6_client_set_duid_llt(client, duid->llt_time);
|
||||||
|
else
|
||||||
|
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)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int dhcp6_configure(Link *link) {
|
int dhcp6_configure(Link *link) {
|
||||||
_cleanup_(sd_dhcp6_client_unrefp) sd_dhcp6_client *client = NULL;
|
_cleanup_(sd_dhcp6_client_unrefp) sd_dhcp6_client *client = NULL;
|
||||||
sd_dhcp6_option *vendor_option;
|
sd_dhcp6_option *vendor_option;
|
||||||
sd_dhcp6_option *send_option;
|
sd_dhcp6_option *send_option;
|
||||||
void *request_options;
|
void *request_options;
|
||||||
const DUID *duid;
|
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(link);
|
assert(link);
|
||||||
@ -1368,28 +1399,9 @@ int dhcp6_configure(Link *link) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to attach event: %m");
|
return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to attach event: %m");
|
||||||
|
|
||||||
r = sd_dhcp6_client_set_mac(client,
|
r = dhcp6_set_identifier(link, client);
|
||||||
(const uint8_t *) &link->mac,
|
|
||||||
sizeof (link->mac), ARPHRD_ETHER);
|
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set MAC address: %m");
|
return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set identifier: %m");
|
||||||
|
|
||||||
if (link->network->iaid_set) {
|
|
||||||
r = sd_dhcp6_client_set_iaid(client, link->network->iaid);
|
|
||||||
if (r < 0)
|
|
||||||
return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set IAID: %m");
|
|
||||||
}
|
|
||||||
|
|
||||||
duid = link_get_duid(link);
|
|
||||||
if (duid->type == DUID_TYPE_LLT && duid->raw_data_len == 0)
|
|
||||||
r = sd_dhcp6_client_set_duid_llt(client, duid->llt_time);
|
|
||||||
else
|
|
||||||
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)
|
|
||||||
return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set DUID: %m");
|
|
||||||
|
|
||||||
ORDERED_HASHMAP_FOREACH(send_option, link->network->dhcp6_client_send_options) {
|
ORDERED_HASHMAP_FOREACH(send_option, link->network->dhcp6_client_send_options) {
|
||||||
r = sd_dhcp6_client_add_option(client, send_option);
|
r = sd_dhcp6_client_add_option(client, send_option);
|
||||||
@ -1472,6 +1484,36 @@ int dhcp6_configure(Link *link) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int dhcp6_update_mac(Link *link) {
|
||||||
|
bool restart;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert(link);
|
||||||
|
|
||||||
|
if (!link->dhcp6_client)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
restart = sd_dhcp6_client_is_running(link->dhcp6_client) > 0;
|
||||||
|
|
||||||
|
if (restart) {
|
||||||
|
r = sd_dhcp6_client_stop(link->dhcp6_client);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = dhcp6_set_identifier(link, link->dhcp6_client);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
if (restart) {
|
||||||
|
r = sd_dhcp6_client_start(link->dhcp6_client);
|
||||||
|
if (r < 0)
|
||||||
|
return log_link_warning_errno(link, r, "Could not restart DHCPv6 client: %m");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int link_serialize_dhcp6_client(Link *link, FILE *f) {
|
int link_serialize_dhcp6_client(Link *link, FILE *f) {
|
||||||
_cleanup_free_ char *duid = NULL;
|
_cleanup_free_ char *duid = NULL;
|
||||||
uint32_t iaid;
|
uint32_t iaid;
|
||||||
|
@ -29,6 +29,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(DHCP6DelegatedPrefix*, dhcp6_pd_free);
|
|||||||
bool link_dhcp6_pd_is_enabled(Link *link);
|
bool link_dhcp6_pd_is_enabled(Link *link);
|
||||||
int dhcp6_pd_remove(Link *link);
|
int dhcp6_pd_remove(Link *link);
|
||||||
int dhcp6_configure(Link *link);
|
int dhcp6_configure(Link *link);
|
||||||
|
int dhcp6_update_mac(Link *link);
|
||||||
int dhcp6_request_address(Link *link, int ir);
|
int dhcp6_request_address(Link *link, int ir);
|
||||||
int dhcp6_request_prefix_delegation(Link *link);
|
int dhcp6_request_prefix_delegation(Link *link);
|
||||||
|
|
||||||
|
@ -3043,42 +3043,9 @@ int link_update(Link *link, sd_netlink_message *m) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_link_warning_errno(link, r, "Could not update MAC address in DHCP client: %m");
|
return log_link_warning_errno(link, r, "Could not update MAC address in DHCP client: %m");
|
||||||
|
|
||||||
if (link->dhcp6_client) {
|
r = dhcp6_update_mac(link);
|
||||||
const DUID* duid = link_get_duid(link);
|
if (r < 0)
|
||||||
bool restart = sd_dhcp6_client_is_running(link->dhcp6_client) > 0;
|
return log_link_warning_errno(link, r, "Could not update MAC address in DHCPv6 client: %m");
|
||||||
|
|
||||||
if (restart) {
|
|
||||||
r = sd_dhcp6_client_stop(link->dhcp6_client);
|
|
||||||
if (r < 0)
|
|
||||||
return log_link_warning_errno(link, r, "Could not stop DHCPv6 client: %m");
|
|
||||||
}
|
|
||||||
|
|
||||||
r = sd_dhcp6_client_set_mac(link->dhcp6_client,
|
|
||||||
(const uint8_t *) &link->mac,
|
|
||||||
sizeof (link->mac),
|
|
||||||
ARPHRD_ETHER);
|
|
||||||
if (r < 0)
|
|
||||||
return log_link_warning_errno(link, r, "Could not update MAC address in DHCPv6 client: %m");
|
|
||||||
|
|
||||||
if (link->network->iaid_set) {
|
|
||||||
r = sd_dhcp6_client_set_iaid(link->dhcp6_client, link->network->iaid);
|
|
||||||
if (r < 0)
|
|
||||||
return log_link_warning_errno(link, r, "Could not update DHCPv6 IAID: %m");
|
|
||||||
}
|
|
||||||
|
|
||||||
r = sd_dhcp6_client_set_duid(link->dhcp6_client,
|
|
||||||
duid->type,
|
|
||||||
duid->raw_data_len > 0 ? duid->raw_data : NULL,
|
|
||||||
duid->raw_data_len);
|
|
||||||
if (r < 0)
|
|
||||||
return log_link_warning_errno(link, r, "Could not update DHCPv6 DUID: %m");
|
|
||||||
|
|
||||||
if (restart) {
|
|
||||||
r = sd_dhcp6_client_start(link->dhcp6_client);
|
|
||||||
if (r < 0)
|
|
||||||
return log_link_warning_errno(link, r, "Could not restart DHCPv6 client: %m");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (link->radv) {
|
if (link->radv) {
|
||||||
bool restart = sd_radv_is_running(link->radv);
|
bool restart = sd_radv_is_running(link->radv);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user