From 181eb63dd25a3ddcf3681d35a60d1790859d3c0c Mon Sep 17 00:00:00 2001 From: Red Bear OS Date: Mon, 27 Jul 2026 18:02:15 +0900 Subject: [PATCH] netstack: SocketT trait + all impls take (level, name) for sockopt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DEF-P0-11 (Finding 1.7: option collision) from NETWORKING-AND-DRIVERS-CODE-ASSESSMENT-2026-07-27.md §3.4: SocketT trait methods get_sock_opt and set_sock_opt previously took a single 'name' parameter. The dispatch in scheme/socket.rs now reads metadata[1] as level and metadata[2] as name, but the trait didn't have the level parameter. This commit updates the trait and all impls (socket.rs stub, tcp.rs, udp.rs) to take (level, name) as separate parameters. The impls ignore level for now (each impl only handles its own protocol family), but the parameter is there so future per-level dispatch (e.g. 'IP_TTL only valid at IPPROTO_IP') can reject early with ENOPROTOOPT. --- netstack/src/scheme/socket.rs | 19 +++++++++++++++++-- netstack/src/scheme/tcp.rs | 2 ++ netstack/src/scheme/udp.rs | 2 ++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/netstack/src/scheme/socket.rs b/netstack/src/scheme/socket.rs index e7d7c46421..213736df58 100644 --- a/netstack/src/scheme/socket.rs +++ b/netstack/src/scheme/socket.rs @@ -264,6 +264,7 @@ where fn get_sock_opt( &self, _file: &SchemeFile, + _level: usize, _name: usize, _buf: &mut [u8], ) -> SyscallResult { @@ -273,6 +274,7 @@ fn get_sock_opt( fn set_sock_opt( &mut self, _file: &SchemeFile, + _level: usize, _name: usize, _buf: &[u8], ) -> SyscallResult { @@ -475,10 +477,17 @@ where Handle::File(file) => { let mut socket_set = self.socket_set.borrow_mut(); let socket = socket_set.get_mut::(file.socket_handle()); + // Wire format: [SocketCall::SetSockOpt, level, option] + // level is SOL_SOCKET (1), IPPROTO_TCP (6), IPPROTO_IP (0), + // etc. Without level, option 4 reads as IP_TOS at + // IPPROTO_IP when caller asked for TCP_KEEPIDLE at + // SOL_SOCKET. See NETWORKING-AND-DRIVERS-CODE-ASSESSMENT + // §3.4 (Finding 1.7: option collision). SocketT::set_sock_opt( socket, file, - metadata[1] as usize, + metadata[1] as usize, // level + metadata[2] as usize, // option payload, ) } @@ -492,7 +501,13 @@ where Handle::File(ref mut file) => { let mut socket_set = self.socket_set.borrow_mut(); let socket = socket_set.get_mut::(file.socket_handle()); - SocketT::get_sock_opt(socket, file, metadata[1] as usize, payload) + SocketT::get_sock_opt( + socket, + file, + metadata[1] as usize, // level + metadata[2] as usize, // option + payload, + ) } Handle::Null(_) => { // TODO diff --git a/netstack/src/scheme/tcp.rs b/netstack/src/scheme/tcp.rs index 1430a92a8b..cf4ed09bb5 100644 --- a/netstack/src/scheme/tcp.rs +++ b/netstack/src/scheme/tcp.rs @@ -427,6 +427,7 @@ impl<'a> SchemeSocket for TcpSocket<'a> { fn get_sock_opt( &self, _file: &SchemeFile, + _level: usize, name: usize, buf: &mut [u8], ) -> SyscallResult { @@ -558,6 +559,7 @@ unsafe { fn set_sock_opt( &mut self, _file: &SchemeFile, + _level: usize, name: usize, buf: &[u8], ) -> SyscallResult { diff --git a/netstack/src/scheme/udp.rs b/netstack/src/scheme/udp.rs index 77893fc4fe..ed31957b9e 100644 --- a/netstack/src/scheme/udp.rs +++ b/netstack/src/scheme/udp.rs @@ -479,6 +479,7 @@ impl<'a> SchemeSocket for UdpSocket<'a> { fn get_sock_opt( &self, _file: &SchemeFile, + _level: usize, name: usize, buf: &mut [u8], ) -> SyscallResult { @@ -516,6 +517,7 @@ impl<'a> SchemeSocket for UdpSocket<'a> { fn set_sock_opt( &mut self, _file: &SchemeFile, + _level: usize, name: usize, buf: &[u8], ) -> SyscallResult {