diff --git a/app-icon.svg b/app-icon.svg
new file mode 100644
index 0000000..24d1384
--- /dev/null
+++ b/app-icon.svg
@@ -0,0 +1,15 @@
+
diff --git a/netstack-smoltcp/src/device.rs b/netstack-smoltcp/src/device.rs
index e9cabbf..9369910 100644
--- a/netstack-smoltcp/src/device.rs
+++ b/netstack-smoltcp/src/device.rs
@@ -16,6 +16,7 @@ pub(super) struct VirtualDevice {
in_buf: UnboundedReceiver>,
out_buf: Sender,
mtu: usize,
+ cached_packet: Option>,
}
impl VirtualDevice {
@@ -31,6 +32,7 @@ impl VirtualDevice {
in_buf: iface_ingress_rx,
out_buf: iface_egress_tx,
mtu,
+ cached_packet: None,
},
iface_ingress_tx,
iface_ingress_tx_avail,
@@ -43,12 +45,18 @@ impl Device for VirtualDevice {
type TxToken<'a> = VirtualTxToken<'a>;
fn receive(&mut self, _timestamp: Instant) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
- let Ok(buffer) = self.in_buf.try_recv() else {
- self.in_buf_avail.store(false, Ordering::Release);
- return None;
+ let buffer = if let Some(buf) = self.cached_packet.take() {
+ buf
+ } else {
+ let Ok(buf) = self.in_buf.try_recv() else {
+ self.in_buf_avail.store(false, Ordering::Release);
+ return None;
+ };
+ buf
};
let Ok(permit) = self.out_buf.try_reserve() else {
+ self.cached_packet = Some(buffer);
self.in_buf_avail.store(false, Ordering::Release);
return None;
};
diff --git a/netstack-smoltcp/src/runner.rs b/netstack-smoltcp/src/runner.rs
index 63b9675..dedf7e8 100644
--- a/netstack-smoltcp/src/runner.rs
+++ b/netstack-smoltcp/src/runner.rs
@@ -12,23 +12,24 @@ use std::{
/// require two sets of API interfaces in single-threaded and multi-threaded.
///
/// [BoxFuture in crate futures utils]: https://docs.rs/futures-util/latest/futures_util/future/type.BoxFuture.html
-pub struct BoxFuture<'a, T>(Pin + 'a>>);
+pub struct BoxFuture<'a, T>(Pin + Send + 'a>>);
impl<'a, T> BoxFuture<'a, T> {
pub fn new(f: F) -> BoxFuture<'a, T>
where
- F: IntoFuture