secure_endpoint.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2015 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 <inttypes.h>
24 
25 #include <algorithm>
26 #include <atomic>
27 #include <memory>
28 
29 #include "absl/base/thread_annotations.h"
30 #include "absl/strings/str_cat.h"
31 #include "absl/strings/string_view.h"
32 #include "absl/types/optional.h"
33 
36 #include <grpc/slice.h>
37 #include <grpc/slice_buffer.h>
38 #include <grpc/support/alloc.h>
39 #include <grpc/support/atm.h>
40 #include <grpc/support/log.h>
41 #include <grpc/support/sync.h>
42 
64 
65 #define STAGING_BUFFER_SIZE 8192
66 
67 static void on_read(void* user_data, grpc_error_handle error);
68 
69 namespace {
70 struct secure_endpoint {
71  secure_endpoint(const grpc_endpoint_vtable* vtable,
72  tsi_frame_protector* protector,
73  tsi_zero_copy_grpc_protector* zero_copy_protector,
74  grpc_endpoint* transport, grpc_slice* leftover_slices,
75  const grpc_channel_args* channel_args,
76  size_t leftover_nslices)
77  : wrapped_ep(transport),
78  protector(protector),
79  zero_copy_protector(zero_copy_protector) {
80  base.vtable = vtable;
81  gpr_mu_init(&protector_mu);
82  GRPC_CLOSURE_INIT(&on_read, ::on_read, this, grpc_schedule_on_exec_ctx);
83  grpc_slice_buffer_init(&source_buffer);
84  grpc_slice_buffer_init(&leftover_bytes);
85  for (size_t i = 0; i < leftover_nslices; i++) {
86  grpc_slice_buffer_add(&leftover_bytes,
87  grpc_slice_ref_internal(leftover_slices[i]));
88  }
89  grpc_slice_buffer_init(&output_buffer);
90  memory_owner =
92  ->memory_quota()
93  ->CreateMemoryOwner(absl::StrCat(grpc_endpoint_get_peer(transport),
94  ":secure_endpoint"));
95  self_reservation = memory_owner.MakeReservation(sizeof(*this));
96  if (zero_copy_protector) {
97  read_staging_buffer = grpc_empty_slice();
98  write_staging_buffer = grpc_empty_slice();
99  } else {
100  read_staging_buffer =
101  memory_owner.MakeSlice(grpc_core::MemoryRequest(STAGING_BUFFER_SIZE));
102  write_staging_buffer =
103  memory_owner.MakeSlice(grpc_core::MemoryRequest(STAGING_BUFFER_SIZE));
104  }
105  has_posted_reclaimer.store(false, std::memory_order_relaxed);
106  min_progress_size = 1;
107  grpc_slice_buffer_init(&protector_staging_buffer);
108  gpr_ref_init(&ref, 1);
109  }
110 
111  ~secure_endpoint() {
112  grpc_endpoint_destroy(wrapped_ep);
113  tsi_frame_protector_destroy(protector);
114  tsi_zero_copy_grpc_protector_destroy(zero_copy_protector);
115  grpc_slice_buffer_destroy_internal(&source_buffer);
116  grpc_slice_buffer_destroy_internal(&leftover_bytes);
117  grpc_slice_unref_internal(read_staging_buffer);
118  grpc_slice_unref_internal(write_staging_buffer);
119  grpc_slice_buffer_destroy_internal(&output_buffer);
120  grpc_slice_buffer_destroy_internal(&protector_staging_buffer);
121  gpr_mu_destroy(&protector_mu);
122  }
123 
125  grpc_endpoint* wrapped_ep;
126  struct tsi_frame_protector* protector;
127  struct tsi_zero_copy_grpc_protector* zero_copy_protector;
128  gpr_mu protector_mu;
129  grpc_core::Mutex read_mu;
130  grpc_core::Mutex write_mu;
131  /* saved upper level callbacks and user_data. */
132  grpc_closure* read_cb = nullptr;
133  grpc_closure* write_cb = nullptr;
135  grpc_slice_buffer* read_buffer = nullptr;
136  grpc_slice_buffer source_buffer;
137  /* saved handshaker leftover data to unprotect. */
138  grpc_slice_buffer leftover_bytes;
139  /* buffers for read and write */
140  grpc_slice read_staging_buffer ABSL_GUARDED_BY(read_mu);
141  grpc_slice write_staging_buffer ABSL_GUARDED_BY(write_mu);
142  grpc_slice_buffer output_buffer;
143  grpc_core::MemoryOwner memory_owner;
145  std::atomic<bool> has_posted_reclaimer;
146  int min_progress_size;
147  grpc_slice_buffer protector_staging_buffer;
149 };
150 } // namespace
151 
152 grpc_core::TraceFlag grpc_trace_secure_endpoint(false, "secure_endpoint");
153 
154 static void destroy(secure_endpoint* ep) { delete ep; }
155 
156 #ifndef NDEBUG
157 #define SECURE_ENDPOINT_UNREF(ep, reason) \
158  secure_endpoint_unref((ep), (reason), __FILE__, __LINE__)
159 #define SECURE_ENDPOINT_REF(ep, reason) \
160  secure_endpoint_ref((ep), (reason), __FILE__, __LINE__)
161 static void secure_endpoint_unref(secure_endpoint* ep, const char* reason,
162  const char* file, int line) {
164  gpr_atm val = gpr_atm_no_barrier_load(&ep->ref.count);
166  "SECENDP unref %p : %s %" PRIdPTR " -> %" PRIdPTR, ep, reason, val,
167  val - 1);
168  }
169  if (gpr_unref(&ep->ref)) {
170  destroy(ep);
171  }
172 }
173 
174 static void secure_endpoint_ref(secure_endpoint* ep, const char* reason,
175  const char* file, int line) {
177  gpr_atm val = gpr_atm_no_barrier_load(&ep->ref.count);
179  "SECENDP ref %p : %s %" PRIdPTR " -> %" PRIdPTR, ep, reason, val,
180  val + 1);
181  }
182  gpr_ref(&ep->ref);
183 }
184 #else
185 #define SECURE_ENDPOINT_UNREF(ep, reason) secure_endpoint_unref((ep))
186 #define SECURE_ENDPOINT_REF(ep, reason) secure_endpoint_ref((ep))
187 static void secure_endpoint_unref(secure_endpoint* ep) {
188  if (gpr_unref(&ep->ref)) {
189  destroy(ep);
190  }
191 }
192 
193 static void secure_endpoint_ref(secure_endpoint* ep) { gpr_ref(&ep->ref); }
194 #endif
195 
196 static void maybe_post_reclaimer(secure_endpoint* ep) {
197  if (!ep->has_posted_reclaimer) {
198  SECURE_ENDPOINT_REF(ep, "benign_reclaimer");
199  ep->has_posted_reclaimer.exchange(true, std::memory_order_relaxed);
200  ep->memory_owner.PostReclaimer(
203  if (sweep.has_value()) {
204  if (GRPC_TRACE_FLAG_ENABLED(grpc_resource_quota_trace)) {
205  gpr_log(GPR_INFO,
206  "secure endpoint: benign reclamation to free memory");
207  }
208  grpc_slice temp_read_slice;
209  grpc_slice temp_write_slice;
210 
211  ep->read_mu.Lock();
212  temp_read_slice = ep->read_staging_buffer;
213  ep->read_staging_buffer = grpc_empty_slice();
214  ep->read_mu.Unlock();
215 
216  ep->write_mu.Lock();
217  temp_write_slice = ep->write_staging_buffer;
218  ep->write_staging_buffer = grpc_empty_slice();
219  ep->write_mu.Unlock();
220 
221  grpc_slice_unref_internal(temp_read_slice);
222  grpc_slice_unref_internal(temp_write_slice);
223  ep->has_posted_reclaimer.exchange(false, std::memory_order_relaxed);
224  }
225  SECURE_ENDPOINT_UNREF(ep, "benign_reclaimer");
226  });
227  }
228 }
229 
230 static void flush_read_staging_buffer(secure_endpoint* ep, uint8_t** cur,
231  uint8_t** end)
232  ABSL_EXCLUSIVE_LOCKS_REQUIRED(ep->read_mu) {
233  grpc_slice_buffer_add_indexed(ep->read_buffer, ep->read_staging_buffer);
234  ep->read_staging_buffer =
235  ep->memory_owner.MakeSlice(grpc_core::MemoryRequest(STAGING_BUFFER_SIZE));
236  *cur = GRPC_SLICE_START_PTR(ep->read_staging_buffer);
237  *end = GRPC_SLICE_END_PTR(ep->read_staging_buffer);
238 }
239 
240 static void call_read_cb(secure_endpoint* ep, grpc_error_handle error) {
242  size_t i;
243  for (i = 0; i < ep->read_buffer->count; i++) {
244  char* data = grpc_dump_slice(ep->read_buffer->slices[i],
246  gpr_log(GPR_INFO, "READ %p: %s", ep, data);
247  gpr_free(data);
248  }
249  }
250  ep->read_buffer = nullptr;
252  SECURE_ENDPOINT_UNREF(ep, "read");
253 }
254 
255 static void on_read(void* user_data, grpc_error_handle error) {
256  unsigned i;
257  uint8_t keep_looping = 0;
259  secure_endpoint* ep = static_cast<secure_endpoint*>(user_data);
260 
261  {
262  grpc_core::MutexLock l(&ep->read_mu);
263  uint8_t* cur = GRPC_SLICE_START_PTR(ep->read_staging_buffer);
264  uint8_t* end = GRPC_SLICE_END_PTR(ep->read_staging_buffer);
265 
266  if (!GRPC_ERROR_IS_NONE(error)) {
269  "Secure read failed", &error, 1));
270  return;
271  }
272 
273  if (ep->zero_copy_protector != nullptr) {
274  // Use zero-copy grpc protector to unprotect.
275  int min_progress_size = 1;
276  // Get the size of the last frame which is not yet fully decrypted.
277  // This estimated frame size is stored in ep->min_progress_size which is
278  // passed to the TCP layer to indicate the minimum number of
279  // bytes that need to be read to make meaningful progress. This would
280  // avoid reading of small slices from the network.
281  // TODO(vigneshbabu): Set min_progress_size in the regular (non-zero-copy)
282  // frame protector code path as well.
284  ep->zero_copy_protector, &ep->source_buffer, ep->read_buffer,
285  &min_progress_size);
286  min_progress_size = std::max(1, min_progress_size);
287  ep->min_progress_size = result != TSI_OK ? 1 : min_progress_size;
288  } else {
289  // Use frame protector to unprotect.
290  /* TODO(yangg) check error, maybe bail out early */
291  for (i = 0; i < ep->source_buffer.count; i++) {
292  grpc_slice encrypted = ep->source_buffer.slices[i];
293  uint8_t* message_bytes = GRPC_SLICE_START_PTR(encrypted);
294  size_t message_size = GRPC_SLICE_LENGTH(encrypted);
295 
296  while (message_size > 0 || keep_looping) {
297  size_t unprotected_buffer_size_written =
298  static_cast<size_t>(end - cur);
299  size_t processed_message_size = message_size;
300  gpr_mu_lock(&ep->protector_mu);
302  ep->protector, message_bytes, &processed_message_size, cur,
303  &unprotected_buffer_size_written);
304  gpr_mu_unlock(&ep->protector_mu);
305  if (result != TSI_OK) {
306  gpr_log(GPR_ERROR, "Decryption error: %s",
308  break;
309  }
310  message_bytes += processed_message_size;
311  message_size -= processed_message_size;
312  cur += unprotected_buffer_size_written;
313 
314  if (cur == end) {
316  /* Force to enter the loop again to extract buffered bytes in
317  protector. The bytes could be buffered because of running out of
318  staging_buffer. If this happens at the end of all slices, doing
319  another unprotect avoids leaving data in the protector. */
320  keep_looping = 1;
321  } else if (unprotected_buffer_size_written > 0) {
322  keep_looping = 1;
323  } else {
324  keep_looping = 0;
325  }
326  }
327  if (result != TSI_OK) break;
328  }
329 
330  if (cur != GRPC_SLICE_START_PTR(ep->read_staging_buffer)) {
332  ep->read_buffer,
334  &ep->read_staging_buffer,
335  static_cast<size_t>(
336  cur - GRPC_SLICE_START_PTR(ep->read_staging_buffer))));
337  }
338  }
339  }
340 
341  /* TODO(yangg) experiment with moving this block after read_cb to see if it
342  helps latency */
343  grpc_slice_buffer_reset_and_unref_internal(&ep->source_buffer);
344 
345  if (result != TSI_OK) {
347  call_read_cb(
349  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Unwrap failed"), result));
350  return;
351  }
352 
354 }
355 
357  grpc_closure* cb, bool urgent,
358  int /*min_progress_size*/) {
359  secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
360  ep->read_cb = cb;
361  ep->read_buffer = slices;
363 
364  SECURE_ENDPOINT_REF(ep, "read");
365  if (ep->leftover_bytes.count) {
366  grpc_slice_buffer_swap(&ep->leftover_bytes, &ep->source_buffer);
367  GPR_ASSERT(ep->leftover_bytes.count == 0);
369  return;
370  }
371 
372  grpc_endpoint_read(ep->wrapped_ep, &ep->source_buffer, &ep->on_read, urgent,
373  /*min_progress_size=*/ep->min_progress_size);
374 }
375 
376 static void flush_write_staging_buffer(secure_endpoint* ep, uint8_t** cur,
377  uint8_t** end)
378  ABSL_EXCLUSIVE_LOCKS_REQUIRED(ep->write_mu) {
379  grpc_slice_buffer_add_indexed(&ep->output_buffer, ep->write_staging_buffer);
380  ep->write_staging_buffer =
381  ep->memory_owner.MakeSlice(grpc_core::MemoryRequest(STAGING_BUFFER_SIZE));
382  *cur = GRPC_SLICE_START_PTR(ep->write_staging_buffer);
383  *end = GRPC_SLICE_END_PTR(ep->write_staging_buffer);
385 }
386 
388  grpc_closure* cb, void* arg, int max_frame_size) {
389  GPR_TIMER_SCOPE("secure_endpoint.endpoint_write", 0);
390 
391  unsigned i;
393  secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
394 
395  {
396  grpc_core::MutexLock l(&ep->write_mu);
397  uint8_t* cur = GRPC_SLICE_START_PTR(ep->write_staging_buffer);
398  uint8_t* end = GRPC_SLICE_END_PTR(ep->write_staging_buffer);
399 
400  grpc_slice_buffer_reset_and_unref_internal(&ep->output_buffer);
401 
403  for (i = 0; i < slices->count; i++) {
404  char* data =
406  gpr_log(GPR_INFO, "WRITE %p: %s", ep, data);
407  gpr_free(data);
408  }
409  }
410 
411  if (ep->zero_copy_protector != nullptr) {
412  // Use zero-copy grpc protector to protect.
413  result = TSI_OK;
414  // Break the input slices into chunks of size = max_frame_size and call
415  // tsi_zero_copy_grpc_protector_protect on each chunk. This ensures that
416  // the protector cannot create frames larger than the specified
417  // max_frame_size.
418  while (slices->length > static_cast<size_t>(max_frame_size) &&
419  result == TSI_OK) {
421  static_cast<size_t>(max_frame_size),
422  &ep->protector_staging_buffer);
424  ep->zero_copy_protector, &ep->protector_staging_buffer,
425  &ep->output_buffer);
426  }
427  if (result == TSI_OK && slices->length > 0) {
429  ep->zero_copy_protector, slices, &ep->output_buffer);
430  }
431  grpc_slice_buffer_reset_and_unref_internal(&ep->protector_staging_buffer);
432  } else {
433  // Use frame protector to protect.
434  for (i = 0; i < slices->count; i++) {
435  grpc_slice plain = slices->slices[i];
436  uint8_t* message_bytes = GRPC_SLICE_START_PTR(plain);
437  size_t message_size = GRPC_SLICE_LENGTH(plain);
438  while (message_size > 0) {
439  size_t protected_buffer_size_to_send = static_cast<size_t>(end - cur);
440  size_t processed_message_size = message_size;
441  gpr_mu_lock(&ep->protector_mu);
442  result = tsi_frame_protector_protect(ep->protector, message_bytes,
443  &processed_message_size, cur,
444  &protected_buffer_size_to_send);
445  gpr_mu_unlock(&ep->protector_mu);
446  if (result != TSI_OK) {
447  gpr_log(GPR_ERROR, "Encryption error: %s",
449  break;
450  }
451  message_bytes += processed_message_size;
452  message_size -= processed_message_size;
453  cur += protected_buffer_size_to_send;
454 
455  if (cur == end) {
457  }
458  }
459  if (result != TSI_OK) break;
460  }
461  if (result == TSI_OK) {
462  size_t still_pending_size;
463  do {
464  size_t protected_buffer_size_to_send = static_cast<size_t>(end - cur);
465  gpr_mu_lock(&ep->protector_mu);
467  ep->protector, cur, &protected_buffer_size_to_send,
468  &still_pending_size);
469  gpr_mu_unlock(&ep->protector_mu);
470  if (result != TSI_OK) break;
471  cur += protected_buffer_size_to_send;
472  if (cur == end) {
474  }
475  } while (still_pending_size > 0);
476  if (cur != GRPC_SLICE_START_PTR(ep->write_staging_buffer)) {
478  &ep->output_buffer,
480  &ep->write_staging_buffer,
481  static_cast<size_t>(
482  cur - GRPC_SLICE_START_PTR(ep->write_staging_buffer))));
483  }
484  }
485  }
486  }
487 
488  if (result != TSI_OK) {
489  /* TODO(yangg) do different things according to the error type? */
490  grpc_slice_buffer_reset_and_unref_internal(&ep->output_buffer);
495  return;
496  }
497 
498  grpc_endpoint_write(ep->wrapped_ep, &ep->output_buffer, cb, arg,
499  max_frame_size);
500 }
501 
502 static void endpoint_shutdown(grpc_endpoint* secure_ep, grpc_error_handle why) {
503  secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
504  grpc_endpoint_shutdown(ep->wrapped_ep, why);
505 }
506 
507 static void endpoint_destroy(grpc_endpoint* secure_ep) {
508  secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
509  ep->memory_owner.Reset();
510  SECURE_ENDPOINT_UNREF(ep, "destroy");
511 }
512 
513 static void endpoint_add_to_pollset(grpc_endpoint* secure_ep,
514  grpc_pollset* pollset) {
515  secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
516  grpc_endpoint_add_to_pollset(ep->wrapped_ep, pollset);
517 }
518 
520  grpc_pollset_set* pollset_set) {
521  secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
522  grpc_endpoint_add_to_pollset_set(ep->wrapped_ep, pollset_set);
523 }
524 
526  grpc_pollset_set* pollset_set) {
527  secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
528  grpc_endpoint_delete_from_pollset_set(ep->wrapped_ep, pollset_set);
529 }
530 
532  secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
533  return grpc_endpoint_get_peer(ep->wrapped_ep);
534 }
535 
537  secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
538  return grpc_endpoint_get_local_address(ep->wrapped_ep);
539 }
540 
541 static int endpoint_get_fd(grpc_endpoint* secure_ep) {
542  secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
543  return grpc_endpoint_get_fd(ep->wrapped_ep);
544 }
545 
546 static bool endpoint_can_track_err(grpc_endpoint* secure_ep) {
547  secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
548  return grpc_endpoint_can_track_err(ep->wrapped_ep);
549 }
550 
562 
564  struct tsi_frame_protector* protector,
565  struct tsi_zero_copy_grpc_protector* zero_copy_protector,
566  grpc_endpoint* to_wrap, grpc_slice* leftover_slices,
567  const grpc_channel_args* channel_args, size_t leftover_nslices) {
568  secure_endpoint* ep =
569  new secure_endpoint(&vtable, protector, zero_copy_protector, to_wrap,
570  leftover_slices, channel_args, leftover_nslices);
571  return &ep->base;
572 }
flush_write_staging_buffer
static void flush_write_staging_buffer(secure_endpoint *ep, uint8_t **cur, uint8_t **end) ABSL_EXCLUSIVE_LOCKS_REQUIRED(ep -> write_mu)
Definition: secure_endpoint.cc:376
GRPC_CLOSURE_INIT
#define GRPC_CLOSURE_INIT(closure, cb, cb_arg, scheduler)
Definition: closure.h:115
trace.h
maybe_post_reclaimer
static void maybe_post_reclaimer(secure_endpoint *ep)
Definition: secure_endpoint.cc:196
grpc_core::MemoryOwner
Definition: memory_quota.h:381
on_read
static void on_read(void *user_data, grpc_error_handle error)
Definition: secure_endpoint.cc:255
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
GPR_INFO
#define GPR_INFO
Definition: include/grpc/impl/codegen/log.h:56
endpoint_add_to_pollset_set
static void endpoint_add_to_pollset_set(grpc_endpoint *secure_ep, grpc_pollset_set *pollset_set)
Definition: secure_endpoint.cc:519
grpc_endpoint_vtable
Definition: endpoint.h:39
gpr_mu_unlock
GPRAPI void gpr_mu_unlock(gpr_mu *mu)
pollset.h
tsi_zero_copy_grpc_protector_unprotect
tsi_result tsi_zero_copy_grpc_protector_unprotect(tsi_zero_copy_grpc_protector *self, grpc_slice_buffer *protected_slices, grpc_slice_buffer *unprotected_slices, int *min_progress_size)
Definition: transport_security_grpc.cc:52
gpr_atm_no_barrier_load
#define gpr_atm_no_barrier_load(p)
Definition: impl/codegen/atm_gcc_atomic.h:53
GRPC_ERROR_NONE
#define GRPC_ERROR_NONE
Definition: error.h:234
log.h
grpc_slice_ref_internal
const grpc_slice & grpc_slice_ref_internal(const grpc_slice &slice)
Definition: slice_refcount.h:32
read_cb
static void read_cb(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf)
Definition: benchmark-pound.c:138
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
flush_read_staging_buffer
static void flush_read_staging_buffer(secure_endpoint *ep, uint8_t **cur, uint8_t **end) ABSL_EXCLUSIVE_LOCKS_REQUIRED(ep -> read_mu)
Definition: secure_endpoint.cc:230
tsi_zero_copy_grpc_protector_destroy
void tsi_zero_copy_grpc_protector_destroy(tsi_zero_copy_grpc_protector *self)
Definition: transport_security_grpc.cc:64
grpc_dump_slice
char * grpc_dump_slice(const grpc_slice &s, uint32_t flags)
Definition: slice_string_helpers.cc:25
grpc_trace_secure_endpoint
grpc_core::TraceFlag grpc_trace_secure_endpoint(false, "secure_endpoint")
timers.h
endpoint_shutdown
static void endpoint_shutdown(grpc_endpoint *secure_ep, grpc_error_handle why)
Definition: secure_endpoint.cc:502
slice.h
GPR_TIMER_SCOPE
#define GPR_TIMER_SCOPE(tag, important)
Definition: src/core/lib/profiling/timers.h:43
grpc_core::MutexLock
Definition: src/core/lib/gprpp/sync.h:88
tsi_zero_copy_grpc_protector_protect
tsi_result tsi_zero_copy_grpc_protector_protect(tsi_zero_copy_grpc_protector *self, grpc_slice_buffer *unprotected_slices, grpc_slice_buffer *protected_slices)
Definition: transport_security_grpc.cc:41
grpc_pollset_set
struct grpc_pollset_set grpc_pollset_set
Definition: iomgr_fwd.h:23
string.h
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
grpc_endpoint_read
void grpc_endpoint_read(grpc_endpoint *ep, grpc_slice_buffer *slices, grpc_closure *cb, bool urgent, int min_progress_size)
Definition: endpoint.cc:25
error
grpc_error_handle error
Definition: retry_filter.cc:499
endpoint_add_to_pollset
static void endpoint_add_to_pollset(grpc_endpoint *secure_ep, grpc_pollset *pollset)
Definition: secure_endpoint.cc:513
endpoint_write
static void endpoint_write(grpc_endpoint *secure_ep, grpc_slice_buffer *slices, grpc_closure *cb, void *arg, int max_frame_size)
Definition: secure_endpoint.cc:387
grpc_endpoint_get_peer
absl::string_view grpc_endpoint_get_peer(grpc_endpoint *ep)
Definition: endpoint.cc:55
file
Definition: bloaty/third_party/zlib/examples/gzappend.c:170
grpc_endpoint_delete_from_pollset_set
void grpc_endpoint_delete_from_pollset_set(grpc_endpoint *ep, grpc_pollset_set *pollset_set)
Definition: endpoint.cc:44
closure.h
GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(desc, errs, count)
Definition: error.h:307
ABSL_GUARDED_BY
#define ABSL_GUARDED_BY(x)
Definition: abseil-cpp/absl/base/thread_annotations.h:62
secure_endpoint.h
GPR_DUMP_HEX
#define GPR_DUMP_HEX
Definition: string.h:34
endpoint_destroy
static void endpoint_destroy(grpc_endpoint *secure_ep)
Definition: secure_endpoint.cc:507
GPR_LOG_SEVERITY_DEBUG
@ GPR_LOG_SEVERITY_DEBUG
Definition: include/grpc/impl/codegen/log.h:46
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
grpc_channel_args
Definition: grpc_types.h:132
GRPC_TRACE_FLAG_ENABLED
#define GRPC_TRACE_FLAG_ENABLED(f)
Definition: debug/trace.h:114
endpoint_get_fd
static int endpoint_get_fd(grpc_endpoint *secure_ep)
Definition: secure_endpoint.cc:541
GPR_DUMP_ASCII
#define GPR_DUMP_ASCII
Definition: string.h:35
gpr_refcount
Definition: impl/codegen/sync_generic.h:39
tsi_frame_protector_protect_flush
tsi_result tsi_frame_protector_protect_flush(tsi_frame_protector *self, unsigned char *protected_output_frames, size_t *protected_output_frames_size, size_t *still_pending_size)
Definition: transport_security.cc:104
tsi_frame_protector_unprotect
tsi_result tsi_frame_protector_unprotect(tsi_frame_protector *self, const unsigned char *protected_frames_bytes, size_t *protected_frames_bytes_size, unsigned char *unprotected_bytes, size_t *unprotected_bytes_size)
Definition: transport_security.cc:119
gpr_mu_destroy
GPRAPI void gpr_mu_destroy(gpr_mu *mu)
TSI_OK
@ TSI_OK
Definition: transport_security_interface.h:32
DEBUG_LOCATION
#define DEBUG_LOCATION
Definition: debug_location.h:41
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
end
char * end
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1008
absl::optional::has_value
constexpr bool has_value() const noexcept
Definition: abseil-cpp/absl/types/optional.h:461
max
int max
Definition: bloaty/third_party/zlib/examples/enough.c:170
grpc_set_tsi_error_result
grpc_error_handle grpc_set_tsi_error_result(grpc_error_handle error, tsi_result result)
Definition: tsi_error.cc:23
grpc_secure_endpoint_create
grpc_endpoint * grpc_secure_endpoint_create(struct tsi_frame_protector *protector, struct tsi_zero_copy_grpc_protector *zero_copy_protector, grpc_endpoint *to_wrap, grpc_slice *leftover_slices, const grpc_channel_args *channel_args, size_t leftover_nslices)
Definition: secure_endpoint.cc:563
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
gpr_mu_init
GPRAPI void gpr_mu_init(gpr_mu *mu)
transport
grpc_transport transport
Definition: filter_fuzzer.cc:146
ABSL_EXCLUSIVE_LOCKS_REQUIRED
#define ABSL_EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: abseil-cpp/absl/base/thread_annotations.h:145
vtable
static const grpc_endpoint_vtable vtable
Definition: secure_endpoint.cc:551
tsi_result
tsi_result
Definition: transport_security_interface.h:31
absl::optional
Definition: abseil-cpp/absl/types/internal/optional.h:61
grpc_core::ResourceQuota::memory_quota
MemoryQuotaRefPtr memory_quota()
Definition: src/core/lib/resource_quota/resource_quota.h:51
GRPC_SLICE_START_PTR
#define GRPC_SLICE_START_PTR(slice)
Definition: include/grpc/impl/codegen/slice.h:101
slice_buffer.h
arg
Definition: cmdline.cc:40
ref
unsigned ref
Definition: cxa_demangle.cpp:4909
grpc_empty_slice
GPRAPI grpc_slice grpc_empty_slice(void)
Definition: slice/slice.cc:42
grpc_slice
Definition: include/grpc/impl/codegen/slice.h:65
gpr_mu_lock
GPRAPI void gpr_mu_lock(gpr_mu *mu)
grpc_slice_buffer_swap
GPRAPI void grpc_slice_buffer_swap(grpc_slice_buffer *a, grpc_slice_buffer *b)
Definition: slice/slice_buffer.cc:249
error.h
gen_synthetic_protos.base
base
Definition: gen_synthetic_protos.py:31
grpc_endpoint_shutdown
void grpc_endpoint_shutdown(grpc_endpoint *ep, grpc_error_handle why)
Definition: endpoint.cc:49
secure_endpoint_unref
static void secure_endpoint_unref(secure_endpoint *ep, const char *reason, const char *file, int line)
Definition: secure_endpoint.cc:161
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
SECURE_ENDPOINT_REF
#define SECURE_ENDPOINT_REF(ep, reason)
Definition: secure_endpoint.cc:159
memory_request.h
slice_internal.h
trace.h
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
grpc_event_engine::experimental::MemoryAllocator::Reservation
An automatic releasing reservation of memory.
Definition: memory_allocator.h:77
GRPC_SLICE_END_PTR
#define GRPC_SLICE_END_PTR(slice)
Definition: include/grpc/impl/codegen/slice.h:110
grpc_endpoint_destroy
void grpc_endpoint_destroy(grpc_endpoint *ep)
Definition: endpoint.cc:53
resource_quota.h
transport_security_interface.h
grpc_slice_buffer_init
GPRAPI void grpc_slice_buffer_init(grpc_slice_buffer *sb)
Definition: slice/slice_buffer.cc:116
tsi_error.h
endpoint_delete_from_pollset_set
static void endpoint_delete_from_pollset_set(grpc_endpoint *secure_ep, grpc_pollset_set *pollset_set)
Definition: secure_endpoint.cc:525
GRPC_ERROR_CREATE_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
Definition: error.h:291
GRPC_SLICE_LENGTH
#define GRPC_SLICE_LENGTH(slice)
Definition: include/grpc/impl/codegen/slice.h:104
grpc_core::TraceFlag
Definition: debug/trace.h:63
gpr_atm
intptr_t gpr_atm
Definition: impl/codegen/atm_gcc_atomic.h:32
memory_diff.cur
def cur
Definition: memory_diff.py:83
SECURE_ENDPOINT_UNREF
#define SECURE_ENDPOINT_UNREF(ep, reason)
Definition: secure_endpoint.cc:157
endpoint_get_local_address
static absl::string_view endpoint_get_local_address(grpc_endpoint *secure_ep)
Definition: secure_endpoint.cc:536
grpc_core::Mutex
Definition: src/core/lib/gprpp/sync.h:61
grpc_slice_buffer_add
GPRAPI void grpc_slice_buffer_add(grpc_slice_buffer *sb, grpc_slice slice)
Definition: slice/slice_buffer.cc:170
grpc_endpoint_get_fd
int grpc_endpoint_get_fd(grpc_endpoint *ep)
Definition: endpoint.cc:63
debug_location.h
grpc_core::ReclamationPass::kBenign
@ kBenign
destroy
static void destroy(secure_endpoint *ep)
Definition: secure_endpoint.cc:154
grpc_core::ResourceQuotaFromChannelArgs
ResourceQuotaRefPtr ResourceQuotaFromChannelArgs(const grpc_channel_args *args)
Definition: api.cc:40
gpr_mu
pthread_mutex_t gpr_mu
Definition: impl/codegen/sync_posix.h:47
tsi_result_to_string
const char * tsi_result_to_string(tsi_result result)
Definition: transport_security.cc:35
grpc_endpoint_add_to_pollset_set
void grpc_endpoint_add_to_pollset_set(grpc_endpoint *ep, grpc_pollset_set *pollset_set)
Definition: endpoint.cc:39
tsi_frame_protector_protect
tsi_result tsi_frame_protector_protect(tsi_frame_protector *self, const unsigned char *unprotected_bytes, size_t *unprotected_bytes_size, unsigned char *protected_output_frames, size_t *protected_output_frames_size)
Definition: transport_security.cc:87
STAGING_BUFFER_SIZE
#define STAGING_BUFFER_SIZE
Definition: secure_endpoint.cc:65
alloc.h
grpc_endpoint_can_track_err
bool grpc_endpoint_can_track_err(grpc_endpoint *ep)
Definition: endpoint.cc:65
secure_endpoint_ref
static void secure_endpoint_ref(secure_endpoint *ep, const char *reason, const char *file, int line)
Definition: secure_endpoint.cc:174
endpoint_read
static void endpoint_read(grpc_endpoint *secure_ep, grpc_slice_buffer *slices, grpc_closure *cb, bool urgent, int)
Definition: secure_endpoint.cc:356
slices
SliceBuffer * slices
Definition: retry_filter.cc:631
regen-readme.line
line
Definition: regen-readme.py:30
exec_ctx.h
slice_refcount.h
grpc_slice_split_head
GPRAPI grpc_slice grpc_slice_split_head(grpc_slice *s, size_t split)
Definition: slice/slice.cc:347
grpc_slice_buffer_move_first
GPRAPI void grpc_slice_buffer_move_first(grpc_slice_buffer *src, size_t n, grpc_slice_buffer *dst)
Definition: slice/slice_buffer.cc:348
grpc_core::ExecCtx::Run
static void Run(const DebugLocation &location, grpc_closure *closure, grpc_error_handle error)
Definition: exec_ctx.cc:98
ref_counted_ptr.h
memory_quota.h
grpc_slice_buffer_destroy_internal
void grpc_slice_buffer_destroy_internal(grpc_slice_buffer *sb)
Definition: slice/slice_buffer.cc:123
grpc_endpoint_write
void grpc_endpoint_write(grpc_endpoint *ep, grpc_slice_buffer *slices, grpc_closure *cb, void *arg, int max_frame_size)
Definition: endpoint.cc:30
memory_allocator.h
grpc_slice_buffer
Definition: include/grpc/impl/codegen/slice.h:83
gpr_ref_init
GPRAPI void gpr_ref_init(gpr_refcount *r, int n)
Definition: sync.cc:86
atm.h
tsi_frame_protector
Definition: transport_security.h:51
tsi_frame_protector_destroy
void tsi_frame_protector_destroy(tsi_frame_protector *self)
Definition: transport_security.cc:135
iomgr_fwd.h
tsi_zero_copy_grpc_protector
Definition: transport_security_grpc.h:79
grpc_endpoint_get_local_address
absl::string_view grpc_endpoint_get_local_address(grpc_endpoint *ep)
Definition: endpoint.cc:59
gpr_unref
GPRAPI int gpr_unref(gpr_refcount *r)
Definition: sync.cc:103
grpc_error
Definition: error_internal.h:42
run_grpclb_interop_tests.l
dictionary l
Definition: run_grpclb_interop_tests.py:410
grpc_endpoint_add_to_pollset
void grpc_endpoint_add_to_pollset(grpc_endpoint *ep, grpc_pollset *pollset)
Definition: endpoint.cc:35
write_cb
static void write_cb(uv_write_t *req, int status)
Definition: benchmark-pump.c:190
grpc_pollset
Definition: bm_cq_multiple_threads.cc:37
sync.h
grpc_closure
Definition: closure.h:56
grpc_endpoint
Definition: endpoint.h:105
endpoint_get_peer
static absl::string_view endpoint_get_peer(grpc_endpoint *secure_ep)
Definition: secure_endpoint.cc:531
gpr_ref
GPRAPI void gpr_ref(gpr_refcount *r)
Definition: sync.cc:88
grpc_slice_buffer_reset_and_unref_internal
void grpc_slice_buffer_reset_and_unref_internal(grpc_slice_buffer *sb)
Definition: slice/slice_buffer.cc:238
grpc_event_engine::experimental::MemoryRequest
Reservation request - how much memory do we want to allocate?
Definition: memory_request.h:27
endpoint_can_track_err
static bool endpoint_can_track_err(grpc_endpoint *secure_ep)
Definition: secure_endpoint.cc:546
sync.h
cb
OPENSSL_EXPORT pem_password_cb * cb
Definition: pem.h:351
call_read_cb
static void call_read_cb(secure_endpoint *ep, grpc_error_handle error)
Definition: secure_endpoint.cc:240
slice_string_helpers.h
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
grpc_slice_unref_internal
void grpc_slice_unref_internal(const grpc_slice &slice)
Definition: slice_refcount.h:39
grpc_slice_buffer_add_indexed
GPRAPI size_t grpc_slice_buffer_add_indexed(grpc_slice_buffer *sb, grpc_slice slice)
Definition: slice/slice_buffer.cc:161
GRPC_ERROR_IS_NONE
#define GRPC_ERROR_IS_NONE(err)
Definition: error.h:241
api.h
transport_security_grpc.h
port_platform.h


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:15