diff --git a/netstack/src/scheme/tcp.rs b/netstack/src/scheme/tcp.rs index a84962154a..c32f2a44a8 100644 --- a/netstack/src/scheme/tcp.rs +++ b/netstack/src/scheme/tcp.rs @@ -17,6 +17,7 @@ const SO_SNDBUF: usize = 7; const SO_RCVBUF: usize = 8; const SO_KEEPALIVE: usize = 9; const SO_REUSEADDR: usize = 2; +const SO_LINGER: usize = 14; const TCP_NODELAY: usize = 1; const TCP_MAXSEG: usize = 2; const TCP_KEEPIDLE: usize = 4; @@ -538,6 +539,16 @@ impl<'a> SchemeSocket for TcpSocket<'a> { buf[..len].copy_from_slice(&bytes[..len]); Ok(len) } + SO_LINGER => { + // struct linger: l_onoff (4 bytes) + l_linger (4 bytes) + let vals = [1i32, 0i32]; // on, 0s linger + let bytes = unsafe { + core::slice::from_raw_parts(vals.as_ptr() as *const u8, 8) + }; + let len = buf.len().min(bytes.len()); + buf[..len].copy_from_slice(&bytes[..len]); + Ok(len) + } // SO_REUSEADDR(2) collides with TCP_MAXSEG(2) — TCP_MAXSEG handles it _ => Err(SyscallError::new(syscall::ENOPROTOOPT)), } @@ -591,6 +602,7 @@ impl<'a> SchemeSocket for TcpSocket<'a> { Ok(1) } IP_MTU_DISCOVER => Ok(1), + SO_LINGER => Ok(1), // accepted, smoltcp handles close semantics // SO_REUSEADDR(2) collides with IP_TTL(2) — IP_TTL handles it _ => Err(SyscallError::new(syscall::ENOPROTOOPT)), }