@@ -16,7 +16,7 @@ use std::{
16
16
use bytes:: BytesMut ;
17
17
use log:: { error, warn} ;
18
18
use pin_project:: pin_project;
19
- use socket2:: { Domain , Protocol , Socket , TcpKeepalive , Type } ;
19
+ use socket2:: { Domain , Protocol , SockAddr , Socket , TcpKeepalive , Type } ;
20
20
use tokio:: {
21
21
io:: { AsyncRead , AsyncWrite , ReadBuf } ,
22
22
net:: { TcpSocket , TcpStream as TokioTcpStream , UdpSocket } ,
@@ -467,26 +467,28 @@ pub async fn create_outbound_udp_socket(af: AddrFamily, opts: &ConnectOpts) -> i
467
467
pub async fn bind_outbound_udp_socket ( bind_addr : & SocketAddr , opts : & ConnectOpts ) -> io:: Result < UdpSocket > {
468
468
let af = AddrFamily :: from ( bind_addr) ;
469
469
470
- let socket = if af != AddrFamily :: Ipv6 {
471
- UdpSocket :: bind ( bind_addr) . await ?
470
+ let socket = Socket :: new ( Domain :: for_address ( * bind_addr) , Type :: DGRAM , Some ( Protocol :: UDP ) ) ?;
471
+
472
+ if let Some ( ref iface) = opts. bind_interface {
473
+ set_ip_unicast_if ( & socket, bind_addr, iface) ?;
474
+ }
475
+
476
+ // bind() should be called after IP_UNICAST_IF
477
+ if af != AddrFamily :: Ipv6 {
478
+ let bind_addr = SockAddr :: from ( * bind_addr) ;
479
+ socket. bind ( & bind_addr) ?;
472
480
} else {
473
- let socket = Socket :: new ( Domain :: for_address ( * bind_addr) , Type :: DGRAM , Some ( Protocol :: UDP ) ) ?;
474
481
socket_bind_dual_stack ( & socket, bind_addr, false ) ?;
482
+ }
475
483
476
- // UdpSocket::from_std requires socket to be non-blocked
477
- socket. set_nonblocking ( true ) ?;
478
- UdpSocket :: from_std ( socket. into ( ) ) ?
479
- } ;
484
+ socket. set_nonblocking ( true ) ?;
485
+ let socket = UdpSocket :: from_std ( socket. into ( ) ) ?;
480
486
481
487
if let Err ( err) = set_disable_ip_fragmentation ( af, & socket) {
482
488
warn ! ( "failed to disable IP fragmentation, error: {}" , err) ;
483
489
}
484
490
disable_connection_reset ( & socket) ?;
485
491
486
- if let Some ( ref iface) = opts. bind_interface {
487
- set_ip_unicast_if ( & socket, bind_addr, iface) ?;
488
- }
489
-
490
492
Ok ( socket)
491
493
}
492
494
0 commit comments