From: Lennart Poettering Date: Wed, 27 May 2020 17:27:51 +0000 (+0200) Subject: socket-util: add generic socket_pass_pktinfo() helper X-Git-Tag: v246-rc1~258^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=35a3eb9bdc95d1e6ba25bc65c78959ea104e45a1;p=thirdparty%2Fsystemd.git 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. --- diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c index 0be098df2ea..05dd7e70014 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 6f366c04299..9e02e398875 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);