From dfcfe68f736bd66754bb9bbb1c0a9974f0e497b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Friedrich=20Sch=C3=B6ller?= Date: Sun, 3 Mar 2024 02:59:19 +0100 Subject: [PATCH] Add the UtunIfname sockopt (UTUN_OPT_IFNAME) --- changelog/2325.added.md | 1 + src/sys/socket/sockopt.rs | 11 +++++++++++ test/sys/test_sockopt.rs | 31 +++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 changelog/2325.added.md diff --git a/changelog/2325.added.md b/changelog/2325.added.md new file mode 100644 index 0000000000..94dd68b00a --- /dev/null +++ b/changelog/2325.added.md @@ -0,0 +1 @@ +Add socket option UtunIfname. diff --git a/src/sys/socket/sockopt.rs b/src/sys/socket/sockopt.rs index ab18035dbb..708775c11b 100644 --- a/src/sys/socket/sockopt.rs +++ b/src/sys/socket/sockopt.rs @@ -1065,6 +1065,17 @@ sockopt_impl!( libc::IPV6_DONTFRAG, bool ); +#[cfg(apple_targets)] +#[cfg(feature = "net")] +sockopt_impl!( + /// Get the utun interface name. + UtunIfname, + GetOnly, + libc::SYSPROTO_CONTROL, + libc::UTUN_OPT_IFNAME, + OsString, + GetOsString<[u8; libc::IFNAMSIZ]> +); #[allow(missing_docs)] // Not documented by Linux! diff --git a/test/sys/test_sockopt.rs b/test/sys/test_sockopt.rs index a99d4e39ed..61108f2603 100644 --- a/test/sys/test_sockopt.rs +++ b/test/sys/test_sockopt.rs @@ -828,3 +828,34 @@ fn test_ktls() { Err(err) => panic!("{err:?}"), } } + +#[test] +#[cfg(apple_targets)] +fn test_utun_ifname() { + use nix::sys::socket::connect; + use nix::sys::socket::SysControlAddr; + + let fd = socket( + AddressFamily::System, + SockType::Datagram, + SockFlag::empty(), + SockProtocol::KextControl, + ) + .unwrap(); + + let unit = 123; + let addr = SysControlAddr::from_name( + fd.as_raw_fd(), + "com.apple.net.utun_control", + unit, + ) + .unwrap(); + + connect(fd.as_raw_fd(), &addr).unwrap(); + + let name = getsockopt(&fd, sockopt::UtunIfname) + .expect("getting UTUN_OPT_IFNAME on a utun interface should succeed"); + + let expected_name = format!("utun{}\0", unit - 1); + assert_eq!(name.into_string(), Ok(expected_name)); +}