@@ -144,10 +144,12 @@ impl P2pNetworkYamuxState {
144
144
. ok_or_else ( || format ! ( "Connection not found {}" , addr) ) ?;
145
145
146
146
let stream_exists = connection_state. get_yamux_stream ( frame_stream_id) . is_some ( ) ;
147
- // TODO: can this ever be None?
148
147
let peer_id = match connection_state. peer_id ( ) {
149
148
Some ( peer_id) => * peer_id,
150
- None => return Ok ( ( ) ) ,
149
+ None => {
150
+ bug_condition ! ( "Peer id must exist" ) ;
151
+ return Ok ( ( ) ) ;
152
+ }
151
153
} ;
152
154
153
155
// Peer reset this stream
@@ -193,34 +195,30 @@ impl P2pNetworkYamuxState {
193
195
P2pNetworkYamuxAction :: IncomingFrameData { addr } => {
194
196
let frame = yamux_state. incoming . pop_front ( ) . unwrap ( ) ; // Cannot fail
195
197
let YamuxFrameInner :: Data ( data) = & frame. inner else {
196
- bug_condition ! (
197
- "Expected Data frame for action `P2pNetworkYamuxAction::IncomingFrameData`"
198
- ) ;
198
+ bug_condition ! ( "Expected Data frame" ) ;
199
199
return Ok ( ( ) ) ;
200
200
} ;
201
201
202
202
let Some ( stream) = yamux_state. streams . get_mut ( & frame. stream_id ) else {
203
203
return Ok ( ( ) ) ;
204
204
} ;
205
205
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 ( ) ) ;
206
+ // Process incoming data and check if we need to update window
207
+ let window_update_info =
208
+ if let Some ( window_increase) = stream. process_incoming_data ( & frame) {
209
+ Some ( ( frame. stream_id , window_increase) )
210
+ } else {
211
+ None
212
+ } ;
209
213
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
214
+ let peer_id = match connection_state. peer_id ( ) {
215
+ Some ( peer_id) => * peer_id,
216
+ None => {
217
+ bug_condition ! ( "Peer id must exist" ) ;
218
+ return Ok ( ( ) ) ;
219
+ }
217
220
} ;
218
221
219
- let peer_id = connection_state
220
- . peer_id ( )
221
- . expect ( "peer id must exist" )
222
- . clone ( ) ;
223
-
224
222
let dispatcher = state_context. into_dispatcher ( ) ;
225
223
226
224
if let Some ( ( update_stream_id, difference) ) = window_update_info {
@@ -309,26 +307,21 @@ impl P2pNetworkYamuxState {
309
307
let Some ( stream) = yamux_state. streams . get_mut ( & stream_id) else {
310
308
return Ok ( ( ) ) ;
311
309
} ;
312
- match & mut frame. inner {
310
+
311
+ match & frame. inner {
313
312
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
- }
313
+ let ( accepted, remaining) =
314
+ stream. queue_frame ( frame, yamux_state. pending_outgoing_limit ) ;
315
+
316
+ if remaining. is_some ( ) {
317
+ let dispatcher = state_context. into_dispatcher ( ) ;
318
+ let error = P2pNetworkConnectionError :: YamuxOverflow ( stream_id) ;
319
+ dispatcher. push ( P2pNetworkSchedulerAction :: Error { addr, error } ) ;
320
+ return Ok ( ( ) ) ;
331
321
}
322
+
323
+ frame =
324
+ accepted. expect ( "frame should be accepted or error should be returned" ) ;
332
325
}
333
326
YamuxFrameInner :: WindowUpdate { difference } => {
334
327
stream. update_local_window ( * difference) ;
@@ -380,7 +373,10 @@ impl P2pNetworkYamuxState {
380
373
381
374
let peer_id = match connection_state. peer_id ( ) {
382
375
Some ( peer_id) => * peer_id,
383
- None => return Ok ( ( ) ) ,
376
+ None => {
377
+ bug_condition ! ( "Peer id must exist" ) ;
378
+ return Ok ( ( ) ) ;
379
+ }
384
380
} ;
385
381
386
382
let dispatcher = state_context. into_dispatcher ( ) ;
0 commit comments