Skip to content

Commit 6565ebb

Browse files
authored
Expose socket option SO_SNDBUFFORCE (#1339)
1 parent 5efb143 commit 6565ebb

4 files changed

Lines changed: 28 additions & 3 deletions

File tree

src/backend/libc/net/sockopt.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,13 @@ pub(crate) fn set_socket_send_buffer_size(fd: BorrowedFd<'_>, size: usize) -> io
362362
setsockopt(fd, c::SOL_SOCKET, c::SO_SNDBUF, size)
363363
}
364364

365+
#[cfg(any(linux_kernel, target_os = "fuchsia", target_os = "redox"))]
366+
#[inline]
367+
pub(crate) fn set_socket_send_buffer_size_force(fd: BorrowedFd<'_>, size: usize) -> io::Result<()> {
368+
let size: c::c_int = size.try_into().map_err(|_| io::Errno::INVAL)?;
369+
setsockopt(fd, c::SOL_SOCKET, c::SO_SNDBUFFORCE, size)
370+
}
371+
365372
#[inline]
366373
pub(crate) fn socket_send_buffer_size(fd: BorrowedFd<'_>) -> io::Result<usize> {
367374
getsockopt(fd, c::SOL_SOCKET, c::SO_SNDBUF).map(|size: u32| size as usize)

src/backend/linux_raw/c.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,9 @@ pub(crate) use linux_raw_sys::{
9797
SO_DOMAIN, SO_ERROR, SO_INCOMING_CPU, SO_KEEPALIVE, SO_LINGER, SO_OOBINLINE,
9898
SO_ORIGINAL_DST, SO_PASSCRED, SO_PROTOCOL, SO_RCVBUF, SO_RCVBUFFORCE, SO_RCVTIMEO_NEW,
9999
SO_RCVTIMEO_NEW as SO_RCVTIMEO, SO_RCVTIMEO_OLD, SO_REUSEADDR, SO_REUSEPORT, SO_SNDBUF,
100-
SO_SNDTIMEO_NEW, SO_SNDTIMEO_NEW as SO_SNDTIMEO, SO_SNDTIMEO_OLD, SO_TYPE, TCP_CONGESTION,
101-
TCP_CORK, TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL, TCP_NODELAY, TCP_QUICKACK,
102-
TCP_THIN_LINEAR_TIMEOUTS, TCP_USER_TIMEOUT,
100+
SO_SNDBUFFORCE, SO_SNDTIMEO_NEW, SO_SNDTIMEO_NEW as SO_SNDTIMEO, SO_SNDTIMEO_OLD, SO_TYPE,
101+
TCP_CONGESTION, TCP_CORK, TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL, TCP_NODELAY,
102+
TCP_QUICKACK, TCP_THIN_LINEAR_TIMEOUTS, TCP_USER_TIMEOUT,
103103
},
104104
netlink::*,
105105
xdp::{

src/backend/linux_raw/net/sockopt.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,12 @@ pub(crate) fn set_socket_send_buffer_size(fd: BorrowedFd<'_>, size: usize) -> io
367367
setsockopt(fd, c::SOL_SOCKET, c::SO_SNDBUF, size)
368368
}
369369

370+
#[inline]
371+
pub(crate) fn set_socket_send_buffer_size_force(fd: BorrowedFd<'_>, size: usize) -> io::Result<()> {
372+
let size: c::c_int = size.try_into().map_err(|_| io::Errno::INVAL)?;
373+
setsockopt(fd, c::SOL_SOCKET, c::SO_SNDBUFFORCE, size)
374+
}
375+
370376
#[inline]
371377
pub(crate) fn socket_send_buffer_size(fd: BorrowedFd<'_>) -> io::Result<usize> {
372378
getsockopt(fd, c::SOL_SOCKET, c::SO_SNDBUF).map(|size: u32| size as usize)

src/net/sockopt.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,18 @@ pub fn set_socket_send_buffer_size<Fd: AsFd>(fd: Fd, value: usize) -> io::Result
430430
backend::net::sockopt::set_socket_send_buffer_size(fd.as_fd(), value)
431431
}
432432

433+
/// `setsockopt(fd, SOL_SOCKET, SO_SNDBUFFORCE, value)`
434+
///
435+
/// See the [module-level documentation] for more.
436+
///
437+
/// [module-level documentation]: self#references-for-get_socket_-and-set_socket_-functions
438+
#[cfg(any(linux_kernel, target_os = "fuchsia", target_os = "redox"))]
439+
#[inline]
440+
#[doc(alias = "SO_SNDBUFFORCE")]
441+
pub fn set_socket_send_buffer_size_force<Fd: AsFd>(fd: Fd, value: usize) -> io::Result<()> {
442+
backend::net::sockopt::set_socket_send_buffer_size_force(fd.as_fd(), value)
443+
}
444+
433445
/// `getsockopt(fd, SOL_SOCKET, SO_SNDBUF)`
434446
///
435447
/// See the [module-level documentation] for more.

0 commit comments

Comments
 (0)