diff --git a/src/socket.rs b/src/socket.rs index 8d517b47..afc3ce9e 100644 --- a/src/socket.rs +++ b/src/socket.rs @@ -1068,6 +1068,36 @@ impl Socket { } } + /// 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", target_os = "linux"))] + pub fn udp_gro(&self) -> io::Result { + unsafe { + getsockopt::(self.as_raw(), sys::SOL_UDP, sys::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", 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, + ) + } + } + /// Get the value of the `SO_SNDBUF` option on this socket. /// /// For more information about this option, see [`set_send_buffer_size`]. diff --git a/src/sys/unix.rs b/src/sys/unix.rs index 3a898bc3..5ddd7ccb 100644 --- a/src/sys/unix.rs +++ b/src/sys/unix.rs @@ -179,7 +179,7 @@ pub(crate) use libc::SO_LINGER; ))] pub(crate) use libc::SO_LINGER_SEC as SO_LINGER; #[cfg(target_os = "linux")] -pub(crate) use libc::SO_PASSCRED; +pub(crate) use libc::{SO_PASSCRED, SOL_UDP, UDP_GRO}; pub(crate) use libc::{ ip_mreq as IpMreq, linger, IPPROTO_IP, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, IPV6_MULTICAST_IF, IPV6_MULTICAST_LOOP, IPV6_UNICAST_HOPS, IPV6_V6ONLY, IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP,