From d69d4038ec1da1de7d2e3192db57f9ead8bb059c Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Tue, 9 Jun 2020 10:48:36 +0200 Subject: [PATCH 1/4] dhcp6: Provide method to access IAID --- src/libsystemd-network/sd-dhcp6-client.c | 12 ++++++++++++ src/systemd/sd-dhcp6-client.h | 3 +++ 2 files changed, 15 insertions(+) diff --git a/src/libsystemd-network/sd-dhcp6-client.c b/src/libsystemd-network/sd-dhcp6-client.c index 8d13aef4e7..b761707e7f 100644 --- a/src/libsystemd-network/sd-dhcp6-client.c +++ b/src/libsystemd-network/sd-dhcp6-client.c @@ -342,6 +342,18 @@ int sd_dhcp6_client_set_iaid(sd_dhcp6_client *client, uint32_t iaid) { return 0; } +int sd_dhcp6_client_get_iaid(sd_dhcp6_client *client, uint32_t *iaid) { + assert_return(client, -EINVAL); + assert_return(iaid, -EINVAL); + + if (!client->iaid_set) + return -ENODATA; + + *iaid = be32toh(client->ia_na.ia_na.id); + + return 0; +} + int sd_dhcp6_client_set_fqdn( sd_dhcp6_client *client, const char *fqdn) { diff --git a/src/systemd/sd-dhcp6-client.h b/src/systemd/sd-dhcp6-client.h index 58a17a5a3f..32616c9799 100644 --- a/src/systemd/sd-dhcp6-client.h +++ b/src/systemd/sd-dhcp6-client.h @@ -110,6 +110,9 @@ int sd_dhcp6_client_set_duid_llt( int sd_dhcp6_client_set_iaid( sd_dhcp6_client *client, uint32_t iaid); +int sd_dhcp6_client_get_iaid( + sd_dhcp6_client *client, + uint32_t *iaid); int sd_dhcp6_client_set_fqdn( sd_dhcp6_client *client, const char *fqdn); From 18d8a2cf3054546ff729cba97d62eac408804000 Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Tue, 9 Jun 2020 10:49:08 +0200 Subject: [PATCH 2/4] network: DHCPv6 - export IAID to state file --- src/network/networkd-link.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 20c5c1c4c8..b27b13c194 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -4086,8 +4086,9 @@ 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; - Address *a; + uint32_t iaid; Route *route; + Address *a; Iterator i; int r; @@ -4420,6 +4421,10 @@ 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); + r = fflush_and_check(f); if (r < 0) goto fail; From 01dd138031d540a0efa1b2ed3ef743d0d074f9c8 Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Tue, 9 Jun 2020 10:49:38 +0200 Subject: [PATCH 3/4] sd-network: Introduce API to get DHCPv6 IAID --- 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 5195a5850f..35606789e3 100644 --- a/src/libsystemd/sd-network/sd-network.c +++ b/src/libsystemd/sd-network/sd-network.c @@ -172,6 +172,10 @@ _public_ int sd_network_link_get_dhcp4_client_id_string(int ifindex, char **clie return network_link_get_string(ifindex, "DHCP4_CLIENT_ID", client_id); } +_public_ int sd_network_link_get_dhcp6_client_iaid_string(int ifindex, char **iaid) { + return network_link_get_string(ifindex, "DHCP6_CLIENT_IAID", iaid); +} + _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 876f010c95..c38c5fc18b 100644 --- a/src/systemd/sd-network.h +++ b/src/systemd/sd-network.h @@ -191,6 +191,9 @@ int sd_network_link_get_timezone(int ifindex, char **timezone); /* Get DHCPv4 client id for a given link. */ 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); + /* Monitor object */ typedef struct sd_network_monitor sd_network_monitor; From 331ee15f18a58996d9dc8248918d35d5ce7f7131 Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Tue, 9 Jun 2020 10:50:21 +0200 Subject: [PATCH 4/4] networkctl: DHCPv6 - display IAID --- src/network/networkctl.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/network/networkctl.c b/src/network/networkctl.c index dea190eb0d..d4a5b52309 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -1381,7 +1381,7 @@ 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; + _cleanup_free_ char *t = NULL, *network = NULL, *client_id = NULL, *iaid = NULL; const char *driver = NULL, *path = NULL, *vendor = NULL, *model = NULL, *link = NULL; const char *on_color_operational, *off_color_operational, *on_color_setup, *off_color_setup; @@ -2083,6 +2083,16 @@ static int link_status_one( return table_log_add_error(r); } + r = sd_network_link_get_dhcp6_client_iaid_string(info->ifindex, &iaid); + if (r >= 0) { + r = table_add_many(table, + TABLE_EMPTY, + TABLE_STRING, "DHCP6 Client IAID:", + TABLE_STRING, iaid); + if (r < 0) + return table_log_add_error(r); + } + r = dump_lldp_neighbors(table, "Connected To:", info->ifindex); if (r < 0) return r;