Go to the documentation of this file.
44 #include "src/libfuzzer/libfuzzer_macro.h"
46 #include "test/core/end2end/fuzzers/api_fuzzer.pb.h"
82 std::unique_ptr<grpc_core::ServerAddressList>*
addresses;
89 *
r->addresses = absl::make_unique<grpc_core::ServerAddressList>();
93 (*
r->addresses)->emplace_back(fake_resolved_address,
nullptr);
98 "Resolution failed", &
error, 1));
109 class FuzzerDNSRequest {
124 FuzzerDNSRequest*
self =
static_cast<FuzzerDNSRequest*
>(
arg);
126 std::vector<grpc_resolved_address> addrs;
129 addrs.push_back(
addr);
145 static FuzzerDNSResolver* GetOrCreate() {
146 static FuzzerDNSResolver*
instance =
new FuzzerDNSResolver();
166 bool Cancel(TaskHandle )
override {
return false; }
172 const char* ,
const char*
addr,
const char* ,
174 std::unique_ptr<grpc_core::ServerAddressList>* addresses,
175 std::unique_ptr<grpc_core::ServerAddressList>* ,
179 r->on_done = on_done;
180 r->addresses = addresses;
246 fc->deadline = deadline;
319 class Call :
public std::enable_shared_from_this<Call> {
340 if (
call_ !=
nullptr) {
368 template <
typename T>
370 return static_cast<T*
>(
Allocate(
sizeof(
T) * elems));
373 template <
typename T>
375 T*
p = AllocArray<T>(1);
380 template <
typename T>
387 template <
typename M>
395 static_cast<size_t>(
metadata.size()),
m};
399 const api_fuzzer::BatchOp& batch_op,
bool* batch_is_ok,
403 switch (batch_op.op_case()) {
404 case api_fuzzer::BatchOp::OP_NOT_SET:
407 case api_fuzzer::BatchOp::kSendInitialMetadata:
409 *batch_is_ok =
false;
414 auto ary =
ReadMetadata(batch_op.send_initial_metadata().metadata());
419 case api_fuzzer::BatchOp::kSendMessage:
422 *batch_is_ok =
false;
425 std::vector<grpc_slice>
slices;
426 for (
const auto&
m : batch_op.send_message().message()) {
431 unwinders->push_back([
this]() {
437 case api_fuzzer::BatchOp::kSendCloseFromClient:
441 case api_fuzzer::BatchOp::kSendStatusFromServer: {
444 auto ary =
ReadMetadata(batch_op.send_status_from_server().metadata());
448 batch_op.send_status_from_server().status_code());
450 batch_op.send_status_from_server().has_status_details()
452 batch_op.send_status_from_server().status_details()))
455 case api_fuzzer::BatchOp::kReceiveInitialMetadata:
457 *batch_is_ok =
false;
466 case api_fuzzer::BatchOp::kReceiveMessage:
473 *batch_is_ok =
false;
482 case api_fuzzer::BatchOp::kReceiveStatusOnClient:
490 case api_fuzzer::BatchOp::kReceiveCloseOnServer:
503 auto self = shared_from_this();
505 --
self->pending_ops_;
507 self->pending_recv_message_op_ =
false;
508 if (
self->recv_message_ !=
nullptr) {
509 grpc_byte_buffer_destroy(self->recv_message_);
510 self->recv_message_ = nullptr;
515 self->send_message_ =
nullptr;
519 self->call_closed_ =
true;
526 auto self = shared_from_this();
529 --
self->pending_ops_;
562 static std::vector<std::shared_ptr<Call>>
g_calls;
579 if (
call_ !=
nullptr) {
601 template <
typename ChannelArgContainer>
608 for (
int i = 0;
i <
args.size();
i++) {
609 switch (
args[
i].value_case()) {
610 case api_fuzzer::ChannelArg::kStr:
614 case api_fuzzer::ChannelArg::kI:
618 case api_fuzzer::ChannelArg::kResourceQuota:
625 case api_fuzzer::ChannelArg::VALUE_NOT_SET:
638 const api_fuzzer::CredArtifact& artifact,
639 std::initializer_list<const char*> builtins) {
640 switch (artifact.type_case()) {
641 case api_fuzzer::CredArtifact::kCustom:
642 return artifact.custom().c_str();
643 case api_fuzzer::CredArtifact::kBuiltin:
644 if (artifact.builtin() < 0)
return nullptr;
645 if (artifact.builtin() <
static_cast<int>(builtins.size())) {
646 return *(builtins.begin() + artifact.builtin());
649 case api_fuzzer::CredArtifact::TYPE_NOT_SET:
655 const api_fuzzer::SslChannelCreds& creds) {
656 const char* root_certs =
657 creds.has_root_certs()
661 creds.has_private_key()
663 {test_server1_key, test_self_signed_client_key,
664 test_signed_client_key})
669 {test_server1_cert, test_self_signed_client_cert,
670 test_signed_client_cert})
675 private_key !=
nullptr && certs !=
nullptr ? &key_cert_pair :
nullptr,
680 const api_fuzzer::CallCreds& creds) {
681 switch (creds.type_case()) {
682 case api_fuzzer::CallCreds::TYPE_NOT_SET:
686 case api_fuzzer::CallCreds::kCompositeCallCreds: {
688 for (
const auto& child_creds :
689 creds.composite_call_creds().call_creds()) {
691 if (
child !=
nullptr) {
692 if (
out ==
nullptr) {
705 case api_fuzzer::CallCreds::kAccessToken:
708 case api_fuzzer::CallCreds::kIam:
710 creds.iam().auth_token().c_str(), creds.iam().auth_selector().c_str(),
717 const api_fuzzer::ChannelCreds& creds) {
718 switch (creds.type_case()) {
719 case api_fuzzer::ChannelCreds::TYPE_NOT_SET:
721 case api_fuzzer::ChannelCreds::kSslChannelCreds:
723 case api_fuzzer::ChannelCreds::kCompositeChannelCreds: {
724 const auto& comp = creds.composite_channel_creds();
729 comp.has_call_creds() ?
ReadCallCreds(comp.call_creds()) :
nullptr;
730 if (
c1 !=
nullptr &&
c2 !=
nullptr) {
736 }
else if (
c1 !=
nullptr) {
738 }
else if (
c2 !=
nullptr) {
754 char* grpc_trace_fuzzer =
gpr_getenv(
"GRPC_TRACE_FUZZER");
759 [actions =
msg.event_engine_actions()]() {
760 return absl::make_unique<
761 grpc_event_engine::experimental::FuzzingEventEngine>(
762 grpc_event_engine::experimental::FuzzingEventEngine::Options(),
779 bool server_shutdown =
false;
780 int pending_server_shutdowns = 0;
781 int pending_channel_watches = 0;
782 int pending_pings = 0;
788 int action_index = 0;
789 auto no_more_actions = [&]() { action_index =
msg.actions_size(); };
790 auto poll_cq = [&]() ->
bool {
806 while (action_index <
msg.actions_size() ||
g_channel !=
nullptr ||
807 g_server !=
nullptr || pending_channel_watches > 0 ||
808 pending_pings > 0 ||
ActiveCall() !=
nullptr) {
813 if (action_index ==
msg.actions_size()) {
822 if (!server_shutdown) {
826 server_shutdown =
true;
827 pending_server_shutdowns++;
828 }
else if (pending_server_shutdowns == 0) {
834 if (
call ==
nullptr)
continue;
852 const api_fuzzer::Action&
action =
msg.actions(action_index);
854 switch (
action.type_case()) {
855 case api_fuzzer::Action::TYPE_NOT_SET:
859 case api_fuzzer::Action::kPollCq: {
864 case api_fuzzer::Action::kCreateChannel: {
865 if (!
action.create_channel().channel_actions_size() ||
872 action.create_channel().has_channel_creds()
876 action.create_channel().target().c_str(), creds,
args);
879 for (
int i = 0;
i <
action.create_channel().channel_actions_size();
881 const api_fuzzer::ChannelAction& channel_action =
882 action.create_channel().channel_actions(
i);
885 std::min(channel_action.add_n_bytes_writable(),
887 std::min(channel_action.add_n_bytes_readable(),
901 case api_fuzzer::Action::kCloseChannel: {
911 case api_fuzzer::Action::kCreateServer: {
923 server_shutdown =
false;
931 case api_fuzzer::Action::kShutdownServer: {
936 pending_server_shutdowns++;
937 server_shutdown =
true;
944 case api_fuzzer::Action::kCancelAllCallsIfShutdown: {
945 if (
g_server !=
nullptr && server_shutdown) {
953 case api_fuzzer::Action::kDestroyServerIfReady: {
954 if (
g_server !=
nullptr && server_shutdown &&
955 pending_server_shutdowns == 0) {
964 case api_fuzzer::Action::kCheckConnectivity: {
967 action.check_connectivity());
974 case api_fuzzer::Action::kWatchConnectivity: {
986 pending_channel_watches++;
994 case api_fuzzer::Action::kCreateCall: {
1001 parent_call =
nullptr;
1017 g_channel, parent_call ==
nullptr ?
nullptr : parent_call->
call(),
1019 deadline,
nullptr));
1027 case api_fuzzer::Action::kChangeActiveCall: {
1033 case api_fuzzer::Action::kQueueBatch: {
1035 if (active_call ==
nullptr ||
1037 active_call->call() ==
nullptr) {
1041 const auto&
batch =
action.queue_batch().operations();
1042 if (
batch.size() > 6) {
1046 std::vector<grpc_op>
ops;
1050 for (
const auto& batch_op :
batch) {
1051 auto op = active_call->ReadOp(batch_op, &
ok, &has_ops, &unwinders);
1052 if (!
op.has_value())
continue;
1058 auto*
v = active_call->FinishedBatchValidator(has_ops);
1060 active_call->call(),
ops.
data(),
ops.size(),
v,
nullptr);
1066 for (
auto& unwind : unwinders) {
1073 case api_fuzzer::Action::kCancelCall: {
1075 if (active_call !=
nullptr && active_call->call() !=
nullptr) {
1083 case api_fuzzer::Action::kGetPeer: {
1085 if (active_call !=
nullptr && active_call->call() !=
nullptr) {
1093 case api_fuzzer::Action::kGetTarget: {
1102 case api_fuzzer::Action::kPing: {
1112 case api_fuzzer::Action::kEnableTracer: {
1117 case api_fuzzer::Action::kDisableTracer: {
1122 case api_fuzzer::Action::kRequestCall: {
1132 case api_fuzzer::Action::kDestroyCall: {
1134 if (active_call !=
nullptr &&
1136 active_call->call() !=
nullptr) {
1144 case api_fuzzer::Action::kResizeResourceQuota: {
1146 action.resize_resource_quota());
grpc_error_handle SetupTransport(grpc_transport *transport, grpc_pollset *accepting_pollset, const grpc_channel_args *args, const RefCountedPtr< channelz::SocketNode > &socket_node)
GPRAPI void grpc_slice_unref(grpc_slice s)
struct grpc_byte_buffer * send_message
void SetCall(grpc_call *call)
GRPCAPI grpc_call_error grpc_call_cancel(grpc_call *call, void *reserved)
GRPCAPI void grpc_call_details_destroy(grpc_call_details *details)
GRPCAPI void grpc_call_details_init(grpc_call_details *details)
grpc_metadata_array * trailing_metadata
static grpc_resource_quota * g_resource_quota
grpc_status_code * status
grpc_ares_request * my_dns_lookup_ares(const char *, const char *addr, const char *, grpc_pollset_set *, grpc_closure *on_done, std::unique_ptr< grpc_core::ServerAddressList > *addresses, std::unique_ptr< grpc_core::ServerAddressList > *, char **, int)
static void dont_log(gpr_log_func_args *)
GRPCAPI grpc_byte_buffer * grpc_raw_byte_buffer_create(grpc_slice *slices, size_t nslices)
static size_t g_active_call
std::vector< grpc_slice > unref_slices_
union grpc_arg::grpc_arg_value value
return memset(p, 0, total)
bool sent_initial_metadata_
struct grpc_arg::grpc_arg_value::grpc_arg_pointer pointer
void SetDefaultEventEngineFactory(std::function< std::unique_ptr< EventEngine >()> factory)
grpc_byte_buffer * recv_message_
struct grpc_resource_quota grpc_resource_quota
grpc_metadata_array recv_initial_metadata_
static Call * ActiveCall()
struct grpc_op::grpc_op_data::grpc_op_send_initial_metadata send_initial_metadata
GRPCAPI void grpc_shutdown_blocking(void)
grpc_transport * grpc_create_chttp2_transport(const grpc_channel_args *channel_args, grpc_endpoint *ep, bool is_client)
void grpc_timer_manager_set_threading(bool enabled)
const grpc_channel_args * channel_args() const
#define GRPC_ARG_RESOURCE_QUOTA
GRPCAPI char * grpc_call_get_peer(grpc_call *call)
void RequestCall(grpc_server *server, grpc_completion_queue *cq)
struct grpc_pollset_set grpc_pollset_set
GRPCAPI grpc_call_credentials * grpc_google_iam_credentials_create(const char *authorization_token, const char *authority_selector, void *reserved)
grpc_metadata_array recv_trailing_metadata_
GRPCAPI grpc_connectivity_state grpc_channel_check_connectivity_state(grpc_channel *channel, int try_to_connect)
static int64_t my_tcp_client_connect(grpc_closure *closure, grpc_endpoint **ep, grpc_pollset_set *, const grpc_channel_args *, const grpc_resolved_address *, grpc_core::Timestamp deadline)
void grpc_channel_ping(grpc_channel *channel, grpc_completion_queue *cq, void *tag, void *reserved)
GPRAPI void gpr_free(void *ptr)
grpc_slice ReadSlice(const T &s)
GRPCAPI grpc_server * grpc_server_create(const grpc_channel_args *args, void *reserved)
GPRAPI void * gpr_malloc(size_t size)
OPENSSL_EXPORT pem_password_cb void * u
#define GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(desc, errs, count)
GRPCAPI char * grpc_channel_get_target(grpc_channel *channel)
RefCountedPtr< grpc_tls_certificate_provider > instance
GRPCAPI void grpc_server_register_completion_queue(grpc_server *server, grpc_completion_queue *cq, void *reserved)
GRPCAPI grpc_resource_quota * grpc_resource_quota_create(const char *trace_name)
GRPCAPI void grpc_call_credentials_release(grpc_call_credentials *creds)
void start_scheduling_grpc_passthru_endpoint_channel_effects(grpc_endpoint *ep, const std::vector< grpc_passthru_endpoint_channel_action > &actions)
#define GRPC_LOG_IF_ERROR(what, error)
static void SetThreadingAll(bool enable)
GRPCAPI grpc_call_credentials * grpc_composite_call_credentials_create(grpc_call_credentials *creds1, grpc_call_credentials *creds2, void *reserved)
static Validator * ValidateConnectivityWatch(gpr_timespec deadline, int *counter)
#define GRPC_CLOSURE_CREATE(cb, cb_arg, scheduler)
static grpc_channel_credentials * ReadChannelCreds(const api_fuzzer::ChannelCreds &creds)
void grpc_timer_manager_tick()
#define T(upbtypeconst, upbtype, ctype, default_value)
GRPCAPI grpc_call_credentials * grpc_access_token_credentials_create(const char *access_token, void *reserved)
struct grpc_op::grpc_op_data::grpc_op_recv_message recv_message
GRPCAPI grpc_channel_credentials * grpc_ssl_credentials_create(const char *pem_root_certs, grpc_ssl_pem_key_cert_pair *pem_key_cert_pair, const verify_peer_options *verify_options, void *reserved)
union grpc_op::grpc_op_data data
Validator(std::function< void(bool)> impl)
GRPCAPI void grpc_metadata_array_destroy(grpc_metadata_array *array)
static constexpr uint64_t kMaxWaitMs
struct grpc_byte_buffer ** recv_message
GRPCAPI grpc_call_error grpc_server_request_call(grpc_server *server, grpc_call **call, grpc_call_details *details, grpc_metadata_array *request_metadata, grpc_completion_queue *cq_bound_to_call, grpc_completion_queue *cq_for_notification, void *tag_new)
std::unique_ptr< Server > server
void grpc_passthru_endpoint_create(grpc_endpoint **client, grpc_endpoint **server, grpc_passthru_endpoint_stats *stats, bool simulate_channel_actions)
static std::vector< grpc_passthru_endpoint_channel_action > g_channel_actions
static void do_connect(void *arg, grpc_error_handle error)
void grpc_test_only_set_slice_hash_seed(uint32_t seed)
char * gpr_getenv(const char *name)
@ GRPC_OP_RECV_INITIAL_METADATA
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Validator * MakeValidator(std::function< void(bool)> impl)
@ GRPC_OP_SEND_STATUS_FROM_SERVER
const grpc_arg_pointer_vtable * vtable
GPRAPI int gpr_time_cmp(gpr_timespec a, gpr_timespec b)
def c_str(s, encoding='ascii')
static constexpr TaskHandle kNullHandle
const GRPCAPI grpc_arg_pointer_vtable * grpc_resource_quota_arg_vtable(void)
static void free_non_null(void *p)
GRPCAPI void grpc_call_unref(grpc_call *call)
void grpc_set_tcp_client_impl(grpc_tcp_client_vtable *impl)
grpc_byte_buffer * send_message_
static Validator * AssertSuccessAndDecrement(int *counter)
Validator * FinishedRequestCall()
Status UnknownError(absl::string_view message)
struct grpc_call grpc_call
unsigned __int64 uint64_t
GRPCAPI grpc_channel_credentials * grpc_insecure_credentials_create()
void grpc_channel_args_destroy(grpc_channel_args *a)
static grpc_channel_credentials * ReadSslChannelCreds(const api_fuzzer::SslChannelCreds &creds)
grpc_metadata * trailing_metadata
GPRAPI grpc_slice grpc_empty_slice(void)
struct grpc_server grpc_server
GRPCAPI void grpc_server_destroy(grpc_server *server)
grpc_transport_stream_op_batch * batch
GRPCAPI grpc_channel_credentials * grpc_composite_channel_credentials_create(grpc_channel_credentials *channel_creds, grpc_call_credentials *call_creds, void *reserved)
static grpc_channel * g_channel
static const char * ReadCredArtifact(const api_fuzzer::CredArtifact &artifact, std::initializer_list< const char * > builtins)
GPRAPI gpr_timespec gpr_now(gpr_clock_type clock)
void ResetDefaultEventEngine()
Reset the default event engine.
static void sched_connect(grpc_closure *closure, grpc_endpoint **ep, gpr_timespec deadline)
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
GRPCAPI void grpc_server_cancel_all_calls(grpc_server *server)
#define GRPC_SLICE_LENGTH(slice)
static void my_cancel_ares_request(grpc_ares_request *request)
grpc_slice * status_details
gpr_clock_type clock_type
GRPCAPI void grpc_channel_credentials_release(grpc_channel_credentials *creds)
GRPCAPI grpc_call * grpc_channel_create_call(grpc_channel *channel, grpc_call *parent_call, uint32_t propagation_mask, grpc_completion_queue *completion_queue, grpc_slice method, const grpc_slice *host, gpr_timespec deadline, void *reserved)
GPRAPI gpr_timespec gpr_inf_past(gpr_clock_type type)
struct grpc_op::grpc_op_data::grpc_op_recv_close_on_server recv_close_on_server
ABSL_NAMESPACE_BEGIN Time Now()
void * Allocate(size_t size)
static constexpr uint64_t kMaxAddNWritableBytes
GRPCAPI grpc_channel * grpc_channel_create(const char *target, grpc_channel_credentials *creds, const grpc_channel_args *args)
#define GRPC_ERROR_REF(err)
struct grpc_op::grpc_op_data::grpc_op_send_status_from_server send_status_from_server
GRPCAPI void grpc_resource_quota_resize(grpc_resource_quota *resource_quota, size_t new_size)
grpc_call_details call_details_
GPRAPI gpr_timespec gpr_time_add(gpr_timespec a, gpr_timespec b)
Validator * FinishedBatchValidator(uint8_t has_ops)
GRPCAPI void grpc_completion_queue_destroy(grpc_completion_queue *cq)
@ GRPC_OP_SEND_INITIAL_METADATA
DEFINE_PROTO_FUZZER(const api_fuzzer::Msg &msg)
grpc_core::ExecCtx exec_ctx
struct grpc_op::grpc_op_data::grpc_op_send_message send_message
bool pending_recv_message_op_
GRPCAPI void grpc_resource_quota_unref(grpc_resource_quota *resource_quota)
GPRAPI gpr_timespec gpr_time_from_micros(int64_t us, gpr_clock_type clock_type)
std::vector< void * > free_pointers_
struct grpc_op::grpc_op_data::grpc_op_recv_status_on_client recv_status_on_client
size_t trailing_metadata_count
static grpc_server * g_server
static constexpr Duration Seconds(int64_t seconds)
virtual TaskHandle ResolveName(absl::string_view name, absl::string_view default_port, grpc_pollset_set *interested_parties, std::function< void(absl::StatusOr< std::vector< grpc_resolved_address >>)> on_done)=0
GRPCAPI void grpc_server_shutdown_and_notify(grpc_server *server, grpc_completion_queue *cq, void *tag)
GRPCAPI void grpc_byte_buffer_destroy(grpc_byte_buffer *bb)
GRPCAPI grpc_event grpc_completion_queue_next(grpc_completion_queue *cq, gpr_timespec deadline, void *reserved)
GRPCAPI void grpc_completion_queue_shutdown(grpc_completion_queue *cq)
EventEngine * GetDefaultEventEngine()
GRPCAPI void grpc_channel_destroy(grpc_channel *channel)
static grpc_call_credentials * ReadCallCreds(const api_fuzzer::CallCreds &creds)
void SetDNSResolver(DNSResolver *resolver)
grpc_ares_request *(* grpc_dns_lookup_ares)(const char *dns_server, const char *name, const char *default_port, grpc_pollset_set *interested_parties, grpc_closure *on_done, std::unique_ptr< grpc_core::ServerAddressList > *addresses, std::unique_ptr< grpc_core::ServerAddressList > *balancer_addresses, char **service_config_json, int query_timeout_ms)
grpc_slice grpc_slice_from_cpp_string(std::string str)
static constexpr uint64_t kMaxAddNReadableBytes
grpc_slice recv_status_details_
void grpc_timer_init(grpc_timer *timer, grpc_core::Timestamp deadline, grpc_closure *closure)
static void Run(const DebugLocation &location, grpc_closure *closure, grpc_error_handle error)
static void finish_resolve(void *arg, grpc_error_handle error)
static std::vector< std::shared_ptr< Call > > g_calls
struct grpc_channel grpc_channel
@ GRPC_OP_RECV_CLOSE_ON_SERVER
grpc_tcp_client_vtable fuzz_tcp_client_vtable
GRPCAPI void grpc_channel_watch_connectivity_state(grpc_channel *channel, grpc_connectivity_state last_observed_state, gpr_timespec deadline, grpc_completion_queue *cq, void *tag)
grpc_metadata_array ReadMetadata(const M &metadata)
std::function< void(bool)> impl_
virtual bool Cancel(TaskHandle handle)=0
GRPCAPI int grpc_tracer_set_enabled(const char *name, int enabled)
grpc_channel_args * ReadArgs(const ChannelArgContainer &args)
GPRAPI char * gpr_strdup(const char *src)
bool grpc_parse_ipv4_hostport(absl::string_view hostport, grpc_resolved_address *addr, bool log_errors)
std::unique_ptr< grpc_core::ServerAddressList > * addresses
absl::optional< grpc_op > ReadOp(const api_fuzzer::BatchOp &batch_op, bool *batch_is_ok, uint8_t *batch_ops, std::vector< std::function< void()>> *unwinders)
GRPCAPI void grpc_resource_quota_ref(grpc_resource_quota *resource_quota)
GRPCAPI grpc_completion_queue * grpc_completion_queue_create_for_next(void *reserved)
struct grpc_op::grpc_op_data::grpc_op_recv_initial_metadata recv_initial_metadata
grpc_slice * status_details
T * AllocArray(size_t elems)
grpc_completion_type type
GPRAPI void gpr_set_log_function(gpr_log_func func)
GRPCAPI void grpc_init(void)
GRPCAPI void grpc_server_start(grpc_server *server)
@ GRPC_OP_RECV_STATUS_ON_CLIENT
static std::atomic< bool > g_channel_force_delete
PHP_PROTO_OBJECT_FREE_END PHP_PROTO_OBJECT_DTOR_END intern self
static bool my_tcp_cancel_connect(int64_t)
static Server * FromC(grpc_server *c_type)
GRPCAPI grpc_call_error grpc_call_start_batch(grpc_call *call, const grpc_op *ops, size_t nops, void *tag, void *reserved)
void(* grpc_cancel_ares_request)(grpc_ares_request *request)
virtual absl::StatusOr< std::vector< grpc_resolved_address > > ResolveNameBlocking(absl::string_view name, absl::string_view default_port)=0
static grpc_completion_queue * cq
void grpc_chttp2_transport_start_reading(grpc_transport *transport, grpc_slice_buffer *read_buffer, grpc_closure *notify_on_receive_settings, grpc_closure *notify_on_close)
gpr_timespec as_timespec(gpr_clock_type type) const
@ GRPC_OP_SEND_CLOSE_FROM_CLIENT
GRPCAPI void grpc_metadata_array_init(grpc_metadata_array *array)
static Validator * Decrement(int *counter)
#define GRPC_ERROR_IS_NONE(err)
bool enqueued_recv_initial_metadata_
grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:58:31