diff --git a/src/smolnetd/scheme/icmp.rs b/src/smolnetd/scheme/icmp.rs index 54a5ca6665..ddb31bc030 100644 --- a/src/smolnetd/scheme/icmp.rs +++ b/src/smolnetd/scheme/icmp.rs @@ -41,6 +41,10 @@ impl<'a, 'b> SchemeSocket for IcmpSocket<'a, 'b> { self.can_recv() } + fn may_recv(&self) -> bool { + true + } + fn get_setting( _file: &SocketFile, _setting: Self::SettingT, diff --git a/src/smolnetd/scheme/ip.rs b/src/smolnetd/scheme/ip.rs index 5cea1b9110..97a83cad32 100644 --- a/src/smolnetd/scheme/ip.rs +++ b/src/smolnetd/scheme/ip.rs @@ -27,6 +27,10 @@ impl<'a, 'b> SchemeSocket for RawSocket<'a, 'b> { self.can_recv() } + fn may_recv(&self) -> bool { + true + } + fn get_setting( _file: &SocketFile, _setting: Self::SettingT, diff --git a/src/smolnetd/scheme/socket.rs b/src/smolnetd/scheme/socket.rs index f1d07c4d16..18e690d0d9 100644 --- a/src/smolnetd/scheme/socket.rs +++ b/src/smolnetd/scheme/socket.rs @@ -123,6 +123,7 @@ where fn can_send(&self) -> bool; fn can_recv(&self) -> bool; + fn may_recv(&self) -> bool; fn hop_limit(&self) -> u8; fn set_hop_limit(&mut self, u8); @@ -214,7 +215,7 @@ where let mut socket_set = self.socket_set.borrow_mut(); let socket = socket_set.get::(socket_handle); - if events & syscall::EVENT_READ == syscall::EVENT_READ && socket.can_recv() { + if events & syscall::EVENT_READ == syscall::EVENT_READ && (socket.can_recv() || !socket.may_recv()) { if !*read_notified { post_fevent(&mut self.scheme_file, fd, syscall::EVENT_READ, 1)?; *read_notified = true; diff --git a/src/smolnetd/scheme/tcp.rs b/src/smolnetd/scheme/tcp.rs index bc18754618..ab33ff3c9f 100644 --- a/src/smolnetd/scheme/tcp.rs +++ b/src/smolnetd/scheme/tcp.rs @@ -26,6 +26,10 @@ impl<'a> SchemeSocket for TcpSocket<'a> { self.can_recv() } + fn may_recv(&self) -> bool { + self.may_recv() + } + fn hop_limit(&self) -> u8 { self.hop_limit().unwrap_or(64) } diff --git a/src/smolnetd/scheme/udp.rs b/src/smolnetd/scheme/udp.rs index f58ad285bd..d253e1aa10 100644 --- a/src/smolnetd/scheme/udp.rs +++ b/src/smolnetd/scheme/udp.rs @@ -28,6 +28,10 @@ impl<'a, 'b> SchemeSocket for UdpSocket<'a, 'b> { self.can_recv() } + fn may_recv(&self) -> bool { + true + } + fn hop_limit(&self) -> u8 { self.hop_limit().unwrap_or(64) }