mirror of
https://github.com/Dasharo/systemd.git
synced 2026-03-06 15:02:31 -08:00
network: DHCP6 client- Allow to send manual DUID
```
[DHCPv6]
DUIDType=custom
DUIDRawData=00:00:ab:11:f9:2a:c2:77:29:f9:5c:00
```
```
Client Identifier
Option: Client Identifier (1)
Length: 12
DUID: 0000ab11f92ac27729f95c00
DUID Type: Unknown (0)
```
This commit is contained in:
@@ -138,6 +138,13 @@
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>custom</option></term>
|
||||
<listitem><para>If <literal>DUIDType=custom</literal>, then the <literal>DUIDRawData=</literal> value will
|
||||
used be as custom identifier. If <literal>DUIDType=custom</literal> is specified then the
|
||||
<literal>DUIDRawData=</literal> key is mandatory. Note it applies only on DHCPv6 clients.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>uuid</option></term>
|
||||
<listitem><para>If <literal>DUIDType=uuid</literal>, and <varname>DUIDRawData=</varname> is not set,
|
||||
|
||||
@@ -15,10 +15,11 @@
|
||||
#define USEC_2000 ((usec_t) 946684800000000) /* 2000-01-01 00:00:00 UTC */
|
||||
|
||||
static const char * const duid_type_table[_DUID_TYPE_MAX] = {
|
||||
[DUID_TYPE_LLT] = "DUID-LLT",
|
||||
[DUID_TYPE_EN] = "DUID-EN/Vendor",
|
||||
[DUID_TYPE_LL] = "DUID-LL",
|
||||
[DUID_TYPE_UUID] = "UUID",
|
||||
[DUID_TYPE_LLT] = "DUID-LLT",
|
||||
[DUID_TYPE_EN] = "DUID-EN/Vendor",
|
||||
[DUID_TYPE_LL] = "DUID-LL",
|
||||
[DUID_TYPE_UUID] = "UUID",
|
||||
[DUID_TYPE_CUSTOM] = "Custom",
|
||||
};
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP_TO_STRING(duid_type, DUIDType);
|
||||
|
||||
@@ -17,6 +17,7 @@ typedef enum DUIDType {
|
||||
DUID_TYPE_EN = 2,
|
||||
DUID_TYPE_LL = 3,
|
||||
DUID_TYPE_UUID = 4,
|
||||
DUID_TYPE_CUSTOM = 5,
|
||||
_DUID_TYPE_MAX,
|
||||
_DUID_TYPE_INVALID = -EINVAL,
|
||||
} DUIDType;
|
||||
|
||||
@@ -212,10 +212,14 @@ static int dhcp6_client_set_duid_internal(
|
||||
log_dhcp6_client(client, "Using DUID of type %i of incorrect length, proceeding.", duid_type);
|
||||
}
|
||||
|
||||
client->duid.type = htobe16(duid_type);
|
||||
memcpy(&client->duid.raw.data, duid, duid_len);
|
||||
client->duid_len = sizeof(client->duid.type) + duid_len;
|
||||
|
||||
if (duid_type == DUID_TYPE_CUSTOM) {
|
||||
memcpy(&client->duid, duid, duid_len);
|
||||
client->duid_len = duid_len;
|
||||
} else {
|
||||
client->duid.type = htobe16(duid_type);
|
||||
memcpy(&client->duid.raw.data, duid, duid_len);
|
||||
client->duid_len = sizeof(client->duid.type) + duid_len;
|
||||
}
|
||||
} else {
|
||||
r = dhcp_identifier_set_duid(duid_type, &client->hw_addr, client->arp_type, llt_time,
|
||||
client->test_mode, &client->duid, &client->duid_len);
|
||||
|
||||
@@ -1106,10 +1106,11 @@ static const char * const dhcp_option_data_type_table[_DHCP_OPTION_DATA_MAX] = {
|
||||
DEFINE_STRING_TABLE_LOOKUP(dhcp_option_data_type, DHCPOptionDataType);
|
||||
|
||||
static const char* const duid_type_table[_DUID_TYPE_MAX] = {
|
||||
[DUID_TYPE_LLT] = "link-layer-time",
|
||||
[DUID_TYPE_EN] = "vendor",
|
||||
[DUID_TYPE_LL] = "link-layer",
|
||||
[DUID_TYPE_UUID] = "uuid",
|
||||
[DUID_TYPE_LLT] = "link-layer-time",
|
||||
[DUID_TYPE_EN] = "vendor",
|
||||
[DUID_TYPE_LL] = "link-layer",
|
||||
[DUID_TYPE_UUID] = "uuid",
|
||||
[DUID_TYPE_CUSTOM] = "custom",
|
||||
};
|
||||
DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(duid_type, DUIDType);
|
||||
|
||||
|
||||
@@ -555,6 +555,11 @@ static int dhcp6_set_identifier(Link *link, sd_dhcp6_client *client) {
|
||||
}
|
||||
|
||||
duid = link_get_dhcp6_duid(link);
|
||||
|
||||
if (duid->type == DUID_TYPE_CUSTOM && duid->raw_data_len == 0)
|
||||
return log_link_debug_errno(link, SYNTHETIC_ERRNO(EINVAL),
|
||||
"DHCPv6 CLIENT: Missing DUID Raw Data as duid type set to 'custom': %m");
|
||||
|
||||
if (duid->type == DUID_TYPE_LLT && duid->raw_data_len == 0)
|
||||
r = sd_dhcp6_client_set_duid_llt(client, duid->llt_time);
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user