sd-dhcp-client: ensure IAID and DUID being set on start

After b2851e8d62, if IAID and DUID are not
set on start, calling sd_dhcp_client_set_iaid_duid_en() in
client_message_init() triggers assertion, as the client is already
running at the stage. Let's set IAID and DUID earlier.

Fixes #28990.
This commit is contained in:
Yu Watanabe
2023-08-30 17:37:03 +09:00
parent acf565b499
commit 5e2a89d84b
+7 -7
View File
@@ -870,13 +870,6 @@ static int client_message_init(
if (client->request_broadcast || client->arp_type != ARPHRD_ETHER)
packet->dhcp.flags = htobe16(0x8000);
/* If no client identifier exists, construct an RFC 4361-compliant one */
if (client->client_id_len == 0) {
r = sd_dhcp_client_set_iaid_duid_en(client, /* iaid_set = */ false, /* iaid = */ 0);
if (r < 0)
return r;
}
/* Some DHCP servers will refuse to issue an DHCP lease if the Client
Identifier option is not set */
r = dhcp_option_append(&packet->dhcp, optlen, &optoffset, 0,
@@ -2075,6 +2068,13 @@ int sd_dhcp_client_start(sd_dhcp_client *client) {
if (r < 0)
return r;
/* If no client identifier exists, construct an RFC 4361-compliant one */
if (client->client_id_len == 0) {
r = sd_dhcp_client_set_iaid_duid_en(client, /* iaid_set = */ false, /* iaid = */ 0);
if (r < 0)
return r;
}
/* RFC7844 section 3.3:
SHOULD perform a complete four-way handshake, starting with a
DHCPDISCOVER, to obtain a new address lease. If the client can