From 6b7d5b6eaf9029b88771ae0ba3cf3c95adb3c24d Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Tue, 9 Jun 2020 16:47:49 +0200 Subject: [PATCH 1/4] network: DHCP6 - introduce DHCP6 DUID to string --- src/libsystemd-network/sd-dhcp6-client.c | 43 ++++++++++++++++++++++++ src/systemd/sd-dhcp6-client.h | 3 ++ 2 files changed, 46 insertions(+) diff --git a/src/libsystemd-network/sd-dhcp6-client.c b/src/libsystemd-network/sd-dhcp6-client.c index b761707e7f..e1572703e2 100644 --- a/src/libsystemd-network/sd-dhcp6-client.c +++ b/src/libsystemd-network/sd-dhcp6-client.c @@ -18,6 +18,7 @@ #include "dns-domain.h" #include "event-util.h" #include "fd-util.h" +#include "hexdecoct.h" #include "hostname-util.h" #include "in-addr-util.h" #include "network-internal.h" @@ -331,6 +332,48 @@ int sd_dhcp6_client_set_duid_llt( return dhcp6_client_set_duid_internal(client, DUID_TYPE_LLT, NULL, 0, llt_time); } +static const char* const dhcp6_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", +}; +DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(dhcp6_duid_type, DUIDType); + +int sd_dhcp6_client_duid_as_string( + sd_dhcp6_client *client, + char **duid) { + _cleanup_free_ char *p = NULL, *s = NULL, *t = NULL; + const char *v; + int r; + + assert_return(client, -EINVAL); + assert_return(client->duid_len > 0, -ENODATA); + + v = dhcp6_duid_type_to_string(be16toh(client->duid.type)); + if (v) { + s = strdup(v); + if (!s) + return -ENOMEM; + } else { + r = asprintf(&s, "%0x", client->duid.type); + if (r < 0) + return -ENOMEM; + } + + t = hexmem(&client->duid.raw.data, client->duid_len); + if (!t) + return -ENOMEM; + + p = strjoin(s, ":", t); + if (!p) + return -ENOMEM; + + *duid = TAKE_PTR(p); + + return 0; +} + int sd_dhcp6_client_set_iaid(sd_dhcp6_client *client, uint32_t iaid) { assert_return(client, -EINVAL); assert_return(IN_SET(client->state, DHCP6_STATE_STOPPED), -EBUSY); diff --git a/src/systemd/sd-dhcp6-client.h b/src/systemd/sd-dhcp6-client.h index 32616c9799..2b0d63a527 100644 --- a/src/systemd/sd-dhcp6-client.h +++ b/src/systemd/sd-dhcp6-client.h @@ -113,6 +113,9 @@ int sd_dhcp6_client_set_iaid( int sd_dhcp6_client_get_iaid( sd_dhcp6_client *client, uint32_t *iaid); +int sd_dhcp6_client_duid_as_string( + sd_dhcp6_client *client, + char **duid); int sd_dhcp6_client_set_fqdn( sd_dhcp6_client *client, const char *fqdn); From 7e738e7b7077156baf5c2a8c2fb23f6c87daded1 Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Tue, 9 Jun 2020 16:48:42 +0200 Subject: [PATCH 2/4] network: DHCP6 - save DUID to state file --- src/network/networkd-link.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index b27b13c194..be5c58087e 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -4086,7 +4086,6 @@ int link_save(Link *link) { const char *admin_state, *oper_state, *carrier_state, *address_state; _cleanup_free_ char *temp_path = NULL; _cleanup_fclose_ FILE *f = NULL; - uint32_t iaid; Route *route; Address *a; Iterator i; @@ -4421,9 +4420,18 @@ int link_save(Link *link) { } } - r = sd_dhcp6_client_get_iaid(link->dhcp6_client, &iaid); - if (r >= 0) - fprintf(f, "DHCP6_CLIENT_IAID=0x%x\n", iaid); + if (link->dhcp6_client) { + _cleanup_free_ char *duid = NULL; + uint32_t iaid; + + r = sd_dhcp6_client_get_iaid(link->dhcp6_client, &iaid); + if (r >= 0) + fprintf(f, "DHCP6_CLIENT_IAID=0x%x\n", iaid); + + r = sd_dhcp6_client_duid_as_string(link->dhcp6_client, &duid); + if (r >= 0) + fprintf(f, "DHCP6_CLIENT_DUID=%s\n", duid); + } r = fflush_and_check(f); if (r < 0) From a9deab2eec8e925eed6d6b9a3395a64438cdd247 Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Tue, 9 Jun 2020 16:49:12 +0200 Subject: [PATCH 3/4] sd-network: Introduce APIs to get DHCP6 DUID --- src/libsystemd/sd-network/sd-network.c | 4 ++++ src/systemd/sd-network.h | 3 +++ 2 files changed, 7 insertions(+) diff --git a/src/libsystemd/sd-network/sd-network.c b/src/libsystemd/sd-network/sd-network.c index 35606789e3..2fde4fbb64 100644 --- a/src/libsystemd/sd-network/sd-network.c +++ b/src/libsystemd/sd-network/sd-network.c @@ -176,6 +176,10 @@ _public_ int sd_network_link_get_dhcp6_client_iaid_string(int ifindex, char **ia return network_link_get_string(ifindex, "DHCP6_CLIENT_IAID", iaid); } +_public_ int sd_network_link_get_dhcp6_client_duid_string(int ifindex, char **duid) { + return network_link_get_string(ifindex, "DHCP6_CLIENT_DUID", duid); +} + _public_ int sd_network_link_get_required_for_online(int ifindex) { _cleanup_free_ char *s = NULL; int r; diff --git a/src/systemd/sd-network.h b/src/systemd/sd-network.h index c38c5fc18b..7e42df17b9 100644 --- a/src/systemd/sd-network.h +++ b/src/systemd/sd-network.h @@ -194,6 +194,9 @@ int sd_network_link_get_dhcp4_client_id_string(int ifindex, char **client_id); /* Get DHCPv6 client IAID for a given link. */ int sd_network_link_get_dhcp6_client_iaid_string(int ifindex, char **iaid); +/* Get DHCPv6 client DUID for a given link. */ +int sd_network_link_get_dhcp6_client_duid_string(int ifindex, char **duid); + /* Monitor object */ typedef struct sd_network_monitor sd_network_monitor; From 639118854fafc0ab63cd72a3711d6005bb062094 Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Tue, 9 Jun 2020 16:49:48 +0200 Subject: [PATCH 4/4] networkctl: Display DHCP6 DUID --- src/network/networkctl.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/network/networkctl.c b/src/network/networkctl.c index d4a5b52309..f7c48f19b1 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -1380,9 +1380,9 @@ static int link_status_one( _cleanup_strv_free_ char **dns = NULL, **ntp = NULL, **sip = NULL, **search_domains = NULL, **route_domains = NULL, **pop3_server = NULL, **smtp_server = NULL, **lpr_server = NULL; - _cleanup_free_ char *setup_state = NULL, *operational_state = NULL, *tz = NULL; - _cleanup_free_ char *t = NULL, *network = NULL, *client_id = NULL, *iaid = NULL; + _cleanup_free_ char *t = NULL, *network = NULL, *client_id = NULL, *iaid = NULL, *duid = NULL; const char *driver = NULL, *path = NULL, *vendor = NULL, *model = NULL, *link = NULL; + _cleanup_free_ char *setup_state = NULL, *operational_state = NULL, *tz = NULL; const char *on_color_operational, *off_color_operational, *on_color_setup, *off_color_setup; _cleanup_free_ int *carrier_bound_to = NULL, *carrier_bound_by = NULL; @@ -2093,6 +2093,16 @@ static int link_status_one( return table_log_add_error(r); } + r = sd_network_link_get_dhcp6_client_duid_string(info->ifindex, &duid); + if (r >= 0) { + r = table_add_many(table, + TABLE_EMPTY, + TABLE_STRING, "DHCP6 Client DUID:", + TABLE_STRING, duid); + if (r < 0) + return table_log_add_error(r); + } + r = dump_lldp_neighbors(table, "Connected To:", info->ifindex); if (r < 0) return r;