1 // Copyright 2022 The gRPC Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 #include "src/core/resolver/dns/dns_resolver_plugin.h" 15 16 #include <grpc/support/port_platform.h> 17 18 #include <memory> 19 20 #include "absl/log/log.h" 21 #include "absl/strings/match.h" 22 #include "src/core/config/config_vars.h" 23 #include "src/core/lib/experiments/experiments.h" 24 #include "src/core/resolver/dns/c_ares/dns_resolver_ares.h" 25 #include "src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.h" 26 #include "src/core/resolver/dns/native/dns_resolver.h" 27 #include "src/core/resolver/resolver_factory.h" 28 #include "src/core/util/crash.h" 29 30 namespace grpc_core { 31 RegisterDnsResolver(CoreConfiguration::Builder * builder)32void RegisterDnsResolver(CoreConfiguration::Builder* builder) { 33 #if GRPC_IOS_EVENT_ENGINE_CLIENT 34 VLOG(2) << "Using EventEngine dns resolver"; 35 builder->resolver_registry()->RegisterResolverFactory( 36 std::make_unique<EventEngineClientChannelDNSResolverFactory>()); 37 return; 38 #endif 39 #ifndef GRPC_DO_NOT_INSTANTIATE_POSIX_POLLER 40 if (IsEventEngineDnsEnabled()) { 41 VLOG(2) << "Using EventEngine dns resolver"; 42 builder->resolver_registry()->RegisterResolverFactory( 43 std::make_unique<EventEngineClientChannelDNSResolverFactory>()); 44 return; 45 } 46 #endif 47 auto resolver = ConfigVars::Get().DnsResolver(); 48 // ---- Ares resolver ---- 49 if (ShouldUseAresDnsResolver(resolver)) { 50 VLOG(2) << "Using ares dns resolver"; 51 RegisterAresDnsResolver(builder); 52 return; 53 } 54 // ---- Native resolver ---- 55 if (absl::EqualsIgnoreCase(resolver, "native") || 56 !builder->resolver_registry()->HasResolverFactory("dns")) { 57 VLOG(2) << "Using native dns resolver"; 58 RegisterNativeDnsResolver(builder); 59 return; 60 } 61 Crash( 62 "Unable to set DNS resolver! Likely a logic error in gRPC-core, " 63 "please file a bug."); 64 } 65 66 } // namespace grpc_core 67