Skip to content

Commit

Permalink
feat: Add UDP GRO option
Browse files Browse the repository at this point in the history
  • Loading branch information
XAMPPRocky committed Nov 7, 2024
1 parent 3a93893 commit 337665d
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 0 deletions.
38 changes: 38 additions & 0 deletions src/sys/unix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -896,6 +896,44 @@ impl SockAddr {
#[cfg(not(any(target_os = "linux", target_os = "android")))]
None
}

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

/// Set value for the `UDP_GRO` option on this socket.
///
/// This indicates that the kernel can combine multiple datagrams into a
/// single buffer, this needs to be used in combination with [`Self::recvmsg`]
/// to get the number of segments in the buffer from the [`MsgHdr`].
#[cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))]
#[cfg_attr(
docsrs,
doc(cfg(all(feature = "all", any(target_os = "android", target_os = "linux"))))
)]
pub fn set_udp_gro(&self, reuse: bool) -> io::Result<()> {
unsafe {
setsockopt(
self.as_raw(),
sys::SOL_UDP,
sys::UDP_GRO,
reuse as c_int,
)
}
}
}

pub(crate) type Socket = c_int;
Expand Down
6 changes: 6 additions & 0 deletions tests/socket.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1355,6 +1355,12 @@ test!(reuse_address, set_reuse_address(true));
not(any(windows, target_os = "solaris", target_os = "illumos"))
))]
test!(reuse_port, set_reuse_port(true));
#[cfg(all(feature = "all", any(target_os = "android", target_os = "linux")))]
#[cfg_attr(
docsrs,
doc(cfg(all(feature = "all", any(target_os = "android", target_os = "linux"))))
)]
test!(udp_gro, set_udp_gro(true));
#[cfg(all(feature = "all", target_os = "freebsd"))]
test!(reuse_port_lb, set_reuse_port_lb(true));
#[cfg(all(feature = "all", unix, not(target_os = "redox")))]
Expand Down

0 comments on commit 337665d

Please sign in to comment.