From c9653b50ebe4c0f17b2b628eead93402df07580a Mon Sep 17 00:00:00 2001 From: Benton60 Date: Wed, 18 Mar 2026 21:00:10 -0400 Subject: [PATCH] initial setup for recvmsg, all handlers return EOPNOTSUPP for now --- netstack/src/scheme/icmp.rs | 4 ++++ netstack/src/scheme/ip.rs | 4 ++++ netstack/src/scheme/socket.rs | 24 +++++++++++++++++++++++- netstack/src/scheme/tcp.rs | 4 ++++ netstack/src/scheme/udp.rs | 4 ++++ 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/netstack/src/scheme/icmp.rs b/netstack/src/scheme/icmp.rs index c2b1b5d0c6..11330799f7 100644 --- a/netstack/src/scheme/icmp.rs +++ b/netstack/src/scheme/icmp.rs @@ -281,6 +281,10 @@ impl<'a> SchemeSocket for IcmpSocket<'a> { } } + fn handle_recvmsg(&mut self, file: &mut SchemeFile, how:&mut [u8], flags:usize) -> SyscallResult { + return Err(SyscallError::new(syscall::EOPNOTSUPP)); + } + fn handle_get_peer_name( &self, file: &SchemeFile, diff --git a/netstack/src/scheme/ip.rs b/netstack/src/scheme/ip.rs index f39d00a638..96eb139916 100644 --- a/netstack/src/scheme/ip.rs +++ b/netstack/src/scheme/ip.rs @@ -149,6 +149,10 @@ impl<'a> SchemeSocket for RawSocket<'a> { Ok(i) } + fn handle_recvmsg(&mut self, file: &mut SchemeFile, how:&mut [u8], flags:usize) -> SyscallResult { + return Err(SyscallError::new(syscall::EOPNOTSUPP)); + } + fn handle_get_peer_name( &self, file: &SchemeFile, diff --git a/netstack/src/scheme/socket.rs b/netstack/src/scheme/socket.rs index a99a696a79..9f832a6660 100644 --- a/netstack/src/scheme/socket.rs +++ b/netstack/src/scheme/socket.rs @@ -243,6 +243,13 @@ where fn handle_shutdown(&mut self, file: &mut SchemeFile, how: usize) -> SyscallResult; + fn handle_recvmsg( + &mut self, + file: &mut SchemeFile, + payload: &mut [u8], + flags: usize, + ) -> SyscallResult; + fn get_sock_opt( &self, file: &SchemeFile, @@ -496,7 +503,6 @@ where } } // SocketCall::SendMsg => self.handle_sendmsg(id, payload, ctx), - // SocketCall::RecvMsg => self.handle_recvmsg(id, payload), // SocketCall::Unbind => self.handle_unbind(id), // SocketCall::GetToken => self.handle_get_token(id, payload), SocketCall::GetPeerName => { @@ -514,6 +520,22 @@ where SocketT::handle_get_peer_name(socket, file, payload) } + SocketCall::RecvMsg => { + let flags = metadata[1] as usize; + let handle = self.handles.get_mut(&fd).ok_or_else(||SyscallError::new(syscall::EBADF))?; + + match *handle { + Handle::File(ref mut file) => { + let mut socket_set = self.socket_set.borrow_mut(); + let socket = socket_set.get_mut::(file.socket_handle()); + + SocketT::handle_recvmsg(socket, file, payload, flags) + } + Handle::Null(_) => Err(SyscallError::new(syscall::EINVAL)), + Handle::SchemeRoot => Err(SyscallError::new(syscall::EBADF)), + } + } + SocketCall::Shutdown => { let how = metadata[1] as usize; diff --git a/netstack/src/scheme/tcp.rs b/netstack/src/scheme/tcp.rs index 8c46eec49c..225d5f2af2 100644 --- a/netstack/src/scheme/tcp.rs +++ b/netstack/src/scheme/tcp.rs @@ -308,6 +308,10 @@ impl<'a> SchemeSocket for TcpSocket<'a> { Ok(i) } + fn handle_recvmsg(&mut self, file: &mut SchemeFile, how:&mut [u8], flags:usize) -> SyscallResult { + return Err(SyscallError::new(syscall::EOPNOTSUPP)); + } + fn handle_get_peer_name( &self, file: &SchemeFile, diff --git a/netstack/src/scheme/udp.rs b/netstack/src/scheme/udp.rs index b0ad69bbf5..0dc50f0f0f 100644 --- a/netstack/src/scheme/udp.rs +++ b/netstack/src/scheme/udp.rs @@ -296,6 +296,10 @@ impl<'a> SchemeSocket for UdpSocket<'a> { Ok(i) } + fn handle_recvmsg(&mut self, file: &mut SchemeFile, how:&mut [u8], flags:usize) -> SyscallResult { + return Err(SyscallError::new(syscall::EOPNOTSUPP)); + } + fn handle_get_peer_name( &self, file: &SchemeFile,