sd-dhcp-client: drop unused legacy code (#42128)

This commit is contained in:
Yu Watanabe
2026-05-17 03:42:29 +09:00
committed by GitHub
18 changed files with 15 additions and 1775 deletions
+1 -28
View File
@@ -11,15 +11,6 @@
#include "dhcp-client-id-internal.h"
#include "dhcp-message.h"
#include "dhcp-option.h"
#include "list.h"
struct sd_dhcp_raw_option {
LIST_FIELDS(struct sd_dhcp_raw_option, options);
uint8_t tag;
uint8_t length;
void *data;
};
struct sd_dhcp_lease {
unsigned n_ref;
@@ -36,15 +27,12 @@ struct sd_dhcp_lease {
/* each 0 if unset */
be32_t address;
be32_t server_address;
be32_t next_server;
be32_t subnet_mask;
be32_t broadcast;
struct in_addr *router;
size_t router_size;
bool rapid_commit;
DHCPServerData servers[_SD_DHCP_LEASE_SERVER_TYPE_MAX];
sd_dns_resolver *dnr;
@@ -59,16 +47,9 @@ struct sd_dhcp_lease {
char *domainname;
char **search_domains;
char *hostname; /* SD_DHCP_OPTION_HOST_NAME (12) */
char *fqdn; /* SD_DHCP_OPTION_FQDN (81) */
char *root_path;
char *hostname;
char *captive_portal;
sd_dhcp_client_id client_id;
void *vendor_specific;
size_t vendor_specific_len;
char *timezone;
uint8_t sixrd_ipv4masklen;
@@ -76,18 +57,10 @@ struct sd_dhcp_lease {
struct in6_addr sixrd_prefix;
struct in_addr *sixrd_br_addresses;
size_t sixrd_n_br_addresses;
LIST_HEAD(struct sd_dhcp_raw_option, private_options);
};
int dhcp_lease_new(sd_dhcp_lease **ret);
int dhcp_lease_parse_options(uint8_t code, uint8_t len, const void *option, void *userdata);
int dhcp_lease_parse_search_domains(const uint8_t *option, size_t len, char ***domains);
int dhcp_lease_insert_private_option(sd_dhcp_lease *lease, uint8_t tag, const void *data, uint8_t len);
void dhcp_lease_set_timestamp(sd_dhcp_lease *lease, const triple_timestamp *timestamp);
int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease);
int dhcp_lease_set_client_id(sd_dhcp_lease *lease, const sd_dhcp_client_id *client_id);
int dhcp_client_parse_message(sd_dhcp_client *client, const struct iovec *iov, sd_dhcp_lease **ret);
-4
View File
@@ -115,7 +115,3 @@ int dhcp_packet_append_ip_headers(
packet->udp = udp;
return 0;
}
int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len, bool checksum, uint16_t port) {
return udp_packet_verify(&IOVEC_MAKE(packet, len), port, checksum, /* ret_payload= */ NULL);
}
-2
View File
@@ -31,5 +31,3 @@ int dhcp_packet_append_ip_headers(
uint16_t destination,
uint16_t len,
int ip_service_type);
int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len, bool checksum, uint16_t port);
-3
View File
@@ -122,9 +122,6 @@ executables += [
'sources' : files('test-ndisc-send.c'),
'type' : 'manual',
},
network_test_template + {
'sources' : files('test-sd-dhcp-lease.c'),
},
network_test_template + {
'sources' : files('test-tlv-util.c'),
},
-113
View File
@@ -1,18 +1,14 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include <arpa/inet.h>
#include <stdio.h>
#include "sd-dhcp-lease.h"
#include "alloc-util.h"
#include "dhcp-route.h"
#include "dns-resolver-internal.h"
#include "extract-word.h"
#include "hexdecoct.h"
#include "in-addr-util.h"
#include "network-internal.h"
#include "parse-util.h"
#include "string-util.h"
#include "strv.h"
@@ -216,112 +212,3 @@ int deserialize_dnr(sd_dns_resolver **ret, const char *string) {
*ret = TAKE_PTR(dnr);
return n;
}
void serialize_dhcp_routes(FILE *f, const char *key, sd_dhcp_route **routes, size_t size) {
assert(f);
assert(key);
assert(routes);
assert(size);
fprintf(f, "%s=", key);
for (size_t i = 0; i < size; i++) {
struct in_addr dest, gw;
uint8_t length;
assert_se(sd_dhcp_route_get_destination(routes[i], &dest) >= 0);
assert_se(sd_dhcp_route_get_gateway(routes[i], &gw) >= 0);
assert_se(sd_dhcp_route_get_destination_prefix_length(routes[i], &length) >= 0);
fprintf(f, "%s,%s%s",
IN4_ADDR_PREFIX_TO_STRING(&dest, length),
IN4_ADDR_TO_STRING(&gw),
i < size - 1 ? " ": "");
}
fputs("\n", f);
}
int deserialize_dhcp_routes(struct sd_dhcp_route **ret, size_t *ret_size, const char *string) {
_cleanup_free_ struct sd_dhcp_route *routes = NULL;
size_t size = 0;
assert(ret);
assert(ret_size);
assert(string);
/* WORD FORMAT: dst_ip/dst_prefixlen,gw_ip */
for (;;) {
_cleanup_free_ char *word = NULL;
char *tok, *tok_end;
unsigned n;
int r;
r = extract_first_word(&string, &word, NULL, 0);
if (r < 0)
return r;
if (r == 0)
break;
struct sd_dhcp_route route = {};
tok = word;
/* get the subnet */
tok_end = strchr(tok, '/');
if (!tok_end)
continue;
*tok_end = '\0';
r = inet_aton(tok, &route.dst_addr);
if (r == 0)
continue;
tok = tok_end + 1;
/* get the prefixlen */
tok_end = strchr(tok, ',');
if (!tok_end)
continue;
*tok_end = '\0';
r = safe_atou(tok, &n);
if (r < 0 || n > 32)
continue;
route.dst_prefixlen = (uint8_t) n;
tok = tok_end + 1;
/* get the gateway */
r = inet_aton(tok, &route.gw_addr);
if (r == 0)
continue;
if (!GREEDY_REALLOC(routes, size + 1))
return -ENOMEM;
routes[size++] = route;
}
*ret_size = size;
*ret = TAKE_PTR(routes);
return 0;
}
int serialize_dhcp_option(FILE *f, const char *key, const void *data, size_t size) {
_cleanup_free_ char *hex_buf = NULL;
assert(f);
assert(key);
assert(data);
hex_buf = hexmem(data, size);
if (!hex_buf)
return -ENOMEM;
fprintf(f, "%s=%s\n", key, hex_buf);
return 0;
}
-13
View File
@@ -16,16 +16,3 @@ int deserialize_in6_addrs(struct in6_addr **ret, const char *string);
int serialize_dnr(FILE *f, const sd_dns_resolver *dnr, size_t n_dnr, bool *with_leading_space);
int deserialize_dnr(sd_dns_resolver **ret, 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, struct sd_dhcp_route **routes, size_t size);
int deserialize_dhcp_routes(struct sd_dhcp_route **ret, size_t *ret_size, 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);
File diff suppressed because it is too large Load Diff
@@ -1,82 +0,0 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include "dhcp-lease-internal.h"
#include "strv.h"
#include "tests.h"
/* According to RFC1035 section 4.1.4, a domain name in a message can be either:
* - a sequence of labels ending in a zero octet
* - a pointer
* - a sequence of labels ending with a pointer
*/
TEST(dhcp_lease_parse_search_domains_basic) {
int r;
_cleanup_strv_free_ char **domains = NULL;
static const uint8_t optionbuf[] = {
0x03, 'F', 'O', 'O', 0x03, 'B', 'A', 'R', 0x00,
0x04, 'A', 'B', 'C', 'D', 0x03, 'E', 'F', 'G', 0x00,
};
r = dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf), &domains);
assert_se(r == 2);
assert_se(streq(domains[0], "FOO.BAR"));
assert_se(streq(domains[1], "ABCD.EFG"));
}
TEST(dhcp_lease_parse_search_domains_ptr) {
int r;
_cleanup_strv_free_ char **domains = NULL;
static const uint8_t optionbuf[] = {
0x03, 'F', 'O', 'O', 0x00, 0xC0, 0x00,
};
r = dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf), &domains);
assert_se(r == 2);
assert_se(streq(domains[0], "FOO"));
assert_se(streq(domains[1], "FOO"));
}
TEST(dhcp_lease_parse_search_domains_labels_and_ptr) {
int r;
_cleanup_strv_free_ char **domains = NULL;
static const uint8_t optionbuf[] = {
0x03, 'F', 'O', 'O', 0x03, 'B', 'A', 'R', 0x00,
0x03, 'A', 'B', 'C', 0xC0, 0x04,
};
r = dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf), &domains);
assert_se(r == 2);
assert_se(streq(domains[0], "FOO.BAR"));
assert_se(streq(domains[1], "ABC.BAR"));
}
/* Tests for exceptions. */
TEST(dhcp_lease_parse_search_domains_no_data) {
_cleanup_strv_free_ char **domains = NULL;
static const uint8_t optionbuf[3] = {0, 0, 0};
assert_se(dhcp_lease_parse_search_domains(NULL, 0, &domains) == -EBADMSG);
assert_se(dhcp_lease_parse_search_domains(optionbuf, 0, &domains) == -EBADMSG);
}
TEST(dhcp_lease_parse_search_domains_loops) {
_cleanup_strv_free_ char **domains = NULL;
static const uint8_t optionbuf[] = {
0x03, 'F', 'O', 'O', 0x00, 0x03, 'B', 'A', 'R', 0xC0, 0x06,
};
assert_se(dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf), &domains) == -EBADMSG);
}
TEST(dhcp_lease_parse_search_domains_wrong_len) {
_cleanup_strv_free_ char **domains = NULL;
static const uint8_t optionbuf[] = {
0x03, 'F', 'O', 'O', 0x03, 'B', 'A', 'R', 0x00,
0x04, 'A', 'B', 'C', 'D', 0x03, 'E', 'F', 'G', 0x00,
};
assert_se(dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf) - 5, &domains) == -EBADMSG);
}
DEFINE_TEST_MAIN(LOG_INFO);
-5
View File
@@ -1,6 +1,5 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include "sd-dhcp-lease.h"
#include "sd-hwdb.h"
#include "sd-netlink.h"
@@ -212,7 +211,6 @@ int dump_gateways(sd_netlink *rtnl, sd_hwdb *hwdb, Table *table, int ifindex) {
int dump_addresses(
sd_netlink *rtnl,
sd_dhcp_message *message,
sd_dhcp_lease *lease,
Table *table,
int ifindex) {
@@ -233,9 +231,6 @@ int dump_addresses(
if (dhcp_message_get_option_address(message, SD_DHCP_OPTION_SERVER_IDENTIFIER, &server_address) < 0)
/* The message should be BOOTP, let's fallback to the siaddr field. */
server_address.s_addr = message->header.siaddr;
} else if (lease) {
(void) sd_dhcp_lease_get_address(lease, &dhcp4_address);
(void) sd_dhcp_lease_get_server_identifier(lease, &server_address);
}
FOREACH_ARRAY(local, local_addrs, n) {
+1 -1
View File
@@ -8,4 +8,4 @@
int dump_list(Table *table, const char *key, char * const *l);
int ieee_oui(sd_hwdb *hwdb, const struct ether_addr *mac, char **ret);
int dump_gateways(sd_netlink *rtnl, sd_hwdb *hwdb, Table *table, int ifindex);
int dump_addresses(sd_netlink *rtnl, sd_dhcp_message *message, sd_dhcp_lease *lease, Table *table, int ifindex);
int dump_addresses(sd_netlink *rtnl, sd_dhcp_message *message, Table *table, int ifindex);
+1 -20
View File
@@ -2,7 +2,6 @@
#include "sd-device.h"
#include "sd-dhcp-client-id.h"
#include "sd-dhcp-lease.h"
#include "sd-dhcp-protocol.h"
#include "sd-hwdb.h"
#include "sd-netlink.h"
@@ -24,7 +23,6 @@
#include "json-util.h"
#include "macvlan-util.h"
#include "netif-util.h"
#include "network-internal.h"
#include "networkctl.h"
#include "networkctl-description.h"
#include "networkctl-dump-util.h"
@@ -242,7 +240,6 @@ static int link_status_one(
const char *driver = NULL, *path = NULL, *vendor = NULL, *model = NULL, *link = NULL,
*on_color_operational, *off_color_operational, *on_color_setup, *off_color_setup, *on_color_online;
_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;
int r;
@@ -294,11 +291,6 @@ static int link_status_one(
if (r == -ENOMEM)
return log_oom();
char lease_file[STRLEN("/run/systemd/netif/leases/") + DECIMAL_STR_MAX(int)];
xsprintf(lease_file, "/run/systemd/netif/leases/%i", info->ifindex);
(void) dhcp_lease_load(&lease, lease_file);
r = format_config_files(&network_dropins, network);
if (r < 0)
return r;
@@ -780,7 +772,7 @@ static int link_status_one(
return r;
}
r = dump_addresses(rtnl, info->dhcp_message, lease, table, info->ifindex);
r = dump_addresses(rtnl, info->dhcp_message, table, info->ifindex);
if (r < 0)
return r;
@@ -849,17 +841,6 @@ static int link_status_one(
if (r < 0)
return table_log_add_error(r);
}
} else if (lease) {
const char *tz;
r = sd_dhcp_lease_get_timezone(lease, &tz);
if (r >= 0) {
r = table_add_many(table,
TABLE_FIELD, "Time Zone",
TABLE_STRING, tz);
if (r < 0)
return table_log_add_error(r);
}
}
if (sd_dhcp_client_id_is_set(&info->dhcp_client_id)) {
+1 -1
View File
@@ -94,7 +94,7 @@ int system_status(sd_netlink *rtnl, sd_hwdb *hwdb) {
if (r < 0)
return table_log_add_error(r);
r = dump_addresses(rtnl, /* message= */ NULL, /* lease= */ NULL, table, /* ifindex= */ 0);
r = dump_addresses(rtnl, /* message= */ NULL, table, /* ifindex= */ 0);
if (r < 0)
return r;
+4 -19
View File
@@ -6,7 +6,7 @@
#include "sd-dhcp-client.h"
#include "sd-dhcp6-client.h"
#include "dhcp-lease-internal.h"
#include "dhcp-lease-internal.h" /* IWYU pragma: keep */
#include "dhcp-server-lease-internal.h"
#include "dhcp6-lease-internal.h"
#include "extract-word.h"
@@ -1354,11 +1354,9 @@ static int dhcp_client_lease_append_json(Link *link, sd_json_variant **v) {
return r;
_cleanup_(sd_json_variant_unrefp) sd_json_variant *m = NULL;
if (link->dhcp_lease->message) {
r = dhcp_message_build_json(link->dhcp_lease->message, &m);
if (r < 0)
return r;
}
r = dhcp_message_build_json(link->dhcp_lease->message, &m);
if (r < 0)
return r;
r = sd_json_buildo(
&w,
@@ -1428,19 +1426,6 @@ static int dhcp_client_private_options_append_json(Link *link, sd_json_variant *
if (!link->dhcp_lease)
return 0;
if (!link->dhcp_lease->message) {
LIST_FOREACH(options, option, link->dhcp_lease->private_options) {
r = sd_json_variant_append_arraybo(
&array,
SD_JSON_BUILD_PAIR_UNSIGNED("Option", option->tag),
SD_JSON_BUILD_PAIR_HEX("PrivateOptionData", option->data, option->length));
if (r < 0)
return r;
}
return json_variant_set_field_non_null(v, "PrivateOptions", array);
}
for (uint8_t i = SD_DHCP_OPTION_PRIVATE_BASE; i <= SD_DHCP_OPTION_PRIVATE_LAST; i++) {
_cleanup_(iovec_done) struct iovec iov = {};
r = dhcp_message_get_option_alloc(link->dhcp_lease->message, i, &iov);
+1 -6
View File
@@ -288,7 +288,6 @@ static Link* link_free(Link *link) {
free(link->previous_ssid);
free(link->driver);
unlink_and_free(link->lease_file);
unlink_and_free(link->state_file);
sd_device_unref(link->dev);
@@ -2713,7 +2712,7 @@ static Link *link_drop_or_unref(Link *link) {
DEFINE_TRIVIAL_CLEANUP_FUNC(Link*, link_drop_or_unref);
static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
_cleanup_free_ char *ifname = NULL, *kind = NULL, *state_file = NULL, *lease_file = NULL;
_cleanup_free_ char *ifname = NULL, *kind = NULL, *state_file = NULL;
_cleanup_(link_drop_or_unrefp) Link *link = NULL;
unsigned short iftype;
int r, ifindex;
@@ -2751,9 +2750,6 @@ static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
/* Do not update state files when running in test mode. */
if (asprintf(&state_file, "/run/systemd/netif/links/%d", ifindex) < 0)
return log_oom_debug();
if (asprintf(&lease_file, "/run/systemd/netif/leases/%d", ifindex) < 0)
return log_oom_debug();
}
link = new(Link, 1);
@@ -2775,7 +2771,6 @@ static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
.ipv6ll_address_gen_mode = _IPV6_LINK_LOCAL_ADDRESS_GEN_MODE_INVALID,
.state_file = TAKE_PTR(state_file),
.lease_file = TAKE_PTR(lease_file),
.n_dns = UINT_MAX,
.dns_default_route = -1,
-1
View File
@@ -117,7 +117,6 @@ typedef struct Link {
sd_dhcp_client *dhcp_client;
sd_dhcp_lease *dhcp_lease;
char *lease_file;
unsigned dhcp4_messages;
bool dhcp4_configured;
char *dhcp4_6rd_tunnel_name;
-9
View File
@@ -959,15 +959,6 @@ static int link_save(Link *link) {
print_link_hashmap(f, "CARRIER_BOUND_TO=", link->bound_to_links);
print_link_hashmap(f, "CARRIER_BOUND_BY=", link->bound_by_links);
if (link->dhcp_lease) {
r = dhcp_lease_save(link->dhcp_lease, link->lease_file);
if (r < 0)
return r;
fprintf(f, "DHCP_LEASE=%s\n", link->lease_file);
} else
(void) unlink(link->lease_file);
r = link_serialize_dhcp6_client(link, f);
if (r < 0)
return r;
-48
View File
@@ -1,9 +1,6 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include <arpa/inet.h>
#include "alloc-util.h"
#include "dhcp-route.h"
#include "hashmap.h"
#include "hostname-setup.h"
#include "network-internal.h"
@@ -42,51 +39,6 @@ TEST(deserialize_in_addr) {
ASSERT_TRUE(in6_addr_equal(&f.in6, &addresses6[2]));
}
TEST(deserialize_dhcp_routes) {
_cleanup_free_ struct sd_dhcp_route *routes = NULL;
size_t size;
ASSERT_OK(deserialize_dhcp_routes(&routes, &size, ""));
ASSERT_EQ(size, 0U);
ASSERT_NULL(routes);
ASSERT_OK(deserialize_dhcp_routes(&routes, &size, "192.168.0.0/16,192.168.0.1 10.1.2.0/24,10.1.2.1 0.0.0.0/0,10.0.1.1"));
ASSERT_EQ(size, 3U);
ASSERT_NOT_NULL(routes);
ASSERT_EQ(routes[0].dst_addr.s_addr, inet_addr("192.168.0.0"));
ASSERT_EQ(routes[0].gw_addr.s_addr, inet_addr("192.168.0.1"));
ASSERT_EQ(routes[0].dst_prefixlen, 16U);
ASSERT_EQ(routes[1].dst_addr.s_addr, inet_addr("10.1.2.0"));
ASSERT_EQ(routes[1].gw_addr.s_addr, inet_addr("10.1.2.1"));
ASSERT_EQ(routes[1].dst_prefixlen, 24U);
ASSERT_EQ(routes[2].dst_addr.s_addr, inet_addr("0.0.0.0"));
ASSERT_EQ(routes[2].gw_addr.s_addr, inet_addr("10.0.1.1"));
ASSERT_EQ(routes[2].dst_prefixlen, 0U);
routes = mfree(routes);
ASSERT_OK(deserialize_dhcp_routes(&routes, &size, "192.168.0.0/16,192.168.0.1 10.1.2.0#24,10.1.2.1 0.0.0.0/0,10.0.1.1"));
ASSERT_EQ(size, 2U);
ASSERT_NOT_NULL(routes);
ASSERT_EQ(routes[0].dst_addr.s_addr, inet_addr("192.168.0.0"));
ASSERT_EQ(routes[0].gw_addr.s_addr, inet_addr("192.168.0.1"));
ASSERT_EQ(routes[0].dst_prefixlen, 16U);
ASSERT_EQ(routes[1].dst_addr.s_addr, inet_addr("0.0.0.0"));
ASSERT_EQ(routes[1].gw_addr.s_addr, inet_addr("10.0.1.1"));
ASSERT_EQ(routes[1].dst_prefixlen, 0U);
routes = mfree(routes);
ASSERT_OK(deserialize_dhcp_routes(&routes, &size, "192.168.0.0/55,192.168.0.1 10.1.2.0#24,10.1.2.1 0.0.0.0/0,10.0.1.X"));
ASSERT_EQ(size, 0U);
ASSERT_NULL(routes);
}
static void test_route_tables_one(Manager *manager, const char *name, uint32_t number) {
_cleanup_free_ char *str = NULL, *expected = NULL, *num_str = NULL;
uint32_t t;
+1 -8
View File
@@ -56,26 +56,19 @@ int sd_dhcp_lease_get_broadcast(sd_dhcp_lease *lease, struct in_addr *addr);
int sd_dhcp_lease_get_netmask(sd_dhcp_lease *lease, struct in_addr *addr);
int sd_dhcp_lease_get_prefix(sd_dhcp_lease *lease, struct in_addr *ret_prefix, uint8_t *ret_prefixlen);
int sd_dhcp_lease_get_router(sd_dhcp_lease *lease, const struct in_addr **addr);
int sd_dhcp_lease_get_next_server(sd_dhcp_lease *lease, struct in_addr *addr);
int sd_dhcp_lease_get_server_identifier(sd_dhcp_lease *lease, struct in_addr *addr);
int sd_dhcp_lease_get_servers(sd_dhcp_lease *lease, sd_dhcp_lease_server_type_t what, const struct in_addr **addr);
int sd_dhcp_lease_get_dns(sd_dhcp_lease *lease, const struct in_addr **addr);
int sd_dhcp_lease_get_ntp(sd_dhcp_lease *lease, const struct in_addr **addr);
int sd_dhcp_lease_get_sip(sd_dhcp_lease *lease, const struct in_addr **addr);
int sd_dhcp_lease_get_pop3(sd_dhcp_lease *lease, const struct in_addr **addr);
int sd_dhcp_lease_get_smtp(sd_dhcp_lease *lease, const struct in_addr **addr);
int sd_dhcp_lease_get_lpr(sd_dhcp_lease *lease, const struct in_addr **addr);
int sd_dhcp_lease_get_mtu(sd_dhcp_lease *lease, uint16_t *mtu);
int sd_dhcp_lease_get_domainname(sd_dhcp_lease *lease, const char **domainname);
int sd_dhcp_lease_get_search_domains(sd_dhcp_lease *lease, char ***domains);
int sd_dhcp_lease_get_hostname(sd_dhcp_lease *lease, const char **hostname);
int sd_dhcp_lease_get_root_path(sd_dhcp_lease *lease, const char **root_path);
int sd_dhcp_lease_get_hostname(sd_dhcp_lease *lease, const char **ret);
int sd_dhcp_lease_get_captive_portal(sd_dhcp_lease *lease, const char **ret);
int sd_dhcp_lease_get_dnr(sd_dhcp_lease *lease, sd_dns_resolver **ret_resolvers);
int sd_dhcp_lease_get_static_routes(sd_dhcp_lease *lease, sd_dhcp_route ***ret);
int sd_dhcp_lease_get_classless_routes(sd_dhcp_lease *lease, sd_dhcp_route ***ret);
int sd_dhcp_lease_get_vendor_specific(sd_dhcp_lease *lease, const void **data, size_t *data_len);
int sd_dhcp_lease_get_client_id(sd_dhcp_lease *lease, const sd_dhcp_client_id **ret);
int sd_dhcp_lease_get_timezone(sd_dhcp_lease *lease, const char **ret);
int sd_dhcp_lease_get_6rd(
sd_dhcp_lease *lease,