From 7b8e279252c954a41bc51fbeddc7ffae194b59f2 Mon Sep 17 00:00:00 2001 From: Han Xu Date: Sat, 19 Jul 2025 21:35:59 -0700 Subject: [PATCH 1/2] add set_multicast_ttl_v4 and set_multicast_hops_v6 --- src/lib.rs | 2 +- src/unix.rs | 8 ++++++++ src/win.rs | 8 ++++++++ tests/ipv4_test.rs | 1 + tests/ipv6_test.rs | 10 +++++++--- 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index e5727a1..b8bb745 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,7 +7,7 @@ //! //! # Examples //! -//! ``` +//! ```no_run //! use std::net::{Ipv4Addr, SocketAddrV4}; //! use socket2::{Domain, SockAddr}; //! use socket_pktinfo::PktInfoUdpSocket; diff --git a/src/unix.rs b/src/unix.rs index b9d9a11..f0a4321 100644 --- a/src/unix.rs +++ b/src/unix.rs @@ -96,6 +96,10 @@ impl PktInfoUdpSocket { self.socket.set_multicast_loop_v4(loop_v4) } + pub fn set_multicast_ttl_v4(&self, ttl: u32) -> io::Result<()> { + self.socket.set_multicast_ttl_v4(ttl) + } + pub fn join_multicast_v6(&self, addr: &Ipv6Addr, interface: u32) -> io::Result<()> { self.socket.join_multicast_v6(addr, interface) } @@ -108,6 +112,10 @@ impl PktInfoUdpSocket { self.socket.set_multicast_loop_v6(loop_v6) } + pub fn set_multicast_hops_v6(&self, hops: u32) -> io::Result<()> { + self.socket.set_multicast_hops_v6(hops) + } + pub fn set_nonblocking(&self, reuse: bool) -> io::Result<()> { self.socket.set_nonblocking(reuse) } diff --git a/src/win.rs b/src/win.rs index aba81b8..70e4006 100644 --- a/src/win.rs +++ b/src/win.rs @@ -144,6 +144,10 @@ impl PktInfoUdpSocket { self.socket.set_multicast_loop_v4(loop_v4) } + pub fn set_multicast_ttl_v4(&self, ttl: u32) -> io::Result<()> { + self.socket.set_multicast_ttl_v4(ttl) + } + pub fn join_multicast_v6(&self, addr: &Ipv6Addr, interface: u32) -> io::Result<()> { self.socket.join_multicast_v6(addr, interface) } @@ -156,6 +160,10 @@ impl PktInfoUdpSocket { self.socket.set_multicast_loop_v6(loop_v6) } + pub fn set_multicast_hops_v6(&self, hops: u32) -> io::Result<()> { + self.socket.set_multicast_hops_v6(hops) + } + pub fn set_nonblocking(&self, reuse: bool) -> io::Result<()> { self.socket.set_nonblocking(reuse) } diff --git a/tests/ipv4_test.rs b/tests/ipv4_test.rs index 15e66e9..789fe56 100644 --- a/tests/ipv4_test.rs +++ b/tests/ipv4_test.rs @@ -44,6 +44,7 @@ fn ipv4_test() -> io::Result<()> { socket.set_multicast_if_v4(&local_ip)?; socket.join_multicast_v4(&multicast_addr, &local_ip)?; socket.set_multicast_loop_v4(true)?; + socket.set_multicast_ttl_v4(255)?; socket.bind(&SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), port).into())?; { diff --git a/tests/ipv6_test.rs b/tests/ipv6_test.rs index a4787d4..c7c5d14 100644 --- a/tests/ipv6_test.rs +++ b/tests/ipv6_test.rs @@ -2,7 +2,7 @@ use network_interface::{NetworkInterface, NetworkInterfaceConfig}; use socket2::{Domain, Protocol, SockAddr, Socket, Type}; use socket_pktinfo::PktInfoUdpSocket; use std::io; -use std::net::{Ipv6Addr, SocketAddr}; +use std::net::{Ipv6Addr, SocketAddr, SocketAddrV6, IpAddr}; use std::str::FromStr; #[test] @@ -31,14 +31,18 @@ fn ipv6_test() -> io::Result<()> { let port = 8000; let multicast_addr = Ipv6Addr::from_str("ff12::1").unwrap(); - let local_addr: SockAddr = SocketAddr::new(local_ip, port).into(); + let IpAddr::V6(local_ipv6) = local_ip else { + panic!("Expected IPv6"); + }; + let local_addr: SockAddr = SocketAddrV6::new(local_ipv6, port, 0, interface.index).into(); let multicast_socket_addr: SockAddr = SocketAddr::new(multicast_addr.into(), port).into(); let mut buf = [0; 8972]; let socket = PktInfoUdpSocket::new(Domain::IPV6)?; socket.set_reuse_address(true)?; - socket.join_multicast_v6(&multicast_addr, 0)?; + socket.join_multicast_v6(&multicast_addr, interface.index)?; socket.set_multicast_loop_v6(true)?; + socket.set_multicast_hops_v6(255)?; socket.bind(&local_addr)?; { From 6fe559a0dba0b68f1797e59d3af90fdfe88886a1 Mon Sep 17 00:00:00 2001 From: Han Xu Date: Mon, 21 Jul 2025 13:03:21 -0700 Subject: [PATCH 2/2] fix fmt --- tests/ipv6_test.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ipv6_test.rs b/tests/ipv6_test.rs index c7c5d14..f16c396 100644 --- a/tests/ipv6_test.rs +++ b/tests/ipv6_test.rs @@ -2,7 +2,7 @@ use network_interface::{NetworkInterface, NetworkInterfaceConfig}; use socket2::{Domain, Protocol, SockAddr, Socket, Type}; use socket_pktinfo::PktInfoUdpSocket; use std::io; -use std::net::{Ipv6Addr, SocketAddr, SocketAddrV6, IpAddr}; +use std::net::{IpAddr, Ipv6Addr, SocketAddr, SocketAddrV6}; use std::str::FromStr; #[test]