@@ -3,7 +3,8 @@ use crate::network::dns::dns_table::DnsTable;
33use crate :: network:: dns:: hosts:: HostsResolver ;
44use crate :: network:: dns:: ns_policy:: { DispatchedDnsResolver , NameserverPolicies } ;
55use crate :: network:: dns:: provider:: IfaceProvider ;
6- use crate :: proxy:: error:: TransportError ;
6+ use crate :: network:: dns:: { default_resolver_opt, AuxiliaryResolver , NameServerConfigEnum } ;
7+ use crate :: proxy:: error:: { DnsError , TransportError } ;
78use arc_swap:: ArcSwap ;
89use hickory_proto:: op:: { Message , MessageType , ResponseCode } ;
910use hickory_proto:: rr:: { DNSClass , RData , Record , RecordType } ;
@@ -52,13 +53,40 @@ macro_rules! impl_genuine_lookup {
5253 } ;
5354}
5455
56+ macro_rules! apply_resolver {
57+ ( $func_name: ident, $name: expr, $domain_name: expr, $auxiliary_resolver: expr) => {
58+ match $auxiliary_resolver {
59+ AuxiliaryResolver :: Dhcp ( inner) => {
60+ let resolver = {
61+ let mut guard = inner. lock( ) . unwrap( ) ;
62+ match guard. refresh( ) {
63+ Ok ( _) => { }
64+ Err ( e) => {
65+ tracing:: warn!(
66+ "failed to update DHCP DNS at ({},{},{}): {:?}" ,
67+ guard. iface,
68+ guard. iface_addr,
69+ guard. ns_addr,
70+ e
71+ ) ;
72+ }
73+ }
74+ guard. get_resolver( )
75+ } ;
76+ $func_name( $name, $domain_name, & resolver) . await
77+ }
78+ AuxiliaryResolver :: Resolver ( inner) => $func_name( $name, $domain_name, & inner) . await ,
79+ }
80+ } ;
81+ }
82+
5583pub struct GenericDns < P : RuntimeProvider > {
5684 name : String ,
5785 table : DnsTable ,
5886 preference : DnsPreference ,
5987 host_resolver : ArcSwap < HostsResolver > ,
6088 ns_policy : ArcSwap < NameserverPolicies > ,
61- resolvers : ArcSwap < Vec < AsyncResolver < GenericConnector < P > > > > ,
89+ resolvers : ArcSwap < Vec < AuxiliaryResolver < AsyncResolver < GenericConnector < P > > > > > ,
6290}
6391
6492pub type Dns = GenericDns < IfaceProvider > ;
@@ -70,28 +98,18 @@ impl Dns {
7098 preference : DnsPreference ,
7199 hosts : & HashMap < String , IpAddr > ,
72100 ns_policy : NameserverPolicies ,
73- configs : Vec < NameServerConfigGroup > ,
74- ) -> Dns {
75- let resolvers = configs
76- . into_iter ( )
77- . map ( |config| {
78- let cfg = ResolverConfig :: from_parts ( None , vec ! [ ] , config) ;
79- AsyncResolver :: new (
80- cfg,
81- Self :: default_resolver_opt ( ) ,
82- GenericConnector :: new ( IfaceProvider :: new ( iface_name) ) ,
83- )
84- } )
85- . collect ( ) ;
101+ configs : Vec < NameServerConfigEnum > ,
102+ ) -> Result < Dns , DnsError > {
103+ let resolvers = Self :: build_resolvers ( iface_name, configs) ?;
86104 let host_resolver = HostsResolver :: new ( hosts) ;
87- Dns {
105+ Ok ( Dns {
88106 name : name. to_string ( ) ,
89107 table : DnsTable :: new ( ) ,
90108 preference,
91109 host_resolver : ArcSwap :: new ( Arc :: new ( host_resolver) ) ,
92110 ns_policy : ArcSwap :: new ( Arc :: new ( ns_policy) ) ,
93111 resolvers : ArcSwap :: new ( Arc :: new ( resolvers) ) ,
94- }
112+ } )
95113 }
96114
97115 pub fn replace_hosts ( & self , hosts : & HashMap < String , IpAddr > ) {
@@ -103,26 +121,38 @@ impl Dns {
103121 self . ns_policy . store ( Arc :: new ( ns_policy) ) ;
104122 }
105123
106- pub fn replace_resolvers ( & self , iface_name : & str , configs : Vec < NameServerConfigGroup > ) {
107- let resolvers = configs
108- . into_iter ( )
109- . map ( |config| {
110- let cfg = ResolverConfig :: from_parts ( None , vec ! [ ] , config) ;
111- AsyncResolver :: new (
112- cfg,
113- Self :: default_resolver_opt ( ) ,
114- GenericConnector :: new ( IfaceProvider :: new ( iface_name) ) ,
115- )
116- } )
117- . collect ( ) ;
124+ // This function is atomic
125+ pub fn replace_resolvers (
126+ & self ,
127+ iface_name : & str ,
128+ configs : Vec < NameServerConfigEnum > ,
129+ ) -> Result < ( ) , DnsError > {
130+ let resolvers = Self :: build_resolvers ( iface_name, configs) ?;
118131 self . resolvers . store ( Arc :: new ( resolvers) ) ;
132+ Ok ( ( ) )
119133 }
120134
121- fn default_resolver_opt ( ) -> ResolverOpts {
122- let mut opts = ResolverOpts :: default ( ) ;
123- opts. timeout = Duration :: from_millis ( 1600 ) ;
124- opts. attempts = 3 ;
125- opts
135+ fn build_resolvers (
136+ iface_name : & str ,
137+ configs : Vec < NameServerConfigEnum > ,
138+ ) -> Result < Vec < AuxiliaryResolver < AsyncResolver < GenericConnector < IfaceProvider > > > > , DnsError >
139+ {
140+ let mut resolvers = Vec :: new ( ) ;
141+ for config in configs. into_iter ( ) {
142+ let resolver = match config {
143+ NameServerConfigEnum :: Normal ( config) => {
144+ let cfg = ResolverConfig :: from_parts ( None , vec ! [ ] , config) ;
145+ AuxiliaryResolver :: new_normal ( AsyncResolver :: new (
146+ cfg,
147+ default_resolver_opt ( ) ,
148+ GenericConnector :: new ( IfaceProvider :: new ( iface_name) ) ,
149+ ) )
150+ }
151+ NameServerConfigEnum :: Dhcp ( dhcp) => AuxiliaryResolver :: new_dhcp ( & dhcp) ?,
152+ } ;
153+ resolvers. push ( resolver) ;
154+ }
155+ Ok ( resolvers)
126156 }
127157}
128158
@@ -138,7 +168,7 @@ impl<P: RuntimeProvider> GenericDns<P> {
138168 preference,
139169 host_resolver : ArcSwap :: new ( Arc :: new ( HostsResolver :: empty ( ) ) ) ,
140170 ns_policy : ArcSwap :: new ( Arc :: new ( NameserverPolicies :: empty ( ) ) ) ,
141- resolvers : ArcSwap :: new ( Arc :: new ( vec ! [ resolver] ) ) ,
171+ resolvers : ArcSwap :: new ( Arc :: new ( vec ! [ AuxiliaryResolver :: new_normal ( resolver) ] ) ) ,
142172 }
143173 }
144174
@@ -161,35 +191,32 @@ impl<P: RuntimeProvider> GenericDns<P> {
161191
162192 async fn genuine_lookup_v4 ( & self , domain_name : & str ) -> Result < Option < IpAddr > , TransportError > {
163193 for r in self . resolvers . load ( ) . iter ( ) {
164- if let Some ( ip) = Self :: genuine_lookup_one_v4 ( & self . name , domain_name, r) . await ? {
194+ if let Some ( ip) = apply_resolver ! ( genuine_lookup_one_v4 , & self . name, domain_name, r) ? {
165195 return Ok ( Some ( ip) ) ;
166196 }
167197 }
168198 Ok ( None )
169199 }
170200 async fn genuine_lookup_v6 ( & self , domain_name : & str ) -> Result < Option < IpAddr > , TransportError > {
171201 for r in self . resolvers . load ( ) . iter ( ) {
172- if let Some ( ip) = Self :: genuine_lookup_one_v6 ( & self . name , domain_name, r) . await ? {
202+ if let Some ( ip) = apply_resolver ! ( genuine_lookup_one_v6 , & self . name, domain_name, r) ? {
173203 return Ok ( Some ( ip) ) ;
174204 }
175205 }
176206 Ok ( None )
177207 }
178208
179- impl_genuine_lookup ! ( genuine_lookup_one_v4, ipv4_lookup) ;
180- impl_genuine_lookup ! ( genuine_lookup_one_v6, ipv6_lookup) ;
181-
182209 async fn one_v4_wrapper (
183210 name : & str ,
184211 domain_name : & str ,
185212 resolver : & DispatchedDnsResolver ,
186213 ) -> Result < Option < IpAddr > , TransportError > {
187214 match resolver {
188215 DispatchedDnsResolver :: Iface ( resolver) => {
189- Self :: genuine_lookup_one_v4 ( name, domain_name, resolver) . await
216+ apply_resolver ! ( genuine_lookup_one_v4 , name, domain_name, resolver)
190217 }
191218 DispatchedDnsResolver :: Plain ( resolver) => {
192- Self :: genuine_lookup_one_v4 ( name, domain_name, resolver) . await
219+ genuine_lookup_one_v4 ( name, domain_name, resolver) . await
193220 }
194221 }
195222 }
@@ -201,10 +228,10 @@ impl<P: RuntimeProvider> GenericDns<P> {
201228 ) -> Result < Option < IpAddr > , TransportError > {
202229 match resolver {
203230 DispatchedDnsResolver :: Iface ( resolver) => {
204- Self :: genuine_lookup_one_v6 ( name, domain_name, resolver) . await
231+ apply_resolver ! ( genuine_lookup_one_v6 , name, domain_name, resolver)
205232 }
206233 DispatchedDnsResolver :: Plain ( resolver) => {
207- Self :: genuine_lookup_one_v6 ( name, domain_name, resolver) . await
234+ genuine_lookup_one_v6 ( name, domain_name, resolver) . await
208235 }
209236 }
210237 }
@@ -331,3 +358,6 @@ impl<P: RuntimeProvider> GenericDns<P> {
331358 }
332359 }
333360}
361+
362+ impl_genuine_lookup ! ( genuine_lookup_one_v4, ipv4_lookup) ;
363+ impl_genuine_lookup ! ( genuine_lookup_one_v6, ipv6_lookup) ;
0 commit comments