Skip to content

Commit

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

/// Get the value of the `TCP_QUICKACK` option on this socket.
///
/// For more information about this option, see [`set_quickack`].
///
/// [`set_quickack`]: Socket::set_quickack
#[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 quickack(&self) -> io::Result<bool> {
unsafe {
getsockopt::<Bool>(self.as_raw(), libc::IPPROTO_TCP, libc::TCP_QUICKACK)
.map(|quickack| quickack != 0)
}
}

/// Set the value of the `TCP_QUICKACK` option on this socket.
///
/// If set, acks are sent immediately, rather than delayed if needed in accordance to normal
/// TCP operation. This flag is not permanent, it only enables a switch to or from quickack mode.
/// Subsequent operation of the TCP protocol will once again enter/leave quickack mode depending on
/// internal protocol processing and factors such as delayed ack timeouts occurring and data transfer.
#[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_quickack(&self, quickack: bool) -> io::Result<()> {
unsafe {
setsockopt(
self.as_raw(),
libc::IPPROTO_TCP,
libc::TCP_QUICKACK,
quickack 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 @@ -1142,6 +1142,11 @@ test!(
any(target_os = "android", target_os = "fuchsia", target_os = "linux")
))]
test!(cork, set_cork(true));
#[cfg(all(
feature = "all",
any(target_os = "android", target_os = "fuchsia", target_os = "linux")
))]
test!(quickack, set_quickack(false));
test!(linger, set_linger(Some(Duration::from_secs(10))));
test!(
read_timeout,
Expand Down

0 comments on commit 849eee2

Please sign in to comment.