@@ -222,20 +222,15 @@ impl P2pNetworkYamuxState {
222222 if difference > 0 {
223223 // have some fresh space in the window
224224 // try send as many frames as can
225- // last frame
226225 let mut window = stream. window_theirs ;
227226 while let Some ( mut frame) = stream. pending . pop_front ( ) {
228- let size = if let YamuxFrameInner :: Data ( data) = & frame. inner {
229- data. len ( )
230- } else {
231- 0
232- } as u32 ;
233- if let Some ( new_window) = window. checked_sub ( size) {
227+ let len = frame. len ( ) as u32 ;
228+ if let Some ( new_window) = window. checked_sub ( len) {
234229 pending_outgoing. push_back ( frame) ;
235230 window = new_window;
236231 } else {
237232 if let Some ( remaining) =
238- frame. split_at ( ( size - window) as usize )
233+ frame. split_at ( ( len - window) as usize )
239234 {
240235 stream. pending . push_front ( remaining) ;
241236 }
@@ -360,7 +355,8 @@ impl P2pNetworkYamuxState {
360355 Ok ( ( ) )
361356 }
362357 P2pNetworkYamuxAction :: OutgoingFrame { mut frame, addr } => {
363- let Some ( stream) = yamux_state. streams . get_mut ( & frame. stream_id ) else {
358+ let stream_id = frame. stream_id ;
359+ let Some ( stream) = yamux_state. streams . get_mut ( & stream_id) else {
364360 return Ok ( ( ) ) ;
365361 } ;
366362 match & mut frame. inner {
@@ -386,6 +382,14 @@ impl P2pNetworkYamuxState {
386382 // or the queue is already not empty
387383 // in both cases the whole frame goes in the queue and nothing to send
388384 stream. pending . push_back ( frame) ;
385+ if stream. pending . iter ( ) . map ( YamuxFrame :: len) . sum :: < usize > ( )
386+ > yamux_state. pending_outgoing_limit
387+ {
388+ let dispatcher = state_context. into_dispatcher ( ) ;
389+ let error = P2pNetworkConnectionError :: YamuxOverflow ( stream_id) ;
390+ dispatcher. push ( P2pNetworkSchedulerAction :: Error { addr, error } ) ;
391+ }
392+
389393 return Ok ( ( ) ) ;
390394 }
391395 }
0 commit comments