@@ -36,29 +36,29 @@ use crate::{
3636 local:: { context:: ServiceContext , loadbalancing:: PingBalancer } ,
3737} ;
3838
39- use super :: client_cache:: DnsClientCache ;
39+ use super :: { client_cache:: DnsClientCache , config :: NameServerAddr } ;
4040
4141/// DNS Relay server
4242pub struct Dns {
4343 context : Arc < ServiceContext > ,
4444 mode : Mode ,
45- local_addr : SocketAddr ,
45+ local_addr : Arc < NameServerAddr > ,
4646 remote_addr : Arc < Address > ,
4747}
4848
4949impl Dns {
5050 /// Create a new DNS Relay server
51- pub fn new ( local_addr : SocketAddr , remote_addr : Address ) -> Dns {
51+ pub fn new ( local_addr : NameServerAddr , remote_addr : Address ) -> Dns {
5252 let context = ServiceContext :: new ( ) ;
5353 Dns :: with_context ( Arc :: new ( context) , local_addr, remote_addr)
5454 }
5555
5656 /// Create with an existed `context`
57- pub fn with_context ( context : Arc < ServiceContext > , local_addr : SocketAddr , remote_addr : Address ) -> Dns {
57+ pub fn with_context ( context : Arc < ServiceContext > , local_addr : NameServerAddr , remote_addr : Address ) -> Dns {
5858 Dns {
5959 context,
6060 mode : Mode :: UdpOnly ,
61- local_addr : local_addr,
61+ local_addr : Arc :: new ( local_addr) ,
6262 remote_addr : Arc :: new ( remote_addr) ,
6363 }
6464 }
@@ -117,7 +117,7 @@ impl Dns {
117117 client. clone ( ) ,
118118 stream,
119119 peer_addr,
120- self . local_addr ,
120+ self . local_addr . clone ( ) ,
121121 self . remote_addr . clone ( ) ,
122122 ) ) ;
123123 }
@@ -127,7 +127,7 @@ impl Dns {
127127 client : Arc < DnsClient > ,
128128 mut stream : TcpStream ,
129129 peer_addr : SocketAddr ,
130- local_addr : SocketAddr ,
130+ local_addr : Arc < NameServerAddr > ,
131131 remote_addr : Arc < Address > ,
132132 ) -> io:: Result < ( ) > {
133133 let mut length_buf = [ 0u8 ; 2 ] ;
@@ -168,7 +168,7 @@ impl Dns {
168168 }
169169 } ;
170170
171- let respond_message = match client. resolve ( message, local_addr, & remote_addr) . await {
171+ let respond_message = match client. resolve ( message, & local_addr, & remote_addr) . await {
172172 Ok ( m) => m,
173173 Err ( err) => {
174174 error ! ( "dns tcp {} lookup error: {}" , peer_addr, err) ;
@@ -237,7 +237,7 @@ impl Dns {
237237 listener. clone ( ) ,
238238 peer_addr,
239239 message,
240- self . local_addr ,
240+ self . local_addr . clone ( ) ,
241241 self . remote_addr . clone ( ) ,
242242 ) ) ;
243243 }
@@ -248,10 +248,10 @@ impl Dns {
248248 listener : Arc < UdpSocket > ,
249249 peer_addr : SocketAddr ,
250250 message : Message ,
251- local_addr : SocketAddr ,
251+ local_addr : Arc < NameServerAddr > ,
252252 remote_addr : Arc < Address > ,
253253 ) -> io:: Result < ( ) > {
254- let respond_message = match client. resolve ( message, local_addr, & remote_addr) . await {
254+ let respond_message = match client. resolve ( message, & local_addr, & remote_addr) . await {
255255 Ok ( m) => m,
256256 Err ( err) => {
257257 error ! ( "dns udp {} lookup failed, error: {}" , peer_addr, err) ;
@@ -442,7 +442,12 @@ impl DnsClient {
442442 }
443443 }
444444
445- async fn resolve ( & self , request : Message , local_addr : SocketAddr , remote_addr : & Address ) -> io:: Result < Message > {
445+ async fn resolve (
446+ & self ,
447+ request : Message ,
448+ local_addr : & NameServerAddr ,
449+ remote_addr : & Address ,
450+ ) -> io:: Result < Message > {
446451 let mut message = Message :: new ( ) ;
447452 message. set_id ( request. id ( ) ) ;
448453 message. set_recursion_desired ( true ) ;
@@ -476,7 +481,7 @@ impl DnsClient {
476481 async fn acl_lookup (
477482 & self ,
478483 query : & Query ,
479- local_addr : SocketAddr ,
484+ local_addr : & NameServerAddr ,
480485 remote_addr : & Address ,
481486 ) -> ( io:: Result < Message > , bool ) {
482487 // Start querying name servers
@@ -657,7 +662,7 @@ impl DnsClient {
657662 }
658663 }
659664
660- async fn lookup_local ( & self , query : & Query , local_addr : SocketAddr ) -> io:: Result < Message > {
665+ async fn lookup_local ( & self , query : & Query , local_addr : & NameServerAddr ) -> io:: Result < Message > {
661666 let mut last_err = io:: Error :: new ( ErrorKind :: InvalidData , "resolve empty" ) ;
662667
663668 for _ in 0 ..self . attempts {
@@ -672,34 +677,44 @@ impl DnsClient {
672677 Err ( last_err)
673678 }
674679
675- async fn lookup_local_inner ( & self , query : & Query , local_addr : SocketAddr ) -> io:: Result < Message > {
680+ async fn lookup_local_inner ( & self , query : & Query , local_addr : & NameServerAddr ) -> io:: Result < Message > {
676681 let mut message = Message :: new ( ) ;
677682 message. set_id ( thread_rng ( ) . gen ( ) ) ;
678683 message. set_recursion_desired ( true ) ;
679684 message. add_query ( query. clone ( ) ) ;
680685
681- // Query UDP then TCP
686+ match * local_addr {
687+ NameServerAddr :: SocketAddr ( ns) => {
688+ // Query UDP then TCP
682689
683- let udp_query =
684- self . client_cache
685- . lookup_udp_local ( local_addr , message. clone ( ) , self . context . connect_opts_ref ( ) ) ;
686- let tcp_query = async move {
687- // Send TCP query after 500ms, because UDP will always return faster than TCP, there is no need to send queries simutaneously
688- time:: sleep ( Duration :: from_millis ( 500 ) ) . await ;
690+ let udp_query =
691+ self . client_cache
692+ . lookup_udp_local ( ns , message. clone ( ) , self . context . connect_opts_ref ( ) ) ;
693+ let tcp_query = async move {
694+ // Send TCP query after 500ms, because UDP will always return faster than TCP, there is no need to send queries simutaneously
695+ time:: sleep ( Duration :: from_millis ( 500 ) ) . await ;
689696
690- self . client_cache
691- . lookup_tcp_local ( local_addr , message, self . context . connect_opts_ref ( ) )
692- . await
693- } ;
697+ self . client_cache
698+ . lookup_tcp_local ( ns , message, self . context . connect_opts_ref ( ) )
699+ . await
700+ } ;
694701
695- tokio:: pin!( udp_query) ;
696- tokio:: pin!( tcp_query) ;
702+ tokio:: pin!( udp_query) ;
703+ tokio:: pin!( tcp_query) ;
697704
698- match future:: select ( udp_query, tcp_query) . await {
699- Either :: Left ( ( Ok ( m) , ..) ) => Ok ( m) ,
700- Either :: Left ( ( Err ( ..) , next) ) => next. await . map_err ( From :: from) ,
701- Either :: Right ( ( Ok ( m) , ..) ) => Ok ( m) ,
702- Either :: Right ( ( Err ( ..) , next) ) => next. await . map_err ( From :: from) ,
705+ match future:: select ( udp_query, tcp_query) . await {
706+ Either :: Left ( ( Ok ( m) , ..) ) => Ok ( m) ,
707+ Either :: Left ( ( Err ( ..) , next) ) => next. await . map_err ( From :: from) ,
708+ Either :: Right ( ( Ok ( m) , ..) ) => Ok ( m) ,
709+ Either :: Right ( ( Err ( ..) , next) ) => next. await . map_err ( From :: from) ,
710+ }
711+ }
712+ #[ cfg( unix) ]
713+ NameServerAddr :: UnixSocketAddr ( ref path) => self
714+ . client_cache
715+ . lookup_unix_stream ( path, message)
716+ . await
717+ . map_err ( From :: from) ,
703718 }
704719 }
705720}
0 commit comments