Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ipv6: add ip6_sock_set_recvpktinfo

Add a helper to directly set the IPV6_RECVPKTINFO sockopt from kernel
space without going through a fake uaccess.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Christoph Hellwig and committed by
David S. Miller
7d7207c2 18d5ad62

+9 -8
+7
include/net/ipv6.h
··· 1262 1262 return ret; 1263 1263 } 1264 1264 1265 + static inline void ip6_sock_set_recvpktinfo(struct sock *sk) 1266 + { 1267 + lock_sock(sk); 1268 + inet6_sk(sk)->rxopt.bits.rxinfo = true; 1269 + release_sock(sk); 1270 + } 1271 + 1265 1272 #endif /* _NET_IPV6_H */
+2 -8
net/sunrpc/svcsock.c
··· 595 595 596 596 static void svc_udp_init(struct svc_sock *svsk, struct svc_serv *serv) 597 597 { 598 - int err, level, optname, one = 1; 599 - 600 598 svc_xprt_init(sock_net(svsk->sk_sock->sk), &svc_udp_class, 601 599 &svsk->sk_xprt, serv); 602 600 clear_bit(XPT_CACHE_AUTH, &svsk->sk_xprt.xpt_flags); ··· 615 617 switch (svsk->sk_sk->sk_family) { 616 618 case AF_INET: 617 619 ip_sock_set_pktinfo(svsk->sk_sock->sk); 618 - return; 620 + break; 619 621 case AF_INET6: 620 - level = SOL_IPV6; 621 - optname = IPV6_RECVPKTINFO; 622 + ip6_sock_set_recvpktinfo(svsk->sk_sock->sk); 622 623 break; 623 624 default: 624 625 BUG(); 625 626 } 626 - err = kernel_setsockopt(svsk->sk_sock, level, optname, 627 - (char *)&one, sizeof(one)); 628 - dprintk("svc: kernel_setsockopt returned %d\n", err); 629 627 } 630 628 631 629 /*