dhcp-message: introduce dhcp_message_{append,get}_option_address()

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).
This commit is contained in:
Yu Watanabe
2026-05-13 00:27:49 +09:00
parent 7b97d772a2
commit 4b2ff0a00f
3 changed files with 18 additions and 0 deletions
+11
View 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,
+2
View 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,
@@ -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 */