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 {