Skip to content

Commit eebba6d

Browse files
committed
network: introduce dhcp6_update_mac()
1 parent d947f7f commit eebba6d

File tree

3 files changed

+68
-58
lines changed

3 files changed

+68
-58
lines changed

src/network/networkd-dhcp6.c

Lines changed: 64 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1344,12 +1344,43 @@ static bool dhcp6_enable_prefix_delegation(Link *dhcp6_link) {
13441344
return false;
13451345
}
13461346

1347+
static int dhcp6_set_identifier(Link *link, sd_dhcp6_client *client) {
1348+
const DUID *duid;
1349+
int r;
1350+
1351+
assert(link);
1352+
assert(link->network);
1353+
assert(client);
1354+
1355+
r = sd_dhcp6_client_set_mac(client, (const uint8_t *) &link->mac, sizeof (link->mac), ARPHRD_ETHER);
1356+
if (r < 0)
1357+
return r;
1358+
1359+
if (link->network->iaid_set) {
1360+
r = sd_dhcp6_client_set_iaid(client, link->network->iaid);
1361+
if (r < 0)
1362+
return r;
1363+
}
1364+
1365+
duid = link_get_duid(link);
1366+
if (duid->type == DUID_TYPE_LLT && duid->raw_data_len == 0)
1367+
r = sd_dhcp6_client_set_duid_llt(client, duid->llt_time);
1368+
else
1369+
r = sd_dhcp6_client_set_duid(client,
1370+
duid->type,
1371+
duid->raw_data_len > 0 ? duid->raw_data : NULL,
1372+
duid->raw_data_len);
1373+
if (r < 0)
1374+
return r;
1375+
1376+
return 0;
1377+
}
1378+
13471379
int dhcp6_configure(Link *link) {
13481380
_cleanup_(sd_dhcp6_client_unrefp) sd_dhcp6_client *client = NULL;
13491381
sd_dhcp6_option *vendor_option;
13501382
sd_dhcp6_option *send_option;
13511383
void *request_options;
1352-
const DUID *duid;
13531384
int r;
13541385

13551386
assert(link);
@@ -1368,28 +1399,9 @@ int dhcp6_configure(Link *link) {
13681399
if (r < 0)
13691400
return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to attach event: %m");
13701401

1371-
r = sd_dhcp6_client_set_mac(client,
1372-
(const uint8_t *) &link->mac,
1373-
sizeof (link->mac), ARPHRD_ETHER);
1402+
r = dhcp6_set_identifier(link, client);
13741403
if (r < 0)
1375-
return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set MAC address: %m");
1376-
1377-
if (link->network->iaid_set) {
1378-
r = sd_dhcp6_client_set_iaid(client, link->network->iaid);
1379-
if (r < 0)
1380-
return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set IAID: %m");
1381-
}
1382-
1383-
duid = link_get_duid(link);
1384-
if (duid->type == DUID_TYPE_LLT && duid->raw_data_len == 0)
1385-
r = sd_dhcp6_client_set_duid_llt(client, duid->llt_time);
1386-
else
1387-
r = sd_dhcp6_client_set_duid(client,
1388-
duid->type,
1389-
duid->raw_data_len > 0 ? duid->raw_data : NULL,
1390-
duid->raw_data_len);
1391-
if (r < 0)
1392-
return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set DUID: %m");
1404+
return log_link_error_errno(link, r, "DHCP6 CLIENT: Failed to set identifier: %m");
13931405

13941406
ORDERED_HASHMAP_FOREACH(send_option, link->network->dhcp6_client_send_options) {
13951407
r = sd_dhcp6_client_add_option(client, send_option);
@@ -1472,6 +1484,36 @@ int dhcp6_configure(Link *link) {
14721484
return 0;
14731485
}
14741486

1487+
int dhcp6_update_mac(Link *link) {
1488+
bool restart;
1489+
int r;
1490+
1491+
assert(link);
1492+
1493+
if (!link->dhcp6_client)
1494+
return 0;
1495+
1496+
restart = sd_dhcp6_client_is_running(link->dhcp6_client) > 0;
1497+
1498+
if (restart) {
1499+
r = sd_dhcp6_client_stop(link->dhcp6_client);
1500+
if (r < 0)
1501+
return r;
1502+
}
1503+
1504+
r = dhcp6_set_identifier(link, link->dhcp6_client);
1505+
if (r < 0)
1506+
return r;
1507+
1508+
if (restart) {
1509+
r = sd_dhcp6_client_start(link->dhcp6_client);
1510+
if (r < 0)
1511+
return log_link_warning_errno(link, r, "Could not restart DHCPv6 client: %m");
1512+
}
1513+
1514+
return 0;
1515+
}
1516+
14751517
int link_serialize_dhcp6_client(Link *link, FILE *f) {
14761518
_cleanup_free_ char *duid = NULL;
14771519
uint32_t iaid;

src/network/networkd-dhcp6.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(DHCP6DelegatedPrefix*, dhcp6_pd_free);
2929
bool link_dhcp6_pd_is_enabled(Link *link);
3030
int dhcp6_pd_remove(Link *link);
3131
int dhcp6_configure(Link *link);
32+
int dhcp6_update_mac(Link *link);
3233
int dhcp6_request_address(Link *link, int ir);
3334
int dhcp6_request_prefix_delegation(Link *link);
3435

src/network/networkd-link.c

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3043,42 +3043,9 @@ int link_update(Link *link, sd_netlink_message *m) {
30433043
if (r < 0)
30443044
return log_link_warning_errno(link, r, "Could not update MAC address in DHCP client: %m");
30453045

3046-
if (link->dhcp6_client) {
3047-
const DUID* duid = link_get_duid(link);
3048-
bool restart = sd_dhcp6_client_is_running(link->dhcp6_client) > 0;
3049-
3050-
if (restart) {
3051-
r = sd_dhcp6_client_stop(link->dhcp6_client);
3052-
if (r < 0)
3053-
return log_link_warning_errno(link, r, "Could not stop DHCPv6 client: %m");
3054-
}
3055-
3056-
r = sd_dhcp6_client_set_mac(link->dhcp6_client,
3057-
(const uint8_t *) &link->mac,
3058-
sizeof (link->mac),
3059-
ARPHRD_ETHER);
3060-
if (r < 0)
3061-
return log_link_warning_errno(link, r, "Could not update MAC address in DHCPv6 client: %m");
3062-
3063-
if (link->network->iaid_set) {
3064-
r = sd_dhcp6_client_set_iaid(link->dhcp6_client, link->network->iaid);
3065-
if (r < 0)
3066-
return log_link_warning_errno(link, r, "Could not update DHCPv6 IAID: %m");
3067-
}
3068-
3069-
r = sd_dhcp6_client_set_duid(link->dhcp6_client,
3070-
duid->type,
3071-
duid->raw_data_len > 0 ? duid->raw_data : NULL,
3072-
duid->raw_data_len);
3073-
if (r < 0)
3074-
return log_link_warning_errno(link, r, "Could not update DHCPv6 DUID: %m");
3075-
3076-
if (restart) {
3077-
r = sd_dhcp6_client_start(link->dhcp6_client);
3078-
if (r < 0)
3079-
return log_link_warning_errno(link, r, "Could not restart DHCPv6 client: %m");
3080-
}
3081-
}
3046+
r = dhcp6_update_mac(link);
3047+
if (r < 0)
3048+
return log_link_warning_errno(link, r, "Could not update MAC address in DHCPv6 client: %m");
30823049

30833050
if (link->radv) {
30843051
bool restart = sd_radv_is_running(link->radv);

0 commit comments

Comments
 (0)