From 37b5051c9541d4049564f8572a7707b4b5370462 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 9 Nov 2023 01:23:12 +0900 Subject: [PATCH 1/2] network: fix json generation When the DHCPv6 client is running in the information requesting mode, then T1 and T2 are not set. --- src/network/networkd-json.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/network/networkd-json.c b/src/network/networkd-json.c index 6e53d368d29..a72eb4ca3a9 100644 --- a/src/network/networkd-json.c +++ b/src/network/networkd-json.c @@ -1057,7 +1057,7 @@ static int dhcp6_client_vendor_options_append_json(Link *link, JsonVariant **v) JSON_BUILD_PAIR_UNSIGNED("SubOptionCode", (*option)->option), JSON_BUILD_PAIR_HEX("SubOptionData", (*option)->data, (*option)->length))); if (r < 0) - return 0; + return r; } return json_variant_set_field_non_null(v, "VendorSpecificOptions", array); @@ -1065,7 +1065,7 @@ static int dhcp6_client_vendor_options_append_json(Link *link, JsonVariant **v) static int dhcp6_client_lease_append_json(Link *link, JsonVariant **v) { _cleanup_(json_variant_unrefp) JsonVariant *w = NULL; - usec_t ts, t1, t2; + usec_t ts = USEC_INFINITY, t1 = USEC_INFINITY, t2 = USEC_INFINITY; int r; assert(link); @@ -1075,15 +1075,15 @@ static int dhcp6_client_lease_append_json(Link *link, JsonVariant **v) { return 0; r = sd_dhcp6_lease_get_timestamp(link->dhcp6_lease, CLOCK_BOOTTIME, &ts); - if (r < 0) + if (r < 0 && r != -ENODATA) return r; r = sd_dhcp6_lease_get_t1_timestamp(link->dhcp6_lease, CLOCK_BOOTTIME, &t1); - if (r < 0) + if (r < 0 && r != -ENODATA) return r; r = sd_dhcp6_lease_get_t2_timestamp(link->dhcp6_lease, CLOCK_BOOTTIME, &t2); - if (r < 0) + if (r < 0 && r != -ENODATA) return r; r = json_build(&w, JSON_BUILD_OBJECT( @@ -1161,7 +1161,7 @@ static int dhcp6_client_append_json(Link *link, JsonVariant **v) { static int dhcp_client_lease_append_json(Link *link, JsonVariant **v) { _cleanup_(json_variant_unrefp) JsonVariant *w = NULL; - usec_t lease_timestamp_usec, t1, t2; + usec_t lease_timestamp_usec = USEC_INFINITY, t1 = USEC_INFINITY, t2 = USEC_INFINITY; int r; assert(link); @@ -1171,16 +1171,16 @@ static int dhcp_client_lease_append_json(Link *link, JsonVariant **v) { return 0; r = sd_dhcp_lease_get_timestamp(link->dhcp_lease, CLOCK_BOOTTIME, &lease_timestamp_usec); - if (r < 0) - return 0; + if (r < 0 && r != -ENODATA) + return r; r = sd_dhcp_lease_get_t1_timestamp(link->dhcp_lease, CLOCK_BOOTTIME, &t1); - if (r < 0) - return 0; + if (r < 0 && r != -ENODATA) + return r; r = sd_dhcp_lease_get_t2_timestamp(link->dhcp_lease, CLOCK_BOOTTIME, &t2); - if (r < 0) - return 0; + if (r < 0 && r != -ENODATA) + return r; r = json_build(&w, JSON_BUILD_OBJECT( JSON_BUILD_PAIR_FINITE_USEC("LeaseTimestampUSec", lease_timestamp_usec), From 3aa47694d1b2d8f142ee1daf83f7ddcb9044c716 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 9 Nov 2023 01:31:17 +0900 Subject: [PATCH 2/2] test-network: verify json format about DHCPv6 client status --- test/test-network/systemd-networkd-tests.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index fd2906ef6b9..c77a0e0eb2d 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -5177,6 +5177,10 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): self.assertNotIn('DHCPREQUEST(veth-peer)', output) self.assertNotIn('DHCPREPLY(veth-peer)', output) + # Check json format + output = check_output(*networkctl_cmd, '--json=short', 'status', 'veth99', env=env) + check_json(output) + # solicit mode stop_dnsmasq() start_dnsmasq('--dhcp-option=108,00:00:02:00', @@ -5228,6 +5232,11 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): self.assertIn('DHCPREPLY(veth-peer)', output) self.assertIn('sent size: 0 option: 14 rapid-commit', output) + # Check json format + output = check_output(*networkctl_cmd, '--json=short', 'status', 'veth99', env=env) + check_json(output) + + # Testing without rapid commit support with open(os.path.join(network_unit_dir, '25-dhcp-client-ipv6-only.network'), mode='a', encoding='utf-8') as f: f.write('\n[DHCPv6]\nRapidCommit=no\n') @@ -5277,6 +5286,10 @@ class NetworkdDHCPClientTests(unittest.TestCase, Utilities): self.assertIn('DHCPREPLY(veth-peer)', output) self.assertNotIn('rapid-commit', output) + # Check json format + output = check_output(*networkctl_cmd, '--json=short', 'status', 'veth99', env=env) + check_json(output) + def test_dhcp_client_ipv6_dbus_status(self): copy_network_unit('25-veth.netdev', '25-dhcp-server-veth-peer.network', '25-dhcp-client-ipv6-only.network') start_networkd()