]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dhcp-message: introduce dhcp_message_{payload,packet}_size()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 17 May 2026 22:46:19 +0000 (07:46 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 18 May 2026 00:34:32 +0000 (09:34 +0900)
src/libsystemd-network/dhcp-message.c
src/libsystemd-network/dhcp-message.h
src/libsystemd-network/test-dhcp-message.c

index a3ba05688df073c21c67ecca1e8c7853b91eac4b..bf85dd4233185b18466dfb36f9f34e4801672cbe 100644 (file)
@@ -1428,6 +1428,18 @@ int dhcp_message_parse(
         return 0;
 }
 
+size_t dhcp_message_payload_size(sd_dhcp_message *message) {
+        assert(message);
+
+        return MAX(size_add(sizeof(DHCPMessageHeader), tlv_size(&message->options)), BOOTP_MESSAGE_SIZE);
+}
+
+size_t dhcp_message_packet_size(sd_dhcp_message *message) {
+        assert(message);
+
+        return size_add(sizeof(struct iphdr) + sizeof(struct udphdr), dhcp_message_payload_size(message));
+}
+
 int dhcp_message_build(sd_dhcp_message *message, struct iovec_wrapper *ret) {
         int r;
 
index 2e7e74def3eb26f4237558ed2e7502180c80a1cf..c694948f67a3878645fc62e7399d57f45e7299a7 100644 (file)
@@ -89,6 +89,9 @@ int dhcp_message_parse(
                 const struct hw_addr_data *hw_addr,
                 sd_dhcp_message **ret);
 
+size_t dhcp_message_payload_size(sd_dhcp_message *message);
+size_t dhcp_message_packet_size(sd_dhcp_message *message);
+
 int dhcp_message_build(sd_dhcp_message *message, struct iovec_wrapper *ret);
 
 int dhcp_message_build_json(sd_dhcp_message *message, sd_json_variant **ret);
index f42a0bfb4f85a7a64530b235f4e2075618ea5245..69e1201b695126c32b0368838dfbb890cfbee03d 100644 (file)
@@ -212,6 +212,7 @@ static void verify_send_udp(sd_dhcp_message *message, uint32_t xid, const struct
                 .msg_iovlen = 1,
         };
         ssize_t len = ASSERT_OK_ERRNO(recvmsg_safe(socket_fd[1], &msg, MSG_DONTWAIT));
+        ASSERT_EQ((size_t) len, dhcp_message_payload_size(message));
 
         _cleanup_(sd_dhcp_message_unrefp) sd_dhcp_message *m = NULL;
         ASSERT_OK(dhcp_message_parse(
@@ -255,6 +256,7 @@ static void verify_send_raw(sd_dhcp_message *message, uint32_t xid, const struct
                 .msg_iovlen = 1,
         };
         ssize_t len = ASSERT_OK_ERRNO(recvmsg_safe(socket_fd[1], &msg, MSG_DONTWAIT));
+        ASSERT_EQ((size_t) len, dhcp_message_packet_size(message));
 
         struct iovec payload;
         ASSERT_OK(udp_packet_verify(
@@ -497,6 +499,7 @@ TEST(dhcp_message) {
 
         _cleanup_(iovec_done) struct iovec joined = {};
         ASSERT_OK(iovw_concat(&iovw, &joined));
+        ASSERT_EQ(joined.iov_len, dhcp_message_payload_size(m));
 
         _cleanup_(sd_dhcp_message_unrefp) sd_dhcp_message *m2 = NULL;
         ASSERT_OK(dhcp_message_parse(