Skip to content

Commit 1c35b04

Browse files
committed
Handle non-WouldBlock errors in smoltcp::phy::Device implemenation
1 parent 7572a94 commit 1c35b04

File tree

1 file changed

+17
-5
lines changed

1 file changed

+17
-5
lines changed

src/dma/smoltcp_phy.rs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use crate::dma::RxError;
2+
13
use super::rx::RxRing;
24
use super::tx::TxRing;
35
use super::EthernetDMA;
@@ -90,11 +92,21 @@ impl<'dma, 'rx> RxToken for EthRxToken<'dma, 'rx> {
9092
#[cfg(not(feature = "ptp"))]
9193
let meta = None;
9294

93-
// NOTE(unwrap): an `EthRxToken` is only created when `eth.rx_available()`
94-
let packet = self.rx_ring.recv_next(meta).ok().unwrap();
95-
let result = f(&packet);
96-
packet.free();
97-
result
95+
match self.rx_ring.recv_next(meta) {
96+
Ok(v) => {
97+
let result = f(&v);
98+
v.free();
99+
result
100+
}
101+
Err(RxError::WouldBlock) => {
102+
defmt::error!("RX token is only created when to-be-received descriptor is available, but RX would block");
103+
f(&[])
104+
}
105+
Err(e) => {
106+
defmt::debug!("Failed to receive packet: {}", e);
107+
f(&[])
108+
}
109+
}
98110
}
99111

100112
#[cfg(feature = "ptp")]

0 commit comments

Comments
 (0)