@@ -193,28 +193,21 @@ impl P2pNetworkYamuxState {
193
193
P2pNetworkYamuxAction :: IncomingFrameData { addr } => {
194
194
let frame = yamux_state. incoming . pop_front ( ) . unwrap ( ) ; // Cannot fail
195
195
let YamuxFrameInner :: Data ( data) = & frame. inner else {
196
- bug_condition ! (
197
- "Expected Data frame for action `P2pNetworkYamuxAction::IncomingFrameData`"
198
- ) ;
196
+ bug_condition ! ( "Expected Data frame" ) ;
199
197
return Ok ( ( ) ) ;
200
198
} ;
201
199
202
200
let Some ( stream) = yamux_state. streams . get_mut ( & frame. stream_id ) else {
203
201
return Ok ( ( ) ) ;
204
202
} ;
205
203
206
- // must not underflow
207
- // TODO: check it and disconnect peer that violates flow rules
208
- stream. window_ours = stream. window_ours . saturating_sub ( frame. len_as_u32 ( ) ) ;
209
-
210
- let window_update_info = if stream. window_ours < stream. max_window_size / 2 {
211
- Some ( (
212
- frame. stream_id ,
213
- stream. max_window_size . saturating_mul ( 2 ) . min ( 1024 * 1024 ) ,
214
- ) )
215
- } else {
216
- None
217
- } ;
204
+ // Process incoming data and check if we need to update window
205
+ let window_update_info =
206
+ if let Some ( window_increase) = stream. process_incoming_data ( & frame) {
207
+ Some ( ( frame. stream_id , window_increase) )
208
+ } else {
209
+ None
210
+ } ;
218
211
219
212
let peer_id = connection_state
220
213
. peer_id ( )
@@ -309,26 +302,21 @@ impl P2pNetworkYamuxState {
309
302
let Some ( stream) = yamux_state. streams . get_mut ( & stream_id) else {
310
303
return Ok ( ( ) ) ;
311
304
} ;
312
- match & mut frame. inner {
305
+
306
+ match & frame. inner {
313
307
YamuxFrameInner :: Data ( _) => {
314
- let frame_len = frame. len_as_u32 ( ) ;
315
- if !stream. try_consume_window ( frame_len) {
316
- // Window too small, split frame and queue remaining
317
- if let Some ( remaining) = frame. split_at ( stream. window_theirs as usize ) {
318
- stream. pending . push_front ( remaining) ;
319
- }
320
- stream. window_theirs = 0 ;
321
-
322
- // Check pending queue size limit
323
- if stream. pending . iter ( ) . map ( YamuxFrame :: len) . sum :: < usize > ( )
324
- > yamux_state. pending_outgoing_limit
325
- {
326
- let dispatcher = state_context. into_dispatcher ( ) ;
327
- let error = P2pNetworkConnectionError :: YamuxOverflow ( stream_id) ;
328
- dispatcher. push ( P2pNetworkSchedulerAction :: Error { addr, error } ) ;
329
- return Ok ( ( ) ) ;
330
- }
308
+ let ( accepted, remaining) =
309
+ stream. queue_frame ( frame, yamux_state. pending_outgoing_limit ) ;
310
+
311
+ if remaining. is_some ( ) {
312
+ let dispatcher = state_context. into_dispatcher ( ) ;
313
+ let error = P2pNetworkConnectionError :: YamuxOverflow ( stream_id) ;
314
+ dispatcher. push ( P2pNetworkSchedulerAction :: Error { addr, error } ) ;
315
+ return Ok ( ( ) ) ;
331
316
}
317
+
318
+ frame =
319
+ accepted. expect ( "frame should be accepted or error should be returned" ) ;
332
320
}
333
321
YamuxFrameInner :: WindowUpdate { difference } => {
334
322
stream. update_local_window ( * difference) ;
0 commit comments