From 93c379703e3be210799953bc0686d02f97119b39 Mon Sep 17 00:00:00 2001 From: sun5etop <146408999+sun5etop@users.noreply.github.com> Date: Sun, 21 Apr 2024 13:36:44 +0800 Subject: [PATCH] =?UTF-8?q?feat(net):=20=E5=AE=9E=E7=8E=B0raw=20socket?= =?UTF-8?q?=E7=9A=84poll=20(#739)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat(net): 实现raw socket的poll --- kernel/src/net/socket/mod.rs | 38 +++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/kernel/src/net/socket/mod.rs b/kernel/src/net/socket/mod.rs index 9dd73c1e..70fb5414 100644 --- a/kernel/src/net/socket/mod.rs +++ b/kernel/src/net/socket/mod.rs @@ -10,7 +10,7 @@ use alloc::{ use hashbrown::HashMap; use smoltcp::{ iface::SocketSet, - socket::{self, tcp, udp}, + socket::{self, raw, tcp, udp}, }; use system_error::SystemError; @@ -756,6 +756,7 @@ impl SocketPollMethod { match socket { socket::Socket::Udp(udp) => Self::udp_poll(udp, shutdown), socket::Socket::Tcp(tcp) => Self::tcp_poll(tcp, shutdown), + socket::Socket::Raw(raw) => Self::raw_poll(raw, shutdown), _ => todo!(), } } @@ -837,4 +838,39 @@ impl SocketPollMethod { return event; } + + pub fn raw_poll(socket: &raw::Socket, shutdown: ShutdownType) -> EPollEventType { + //kdebug!("enter raw_poll!"); + let mut event = EPollEventType::empty(); + + if shutdown.contains(ShutdownType::RCV_SHUTDOWN) { + event.insert( + EPollEventType::EPOLLRDHUP | EPollEventType::EPOLLIN | EPollEventType::EPOLLRDNORM, + ); + } + if shutdown.contains(ShutdownType::SHUTDOWN_MASK) { + event.insert(EPollEventType::EPOLLHUP); + } + + if socket.can_recv() { + //kdebug!("poll can recv!"); + event.insert(EPollEventType::EPOLLIN | EPollEventType::EPOLLRDNORM); + } else { + //kdebug!("poll can not recv!"); + } + + if socket.can_send() { + //kdebug!("poll can send!"); + event.insert( + EPollEventType::EPOLLOUT + | EPollEventType::EPOLLWRNORM + | EPollEventType::EPOLLWRBAND, + ); + } else { + //kdebug!("poll can not send!"); + // TODO: 缓冲区空间不够,需要使用信号处理 + todo!() + } + return event; + } }