@@ -447,3 +447,66 @@ fn rebind_blocked_port() {
447447 }
448448 }
449449}
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