Skip to content

Commit

Permalink
Add support for the socket option TCP_THIN_LINEAR_TIMEOUTS
Browse files Browse the repository at this point in the history
  • Loading branch information
eddi0815 authored and Thomasdezeeuw committed Jan 19, 2022
1 parent 849eee2 commit 24c231c
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 0 deletions.
54 changes: 54 additions & 0 deletions src/sys/unix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1385,6 +1385,60 @@ impl crate::Socket {
}
}

/// Get the value of the `TCP_THIN_LINEAR_TIMEOUTS` option on this socket.
///
/// For more information about this option, see [`set_thin_linear_timeouts`].
///
/// [`set_thin_linear_timeouts`]: Socket::set_thin_linear_timeouts
#[cfg(all(
feature = "all",
any(target_os = "android", target_os = "fuchsia", target_os = "linux")
))]
#[cfg_attr(
docsrs,
doc(cfg(all(
feature = "all",
any(target_os = "android", target_os = "fuchsia", target_os = "linux")
)))
)]
pub fn thin_linear_timeouts(&self) -> io::Result<bool> {
unsafe {
getsockopt::<Bool>(
self.as_raw(),
libc::IPPROTO_TCP,
libc::TCP_THIN_LINEAR_TIMEOUTS,
)
.map(|timeouts| timeouts != 0)
}
}

/// Set the value of the `TCP_THIN_LINEAR_TIMEOUTS` option on this socket.
///
/// If set, the kernel will dynamically detect a thin-stream connection if there are less than four packets in flight.
/// With less than four packets in flight the normal TCP fast retransmission will not be effective.
/// The kernel will modify the retransmission to avoid the very high latencies that thin stream suffer because of exponential backoff.
#[cfg(all(
feature = "all",
any(target_os = "android", target_os = "fuchsia", target_os = "linux")
))]
#[cfg_attr(
docsrs,
doc(cfg(all(
feature = "all",
any(target_os = "android", target_os = "fuchsia", target_os = "linux")
)))
)]
pub fn set_thin_linear_timeouts(&self, timeouts: bool) -> io::Result<()> {
unsafe {
setsockopt(
self.as_raw(),
libc::IPPROTO_TCP,
libc::TCP_THIN_LINEAR_TIMEOUTS,
timeouts as c_int,
)
}
}

/// Gets the value for the `SO_BINDTODEVICE` option on this socket.
///
/// This value gets the socket binded device's interface name.
Expand Down
5 changes: 5 additions & 0 deletions tests/socket.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1147,6 +1147,11 @@ test!(cork, set_cork(true));
any(target_os = "android", target_os = "fuchsia", target_os = "linux")
))]
test!(quickack, set_quickack(false));
#[cfg(all(
feature = "all",
any(target_os = "android", target_os = "fuchsia", target_os = "linux")
))]
test!(thin_linear_timeouts, set_thin_linear_timeouts(true));
test!(linger, set_linger(Some(Duration::from_secs(10))));
test!(
read_timeout,
Expand Down

0 comments on commit 24c231c

Please sign in to comment.