]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dhcp-message: introduce dhcp_message_{append,get}_option_address()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 19 Apr 2026 05:46:59 +0000 (14:46 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 12 May 2026 15:27:49 +0000 (00:27 +0900)
These are equivalent to dhcp_message_{append,get}_option_be32(), but for
type safety.

These are for e.g. DHCP options 50 (requested IP address).

src/libsystemd-network/dhcp-message.c
src/libsystemd-network/dhcp-message.h
src/libsystemd-network/test-dhcp-message.c

index 85976ec6ed1d03283dbc972113ce2db34307a230..6344a7a41aa7962866da7924e5bde1523511e1af 100644 (file)
@@ -167,6 +167,12 @@ int dhcp_message_append_option_sec(sd_dhcp_message *message, uint8_t code, usec_
         return dhcp_message_append_option_be32(message, code, usec_to_be32_sec(usec));
 }
 
+int dhcp_message_append_option_address(sd_dhcp_message *message, uint8_t code, const struct in_addr *addr) {
+        assert(message);
+        assert(addr);
+        return dhcp_message_append_option_be32(message, code, addr->s_addr);
+}
+
 int dhcp_message_get_option(sd_dhcp_message *message, uint8_t code, size_t length, void *ret) {
         int r;
 
@@ -232,6 +238,11 @@ int dhcp_message_get_option_sec(sd_dhcp_message *message, uint8_t code, bool max
         return 0;
 }
 
+int dhcp_message_get_option_address(sd_dhcp_message *message, uint8_t code, struct in_addr *ret) {
+        assert(message);
+        return dhcp_message_get_option_be32(message, code, ret ? &ret->s_addr : NULL);
+}
+
 static int dhcp_message_verify_header(
                 const struct iovec *iov,
                 uint8_t op,
index 6086cda3c58f164f11e48c37edc1cad23c7f9446..e0e5d8758836b4608acfb3aea0e1dc81b12412ac 100644 (file)
@@ -35,6 +35,7 @@ int dhcp_message_append_option_u8(sd_dhcp_message *message, uint8_t code, uint8_
 int dhcp_message_append_option_u16(sd_dhcp_message *message, uint8_t code, uint16_t data);
 int dhcp_message_append_option_be32(sd_dhcp_message *message, uint8_t code, be32_t data);
 int dhcp_message_append_option_sec(sd_dhcp_message *message, uint8_t code, usec_t usec);
+int dhcp_message_append_option_address(sd_dhcp_message *message, uint8_t code, const struct in_addr *addr);
 
 int dhcp_message_get_option(sd_dhcp_message *message, uint8_t code, size_t length, void *ret);
 int dhcp_message_get_option_alloc(sd_dhcp_message *message, uint8_t code, struct iovec *ret);
@@ -43,6 +44,7 @@ int dhcp_message_get_option_u8(sd_dhcp_message *message, uint8_t code, uint8_t *
 int dhcp_message_get_option_u16(sd_dhcp_message *message, uint8_t code, uint16_t *ret);
 int dhcp_message_get_option_be32(sd_dhcp_message *message, uint8_t code, be32_t *ret);
 int dhcp_message_get_option_sec(sd_dhcp_message *message, uint8_t code, bool max_as_infinity, usec_t *ret);
+int dhcp_message_get_option_address(sd_dhcp_message *message, uint8_t code, struct in_addr *ret);
 
 int dhcp_message_parse(
                 const struct iovec *iov,
index 3ac8a66d21ea3fe5c9f7dfe2728c5cfbe215ce58..92d22d4de1c88b2490b08918fb36e91b21c6c4cc 100644 (file)
@@ -58,6 +58,8 @@ static void verify_address(sd_dhcp_message *m, const struct in_addr *expected) {
         struct in_addr a;
         ASSERT_OK(dhcp_message_get_option_be32(m, SD_DHCP_OPTION_REQUESTED_IP_ADDRESS, &a.s_addr));
         ASSERT_EQ(a.s_addr, expected->s_addr);
+        ASSERT_OK(dhcp_message_get_option_address(m, SD_DHCP_OPTION_REQUESTED_IP_ADDRESS, &a));
+        ASSERT_EQ(a.s_addr, expected->s_addr);
 }
 
 TEST(dhcp_message) {
@@ -117,6 +119,9 @@ TEST(dhcp_message) {
         /* address */
         ASSERT_OK(dhcp_message_append_option_be32(m, SD_DHCP_OPTION_REQUESTED_IP_ADDRESS, addr.s_addr));
         ASSERT_ERROR(dhcp_message_append_option_be32(m, SD_DHCP_OPTION_REQUESTED_IP_ADDRESS, addr.s_addr), EEXIST);
+        ASSERT_ERROR(dhcp_message_append_option_address(m, SD_DHCP_OPTION_REQUESTED_IP_ADDRESS, &addr), EEXIST);
+        dhcp_message_remove_option(m, SD_DHCP_OPTION_REQUESTED_IP_ADDRESS);
+        ASSERT_OK(dhcp_message_append_option_address(m, SD_DHCP_OPTION_REQUESTED_IP_ADDRESS, &addr));
         verify_address(m, &addr);
 
         /* build and parse */