diff --git a/src/socket.rs b/src/socket.rs index 4e41793c..698d3556 100644 --- a/src/socket.rs +++ b/src/socket.rs @@ -2018,6 +2018,67 @@ impl Socket { ) } } + + /// Get the value of the `IPV6_RECVHOPLIMIT` option for this socket. + /// + /// For more information about this option, see [`set_recv_hoplimit_v6`]. + /// + /// [`set_recv_hoplimit_v6`]: Socket::set_recv_hoplimit_v6 + #[cfg(all( + feature = "all", + not(any( + windows, + target_os = "dragonfly", + target_os = "fuchsia", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", + target_os = "solaris", + target_os = "haiku", + target_os = "hurd", + target_os = "espidf", + target_os = "vita", + )) + ))] + pub fn recv_hoplimit_v6(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::IPPROTO_IPV6, sys::IPV6_RECVHOPLIMIT) + .map(|recv_hoplimit| recv_hoplimit > 0) + } + } + /// Set the value of the `IPV6_RECVHOPLIMIT` option for this socket. + /// + /// The received hop limit is returned as ancillary data by recvmsg() + /// only if the application has enabled the IPV6_RECVHOPLIMIT socket + /// option: + #[cfg(all( + feature = "all", + not(any( + windows, + target_os = "dragonfly", + target_os = "fuchsia", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", + target_os = "solaris", + target_os = "haiku", + target_os = "hurd", + target_os = "espidf", + target_os = "vita", + )) + ))] + pub fn set_recv_hoplimit_v6(&self, recv_hoplimit: bool) -> io::Result<()> { + unsafe { + setsockopt( + self.as_raw(), + sys::IPPROTO_IPV6, + sys::IPV6_RECVHOPLIMIT, + recv_hoplimit as c_int, + ) + } + } } /// Socket options for TCP sockets, get/set using `IPPROTO_TCP`. diff --git a/src/sys/unix.rs b/src/sys/unix.rs index 1451b1f4..b40c3df1 100644 --- a/src/sys/unix.rs +++ b/src/sys/unix.rs @@ -122,6 +122,23 @@ pub(crate) use libc::SO_OOBINLINE; // Used in `Socket`. #[cfg(not(target_os = "nto"))] pub(crate) use libc::ipv6_mreq as Ipv6Mreq; +#[cfg(all( + feature = "all", + not(any( + target_os = "dragonfly", + target_os = "fuchsia", + target_os = "hurd", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", + target_os = "solaris", + target_os = "haiku", + target_os = "espidf", + target_os = "vita", + )) +))] +pub(crate) use libc::IPV6_RECVHOPLIMIT; #[cfg(not(any( target_os = "dragonfly", target_os = "fuchsia", diff --git a/tests/socket.rs b/tests/socket.rs index 0959ef39..98a535c7 100644 --- a/tests/socket.rs +++ b/tests/socket.rs @@ -1475,6 +1475,24 @@ test!(IPv6 tclass_v6, set_tclass_v6(96)); )))] test!(IPv6 recv_tclass_v6, set_recv_tclass_v6(true)); +#[cfg(all( + feature = "all", + not(any( + target_os = "dragonfly", + target_os = "fuchsia", + target_os = "hurd", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", + target_os = "solaris", + target_os = "windows", + target_os = "vita", + target_os = "haiku", + )) +))] +test!(IPv6 recv_hoplimit_v6, set_recv_hoplimit_v6(true)); + #[cfg(all( feature = "all", any(target_os = "android", target_os = "fuchsia", target_os = "linux")