#include <grpc/support/port_platform.h>
#include "src/core/lib/security/transport/secure_endpoint.h"
#include <inttypes.h>
#include <algorithm>
#include <atomic>
#include <memory>
#include "absl/base/thread_annotations.h"
#include "absl/status/status.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include <grpc/event_engine/memory_allocator.h>
#include <grpc/event_engine/memory_request.h>
#include <grpc/slice.h>
#include <grpc/slice_buffer.h>
#include <grpc/support/alloc.h>
#include <grpc/support/atm.h>
#include <grpc/support/log.h>
#include <grpc/support/sync.h>
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/gprpp/debug_location.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/gprpp/sync.h"
#include "src/core/lib/iomgr/closure.h"
#include "src/core/lib/iomgr/error.h"
#include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/iomgr/iomgr_fwd.h"
#include "src/core/lib/resource_quota/api.h"
#include "src/core/lib/resource_quota/memory_quota.h"
#include "src/core/lib/resource_quota/resource_quota.h"
#include "src/core/lib/resource_quota/trace.h"
#include "src/core/lib/security/transport/tsi_error.h"
#include "src/core/lib/slice/slice.h"
#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/tsi/transport_security_grpc.h"
#include "src/core/tsi/transport_security_interface.h"
#define STAGING_BUFFER_SIZE …
static void on_read(void* user_data, grpc_error_handle error);
namespace {
struct secure_endpoint { … };
}
grpc_core::TraceFlag grpc_trace_secure_endpoint(false, "secure_endpoint");
static void destroy(secure_endpoint* ep) { … }
#ifndef NDEBUG
#define SECURE_ENDPOINT_UNREF(ep, reason) …
#define SECURE_ENDPOINT_REF(ep, reason) …
static void secure_endpoint_unref(secure_endpoint* ep, const char* reason,
const char* file, int line) { … }
static void secure_endpoint_ref(secure_endpoint* ep, const char* reason,
const char* file, int line) { … }
#else
#define SECURE_ENDPOINT_UNREF …
#define SECURE_ENDPOINT_REF …
static void secure_endpoint_unref(secure_endpoint* ep) {
if (gpr_unref(&ep->ref)) {
destroy(ep);
}
}
static void secure_endpoint_ref(secure_endpoint* ep) { gpr_ref(&ep->ref); }
#endif
static void maybe_post_reclaimer(secure_endpoint* ep) { … }
static void flush_read_staging_buffer(secure_endpoint* ep, uint8_t** cur,
uint8_t** end)
ABSL_EXCLUSIVE_LOCKS_REQUIRED(ep->read_mu) { … }
static void call_read_cb(secure_endpoint* ep, grpc_error_handle error) { … }
static void on_read(void* user_data, grpc_error_handle error) { … }
static void endpoint_read(grpc_endpoint* secure_ep, grpc_slice_buffer* slices,
grpc_closure* cb, bool urgent,
int ) { … }
static void flush_write_staging_buffer(secure_endpoint* ep, uint8_t** cur,
uint8_t** end)
ABSL_EXCLUSIVE_LOCKS_REQUIRED(ep->write_mu) { … }
static void endpoint_write(grpc_endpoint* secure_ep, grpc_slice_buffer* slices,
grpc_closure* cb, void* arg, int max_frame_size) { … }
static void endpoint_shutdown(grpc_endpoint* secure_ep, grpc_error_handle why) { … }
static void endpoint_destroy(grpc_endpoint* secure_ep) { … }
static void endpoint_add_to_pollset(grpc_endpoint* secure_ep,
grpc_pollset* pollset) { … }
static void endpoint_add_to_pollset_set(grpc_endpoint* secure_ep,
grpc_pollset_set* pollset_set) { … }
static void endpoint_delete_from_pollset_set(grpc_endpoint* secure_ep,
grpc_pollset_set* pollset_set) { … }
static absl::string_view endpoint_get_peer(grpc_endpoint* secure_ep) { … }
static absl::string_view endpoint_get_local_address(grpc_endpoint* secure_ep) { … }
static int endpoint_get_fd(grpc_endpoint* secure_ep) { … }
static bool endpoint_can_track_err(grpc_endpoint* secure_ep) { … }
static const grpc_endpoint_vtable vtable = …;
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) { … }