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:
@@ -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,
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user