From 35a3eb9bdc95d1e6ba25bc65c78959ea104e45a1 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 27 May 2020 19:27:51 +0200 Subject: [PATCH] socket-util: add generic socket_pass_pktinfo() helper The helper turns on the protocol specific "packet info" structure cmsg for three relevant protocols we know. --- src/basic/socket-util.c | 24 +++++++++++++++++++++++- src/basic/socket-util.h | 2 ++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c index 0be098df2e..05dd7e7001 100644 --- a/src/basic/socket-util.c +++ b/src/basic/socket-util.c @@ -1174,5 +1174,27 @@ ssize_t recvmsg_safe(int sockfd, struct msghdr *msg, int flags) { } return n; - +} + +int socket_pass_pktinfo(int fd, bool b) { + int af; + socklen_t sl = sizeof(af); + + if (getsockopt(fd, SOL_SOCKET, SO_DOMAIN, &af, &sl) < 0) + return -errno; + + switch (af) { + + case AF_INET: + return setsockopt_int(fd, IPPROTO_IP, IP_PKTINFO, b); + + case AF_INET6: + return setsockopt_int(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, b); + + case AF_NETLINK: + return setsockopt_int(fd, SOL_NETLINK, NETLINK_PKTINFO, b); + + default: + return -EAFNOSUPPORT; + } } diff --git a/src/basic/socket-util.h b/src/basic/socket-util.h index 6f366c0429..9e02e39887 100644 --- a/src/basic/socket-util.h +++ b/src/basic/socket-util.h @@ -220,3 +220,5 @@ int socket_bind_to_ifname(int fd, const char *ifname); int socket_bind_to_ifindex(int fd, int ifindex); ssize_t recvmsg_safe(int sockfd, struct msghdr *msg, int flags); + +int socket_pass_pktinfo(int fd, bool b);