@@ -14,7 +14,7 @@ impl<X: Xfer> AsyncClient<'_, X> {
1414 /// # Arguments
1515 ///
1616 /// * `buffer` - A mutable slice used to store the received Ethernet packet.
17- /// * `timeout` - An optional duration to wait for a packet.
17+ /// * `timeout` - An optional duration to wait for an Ethernet packet.
1818 /// If `None`, the default timeout value `ETHERNET_RX_TIMEOUT_MSEC` is used.
1919 ///
2020 /// # Returns
@@ -23,11 +23,11 @@ impl<X: Xfer> AsyncClient<'_, X> {
2323 /// * `Err(StackError)` - If an error occurs while reading the ethernet packet.
2424 pub async fn read_ethernet_packet (
2525 & mut self ,
26- buffer : Option < & mut [ u8 ] > ,
26+ buffer : & mut [ u8 ] ,
2727 timeout : Option < Duration > ,
2828 ) -> Result < usize , StackError > {
2929 let timeout_ms: Option < u32 > = timeout. map ( |d| d. as_millis ( ) . min ( u32:: MAX as u128 ) as u32 ) ;
30- let mut op = RxEthernetPacketInfo :: new ( buffer, timeout_ms) ;
30+ let mut op = RxEthernetPacketInfo :: new ( Some ( buffer) , timeout_ms) ;
3131 self . poll_op ( & mut op) . await
3232 }
3333
@@ -53,7 +53,7 @@ impl<X: Xfer> AsyncClient<'_, X> {
5353
5454#[ cfg( feature = "embassy-net" ) ]
5555mod embassy_net {
56- use super :: { AsyncClient , Xfer } ;
56+ use super :: { AsyncClient , StackError , Xfer } ;
5757 use crate :: error;
5858 use crate :: manager:: { Manager , MAX_OCTETS_IN_MAC_ADDRESS , SOCKET_BUFFER_MAX_LENGTH } ;
5959 use crate :: ops:: net_ops:: ethernet_receive:: RxEthernetPacketInfo ;
@@ -93,7 +93,7 @@ mod embassy_net {
9393 /// Construct a token pair consisting of one receive token and one transmit token.
9494 fn receive (
9595 & mut self ,
96- _cx : & mut Context < ' _ > ,
96+ cx : & mut Context < ' _ > ,
9797 ) -> Option < ( Self :: RxToken < ' _ > , Self :: TxToken < ' _ > ) > {
9898 // poll for new events
9999 let _ = self . heartbeat ( ) ;
@@ -102,10 +102,27 @@ mod embassy_net {
102102 let mut rx_op = RxEthernetPacketInfo :: new ( None , Some ( ETH_RECV_TIMEOUT_MSEC ) ) ;
103103 let result = self . poll_once ( & mut rx_op) ;
104104
105- let Ok ( read_length) = result else {
106- return None ;
105+ let read_length = match result {
106+ Ok ( length) => length,
107+ Err ( e) => {
108+ if e == StackError :: GeneralTimeout {
109+ error ! ( "Ethernet receive timeout" ) ;
110+ }
111+ // register the waker if no packet is available
112+ if let Err ( e) = self
113+ . manager
114+ . borrow_mut ( )
115+ . register_waker_if_new ( cx. waker ( ) . clone ( ) )
116+ {
117+ error ! ( "Too many wakers registered: {:?}" , e) ;
118+ }
119+ return None ;
120+ }
107121 } ;
108122
123+ // Got a packet - remove the waker.
124+ self . manager . borrow_mut ( ) . unregister_waker ( & cx. waker ( ) ) ;
125+
109126 let rx_token = WincRxToken {
110127 callback : & self . callbacks ,
111128 read_length,
@@ -234,7 +251,7 @@ mod tests {
234251 let mut client = make_test_client ( ) ;
235252 * client. debug_callback . borrow_mut ( ) = Some ( & mut my_debug) ;
236253 client
237- . read_ethernet_packet ( Some ( rx_buffer. as_mut_slice ( ) ) , None )
254+ . read_ethernet_packet ( rx_buffer. as_mut_slice ( ) , None )
238255 . await
239256 } ;
240257
@@ -248,7 +265,7 @@ mod tests {
248265 let timeout = Some ( Duration :: from_millis ( 1000 ) ) ;
249266
250267 let result = client
251- . read_ethernet_packet ( Some ( rx_buffer. as_mut_slice ( ) ) , timeout)
268+ . read_ethernet_packet ( rx_buffer. as_mut_slice ( ) , timeout)
252269 . await ;
253270
254271 assert_eq ! ( result, Err ( StackError :: GeneralTimeout ) ) ;
0 commit comments