@@ -447,3 +447,66 @@ fn rebind_blocked_port() {
447
447
}
448
448
}
449
449
}
450
+
451
+ // Changes the local address after N packets
452
+ #[ derive( Default ) ]
453
+ struct RebindAddrAfter {
454
+ count : usize ,
455
+ }
456
+
457
+ impl Interceptor for RebindAddrAfter {
458
+ fn intercept_rx_local_address ( & mut self , _subject : & Subject , addr : & mut LocalAddress ) {
459
+ if self . count == 0 {
460
+ addr. 0 = rebind_port ( rebind_ip ( addr. 0 . into ( ) ) ) . into ( ) ;
461
+ }
462
+ }
463
+
464
+ fn intercept_rx_datagram < ' a > (
465
+ & mut self ,
466
+ _subject : & Subject ,
467
+ _datagram : & Datagram ,
468
+ payload : DecoderBufferMut < ' a > ,
469
+ ) -> DecoderBufferMut < ' a > {
470
+ self . count = self . count . saturating_sub ( 1 ) ;
471
+ payload
472
+ }
473
+ }
474
+
475
+ /// Ensures that a datagram received from a client on a different server IP/port is still
476
+ /// accepted.
477
+ #[ test]
478
+ fn rebind_server_addr_before_handshake_confirmed ( ) {
479
+ let model = Model :: default ( ) ;
480
+ let subscriber = recorder:: DatagramDropped :: new ( ) ;
481
+ let datagram_dropped_events = subscriber. events ( ) ;
482
+
483
+ test ( model, move |handle| {
484
+ let server = Server :: builder ( )
485
+ . with_io ( handle. builder ( ) . build ( ) ?) ?
486
+ . with_tls ( SERVER_CERTS ) ?
487
+ . with_event ( ( tracing_events ( ) , subscriber) ) ?
488
+ . with_random ( Random :: with_seed ( 456 ) ) ?
489
+ . with_packet_interceptor ( RebindAddrAfter { count : 1 } ) ?
490
+ . start ( ) ?;
491
+
492
+ let client = Client :: builder ( )
493
+ . with_io ( handle. builder ( ) . build ( ) ?) ?
494
+ . with_tls ( certificates:: CERT_PEM ) ?
495
+ . with_event ( tracing_events ( ) ) ?
496
+ . with_random ( Random :: with_seed ( 456 ) ) ?
497
+ . start ( ) ?;
498
+
499
+ let addr = start_server ( server) ?;
500
+ start_client ( client, addr, Data :: new ( 1000 ) ) ?;
501
+ Ok ( addr)
502
+ } )
503
+ . unwrap ( ) ;
504
+
505
+ let datagram_dropped_events = datagram_dropped_events. lock ( ) . unwrap ( ) ;
506
+ let datagram_dropped_events = & datagram_dropped_events[ ..] ;
507
+
508
+ assert ! (
509
+ datagram_dropped_events. is_empty( ) ,
510
+ "s2n-quic should not drop packets with different server addrs {datagram_dropped_events:?}"
511
+ ) ;
512
+ }
0 commit comments