@@ -16,7 +16,7 @@ use std::{
1616use bytes:: BytesMut ;
1717use log:: { error, warn} ;
1818use pin_project:: pin_project;
19- use socket2:: { Domain , Protocol , Socket , TcpKeepalive , Type } ;
19+ use socket2:: { Domain , Protocol , SockAddr , Socket , TcpKeepalive , Type } ;
2020use tokio:: {
2121 io:: { AsyncRead , AsyncWrite , ReadBuf } ,
2222 net:: { TcpSocket , TcpStream as TokioTcpStream , UdpSocket } ,
@@ -467,26 +467,28 @@ pub async fn create_outbound_udp_socket(af: AddrFamily, opts: &ConnectOpts) -> i
467467pub async fn bind_outbound_udp_socket ( bind_addr : & SocketAddr , opts : & ConnectOpts ) -> io:: Result < UdpSocket > {
468468 let af = AddrFamily :: from ( bind_addr) ;
469469
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) ?;
472480 } else {
473- let socket = Socket :: new ( Domain :: for_address ( * bind_addr) , Type :: DGRAM , Some ( Protocol :: UDP ) ) ?;
474481 socket_bind_dual_stack ( & socket, bind_addr, false ) ?;
482+ }
475483
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 ( ) ) ?;
480486
481487 if let Err ( err) = set_disable_ip_fragmentation ( af, & socket) {
482488 warn ! ( "failed to disable IP fragmentation, error: {}" , err) ;
483489 }
484490 disable_connection_reset ( & socket) ?;
485491
486- if let Some ( ref iface) = opts. bind_interface {
487- set_ip_unicast_if ( & socket, bind_addr, iface) ?;
488- }
489-
490492 Ok ( socket)
491493}
492494
0 commit comments