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);
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)
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");
/* 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;
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);