xds_certificate_provider.cc
Go to the documentation of this file.
1 //
2 //
3 // Copyright 2020 gRPC authors.
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 //
18 
20 
22 
23 #include <utility>
24 
25 #include "absl/functional/bind_front.h"
26 #include "absl/memory/memory.h"
27 #include "absl/types/optional.h"
28 
29 #include <grpc/support/log.h>
30 
34 
35 namespace grpc_core {
36 
37 namespace {
38 
39 class RootCertificatesWatcher
41  public:
42  // Takes a ref to \a parent instead of a raw pointer since the watcher is
43  // owned by the root certificate distributor and not by \a parent. Note that
44  // presently, the watcher is immediately deleted when
45  // CancelTlsCertificatesWatch() is called, but that can potentially change in
46  // the future.
47  RootCertificatesWatcher(
48  RefCountedPtr<grpc_tls_certificate_distributor> parent,
49  std::string cert_name)
50  : parent_(std::move(parent)), cert_name_(std::move(cert_name)) {}
51 
52  void OnCertificatesChanged(absl::optional<absl::string_view> root_certs,
54  /* key_cert_pairs */) override {
55  if (root_certs.has_value()) {
57  absl::nullopt);
58  }
59  }
60 
61  void OnError(grpc_error_handle root_cert_error,
62  grpc_error_handle identity_cert_error) override {
63  if (!GRPC_ERROR_IS_NONE(root_cert_error)) {
64  parent_->SetErrorForCert(cert_name_, root_cert_error /* pass the ref */,
65  absl::nullopt);
66  }
67  GRPC_ERROR_UNREF(identity_cert_error);
68  }
69 
70  private:
71  RefCountedPtr<grpc_tls_certificate_distributor> parent_;
73 };
74 
75 class IdentityCertificatesWatcher
77  public:
78  // Takes a ref to \a parent instead of a raw pointer since the watcher is
79  // owned by the root certificate distributor and not by \a parent. Note that
80  // presently, the watcher is immediately deleted when
81  // CancelTlsCertificatesWatch() is called, but that can potentially change in
82  // the future.
83  IdentityCertificatesWatcher(
84  RefCountedPtr<grpc_tls_certificate_distributor> parent,
85  std::string cert_name)
86  : parent_(std::move(parent)), cert_name_(std::move(cert_name)) {}
87 
88  void OnCertificatesChanged(
89  absl::optional<absl::string_view> /* root_certs */,
90  absl::optional<PemKeyCertPairList> key_cert_pairs) override {
91  if (key_cert_pairs.has_value()) {
92  parent_->SetKeyMaterials(cert_name_, absl::nullopt, key_cert_pairs);
93  }
94  }
95 
96  void OnError(grpc_error_handle root_cert_error,
97  grpc_error_handle identity_cert_error) override {
98  if (!GRPC_ERROR_IS_NONE(identity_cert_error)) {
99  parent_->SetErrorForCert(cert_name_, absl::nullopt,
100  identity_cert_error /* pass the ref */);
101  }
102  GRPC_ERROR_UNREF(root_cert_error);
103  }
104 
105  private:
106  RefCountedPtr<grpc_tls_certificate_distributor> parent_;
108 };
109 
110 } // namespace
111 
112 //
113 // XdsCertificateProvider::ClusterCertificateState
114 //
115 
117  if (root_cert_watcher_ != nullptr) {
119  }
120  if (identity_cert_watcher_ != nullptr) {
123  }
124 }
125 
127  return !watching_root_certs_ && !watching_identity_certs_ &&
128  root_cert_distributor_ == nullptr &&
129  identity_cert_distributor_ == nullptr;
130 }
131 
134  const std::string& cert_name, absl::string_view root_cert_name,
135  RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor) {
136  if (root_cert_name_ == root_cert_name &&
137  root_cert_distributor_ == root_cert_distributor) {
138  return;
139  }
140  root_cert_name_ = std::string(root_cert_name);
141  if (watching_root_certs_) {
142  // The root certificates are being watched. Swap out the watcher.
143  if (root_cert_distributor_ != nullptr) {
144  root_cert_distributor_->CancelTlsCertificatesWatch(root_cert_watcher_);
145  }
146  if (root_cert_distributor != nullptr) {
147  UpdateRootCertWatcher(cert_name, root_cert_distributor.get());
148  } else {
149  root_cert_watcher_ = nullptr;
150  xds_certificate_provider_->distributor_->SetErrorForCert(
151  "",
153  "No certificate provider available for root certificates"),
154  absl::nullopt);
155  }
156  }
157  // Swap out the root certificate distributor
158  root_cert_distributor_ = std::move(root_cert_distributor);
159 }
160 
163  const std::string& cert_name, absl::string_view identity_cert_name,
165  identity_cert_distributor) {
166  if (identity_cert_name_ == identity_cert_name &&
167  identity_cert_distributor_ == identity_cert_distributor) {
168  return;
169  }
170  identity_cert_name_ = std::string(identity_cert_name);
171  if (watching_identity_certs_) {
172  // The identity certificates are being watched. Swap out the watcher.
173  if (identity_cert_distributor_ != nullptr) {
174  identity_cert_distributor_->CancelTlsCertificatesWatch(
175  identity_cert_watcher_);
176  }
177  if (identity_cert_distributor != nullptr) {
178  UpdateIdentityCertWatcher(cert_name, identity_cert_distributor.get());
179  } else {
180  identity_cert_watcher_ = nullptr;
181  xds_certificate_provider_->distributor_->SetErrorForCert(
182  "", absl::nullopt,
184  "No certificate provider available for identity certificates"));
185  }
186  }
187  // Swap out the identity certificate distributor
188  identity_cert_distributor_ = std::move(identity_cert_distributor);
189 }
190 
192  const std::string& cert_name,
193  grpc_tls_certificate_distributor* root_cert_distributor) {
194  auto watcher = absl::make_unique<RootCertificatesWatcher>(
195  xds_certificate_provider_->distributor_, cert_name);
196  root_cert_watcher_ = watcher.get();
197  root_cert_distributor->WatchTlsCertificates(std::move(watcher),
198  root_cert_name_, absl::nullopt);
199 }
200 
202  const std::string& cert_name,
203  grpc_tls_certificate_distributor* identity_cert_distributor) {
204  auto watcher = absl::make_unique<IdentityCertificatesWatcher>(
205  xds_certificate_provider_->distributor_, cert_name);
206  identity_cert_watcher_ = watcher.get();
207  identity_cert_distributor->WatchTlsCertificates(
208  std::move(watcher), absl::nullopt, identity_cert_name_);
209 }
210 
212  const std::string& cert_name, bool root_being_watched,
213  bool identity_being_watched) {
214  // We aren't specially handling the case where root_cert_distributor is same
215  // as identity_cert_distributor. Always using two separate watchers
216  // irrespective of the fact results in a straightforward design, and using a
217  // single watcher does not seem to provide any benefit other than cutting down
218  // on the number of callbacks.
219  if (root_being_watched && !watching_root_certs_) {
220  // We need to start watching root certs.
221  watching_root_certs_ = true;
222  if (root_cert_distributor_ == nullptr) {
223  xds_certificate_provider_->distributor_->SetErrorForCert(
224  cert_name,
226  "No certificate provider available for root certificates"),
227  absl::nullopt);
228  } else {
229  UpdateRootCertWatcher(cert_name, root_cert_distributor_.get());
230  }
231  } else if (!root_being_watched && watching_root_certs_) {
232  // We need to cancel root certs watch.
233  watching_root_certs_ = false;
234  if (root_cert_distributor_ != nullptr) {
235  root_cert_distributor_->CancelTlsCertificatesWatch(root_cert_watcher_);
236  root_cert_watcher_ = nullptr;
237  }
238  GPR_ASSERT(root_cert_watcher_ == nullptr);
239  }
240  if (identity_being_watched && !watching_identity_certs_) {
241  watching_identity_certs_ = true;
242  if (identity_cert_distributor_ == nullptr) {
243  xds_certificate_provider_->distributor_->SetErrorForCert(
244  cert_name, absl::nullopt,
246  "No certificate provider available for identity certificates"));
247  } else {
248  UpdateIdentityCertWatcher(cert_name, identity_cert_distributor_.get());
249  }
250  } else if (!identity_being_watched && watching_identity_certs_) {
251  watching_identity_certs_ = false;
252  if (identity_cert_distributor_ != nullptr) {
253  identity_cert_distributor_->CancelTlsCertificatesWatch(
254  identity_cert_watcher_);
255  identity_cert_watcher_ = nullptr;
256  }
257  GPR_ASSERT(identity_cert_watcher_ == nullptr);
258  }
259 }
260 
261 //
262 // XdsCertificateProvider
263 //
264 
269 }
270 
273 }
274 
276  static UniqueTypeName::Factory kFactory("Xds");
277  return kFactory.Create();
278 }
279 
281  MutexLock lock(&mu_);
282  auto it = certificate_state_map_.find(cert_name);
283  if (it == certificate_state_map_.end()) return false;
284  return it->second->ProvidesRootCerts();
285 }
286 
288  const std::string& cert_name, absl::string_view root_cert_name,
289  RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor) {
290  MutexLock lock(&mu_);
291  auto it = certificate_state_map_.find(cert_name);
292  if (it == certificate_state_map_.end()) {
293  it = certificate_state_map_
294  .emplace(cert_name,
295  absl::make_unique<ClusterCertificateState>(this))
296  .first;
297  }
298  it->second->UpdateRootCertNameAndDistributor(cert_name, root_cert_name,
299  root_cert_distributor);
300  // Delete unused entries.
301  if (it->second->IsSafeToRemove()) certificate_state_map_.erase(it);
302 }
303 
305  const std::string& cert_name) {
306  MutexLock lock(&mu_);
307  auto it = certificate_state_map_.find(cert_name);
308  if (it == certificate_state_map_.end()) return false;
309  return it->second->ProvidesIdentityCerts();
310 }
311 
313  const std::string& cert_name, absl::string_view identity_cert_name,
314  RefCountedPtr<grpc_tls_certificate_distributor> identity_cert_distributor) {
315  MutexLock lock(&mu_);
316  auto it = certificate_state_map_.find(cert_name);
317  if (it == certificate_state_map_.end()) {
318  it = certificate_state_map_
319  .emplace(cert_name,
320  absl::make_unique<ClusterCertificateState>(this))
321  .first;
322  }
323  it->second->UpdateIdentityCertNameAndDistributor(
324  cert_name, identity_cert_name, identity_cert_distributor);
325  // Delete unused entries.
326  if (it->second->IsSafeToRemove()) certificate_state_map_.erase(it);
327 }
328 
330  const std::string& cert_name) {
331  MutexLock lock(&mu_);
332  auto it = certificate_state_map_.find(cert_name);
333  if (it == certificate_state_map_.end()) return false;
334  return it->second->require_client_certificate();
335 }
336 
338  const std::string& cert_name, bool require_client_certificate) {
339  MutexLock lock(&mu_);
340  auto it = certificate_state_map_.find(cert_name);
341  if (it == certificate_state_map_.end()) return;
342  it->second->set_require_client_certificate(require_client_certificate);
343 }
344 
345 std::vector<StringMatcher> XdsCertificateProvider::GetSanMatchers(
346  const std::string& cluster) {
348  auto it = san_matcher_map_.find(cluster);
349  if (it == san_matcher_map_.end()) return {};
350  return it->second;
351 }
352 
354  const std::string& cluster, std::vector<StringMatcher> matchers) {
356  if (matchers.empty()) {
357  san_matcher_map_.erase(cluster);
358  } else {
359  san_matcher_map_[cluster] = std::move(matchers);
360  }
361 }
362 
364  bool root_being_watched,
365  bool identity_being_watched) {
366  MutexLock lock(&mu_);
367  auto it = certificate_state_map_.find(cert_name);
368  if (it == certificate_state_map_.end()) {
369  it = certificate_state_map_
370  .emplace(cert_name,
371  absl::make_unique<ClusterCertificateState>(this))
372  .first;
373  }
374  it->second->WatchStatusCallback(cert_name, root_being_watched,
375  identity_being_watched);
376  // Delete unused entries.
377  if (it->second->IsSafeToRemove()) certificate_state_map_.erase(it);
378 }
379 
380 namespace {
381 
382 void* XdsCertificateProviderArgCopy(void* p) {
383  XdsCertificateProvider* xds_certificate_provider =
384  static_cast<XdsCertificateProvider*>(p);
385  return xds_certificate_provider->Ref().release();
386 }
387 
388 void XdsCertificateProviderArgDestroy(void* p) {
389  XdsCertificateProvider* xds_certificate_provider =
390  static_cast<XdsCertificateProvider*>(p);
391  xds_certificate_provider->Unref();
392 }
393 
394 int XdsCertificateProviderArgCmp(void* p, void* q) {
395  return QsortCompare(p, q);
396 }
397 
398 const grpc_arg_pointer_vtable kChannelArgVtable = {
399  XdsCertificateProviderArgCopy, XdsCertificateProviderArgDestroy,
400  XdsCertificateProviderArgCmp};
401 
402 } // namespace
403 
406  const_cast<char*>(GRPC_ARG_XDS_CERTIFICATE_PROVIDER),
407  const_cast<XdsCertificateProvider*>(this), &kChannelArgVtable);
408 }
409 
412  XdsCertificateProvider* xds_certificate_provider =
413  grpc_channel_args_find_pointer<XdsCertificateProvider>(
415  return xds_certificate_provider != nullptr ? xds_certificate_provider->Ref()
416  : nullptr;
417 }
418 
419 } // namespace grpc_core
grpc_arg
Definition: grpc_types.h:103
grpc_core::XdsCertificateProvider::ClusterCertificateState::IsSafeToRemove
bool IsSafeToRemove() const
Definition: xds_certificate_provider.cc:126
grpc_core::UniqueTypeName::Factory::Create
UniqueTypeName Create()
Definition: unique_type_name.h:67
grpc_core::MakeRefCounted
RefCountedPtr< T > MakeRefCounted(Args &&... args)
Definition: ref_counted_ptr.h:335
regen-readme.it
it
Definition: regen-readme.py:15
grpc_core::XdsCertificateProvider::mu_
Mutex mu_
Definition: xds_certificate_provider.h:155
log.h
grpc_core::XdsCertificateProvider::ClusterCertificateState::identity_cert_distributor_
RefCountedPtr< grpc_tls_certificate_distributor > identity_cert_distributor_
Definition: xds_certificate_provider.h:136
grpc_core::RefCountedPtr::get
T * get() const
Definition: ref_counted_ptr.h:146
absl::bind_front
constexpr ABSL_NAMESPACE_BEGIN functional_internal::bind_front_t< F, BoundArgs... > bind_front(F &&func, BoundArgs &&... args)
Definition: abseil-cpp/absl/functional/bind_front.h:182
grpc_core::XdsCertificateProvider::UpdateRootCertNameAndDistributor
void UpdateRootCertNameAndDistributor(const std::string &cert_name, absl::string_view root_cert_name, RefCountedPtr< grpc_tls_certificate_distributor > root_cert_distributor)
Definition: xds_certificate_provider.cc:287
grpc_core::XdsCertificateProvider::ClusterCertificateState::UpdateRootCertWatcher
void UpdateRootCertWatcher(const std::string &cert_name, grpc_tls_certificate_distributor *root_cert_distributor)
Definition: xds_certificate_provider.cc:191
grpc_core
Definition: call_metric_recorder.h:31
grpc_core::MutexLock
Definition: src/core/lib/gprpp/sync.h:88
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
matchers
XdsRouteConfigResource::Route::Matchers matchers
Definition: xds_server_config_fetcher.cc:317
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
grpc_core::XdsCertificateProvider::ClusterCertificateState::root_cert_watcher_
grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface * root_cert_watcher_
Definition: xds_certificate_provider.h:138
grpc_core::XdsCertificateProvider::GetRequireClientCertificate
bool GetRequireClientCertificate(const std::string &cert_name)
Definition: xds_certificate_provider.cc:329
grpc_tls_certificate_distributor
Definition: grpc_tls_certificate_distributor.h:43
grpc_core::XdsCertificateProvider::ProvidesRootCerts
bool ProvidesRootCerts(const std::string &cert_name)
Definition: xds_certificate_provider.cc:280
grpc_core::RefCountedPtr::release
T * release()
Definition: ref_counted_ptr.h:140
grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface
Definition: grpc_tls_certificate_distributor.h:47
grpc_arg_pointer_vtable
Definition: grpc_types.h:85
grpc_channel_args
Definition: grpc_types.h:132
grpc_core::XdsCertificateProvider::ClusterCertificateState::UpdateRootCertNameAndDistributor
void UpdateRootCertNameAndDistributor(const std::string &cert_name, absl::string_view root_cert_name, RefCountedPtr< grpc_tls_certificate_distributor > root_cert_distributor)
Definition: xds_certificate_provider.cc:133
grpc_tls_certificate_distributor::WatchTlsCertificates
void WatchTlsCertificates(std::unique_ptr< TlsCertificatesWatcherInterface > watcher, absl::optional< std::string > root_cert_name, absl::optional< std::string > identity_cert_name)
Definition: grpc_tls_certificate_distributor.cc:176
grpc_tls_certificate_distributor::SetKeyMaterials
void SetKeyMaterials(const std::string &cert_name, absl::optional< std::string > pem_root_certs, absl::optional< grpc_core::PemKeyCertPairList > pem_key_cert_pairs)
Definition: grpc_tls_certificate_distributor.cc:27
grpc_core::RefCounted::Unref
void Unref()
Definition: ref_counted.h:302
grpc_core::XdsCertificateProvider::GetFromChannelArgs
static RefCountedPtr< XdsCertificateProvider > GetFromChannelArgs(const grpc_channel_args *args)
Definition: xds_certificate_provider.cc:411
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
grpc_core::XdsCertificateProvider::ClusterCertificateState::~ClusterCertificateState
~ClusterCertificateState()
Definition: xds_certificate_provider.cc:116
grpc_core::RefCountedPtr< grpc_tls_certificate_distributor >
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
cluster
absl::string_view cluster
Definition: xds_resolver.cc:331
grpc_core::XdsCertificateProvider::ClusterCertificateState::WatchStatusCallback
void WatchStatusCallback(const std::string &cert_name, bool root_being_watched, bool identity_being_watched)
Definition: xds_certificate_provider.cc:211
absl::optional::has_value
constexpr bool has_value() const noexcept
Definition: abseil-cpp/absl/types/optional.h:461
grpc_core::XdsCertificateProvider::ClusterCertificateState::identity_cert_watcher_
grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface * identity_cert_watcher_
Definition: xds_certificate_provider.h:140
grpc_core::XdsCertificateProvider::GetSanMatchers
std::vector< StringMatcher > GetSanMatchers(const std::string &cluster)
Definition: xds_certificate_provider.cc:345
grpc_core::XdsCertificateProvider::ClusterCertificateState::UpdateIdentityCertNameAndDistributor
void UpdateIdentityCertNameAndDistributor(const std::string &cert_name, absl::string_view identity_cert_name, RefCountedPtr< grpc_tls_certificate_distributor > identity_cert_distributor)
Definition: xds_certificate_provider.cc:162
grpc_core::XdsCertificateProvider::san_matchers_mu_
Mutex san_matchers_mu_
Definition: xds_certificate_provider.h:167
absl::optional< absl::string_view >
xds_certificate_provider_
RefCountedPtr< XdsCertificateProvider > xds_certificate_provider_
Definition: cds.cc:205
parent_
RefCountedPtr< grpc_tls_certificate_distributor > parent_
Definition: xds_certificate_provider.cc:71
gen_settings_ids.OnError
OnError
Definition: gen_settings_ids.py:27
GRPC_ARG_XDS_CERTIFICATE_PROVIDER
#define GRPC_ARG_XDS_CERTIFICATE_PROVIDER
Definition: xds_certificate_provider.h:43
grpc_core::XdsCertificateProvider::UpdateSubjectAlternativeNameMatchers
void UpdateSubjectAlternativeNameMatchers(const std::string &cluster, std::vector< StringMatcher > matchers)
Definition: xds_certificate_provider.cc:353
grpc_tls_certificate_distributor::SetErrorForCert
void SetErrorForCert(const std::string &cert_name, absl::optional< grpc_error_handle > root_cert_error, absl::optional< grpc_error_handle > identity_cert_error)
Definition: grpc_tls_certificate_distributor.cc:102
error.h
grpc_core::XdsCertificateProvider::distributor_
RefCountedPtr< grpc_tls_certificate_distributor > distributor_
Definition: xds_certificate_provider.h:153
GRPC_ERROR_CREATE_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
Definition: error.h:291
grpc_core::XdsCertificateProvider::WatchStatusCallback
void WatchStatusCallback(std::string cert_name, bool root_being_watched, bool identity_being_watched)
Definition: xds_certificate_provider.cc:363
grpc_core::XdsCertificateProvider::~XdsCertificateProvider
~XdsCertificateProvider() override
Definition: xds_certificate_provider.cc:271
grpc_core::XdsCertificateProvider
Definition: xds_certificate_provider.h:48
absl::optional::value
constexpr const T & value() const &
Definition: abseil-cpp/absl/types/optional.h:475
grpc_tls_certificate_distributor::CancelTlsCertificatesWatch
void CancelTlsCertificatesWatch(TlsCertificatesWatcherInterface *watcher)
Definition: grpc_tls_certificate_distributor.cc:264
grpc_core::XdsCertificateProvider::ClusterCertificateState::UpdateIdentityCertWatcher
void UpdateIdentityCertWatcher(const std::string &cert_name, grpc_tls_certificate_distributor *identity_cert_distributor)
Definition: xds_certificate_provider.cc:201
grpc_core::UniqueTypeName
Definition: unique_type_name.h:56
grpc_core::QsortCompare
int QsortCompare(const T &a, const T &b)
Definition: useful.h:95
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
grpc_core::XdsCertificateProvider::UpdateIdentityCertNameAndDistributor
void UpdateIdentityCertNameAndDistributor(const std::string &cert_name, absl::string_view identity_cert_name, RefCountedPtr< grpc_tls_certificate_distributor > identity_cert_distributor)
Definition: xds_certificate_provider.cc:312
GRPC_ERROR_UNREF
#define GRPC_ERROR_UNREF(err)
Definition: error.h:262
watcher
ClusterWatcher * watcher
Definition: cds.cc:148
channel_args.h
xds_certificate_provider.h
grpc_core::XdsCertificateProvider::UpdateRequireClientCertificate
void UpdateRequireClientCertificate(const std::string &cert_name, bool require_client_certificate)
Definition: xds_certificate_provider.cc:337
cert_name_
std::string cert_name_
Definition: xds_certificate_provider.cc:72
grpc_core::XdsCertificateProvider::XdsCertificateProvider
XdsCertificateProvider()
Definition: xds_certificate_provider.cc:265
grpc_error
Definition: error_internal.h:42
grpc_core::XdsCertificateProvider::MakeChannelArg
grpc_arg MakeChannelArg() const
Definition: xds_certificate_provider.cc:404
grpc_core::XdsCertificateProvider::ClusterCertificateState::root_cert_distributor_
RefCountedPtr< grpc_tls_certificate_distributor > root_cert_distributor_
Definition: xds_certificate_provider.h:135
grpc_core::XdsCertificateProvider::type
UniqueTypeName type() const override
Definition: xds_certificate_provider.cc:275
grpc_core::UniqueTypeName::Factory
Definition: unique_type_name.h:60
grpc_channel_arg_pointer_create
grpc_arg grpc_channel_arg_pointer_create(char *name, void *value, const grpc_arg_pointer_vtable *vtable)
Definition: channel_args.cc:492
grpc_core::XdsCertificateProvider::ProvidesIdentityCerts
bool ProvidesIdentityCerts(const std::string &cert_name)
Definition: xds_certificate_provider.cc:304
ssl_utils.h
grpc_tls_certificate_distributor::SetWatchStatusCallback
void SetWatchStatusCallback(std::function< void(std::string, bool, bool)> callback)
Definition: grpc_tls_certificate_distributor.h:133
grpc_core::RefCounted::Ref
RefCountedPtr< Child > Ref() GRPC_MUST_USE_RESULT
Definition: ref_counted.h:287
GRPC_ERROR_IS_NONE
#define GRPC_ERROR_IS_NONE(err)
Definition: error.h:241
port_platform.h


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:57