From ef0daa1129f6e9cbb229e1177048c29311c2152f Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 18 Jun 2020 23:01:05 +0900 Subject: [PATCH 1/8] libsystemd-network: move prototypes of dhcp_lese_save/load() to network-internal.h --- src/libsystemd-network/dhcp-lease-internal.h | 3 --- src/libsystemd-network/network-internal.h | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/libsystemd-network/dhcp-lease-internal.h b/src/libsystemd-network/dhcp-lease-internal.h index aed30d6118..66222eaddb 100644 --- a/src/libsystemd-network/dhcp-lease-internal.h +++ b/src/libsystemd-network/dhcp-lease-internal.h @@ -82,6 +82,3 @@ int dhcp_lease_insert_private_option(sd_dhcp_lease *lease, uint8_t tag, const vo int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease); int dhcp_lease_set_client_id(sd_dhcp_lease *lease, const void *client_id, size_t client_id_len); - -int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file); -int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file); diff --git a/src/libsystemd-network/network-internal.h b/src/libsystemd-network/network-internal.h index aa61bc2614..e4c11235b6 100644 --- a/src/libsystemd-network/network-internal.h +++ b/src/libsystemd-network/network-internal.h @@ -61,9 +61,13 @@ int deserialize_in6_addrs(struct in6_addr **addresses, const char *string); /* don't include "dhcp-lease-internal.h" as it causes conflicts between netinet/ip.h and linux/ip.h */ struct sd_dhcp_route; +struct sd_dhcp_lease; void serialize_dhcp_routes(FILE *f, const char *key, sd_dhcp_route **routes, size_t size); int deserialize_dhcp_routes(struct sd_dhcp_route **ret, size_t *ret_size, size_t *ret_allocated, const char *string); /* It is not necessary to add deserialize_dhcp_option(). Use unhexmem() instead. */ int serialize_dhcp_option(FILE *f, const char *key, const void *data, size_t size); + +int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file); +int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file); From 35cab5f99d8de0ab601d800f3395d018dc807309 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 18 Jun 2020 23:02:31 +0900 Subject: [PATCH 2/8] networkctl: load DHCPv4 lease file and use timezone data from the lease file --- src/network/networkctl.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/network/networkctl.c b/src/network/networkctl.c index bf663146d6..6dd856d181 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -1379,12 +1379,12 @@ static int link_status_one( const LinkInfo *info) { _cleanup_strv_free_ char **dns = NULL, **ntp = NULL, **sip = NULL, **search_domains = NULL, **route_domains = 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_ char *t = NULL, *network = NULL, *client_id = NULL, *iaid = NULL, *duid = NULL, + *setup_state = NULL, *operational_state = NULL, *lease_file = NULL; + const char *driver = NULL, *path = NULL, *vendor = NULL, *model = NULL, *link = NULL, + *on_color_operational, *off_color_operational, *on_color_setup, *off_color_setup; _cleanup_free_ int *carrier_bound_to = NULL, *carrier_bound_by = NULL; + _cleanup_(sd_dhcp_lease_unrefp) sd_dhcp_lease *lease = NULL; _cleanup_(table_unrefp) Table *table = NULL; TableCell *cell; int r; @@ -1425,6 +1425,11 @@ static int link_status_one( (void) sd_network_link_get_carrier_bound_to(info->ifindex, &carrier_bound_to); (void) sd_network_link_get_carrier_bound_by(info->ifindex, &carrier_bound_by); + if (asprintf(&lease_file, "/run/systemd/netif/leases/%d", info->ifindex) < 0) + return log_oom(); + + (void) dhcp_lease_load(&lease, lease_file); + table = table_new("dot", "key", "value"); if (!table) return log_oom(); @@ -2050,14 +2055,18 @@ static int link_status_one( if (r < 0) return r; - (void) sd_network_link_get_timezone(info->ifindex, &tz); - if (tz) { - r = table_add_many(table, - TABLE_EMPTY, - TABLE_STRING, "Time Zone:", - TABLE_STRING, tz); - if (r < 0) - return table_log_add_error(r); + if (lease) { + const char *tz; + + r = sd_dhcp_lease_get_timezone(lease, &tz); + if (r >= 0) { + r = table_add_many(table, + TABLE_EMPTY, + TABLE_STRING, "Time Zone:", + TABLE_STRING, tz); + if (r < 0) + return table_log_add_error(r); + } } r = sd_network_link_get_dhcp4_client_id_string(info->ifindex, &client_id); From d41fa6ee91475b890d4b5821f07a4ff927a7e3a9 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 18 Jun 2020 23:18:27 +0900 Subject: [PATCH 3/8] networkctl: use lease file to get DHCPv4 address --- src/network/networkctl.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/network/networkctl.c b/src/network/networkctl.c index 6dd856d181..f9117418f5 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -930,12 +930,13 @@ static int dump_gateways( static int dump_addresses( sd_netlink *rtnl, + sd_dhcp_lease *lease, Table *table, int ifindex) { _cleanup_free_ struct local_address *local = NULL; - _cleanup_free_ char *dhcp4_address = NULL; _cleanup_strv_free_ char **buf = NULL; + struct in_addr dhcp4_address = {}; int r, n, i; assert(rtnl); @@ -945,7 +946,8 @@ static int dump_addresses( if (n <= 0) return n; - (void) sd_network_link_get_dhcp4_address(ifindex, &dhcp4_address); + if (lease) + (void) sd_dhcp_lease_get_address(lease, &dhcp4_address); for (i = 0; i < n; i++) { _cleanup_free_ char *pretty = NULL; @@ -955,7 +957,7 @@ static int dump_addresses( if (r < 0) return r; - if (dhcp4_address && streq(pretty, dhcp4_address)) { + if (local[i].family == AF_INET && in4_addr_equal(&local[i].address.in, &dhcp4_address)) { _cleanup_free_ char *p = NULL; p = pretty; @@ -2027,7 +2029,7 @@ static int link_status_one( } } - r = dump_addresses(rtnl, table, info->ifindex); + r = dump_addresses(rtnl, lease, table, info->ifindex); if (r < 0) return r; r = dump_gateways(rtnl, hwdb, table, info->ifindex); @@ -2156,7 +2158,7 @@ static int system_status(sd_netlink *rtnl, sd_hwdb *hwdb) { if (r < 0) return table_log_add_error(r); - r = dump_addresses(rtnl, table, 0); + r = dump_addresses(rtnl, NULL, table, 0); if (r < 0) return r; r = dump_gateways(rtnl, hwdb, table, 0); From 862e7108209024b9175afa748a1500e6f3ad2180 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 18 Jun 2020 23:24:06 +0900 Subject: [PATCH 4/8] networkctl: use lease file to get DHCPv4 client ID --- src/network/networkctl.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/network/networkctl.c b/src/network/networkctl.c index f9117418f5..6d2bb110b4 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -1381,7 +1381,7 @@ static int link_status_one( const LinkInfo *info) { _cleanup_strv_free_ char **dns = NULL, **ntp = NULL, **sip = NULL, **search_domains = NULL, **route_domains = NULL; - _cleanup_free_ char *t = NULL, *network = NULL, *client_id = NULL, *iaid = NULL, *duid = NULL, + _cleanup_free_ char *t = NULL, *network = NULL, *iaid = NULL, *duid = NULL, *setup_state = NULL, *operational_state = NULL, *lease_file = NULL; const char *driver = NULL, *path = NULL, *vendor = NULL, *model = NULL, *link = NULL, *on_color_operational, *off_color_operational, *on_color_setup, *off_color_setup; @@ -2058,6 +2058,8 @@ static int link_status_one( return r; if (lease) { + const void *client_id; + size_t client_id_len; const char *tz; r = sd_dhcp_lease_get_timezone(lease, &tz); @@ -2069,16 +2071,21 @@ static int link_status_one( if (r < 0) return table_log_add_error(r); } - } - r = sd_network_link_get_dhcp4_client_id_string(info->ifindex, &client_id); - if (r >= 0) { - r = table_add_many(table, - TABLE_EMPTY, - TABLE_STRING, "DHCP4 Client ID:", - TABLE_STRING, client_id); - if (r < 0) - return table_log_add_error(r); + r = sd_dhcp_lease_get_client_id(lease, &client_id, &client_id_len); + if (r >= 0) { + _cleanup_free_ char *id = NULL; + + r = sd_dhcp_client_id_to_string(client_id, client_id_len, &id); + if (r >= 0) { + r = table_add_many(table, + TABLE_EMPTY, + TABLE_STRING, "DHCP4 Client ID:", + TABLE_STRING, id); + if (r < 0) + return table_log_add_error(r); + } + } } r = sd_network_link_get_dhcp6_client_iaid_string(info->ifindex, &iaid); From 5202be27ee1506a1e87b5e776c4db729f43ce3f3 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 18 Jun 2020 23:31:32 +0900 Subject: [PATCH 5/8] sd-network: drop unused functions --- src/libsystemd/sd-network/sd-network.c | 12 ------------ src/systemd/sd-network.h | 10 ---------- 2 files changed, 22 deletions(-) diff --git a/src/libsystemd/sd-network/sd-network.c b/src/libsystemd/sd-network/sd-network.c index 30f47244ad..ce6ae846c5 100644 --- a/src/libsystemd/sd-network/sd-network.c +++ b/src/libsystemd/sd-network/sd-network.c @@ -168,10 +168,6 @@ _public_ int sd_network_link_get_address_state(int ifindex, char **state) { return network_link_get_string(ifindex, "ADDRESS_STATE", state); } -_public_ int sd_network_link_get_dhcp4_client_id_string(int ifindex, char **client_id) { - 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); } @@ -236,14 +232,6 @@ _public_ int sd_network_link_get_dnssec_negative_trust_anchors(int ifindex, char return network_link_get_strv(ifindex, "DNSSEC_NTA", nta); } -_public_ int sd_network_link_get_timezone(int ifindex, char **ret) { - return network_link_get_string(ifindex, "TIMEZONE", ret); -} - -_public_ int sd_network_link_get_dhcp4_address(int ifindex, char **ret) { - return network_link_get_string(ifindex, "DHCP4_ADDRESS", ret); -} - _public_ int sd_network_link_get_dns(int ifindex, char ***ret) { return network_link_get_strv(ifindex, "DNS", ret); } diff --git a/src/systemd/sd-network.h b/src/systemd/sd-network.h index edb40850b1..42bcd74b74 100644 --- a/src/systemd/sd-network.h +++ b/src/systemd/sd-network.h @@ -110,10 +110,6 @@ int sd_network_link_get_network_file(int ifindex, char **filename); * IP addresses */ int sd_network_link_get_dns(int ifindex, char ***ret); -/* Get DHCP4 address for a given link. This is string representations of - * IPv4 address */ -int sd_network_link_get_dhcp4_address(int ifindex, char **ret); - /* Get NTP entries for a given link. These are domain names or string * representations of IP addresses */ int sd_network_link_get_ntp(int ifindex, char ***ret); @@ -173,12 +169,6 @@ int sd_network_link_get_carrier_bound_to(int ifindex, int **ifindexes); /* Get the CARRIERS that are bound to current link. */ int sd_network_link_get_carrier_bound_by(int ifindex, int **ifindexes); -/* Get the timezone that was learnt on a specific link. */ -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); From 46986251d6eb4c78bb56c080ce310fd2b1f9439f Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 18 Jun 2020 23:35:09 +0900 Subject: [PATCH 6/8] network: drop duplicated information from link state file Those entries are already in DHCP4 lease file, and not used anymore. --- src/network/networkd-link.c | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index afeb36d315..94806be5e6 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -4351,33 +4351,6 @@ int link_save(Link *link) { print_link_hashmap(f, "CARRIER_BOUND_BY=", link->bound_by_links); if (link->dhcp_lease) { - struct in_addr address; - const char *tz = NULL; - size_t client_id_len; - const void *client_id; - - assert(link->network); - - r = sd_dhcp_lease_get_timezone(link->dhcp_lease, &tz); - if (r >= 0) - fprintf(f, "TIMEZONE=%s\n", tz); - - r = sd_dhcp_lease_get_address(link->dhcp_lease, &address); - if (r >= 0) { - fputs("DHCP4_ADDRESS=", f); - serialize_in_addrs(f, &address, 1, NULL, NULL); - fputc('\n', f); - } - - r = sd_dhcp_lease_get_client_id(link->dhcp_lease, &client_id, &client_id_len); - if (r >= 0) { - _cleanup_free_ char *id = NULL; - - r = sd_dhcp_client_id_to_string(client_id, client_id_len, &id); - if (r >= 0) - fprintf(f, "DHCP4_CLIENT_ID=%s\n", id); - } - r = dhcp_lease_save(link->dhcp_lease, link->lease_file); if (r < 0) goto fail; From fd1f3b3eed7522f472b439151b3ffcfbfbb5b203 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 18 Jun 2020 23:59:38 +0900 Subject: [PATCH 7/8] dhcp: fix entry name in parsing lease file --- src/libsystemd-network/sd-dhcp-lease.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c index 8582302cb4..0bc5fa3210 100644 --- a/src/libsystemd-network/sd-dhcp-lease.c +++ b/src/libsystemd-network/sd-dhcp-lease.c @@ -1076,7 +1076,7 @@ int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) { "ADDRESS", &address, "ROUTER", &router, "NETMASK", &netmask, - "SERVER_IDENTIFIER", &server_address, + "SERVER_ADDRESS", &server_address, "NEXT_SERVER", &next_server, "BROADCAST", &broadcast, "DNS", &dns, From 3d0c8750c5a76fc2f5c7f816c95bfa0238e2f581 Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Fri, 19 Jun 2020 00:01:21 +0900 Subject: [PATCH 8/8] networkctl: display DHCPv4 server address --- src/network/networkctl.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/network/networkctl.c b/src/network/networkctl.c index 6d2bb110b4..8049912f43 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ +#include #include #include #include @@ -958,12 +959,18 @@ static int dump_addresses( return r; if (local[i].family == AF_INET && in4_addr_equal(&local[i].address.in, &dhcp4_address)) { - _cleanup_free_ char *p = NULL; + struct in_addr server_address; + char *p, s[INET_ADDRSTRLEN]; - p = pretty; - pretty = strjoin(pretty , " (DHCP4)"); - if (!pretty) + r = sd_dhcp_lease_get_server_identifier(lease, &server_address); + if (r >= 0 && inet_ntop(AF_INET, &server_address, s, sizeof(s))) + p = strjoin(pretty, " (DHCP4 via ", s, ")"); + else + p = strjoin(pretty, " (DHCP4)"); + if (!p) return log_oom(); + + free_and_replace(pretty, p); } r = strv_extendf(&buf, "%s%s%s",