diff --git a/src/backend/libc/net/sockopt.rs b/src/backend/libc/net/sockopt.rs index 0a8541461..9241fdf74 100644 --- a/src/backend/libc/net/sockopt.rs +++ b/src/backend/libc/net/sockopt.rs @@ -616,12 +616,12 @@ pub(crate) fn ipv6_multicast_loop(fd: BorrowedFd<'_>) -> io::Result { #[inline] pub(crate) fn set_ipv6_multicast_hops(fd: BorrowedFd<'_>, multicast_hops: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IPV6_MULTICAST_HOPS, multicast_hops) + setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_MULTICAST_HOPS, multicast_hops) } #[inline] pub(crate) fn ipv6_multicast_hops(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IP, c::IPV6_MULTICAST_HOPS) + getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_MULTICAST_HOPS) } #[inline] diff --git a/src/backend/linux_raw/net/sockopt.rs b/src/backend/linux_raw/net/sockopt.rs index 85c65b085..98cda240c 100644 --- a/src/backend/linux_raw/net/sockopt.rs +++ b/src/backend/linux_raw/net/sockopt.rs @@ -567,12 +567,12 @@ pub(crate) fn ipv6_multicast_loop(fd: BorrowedFd<'_>) -> io::Result { #[inline] pub(crate) fn set_ipv6_multicast_hops(fd: BorrowedFd<'_>, multicast_hops: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IPV6_MULTICAST_HOPS, multicast_hops) + setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_MULTICAST_HOPS, multicast_hops) } #[inline] pub(crate) fn ipv6_multicast_hops(fd: BorrowedFd<'_>) -> io::Result { - getsockopt(fd, c::IPPROTO_IP, c::IPV6_MULTICAST_HOPS) + getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_MULTICAST_HOPS) } #[inline] diff --git a/tests/net/sockopt.rs b/tests/net/sockopt.rs index d139d9a5c..0ad741118 100644 --- a/tests/net/sockopt.rs +++ b/tests/net/sockopt.rs @@ -424,16 +424,25 @@ fn test_sockopts_ipv6() { } assert_ne!(sockopt::ipv6_unicast_hops(&s).unwrap(), 0); - // On NetBSD, `get_ipv6_multicasthops` returns 1 here. It's not evident - // why it differs from other OS's. - #[cfg(not(target_os = "netbsd"))] match sockopt::ipv6_multicast_hops(&s) { - Ok(hops) => assert_eq!(hops, 0), + Ok(hops) => assert_eq!(hops, 1), + Err(io::Errno::OPNOTSUPP) => (), Err(io::Errno::NOPROTOOPT) => (), Err(io::Errno::INVAL) => (), Err(err) => panic!("{:?}", err), } + match sockopt::set_ipv6_multicast_hops(&s, 8) { + Ok(()) => match sockopt::ipv6_multicast_hops(&s) { + Ok(hops) => assert_eq!(hops, 8), + Err(err) => panic!("{:?}", err), + }, + Err(io::Errno::OPNOTSUPP) => (), + Err(io::Errno::INVAL) => (), + Err(io::Errno::NOPROTOOPT) => (), + Err(err) => panic!("{:?}", err), + } + // Set the IPv4 V6OONLY value. let v6only = rustix::net::sockopt::ipv6_v6only(&s).unwrap(); sockopt::set_ipv6_v6only(&s, !v6only).unwrap(); @@ -516,6 +525,20 @@ fn test_sockopts_ipv6() { test_sockopts_tcp(&s); } +#[test] +fn test_ipv6_multicast_hops_dgram() { + crate::init(); + + let s = rustix::net::socket(AddressFamily::INET6, SocketType::DGRAM, None).unwrap(); + match sockopt::set_ipv6_multicast_hops(&s, 8) { + Ok(()) => assert_eq!(sockopt::ipv6_multicast_hops(&s).unwrap(), 8), + Err(io::Errno::OPNOTSUPP) => (), + Err(io::Errno::INVAL) => (), + Err(io::Errno::NOPROTOOPT) => (), + Err(err) => panic!("{:?}", err), + } +} + #[cfg(linux_kernel)] #[test] fn test_socket_passcred() {