Skip to content

Commit

Permalink
Merge #1865
Browse files Browse the repository at this point in the history
1865: Add IpMtu sockopt r=asomers a=ShadowJonathan

Resolves #1864

Co-authored-by: Jonathan de Jong <jonathandejong02@gmail.com>
  • Loading branch information
bors[bot] and ShadowJonathan committed Nov 25, 2022
2 parents a75a349 + e9f07ee commit a7a1426
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 0 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Expand Up @@ -38,6 +38,8 @@ This project adheres to [Semantic Versioning](https://semver.org/).
([#1857](https://github.com/nix-rust/nix/pull/1857))
- Added `SockProtocol::Raw` for raw sockets
([#1848](https://github.com/nix-rust/nix/pull/1848))
- added `IP_MTU` (`IpMtu`) `IPPROTO_IP` sockopt on Linux and Android.
([#1865](https://github.com/nix-rust/nix/pull/1865))

### Changed

Expand Down
9 changes: 9 additions & 0 deletions src/sys/socket/sockopt.rs
Expand Up @@ -925,6 +925,15 @@ sockopt_impl!(
libc::IPV6_RECVERR,
bool
);
#[cfg(any(target_os = "android", target_os = "linux"))]
sockopt_impl!(
/// Fetch the current system-estimated Path MTU.
IpMtu,
GetOnly,
libc::IPPROTO_IP,
libc::IP_MTU,
libc::c_int
);
#[cfg(any(target_os = "android", target_os = "freebsd", target_os = "linux"))]
sockopt_impl!(
/// Set or retrieve the current time-to-live field that is used in every
Expand Down
27 changes: 27 additions & 0 deletions test/sys/test_sockopt.rs
Expand Up @@ -236,6 +236,33 @@ fn test_so_tcp_keepalive() {
}
}

#[test]
#[cfg(any(target_os = "android", target_os = "linux"))]
#[cfg_attr(qemu, ignore)]
fn test_get_mtu() {
use nix::sys::socket::{bind, connect, SockaddrIn};
use std::net::SocketAddrV4;
use std::str::FromStr;

let std_sa = SocketAddrV4::from_str("127.0.0.1:4001").unwrap();
let std_sb = SocketAddrV4::from_str("127.0.0.1:4002").unwrap();

let usock = socket(
AddressFamily::Inet,
SockType::Datagram,
SockFlag::empty(),
SockProtocol::Udp,
)
.unwrap();

// Bind and initiate connection
bind(usock, &SockaddrIn::from(std_sa)).unwrap();
connect(usock, &SockaddrIn::from(std_sb)).unwrap();

// Loopback connections have 2^16 - the maximum - MTU
assert_eq!(getsockopt(usock, sockopt::IpMtu), Ok(u16::MAX as i32))
}

#[test]
#[cfg(any(target_os = "android", target_os = "freebsd", target_os = "linux"))]
fn test_ttl_opts() {
Expand Down

0 comments on commit a7a1426

Please sign in to comment.