Skip to content

Commit

Permalink
Add IP_DONTFRAG and IPV6_DONTFRAG SockOpts
Browse files Browse the repository at this point in the history
IP_DONTFRAG: iOS, macOS
IPV6_DONTFRAG: android, iOS, linux and macOS

Test: `cargo test --test test dontfrag_opts`

Some CI tests running ENOPROTOOPT are disabled.
  • Loading branch information
junhochoi committed Apr 7, 2022
1 parent 131fdf1 commit 43b0517
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 0 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Expand Up @@ -61,6 +61,9 @@ This project adheres to [Semantic Versioning](https://semver.org/).
(#[1670](https://github.com/nix-rust/nix/pull/1670))
- Added `waitid`.
(#[1584](https://github.com/nix-rust/nix/pull/1584))
- Added `Ipv6DontFrag` for android, iOS, linux and macOS.
- Added `IpDontFrag` for iOS, macOS.
(#[1692](https://github.com/nix-rust/nix/pull/1692))

### Changed

Expand Down
13 changes: 13 additions & 0 deletions src/sys/socket/sockopt.rs
Expand Up @@ -615,6 +615,19 @@ sockopt_impl!(
sockopt_impl!(
/// Set the unicast hop limit for the socket.
Ipv6Ttl, Both, libc::IPPROTO_IPV6, libc::IPV6_UNICAST_HOPS, libc::c_int);
#[cfg(any(target_os = "ios", target_os = "macos"))]
sockopt_impl!(
/// Set "don't fragment packet" flag on the IP packet.
IpDontFrag, Both, libc::IPPROTO_IP, libc::IP_DONTFRAG, bool);
#[cfg(any(
target_os = "android",
target_os = "ios",
target_os = "linux",
target_os = "macos",
))]
sockopt_impl!(
/// Set "don't fragment packet" flag on the IPv6 packet.
Ipv6DontFrag, Both, libc::IPPROTO_IPV6, libc::IPV6_DONTFRAG, bool);

#[allow(missing_docs)]
// Not documented by Linux!
Expand Down
38 changes: 38 additions & 0 deletions test/sys/test_sockopt.rs
Expand Up @@ -196,3 +196,41 @@ fn test_ttl_opts() {
setsockopt(fd6, sockopt::Ipv6Ttl, &1)
.expect("setting ipv6ttl on an inet6 socket should succeed");
}

#[test]
#[cfg(any(target_os = "ios", target_os = "macos"))]
fn test_dontfrag_opts() {
let fd4 = socket(AddressFamily::Inet, SockType::Stream, SockFlag::empty(), SockProtocol::Tcp).unwrap();
setsockopt(fd4, sockopt::IpDontFrag, &true)
.expect("setting IP_DONTFRAG on an inet stream socket should succeed");
setsockopt(fd4, sockopt::IpDontFrag, &false)
.expect("unsetting IP_DONTFRAG on an inet stream socket should succeed");
let fd4d = socket(AddressFamily::Inet, SockType::Datagram, SockFlag::empty(), None).unwrap();
setsockopt(fd4d, sockopt::IpDontFrag, &true)
.expect("setting IP_DONTFRAG on an inet datagram socket should succeed");
setsockopt(fd4d, sockopt::IpDontFrag, &false)
.expect("unsetting IP_DONTFRAG on an inet datagram socket should succeed");
}

#[test]
#[cfg(all(
any(target_arch = "x86", target_arch = "x86_64"),
any(
target_os = "android",
target_os = "ios",
target_os = "linux",
target_os = "macos",
)
))]
fn test_v6dontfrag_opts() {
let fd6 = socket(AddressFamily::Inet6, SockType::Stream, SockFlag::empty(), SockProtocol::Tcp).unwrap();
setsockopt(fd6, sockopt::Ipv6DontFrag, &true)
.expect("setting IPV6_DONTFRAG on an inet6 stream socket should succeed");
setsockopt(fd6, sockopt::Ipv6DontFrag, &false)
.expect("unsetting IPV6_DONTFRAG on an inet6 stream socket should succeed");
let fd6d = socket(AddressFamily::Inet6, SockType::Datagram, SockFlag::empty(), None).unwrap();
setsockopt(fd6d, sockopt::Ipv6DontFrag, &true)
.expect("setting IPV6_DONTFRAG on an inet6 datagram socket should succeed");
setsockopt(fd6d, sockopt::Ipv6DontFrag, &false)
.expect("unsetting IPV6_DONTFRAG on an inet6 datagram socket should succeed");
}

0 comments on commit 43b0517

Please sign in to comment.