]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dhcp-server-request: also save IP_PKTINFO of received message
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 10 May 2026 14:04:15 +0000 (23:04 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 22 May 2026 06:57:06 +0000 (15:57 +0900)
It will be used later.

This also drops redundant ifindex check, as the socket is already
initialized with socket_bind_to_ifindex().

src/libsystemd-network/dhcp-server-request.c
src/libsystemd-network/dhcp-server-request.h

index a553fc43b626e465faa8b0abc643320fd9486ee3..a914f3ef1d6d306635425f01b0b8ccc2e20f3038 100644 (file)
@@ -426,7 +426,7 @@ static int dhcp_server_process_release(sd_dhcp_server *server, DHCPRequest *req)
         return 0;
 }
 
-int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message, size_t length, const triple_timestamp *timestamp) {
+int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message, size_t length, struct msghdr *mh) {
         int r;
 
         assert(server);
@@ -437,7 +437,8 @@ int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message, siz
         if (r < 0)
                 return r;
 
-        dhcp_request_set_timestamp(req, timestamp);
+        dhcp_request_set_timestamp(req, mh ? TRIPLE_TIMESTAMP_FROM_CMSG(mh) : NULL);
+        req->pktinfo = mh ? CMSG_FIND_DATA(mh, IPPROTO_IP, IP_PKTINFO, struct in_pktinfo) : NULL;
 
         r = dhcp_server_cleanup_expired_leases(server);
         if (r < 0)
@@ -493,12 +494,7 @@ static int server_receive_message(sd_event_source *s, int fd, uint32_t revents,
                 return 0;
         }
 
-        /* TODO: figure out if this can be done as a filter on the socket, like for IPv6 */
-        struct in_pktinfo *info = CMSG_FIND_DATA(&msg, IPPROTO_IP, IP_PKTINFO, struct in_pktinfo);
-        if (info && info->ipi_ifindex != server->ifindex)
-                return 0;
-
-        r = dhcp_server_handle_message(server, buf, (size_t) len, TRIPLE_TIMESTAMP_FROM_CMSG(&msg));
+        r = dhcp_server_handle_message(server, buf, (size_t) len, &msg);
         if (r < 0)
                 log_dhcp_server_errno(server, r, "Couldn't process incoming message, ignoring: %m");
 
index f37d81bd145a6e49edc8c12be94c396cdb7ec630..161499a3ed5768823632bcc3785b2cea03431aa7 100644 (file)
@@ -17,6 +17,7 @@ typedef struct DHCPRequest {
         /* sender hardware address, may not be set for non-ethernet interface */
         struct hw_addr_data hw_addr;
         triple_timestamp timestamp;
+        struct in_pktinfo *pktinfo;
 
         /* options */
         uint8_t type;
@@ -35,5 +36,5 @@ typedef struct DHCPRequest {
 
 int dhcp_request_get_lifetime_timestamp(DHCPRequest *req, clockid_t clock, usec_t *ret);
 
-int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message, size_t length, const triple_timestamp *timestamp);
+int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message, size_t length, struct msghdr *mh);
 int dhcp_server_setup_io_event_source(sd_dhcp_server *server);