From 33acdc511c52c662ba8a42d851d1d8dde0f714f7 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 25 Jul 2023 01:57:10 +0900 Subject: [PATCH] sd-dhcp: introduce sd_dhcp_lease_get_prefix() --- src/libsystemd-network/sd-dhcp-lease.c | 28 ++++++++++++++++++++++++++ src/systemd/sd-dhcp-lease.h | 1 + 2 files changed, 29 insertions(+) diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c index 03fd80064b..5e8869a3b7 100644 --- a/src/libsystemd-network/sd-dhcp-lease.c +++ b/src/libsystemd-network/sd-dhcp-lease.c @@ -201,6 +201,34 @@ int sd_dhcp_lease_get_netmask(sd_dhcp_lease *lease, struct in_addr *addr) { return 0; } +int sd_dhcp_lease_get_prefix(sd_dhcp_lease *lease, struct in_addr *ret_prefix, uint8_t *ret_prefixlen) { + struct in_addr address, netmask; + uint8_t prefixlen; + int r; + + assert_return(lease, -EINVAL); + + r = sd_dhcp_lease_get_address(lease, &address); + if (r < 0) + return r; + + r = sd_dhcp_lease_get_netmask(lease, &netmask); + if (r < 0) + return r; + + prefixlen = in4_addr_netmask_to_prefixlen(&netmask); + + r = in4_addr_mask(&address, prefixlen); + if (r < 0) + return r; + + if (ret_prefix) + *ret_prefix = address; + if (ret_prefixlen) + *ret_prefixlen = prefixlen; + return 0; +} + int sd_dhcp_lease_get_server_identifier(sd_dhcp_lease *lease, struct in_addr *addr) { assert_return(lease, -EINVAL); assert_return(addr, -EINVAL); diff --git a/src/systemd/sd-dhcp-lease.h b/src/systemd/sd-dhcp-lease.h index a0e09e52ac..8a27059572 100644 --- a/src/systemd/sd-dhcp-lease.h +++ b/src/systemd/sd-dhcp-lease.h @@ -52,6 +52,7 @@ int sd_dhcp_lease_get_t1(sd_dhcp_lease *lease, uint32_t *t1); int sd_dhcp_lease_get_t2(sd_dhcp_lease *lease, uint32_t *t2); 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); -- 2.25.1