grpc 1.41.0.pre2 → 1.42.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +57 -44
- data/etc/roots.pem +335 -326
- data/include/grpc/event_engine/event_engine.h +82 -42
- data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
- data/include/grpc/event_engine/memory_allocator.h +210 -0
- data/include/grpc/grpc.h +4 -0
- data/include/grpc/grpc_security.h +18 -0
- data/include/grpc/grpc_security_constants.h +1 -0
- data/include/grpc/impl/codegen/port_platform.h +7 -0
- data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
- data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
- data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
- data/src/core/ext/filters/client_channel/client_channel.h +74 -27
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
- data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
- data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
- data/src/core/ext/filters/client_channel/config_selector.h +4 -5
- data/src/core/ext/filters/client_channel/connector.h +18 -18
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
- data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
- data/src/core/ext/filters/client_channel/resolver.h +1 -1
- data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
- data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
- data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
- data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
- data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
- data/src/core/ext/filters/client_channel/server_address.h +1 -1
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
- data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
- data/src/core/ext/filters/client_channel/subchannel.h +29 -49
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
- data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
- data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
- data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
- data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
- data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
- data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
- data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
- data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
- data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
- data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
- data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
- data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
- data/src/core/ext/service_config/service_config_call_data.h +72 -0
- data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
- data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
- data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
- data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
- data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
- data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
- data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
- data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
- data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
- data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
- data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
- data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
- data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
- data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
- data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
- data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
- data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
- data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
- data/src/core/ext/xds/xds_api.cc +325 -362
- data/src/core/ext/xds/xds_api.h +134 -82
- data/src/core/ext/xds/xds_bootstrap.h +10 -0
- data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
- data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
- data/src/core/ext/xds/xds_client.cc +527 -314
- data/src/core/ext/xds/xds_client.h +42 -37
- data/src/core/ext/xds/xds_client_stats.h +1 -1
- data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
- data/src/core/lib/address_utils/parse_address.cc +2 -0
- data/src/core/lib/avl/avl.cc +5 -5
- data/src/core/lib/backoff/backoff.cc +1 -1
- data/src/core/lib/channel/channel_args.cc +24 -6
- data/src/core/lib/channel/channel_args.h +9 -0
- data/src/core/lib/channel/channel_stack_builder.cc +3 -3
- data/src/core/lib/channel/channel_trace.cc +1 -1
- data/src/core/lib/channel/channel_trace.h +1 -1
- data/src/core/lib/channel/channelz.cc +3 -3
- data/src/core/lib/channel/channelz.h +2 -2
- data/src/core/lib/channel/channelz_registry.cc +1 -1
- data/src/core/lib/channel/channelz_registry.h +1 -1
- data/src/core/lib/channel/connected_channel.cc +1 -3
- data/src/core/lib/channel/connected_channel.h +1 -2
- data/src/core/lib/compression/compression.cc +2 -2
- data/src/core/lib/compression/compression_args.cc +6 -4
- data/src/core/lib/compression/compression_internal.cc +2 -2
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/config/core_configuration.cc +44 -2
- data/src/core/lib/config/core_configuration.h +39 -1
- data/src/core/lib/debug/stats.cc +1 -1
- data/src/core/lib/debug/stats_data.cc +13 -13
- data/src/core/lib/gpr/atm.cc +1 -1
- data/src/core/lib/gpr/cpu_posix.cc +1 -1
- data/src/core/lib/gpr/string.cc +2 -2
- data/src/core/lib/gpr/tls.h +1 -1
- data/src/core/lib/gpr/useful.h +79 -32
- data/src/core/lib/gprpp/arena.h +10 -0
- data/src/core/lib/gprpp/bitset.h +38 -16
- data/src/core/lib/gprpp/chunked_vector.h +211 -0
- data/src/core/lib/gprpp/construct_destruct.h +1 -1
- data/src/core/lib/gprpp/match.h +1 -1
- data/src/core/lib/gprpp/memory.h +6 -0
- data/src/core/lib/gprpp/overload.h +1 -1
- data/src/core/lib/gprpp/status_helper.cc +23 -3
- data/src/core/lib/gprpp/status_helper.h +12 -1
- data/src/core/lib/gprpp/table.h +411 -0
- data/src/core/lib/http/httpcli.cc +200 -182
- data/src/core/lib/http/parser.cc +2 -2
- data/src/core/lib/iomgr/call_combiner.cc +28 -10
- data/src/core/lib/iomgr/combiner.cc +6 -21
- data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
- data/src/core/lib/iomgr/error.cc +113 -52
- data/src/core/lib/iomgr/error.h +50 -9
- data/src/core/lib/iomgr/error_cfstream.cc +5 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
- data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
- data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
- data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
- data/src/core/lib/iomgr/event_engine/closure.h +10 -1
- data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
- data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
- data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
- data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
- data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
- data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
- data/src/core/lib/iomgr/exec_ctx.cc +1 -9
- data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
- data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
- data/src/core/lib/iomgr/executor.cc +6 -20
- data/src/core/lib/iomgr/iomgr.cc +3 -1
- data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
- data/src/core/lib/iomgr/iomgr_internal.h +3 -2
- data/src/core/lib/iomgr/load_file.cc +2 -2
- data/src/core/lib/iomgr/lockfree_event.cc +18 -0
- data/src/core/lib/iomgr/pollset_custom.cc +1 -1
- data/src/core/lib/iomgr/pollset_custom.h +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
- data/src/core/lib/iomgr/resource_quota.cc +13 -11
- data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
- data/src/core/lib/iomgr/socket_mutator.cc +2 -2
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
- data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
- data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
- data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
- data/src/core/lib/iomgr/tcp_posix.cc +4 -5
- data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
- data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
- data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
- data/src/core/lib/iomgr/tcp_windows.cc +2 -2
- data/src/core/lib/iomgr/timer_generic.cc +13 -13
- data/src/core/lib/iomgr/timer_heap.cc +1 -1
- data/src/core/lib/json/json_util.cc +68 -0
- data/src/core/lib/json/json_util.h +57 -99
- data/src/core/lib/json/json_writer.cc +0 -3
- data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
- data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
- data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
- data/src/core/lib/security/context/security_context.cc +4 -2
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
- data/src/core/lib/security/credentials/credentials.cc +4 -2
- data/src/core/lib/security/credentials/credentials.h +6 -1
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
- data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/security_connector.cc +9 -4
- data/src/core/lib/security/security_connector/security_connector.h +1 -1
- data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
- data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
- data/src/core/lib/security/transport/security_handshaker.cc +73 -43
- data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
- data/src/core/lib/security/transport/tsi_error.cc +3 -5
- data/src/core/lib/slice/slice.cc +0 -16
- data/src/core/lib/slice/slice_api.cc +39 -0
- data/src/core/lib/slice/slice_buffer.cc +5 -5
- data/src/core/lib/slice/slice_intern.cc +8 -13
- data/src/core/lib/slice/slice_internal.h +1 -244
- data/src/core/lib/slice/slice_refcount.cc +17 -0
- data/src/core/lib/slice/slice_refcount.h +121 -0
- data/src/core/lib/slice/slice_refcount_base.h +173 -0
- data/src/core/lib/slice/slice_split.cc +100 -0
- data/src/core/lib/slice/slice_split.h +40 -0
- data/src/core/lib/slice/slice_string_helpers.cc +0 -83
- data/src/core/lib/slice/slice_string_helpers.h +0 -11
- data/src/core/lib/slice/static_slice.cc +529 -0
- data/src/core/lib/slice/static_slice.h +331 -0
- data/src/core/lib/surface/builtins.cc +49 -0
- data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
- data/src/core/lib/surface/call.cc +103 -120
- data/src/core/lib/surface/call.h +0 -6
- data/src/core/lib/surface/channel.cc +19 -32
- data/src/core/lib/surface/channel.h +0 -9
- data/src/core/lib/surface/channel_init.cc +23 -76
- data/src/core/lib/surface/channel_init.h +52 -44
- data/src/core/lib/surface/completion_queue.cc +6 -5
- data/src/core/lib/surface/init.cc +0 -39
- data/src/core/lib/surface/init_secure.cc +17 -14
- data/src/core/lib/surface/lame_client.cc +18 -11
- data/src/core/lib/surface/lame_client.h +1 -1
- data/src/core/lib/surface/server.cc +25 -17
- data/src/core/lib/surface/server.h +17 -10
- data/src/core/lib/surface/validate_metadata.cc +5 -2
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +1 -1
- data/src/core/lib/transport/error_utils.cc +42 -17
- data/src/core/lib/transport/error_utils.h +1 -1
- data/src/core/lib/transport/metadata.cc +31 -10
- data/src/core/lib/transport/metadata.h +2 -1
- data/src/core/lib/transport/metadata_batch.cc +35 -371
- data/src/core/lib/transport/metadata_batch.h +905 -71
- data/src/core/lib/transport/parsed_metadata.h +263 -0
- data/src/core/lib/transport/pid_controller.cc +4 -4
- data/src/core/lib/transport/static_metadata.cc +714 -846
- data/src/core/lib/transport/static_metadata.h +115 -379
- data/src/core/lib/transport/status_metadata.cc +1 -0
- data/src/core/lib/transport/transport.cc +4 -5
- data/src/core/lib/transport/transport_op_string.cc +40 -20
- data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
- data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
- data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
- data/src/core/tsi/fake_transport_security.cc +15 -7
- data/src/core/tsi/local_transport_security.cc +36 -73
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
- data/src/core/tsi/ssl_transport_security.cc +10 -2
- data/src/core/tsi/transport_security.cc +12 -0
- data/src/core/tsi/transport_security.h +16 -1
- data/src/core/tsi/transport_security_interface.h +26 -0
- data/src/ruby/ext/grpc/extconf.rb +12 -9
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
- data/src/ruby/spec/client_server_spec.rb +1 -1
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
- data/third_party/address_sorting/address_sorting_posix.c +1 -0
- data/third_party/boringssl-with-bazel/err_data.c +278 -272
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +21 -22
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +15 -22
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +13 -7
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +19 -29
- data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/a_strex.c +268 -271
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +106 -153
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +0 -39
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/charmap.h +0 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +38 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +8 -8
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +289 -198
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +8 -8
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +9 -13
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +11 -8
- data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +1 -7
- data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -5
- data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +0 -4
- data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +1 -7
- data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -6
- data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -17
- data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +9 -0
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +8 -0
- data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +45 -65
- data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +21 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +3 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +5 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +10 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +4 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +24 -9
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +4 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
- data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +12 -9
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +0 -9
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +0 -8
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +0 -4
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +16 -7
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +9 -4
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +151 -12
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +181 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +246 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +11 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +0 -179
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +4 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -5
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +11 -50
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +2 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +0 -16
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +22 -18
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +11 -8
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +16 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +4 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +24 -5
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +17 -8
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +6 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +112 -55
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +71 -26
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +366 -227
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +2 -9
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +3 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +3 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +9 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +8 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +4 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +9 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -20
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -5
- data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +5 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/span.h +37 -15
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +28 -14
- data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -32
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +529 -91
- data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -695
- data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +48 -8
- data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +266 -357
- data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +90 -152
- data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +15 -13
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +75 -79
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +96 -97
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +63 -43
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +6 -12
- data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +14 -17
- data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +14 -27
- data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +203 -203
- data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +30 -41
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +47 -33
- data/third_party/re2/re2/compile.cc +91 -109
- data/third_party/re2/re2/dfa.cc +27 -39
- data/third_party/re2/re2/filtered_re2.cc +18 -2
- data/third_party/re2/re2/filtered_re2.h +10 -5
- data/third_party/re2/re2/nfa.cc +1 -1
- data/third_party/re2/re2/parse.cc +42 -23
- data/third_party/re2/re2/perl_groups.cc +34 -34
- data/third_party/re2/re2/prefilter.cc +3 -2
- data/third_party/re2/re2/prog.cc +182 -4
- data/third_party/re2/re2/prog.h +28 -9
- data/third_party/re2/re2/re2.cc +87 -118
- data/third_party/re2/re2/re2.h +156 -141
- data/third_party/re2/re2/regexp.cc +12 -5
- data/third_party/re2/re2/regexp.h +8 -2
- data/third_party/re2/re2/set.cc +31 -9
- data/third_party/re2/re2/set.h +9 -4
- data/third_party/re2/re2/simplify.cc +11 -3
- data/third_party/re2/re2/tostring.cc +1 -1
- data/third_party/re2/re2/walker-inl.h +1 -1
- data/third_party/re2/util/mutex.h +2 -2
- data/third_party/re2/util/pcre.h +3 -3
- metadata +81 -68
- data/include/grpc/event_engine/slice_allocator.h +0 -71
- data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
- data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
- data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
- data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
- data/src/core/ext/transport/chttp2/client/authority.h +0 -36
- data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
- data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
- data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
- data/src/core/lib/iomgr/udp_server.cc +0 -747
- data/src/core/lib/iomgr/udp_server.h +0 -103
- data/src/core/lib/transport/authority_override.cc +0 -40
- data/src/core/lib/transport/authority_override.h +0 -37
@@ -1,747 +0,0 @@
|
|
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
|
-
|
19
|
-
/* FIXME: "posix" files shouldn't be depending on _GNU_SOURCE */
|
20
|
-
#ifndef _GNU_SOURCE
|
21
|
-
#define _GNU_SOURCE
|
22
|
-
#endif
|
23
|
-
|
24
|
-
#ifndef SO_RXQ_OVFL
|
25
|
-
#define SO_RXQ_OVFL 40
|
26
|
-
#endif
|
27
|
-
|
28
|
-
#include <grpc/support/port_platform.h>
|
29
|
-
|
30
|
-
#include "src/core/lib/iomgr/port.h"
|
31
|
-
|
32
|
-
#ifdef GRPC_POSIX_SOCKET_UDP_SERVER
|
33
|
-
|
34
|
-
#include <errno.h>
|
35
|
-
#include <fcntl.h>
|
36
|
-
#include <limits.h>
|
37
|
-
#include <netinet/in.h>
|
38
|
-
#include <netinet/tcp.h>
|
39
|
-
#include <string.h>
|
40
|
-
#include <sys/socket.h>
|
41
|
-
#include <sys/stat.h>
|
42
|
-
#include <sys/types.h>
|
43
|
-
#include <unistd.h>
|
44
|
-
|
45
|
-
#include <string>
|
46
|
-
#include <vector>
|
47
|
-
|
48
|
-
#include "absl/container/inlined_vector.h"
|
49
|
-
#include "absl/strings/str_cat.h"
|
50
|
-
|
51
|
-
#include <grpc/grpc.h>
|
52
|
-
#include <grpc/support/alloc.h>
|
53
|
-
#include <grpc/support/log.h>
|
54
|
-
#include <grpc/support/string_util.h>
|
55
|
-
#include <grpc/support/sync.h>
|
56
|
-
#include <grpc/support/time.h>
|
57
|
-
|
58
|
-
#include "src/core/lib/address_utils/sockaddr_utils.h"
|
59
|
-
#include "src/core/lib/channel/channel_args.h"
|
60
|
-
#include "src/core/lib/gpr/string.h"
|
61
|
-
#include "src/core/lib/gprpp/memory.h"
|
62
|
-
#include "src/core/lib/iomgr/error.h"
|
63
|
-
#include "src/core/lib/iomgr/ev_posix.h"
|
64
|
-
#include "src/core/lib/iomgr/executor.h"
|
65
|
-
#include "src/core/lib/iomgr/resolve_address.h"
|
66
|
-
#include "src/core/lib/iomgr/sockaddr.h"
|
67
|
-
#include "src/core/lib/iomgr/socket_factory_posix.h"
|
68
|
-
#include "src/core/lib/iomgr/socket_utils_posix.h"
|
69
|
-
#include "src/core/lib/iomgr/udp_server.h"
|
70
|
-
#include "src/core/lib/iomgr/unix_sockets_posix.h"
|
71
|
-
|
72
|
-
/* A listener which implements basic features of Listening on a port for
|
73
|
-
* I/O events*/
|
74
|
-
class GrpcUdpListener {
|
75
|
-
public:
|
76
|
-
GrpcUdpListener(grpc_udp_server* server, int fd,
|
77
|
-
const grpc_resolved_address* addr);
|
78
|
-
~GrpcUdpListener();
|
79
|
-
|
80
|
-
/* Called when grpc server starts to listening on the grpc_fd. */
|
81
|
-
void StartListening(const std::vector<grpc_pollset*>* pollsets,
|
82
|
-
GrpcUdpHandlerFactory* handler_factory);
|
83
|
-
|
84
|
-
/* Called when data is available to read from the socket.
|
85
|
-
* Return true if there is more data to read from fd. */
|
86
|
-
void OnRead(grpc_error_handle error, void* do_read_arg);
|
87
|
-
|
88
|
-
/* Called when the socket is writeable. The given closure should be scheduled
|
89
|
-
* when the socket becomes blocked next time. */
|
90
|
-
void OnCanWrite(grpc_error_handle error, void* do_write_arg);
|
91
|
-
|
92
|
-
/* Called when the grpc_fd is about to be orphaned (and the FD closed). */
|
93
|
-
void OnFdAboutToOrphan();
|
94
|
-
|
95
|
-
/* Called to orphan fd of this listener.*/
|
96
|
-
void OrphanFd();
|
97
|
-
|
98
|
-
/* Called when this listener is going to be destroyed. */
|
99
|
-
void OnDestroy();
|
100
|
-
|
101
|
-
int fd() const { return fd_; }
|
102
|
-
|
103
|
-
protected:
|
104
|
-
grpc_fd* emfd() const { return emfd_; }
|
105
|
-
|
106
|
-
gpr_mu* mutex() { return &mutex_; }
|
107
|
-
|
108
|
-
private:
|
109
|
-
/* event manager callback when reads are ready */
|
110
|
-
static void on_read(void* arg, grpc_error_handle error);
|
111
|
-
static void on_write(void* arg, grpc_error_handle error);
|
112
|
-
|
113
|
-
static void do_read(void* arg, grpc_error_handle error);
|
114
|
-
static void do_write(void* arg, grpc_error_handle error);
|
115
|
-
// Wrapper of grpc_fd_notify_on_write() with a grpc_closure callback
|
116
|
-
// interface.
|
117
|
-
static void fd_notify_on_write_wrapper(void* arg, grpc_error_handle error);
|
118
|
-
|
119
|
-
static void shutdown_fd(void* args, grpc_error_handle error);
|
120
|
-
|
121
|
-
int fd_;
|
122
|
-
grpc_fd* emfd_;
|
123
|
-
grpc_udp_server* server_;
|
124
|
-
grpc_resolved_address addr_;
|
125
|
-
grpc_closure read_closure_;
|
126
|
-
grpc_closure write_closure_;
|
127
|
-
// To be called when corresponding QuicGrpcServer closes all active
|
128
|
-
// connections.
|
129
|
-
grpc_closure orphan_fd_closure_;
|
130
|
-
grpc_closure destroyed_closure_;
|
131
|
-
// To be scheduled on another thread to actually read/write.
|
132
|
-
grpc_closure do_read_closure_;
|
133
|
-
grpc_closure do_write_closure_;
|
134
|
-
grpc_closure notify_on_write_closure_;
|
135
|
-
// True if orphan_cb is trigered.
|
136
|
-
bool orphan_notified_;
|
137
|
-
// True if grpc_fd_notify_on_write() is called after on_write() call.
|
138
|
-
bool notify_on_write_armed_;
|
139
|
-
// True if fd has been shutdown.
|
140
|
-
bool already_shutdown_;
|
141
|
-
// Object actually handles I/O events. Assigned in StartListening().
|
142
|
-
GrpcUdpHandler* udp_handler_ = nullptr;
|
143
|
-
// To be notified on destruction.
|
144
|
-
GrpcUdpHandlerFactory* handler_factory_ = nullptr;
|
145
|
-
// Required to access above fields.
|
146
|
-
gpr_mu mutex_;
|
147
|
-
};
|
148
|
-
|
149
|
-
GrpcUdpListener::GrpcUdpListener(grpc_udp_server* server, int fd,
|
150
|
-
const grpc_resolved_address* addr)
|
151
|
-
: fd_(fd),
|
152
|
-
server_(server),
|
153
|
-
orphan_notified_(false),
|
154
|
-
already_shutdown_(false) {
|
155
|
-
std::string addr_str = grpc_sockaddr_to_string(addr, true);
|
156
|
-
std::string name = absl::StrCat("udp-server-listener:", addr_str);
|
157
|
-
emfd_ = grpc_fd_create(fd, name.c_str(), true);
|
158
|
-
memcpy(&addr_, addr, sizeof(grpc_resolved_address));
|
159
|
-
GPR_ASSERT(emfd_);
|
160
|
-
gpr_mu_init(&mutex_);
|
161
|
-
}
|
162
|
-
|
163
|
-
GrpcUdpListener::~GrpcUdpListener() { gpr_mu_destroy(&mutex_); }
|
164
|
-
|
165
|
-
/* the overall server */
|
166
|
-
struct grpc_udp_server {
|
167
|
-
gpr_mu mu;
|
168
|
-
|
169
|
-
/* factory to use for creating and binding sockets, or NULL */
|
170
|
-
grpc_socket_factory* socket_factory;
|
171
|
-
|
172
|
-
/* active port count: how many ports are actually still listening */
|
173
|
-
size_t active_ports;
|
174
|
-
/* destroyed port count: how many ports are completely destroyed */
|
175
|
-
size_t destroyed_ports;
|
176
|
-
|
177
|
-
/* is this server shutting down? (boolean) */
|
178
|
-
int shutdown;
|
179
|
-
|
180
|
-
/* An array of listeners */
|
181
|
-
absl::InlinedVector<GrpcUdpListener, 16> listeners;
|
182
|
-
|
183
|
-
/* factory for use to create udp listeners */
|
184
|
-
GrpcUdpHandlerFactory* handler_factory;
|
185
|
-
|
186
|
-
/* shutdown callback */
|
187
|
-
grpc_closure* shutdown_complete;
|
188
|
-
|
189
|
-
/* all pollsets interested in new connections. The object pointed at is not
|
190
|
-
* owned by this struct. */
|
191
|
-
const std::vector<grpc_pollset*>* pollsets;
|
192
|
-
/* opaque object to pass to callbacks */
|
193
|
-
void* user_data;
|
194
|
-
|
195
|
-
/* latch has_so_reuseport during server creation */
|
196
|
-
bool so_reuseport;
|
197
|
-
};
|
198
|
-
|
199
|
-
static grpc_socket_factory* get_socket_factory(const grpc_channel_args* args) {
|
200
|
-
if (args) {
|
201
|
-
const grpc_arg* arg = grpc_channel_args_find(args, GRPC_ARG_SOCKET_FACTORY);
|
202
|
-
if (arg) {
|
203
|
-
GPR_ASSERT(arg->type == GRPC_ARG_POINTER);
|
204
|
-
return static_cast<grpc_socket_factory*>(arg->value.pointer.p);
|
205
|
-
}
|
206
|
-
}
|
207
|
-
return nullptr;
|
208
|
-
}
|
209
|
-
|
210
|
-
grpc_udp_server* grpc_udp_server_create(const grpc_channel_args* args) {
|
211
|
-
grpc_udp_server* s = new grpc_udp_server();
|
212
|
-
gpr_mu_init(&s->mu);
|
213
|
-
s->socket_factory = get_socket_factory(args);
|
214
|
-
if (s->socket_factory) {
|
215
|
-
grpc_socket_factory_ref(s->socket_factory);
|
216
|
-
}
|
217
|
-
s->active_ports = 0;
|
218
|
-
s->destroyed_ports = 0;
|
219
|
-
s->shutdown = 0;
|
220
|
-
s->so_reuseport = grpc_is_socket_reuse_port_supported();
|
221
|
-
return s;
|
222
|
-
}
|
223
|
-
|
224
|
-
// static
|
225
|
-
void GrpcUdpListener::shutdown_fd(void* args, grpc_error_handle error) {
|
226
|
-
if (args == nullptr) {
|
227
|
-
// No-op if shutdown args are null.
|
228
|
-
return;
|
229
|
-
}
|
230
|
-
auto sp = static_cast<GrpcUdpListener*>(args);
|
231
|
-
gpr_mu_lock(sp->mutex());
|
232
|
-
gpr_log(GPR_DEBUG, "shutdown fd %d", sp->fd_);
|
233
|
-
grpc_fd_shutdown(sp->emfd_, GRPC_ERROR_REF(error));
|
234
|
-
sp->already_shutdown_ = true;
|
235
|
-
if (!sp->notify_on_write_armed_) {
|
236
|
-
// Re-arm write notification to notify listener with error. This is
|
237
|
-
// necessary to decrement active_ports.
|
238
|
-
sp->notify_on_write_armed_ = true;
|
239
|
-
grpc_fd_notify_on_write(sp->emfd_, &sp->write_closure_);
|
240
|
-
}
|
241
|
-
gpr_mu_unlock(sp->mutex());
|
242
|
-
}
|
243
|
-
|
244
|
-
static void finish_shutdown(grpc_udp_server* s) {
|
245
|
-
if (s->shutdown_complete != nullptr) {
|
246
|
-
grpc_core::ExecCtx::Run(DEBUG_LOCATION, s->shutdown_complete,
|
247
|
-
GRPC_ERROR_NONE);
|
248
|
-
}
|
249
|
-
|
250
|
-
gpr_mu_destroy(&s->mu);
|
251
|
-
|
252
|
-
gpr_log(GPR_DEBUG, "Destroy all listeners.");
|
253
|
-
for (size_t i = 0; i < s->listeners.size(); ++i) {
|
254
|
-
s->listeners[i].OnDestroy();
|
255
|
-
}
|
256
|
-
|
257
|
-
if (s->socket_factory) {
|
258
|
-
grpc_socket_factory_unref(s->socket_factory);
|
259
|
-
}
|
260
|
-
|
261
|
-
delete s;
|
262
|
-
}
|
263
|
-
|
264
|
-
static void destroyed_port(void* server, grpc_error_handle /*error*/) {
|
265
|
-
grpc_udp_server* s = static_cast<grpc_udp_server*>(server);
|
266
|
-
gpr_mu_lock(&s->mu);
|
267
|
-
s->destroyed_ports++;
|
268
|
-
if (s->destroyed_ports == s->listeners.size()) {
|
269
|
-
gpr_mu_unlock(&s->mu);
|
270
|
-
finish_shutdown(s);
|
271
|
-
} else {
|
272
|
-
gpr_mu_unlock(&s->mu);
|
273
|
-
}
|
274
|
-
}
|
275
|
-
|
276
|
-
/* called when all listening endpoints have been shutdown, so no further
|
277
|
-
events will be received on them - at this point it's safe to destroy
|
278
|
-
things */
|
279
|
-
static void deactivated_all_ports(grpc_udp_server* s) {
|
280
|
-
/* delete ALL the things */
|
281
|
-
gpr_mu_lock(&s->mu);
|
282
|
-
|
283
|
-
GPR_ASSERT(s->shutdown);
|
284
|
-
|
285
|
-
if (s->listeners.empty()) {
|
286
|
-
gpr_mu_unlock(&s->mu);
|
287
|
-
finish_shutdown(s);
|
288
|
-
return;
|
289
|
-
}
|
290
|
-
for (size_t i = 0; i < s->listeners.size(); ++i) {
|
291
|
-
s->listeners[i].OrphanFd();
|
292
|
-
}
|
293
|
-
gpr_mu_unlock(&s->mu);
|
294
|
-
}
|
295
|
-
|
296
|
-
void GrpcUdpListener::OrphanFd() {
|
297
|
-
gpr_log(GPR_DEBUG, "Orphan fd %d, emfd %p", fd_, emfd_);
|
298
|
-
grpc_unlink_if_unix_domain_socket(&addr_);
|
299
|
-
|
300
|
-
GRPC_CLOSURE_INIT(&destroyed_closure_, destroyed_port, server_,
|
301
|
-
grpc_schedule_on_exec_ctx);
|
302
|
-
/* Because at this point, all listening sockets have been shutdown already, no
|
303
|
-
* need to call OnFdAboutToOrphan() to notify the handler again. */
|
304
|
-
grpc_fd_orphan(emfd_, &destroyed_closure_, nullptr, "udp_listener_shutdown");
|
305
|
-
}
|
306
|
-
|
307
|
-
void grpc_udp_server_destroy(grpc_udp_server* s, grpc_closure* on_done) {
|
308
|
-
gpr_mu_lock(&s->mu);
|
309
|
-
|
310
|
-
GPR_ASSERT(!s->shutdown);
|
311
|
-
s->shutdown = 1;
|
312
|
-
|
313
|
-
s->shutdown_complete = on_done;
|
314
|
-
|
315
|
-
gpr_log(GPR_DEBUG, "start to destroy udp_server");
|
316
|
-
/* shutdown all fd's */
|
317
|
-
if (s->active_ports) {
|
318
|
-
for (size_t i = 0; i < s->listeners.size(); ++i) {
|
319
|
-
GrpcUdpListener* sp = &s->listeners[i];
|
320
|
-
sp->OnFdAboutToOrphan();
|
321
|
-
}
|
322
|
-
gpr_mu_unlock(&s->mu);
|
323
|
-
} else {
|
324
|
-
gpr_mu_unlock(&s->mu);
|
325
|
-
deactivated_all_ports(s);
|
326
|
-
}
|
327
|
-
}
|
328
|
-
|
329
|
-
void GrpcUdpListener::OnFdAboutToOrphan() {
|
330
|
-
gpr_mu_lock(&mutex_);
|
331
|
-
grpc_unlink_if_unix_domain_socket(&addr_);
|
332
|
-
|
333
|
-
GRPC_CLOSURE_INIT(&destroyed_closure_, destroyed_port, server_,
|
334
|
-
grpc_schedule_on_exec_ctx);
|
335
|
-
if (!orphan_notified_ && udp_handler_ != nullptr) {
|
336
|
-
/* Signals udp_handler that the FD is about to be closed and
|
337
|
-
* should no longer be used. */
|
338
|
-
GRPC_CLOSURE_INIT(&orphan_fd_closure_, shutdown_fd, this,
|
339
|
-
grpc_schedule_on_exec_ctx);
|
340
|
-
gpr_log(GPR_DEBUG, "fd %d about to be orphaned", fd_);
|
341
|
-
udp_handler_->OnFdAboutToOrphan(&orphan_fd_closure_, server_->user_data);
|
342
|
-
orphan_notified_ = true;
|
343
|
-
}
|
344
|
-
gpr_mu_unlock(&mutex_);
|
345
|
-
}
|
346
|
-
|
347
|
-
static int bind_socket(grpc_socket_factory* socket_factory, int sockfd,
|
348
|
-
const grpc_resolved_address* addr) {
|
349
|
-
return (socket_factory != nullptr)
|
350
|
-
? grpc_socket_factory_bind(socket_factory, sockfd, addr)
|
351
|
-
: bind(sockfd,
|
352
|
-
reinterpret_cast<grpc_sockaddr*>(
|
353
|
-
const_cast<char*>(addr->addr)),
|
354
|
-
addr->len);
|
355
|
-
}
|
356
|
-
|
357
|
-
/* Prepare a recently-created socket for listening. */
|
358
|
-
static int prepare_socket(grpc_socket_factory* socket_factory, int fd,
|
359
|
-
const grpc_resolved_address* addr, int rcv_buf_size,
|
360
|
-
int snd_buf_size, bool so_reuseport) {
|
361
|
-
grpc_resolved_address sockname_temp;
|
362
|
-
grpc_sockaddr* addr_ptr =
|
363
|
-
reinterpret_cast<grpc_sockaddr*>(const_cast<char*>(addr->addr));
|
364
|
-
|
365
|
-
if (fd < 0) {
|
366
|
-
goto error;
|
367
|
-
}
|
368
|
-
|
369
|
-
if (grpc_set_socket_nonblocking(fd, 1) != GRPC_ERROR_NONE) {
|
370
|
-
gpr_log(GPR_ERROR, "Unable to set nonblocking %d: %s", fd, strerror(errno));
|
371
|
-
goto error;
|
372
|
-
}
|
373
|
-
if (grpc_set_socket_cloexec(fd, 1) != GRPC_ERROR_NONE) {
|
374
|
-
gpr_log(GPR_ERROR, "Unable to set cloexec %d: %s", fd, strerror(errno));
|
375
|
-
goto error;
|
376
|
-
}
|
377
|
-
|
378
|
-
if (grpc_set_socket_ip_pktinfo_if_possible(fd) != GRPC_ERROR_NONE) {
|
379
|
-
gpr_log(GPR_ERROR, "Unable to set ip_pktinfo.");
|
380
|
-
goto error;
|
381
|
-
} else if (addr_ptr->sa_family == AF_INET6) {
|
382
|
-
if (grpc_set_socket_ipv6_recvpktinfo_if_possible(fd) != GRPC_ERROR_NONE) {
|
383
|
-
gpr_log(GPR_ERROR, "Unable to set ipv6_recvpktinfo.");
|
384
|
-
goto error;
|
385
|
-
}
|
386
|
-
}
|
387
|
-
|
388
|
-
if (grpc_set_socket_sndbuf(fd, snd_buf_size) != GRPC_ERROR_NONE) {
|
389
|
-
gpr_log(GPR_ERROR, "Failed to set send buffer size to %d bytes",
|
390
|
-
snd_buf_size);
|
391
|
-
goto error;
|
392
|
-
}
|
393
|
-
|
394
|
-
if (grpc_set_socket_rcvbuf(fd, rcv_buf_size) != GRPC_ERROR_NONE) {
|
395
|
-
gpr_log(GPR_ERROR, "Failed to set receive buffer size to %d bytes",
|
396
|
-
rcv_buf_size);
|
397
|
-
goto error;
|
398
|
-
}
|
399
|
-
|
400
|
-
{
|
401
|
-
int get_overflow = 1;
|
402
|
-
if (0 != setsockopt(fd, SOL_SOCKET, SO_RXQ_OVFL, &get_overflow,
|
403
|
-
sizeof(get_overflow))) {
|
404
|
-
gpr_log(GPR_INFO, "Failed to set socket overflow support");
|
405
|
-
}
|
406
|
-
}
|
407
|
-
|
408
|
-
if (so_reuseport && !grpc_is_unix_socket(addr) &&
|
409
|
-
grpc_set_socket_reuse_port(fd, 1) != GRPC_ERROR_NONE) {
|
410
|
-
gpr_log(GPR_ERROR, "Failed to set SO_REUSEPORT for fd %d", fd);
|
411
|
-
goto error;
|
412
|
-
}
|
413
|
-
|
414
|
-
if (bind_socket(socket_factory, fd, addr) < 0) {
|
415
|
-
std::string addr_str = grpc_sockaddr_to_string(addr, false);
|
416
|
-
gpr_log(GPR_ERROR, "bind addr=%s: %s", addr_str.c_str(), strerror(errno));
|
417
|
-
goto error;
|
418
|
-
}
|
419
|
-
|
420
|
-
sockname_temp.len = static_cast<socklen_t>(sizeof(struct sockaddr_storage));
|
421
|
-
|
422
|
-
if (getsockname(fd, reinterpret_cast<grpc_sockaddr*>(sockname_temp.addr),
|
423
|
-
&sockname_temp.len) < 0) {
|
424
|
-
gpr_log(GPR_ERROR, "Unable to get the address socket %d is bound to: %s",
|
425
|
-
fd, strerror(errno));
|
426
|
-
goto error;
|
427
|
-
}
|
428
|
-
|
429
|
-
return grpc_sockaddr_get_port(&sockname_temp);
|
430
|
-
|
431
|
-
error:
|
432
|
-
if (fd >= 0) {
|
433
|
-
close(fd);
|
434
|
-
}
|
435
|
-
return -1;
|
436
|
-
}
|
437
|
-
|
438
|
-
// static
|
439
|
-
void GrpcUdpListener::do_read(void* arg, grpc_error_handle error) {
|
440
|
-
GrpcUdpListener* sp = static_cast<GrpcUdpListener*>(arg);
|
441
|
-
GPR_ASSERT(error == GRPC_ERROR_NONE);
|
442
|
-
/* TODO: the reason we hold server->mu here is merely to prevent fd
|
443
|
-
* shutdown while we are reading. However, it blocks do_write(). Switch to
|
444
|
-
* read lock if available. */
|
445
|
-
gpr_mu_lock(sp->mutex());
|
446
|
-
/* Tell the registered callback that data is available to read. */
|
447
|
-
if (!sp->already_shutdown_ && sp->udp_handler_->Read()) {
|
448
|
-
/* There maybe more packets to read. Schedule read_more_cb_ closure to run
|
449
|
-
* after finishing this event loop. */
|
450
|
-
grpc_core::Executor::Run(&sp->do_read_closure_, GRPC_ERROR_NONE,
|
451
|
-
grpc_core::ExecutorType::DEFAULT,
|
452
|
-
grpc_core::ExecutorJobType::LONG);
|
453
|
-
} else {
|
454
|
-
/* Finish reading all the packets, re-arm the notification event so we can
|
455
|
-
* get another chance to read. Or fd already shutdown, re-arm to get a
|
456
|
-
* notification with shutdown error. */
|
457
|
-
grpc_fd_notify_on_read(sp->emfd_, &sp->read_closure_);
|
458
|
-
}
|
459
|
-
gpr_mu_unlock(sp->mutex());
|
460
|
-
}
|
461
|
-
|
462
|
-
// static
|
463
|
-
void GrpcUdpListener::on_read(void* arg, grpc_error_handle error) {
|
464
|
-
GrpcUdpListener* sp = static_cast<GrpcUdpListener*>(arg);
|
465
|
-
sp->OnRead(error, arg);
|
466
|
-
}
|
467
|
-
|
468
|
-
void GrpcUdpListener::OnRead(grpc_error_handle error, void* do_read_arg) {
|
469
|
-
if (error != GRPC_ERROR_NONE) {
|
470
|
-
gpr_mu_lock(&server_->mu);
|
471
|
-
if (0 == --server_->active_ports && server_->shutdown) {
|
472
|
-
gpr_mu_unlock(&server_->mu);
|
473
|
-
deactivated_all_ports(server_);
|
474
|
-
} else {
|
475
|
-
gpr_mu_unlock(&server_->mu);
|
476
|
-
}
|
477
|
-
return;
|
478
|
-
}
|
479
|
-
|
480
|
-
/* Read once. If there is more data to read, off load the work to another
|
481
|
-
* thread to finish. */
|
482
|
-
if (udp_handler_->Read()) {
|
483
|
-
/* There maybe more packets to read. Schedule read_more_cb_ closure to run
|
484
|
-
* after finishing this event loop. */
|
485
|
-
GRPC_CLOSURE_INIT(&do_read_closure_, do_read, do_read_arg, nullptr);
|
486
|
-
grpc_core::Executor::Run(&do_read_closure_, GRPC_ERROR_NONE,
|
487
|
-
grpc_core::ExecutorType::DEFAULT,
|
488
|
-
grpc_core::ExecutorJobType::LONG);
|
489
|
-
} else {
|
490
|
-
/* Finish reading all the packets, re-arm the notification event so we can
|
491
|
-
* get another chance to read. Or fd already shutdown, re-arm to get a
|
492
|
-
* notification with shutdown error. */
|
493
|
-
grpc_fd_notify_on_read(emfd_, &read_closure_);
|
494
|
-
}
|
495
|
-
}
|
496
|
-
|
497
|
-
// static
|
498
|
-
// Wrapper of grpc_fd_notify_on_write() with a grpc_closure callback interface.
|
499
|
-
void GrpcUdpListener::fd_notify_on_write_wrapper(void* arg,
|
500
|
-
grpc_error_handle /*error*/) {
|
501
|
-
GrpcUdpListener* sp = static_cast<GrpcUdpListener*>(arg);
|
502
|
-
gpr_mu_lock(sp->mutex());
|
503
|
-
if (!sp->notify_on_write_armed_) {
|
504
|
-
grpc_fd_notify_on_write(sp->emfd_, &sp->write_closure_);
|
505
|
-
sp->notify_on_write_armed_ = true;
|
506
|
-
}
|
507
|
-
gpr_mu_unlock(sp->mutex());
|
508
|
-
}
|
509
|
-
|
510
|
-
// static
|
511
|
-
void GrpcUdpListener::do_write(void* arg, grpc_error_handle error) {
|
512
|
-
GrpcUdpListener* sp = static_cast<GrpcUdpListener*>(arg);
|
513
|
-
gpr_mu_lock(sp->mutex());
|
514
|
-
if (sp->already_shutdown_) {
|
515
|
-
// If fd has been shutdown, don't write any more and re-arm notification.
|
516
|
-
grpc_fd_notify_on_write(sp->emfd_, &sp->write_closure_);
|
517
|
-
} else {
|
518
|
-
sp->notify_on_write_armed_ = false;
|
519
|
-
/* Tell the registered callback that the socket is writeable. */
|
520
|
-
GPR_ASSERT(error == GRPC_ERROR_NONE);
|
521
|
-
GRPC_CLOSURE_INIT(&sp->notify_on_write_closure_, fd_notify_on_write_wrapper,
|
522
|
-
arg, grpc_schedule_on_exec_ctx);
|
523
|
-
sp->udp_handler_->OnCanWrite(sp->server_->user_data,
|
524
|
-
&sp->notify_on_write_closure_);
|
525
|
-
}
|
526
|
-
gpr_mu_unlock(sp->mutex());
|
527
|
-
}
|
528
|
-
|
529
|
-
// static
|
530
|
-
void GrpcUdpListener::on_write(void* arg, grpc_error_handle error) {
|
531
|
-
GrpcUdpListener* sp = static_cast<GrpcUdpListener*>(arg);
|
532
|
-
sp->OnCanWrite(error, arg);
|
533
|
-
}
|
534
|
-
|
535
|
-
void GrpcUdpListener::OnCanWrite(grpc_error_handle error, void* do_write_arg) {
|
536
|
-
if (error != GRPC_ERROR_NONE) {
|
537
|
-
gpr_mu_lock(&server_->mu);
|
538
|
-
if (0 == --server_->active_ports && server_->shutdown) {
|
539
|
-
gpr_mu_unlock(&server_->mu);
|
540
|
-
deactivated_all_ports(server_);
|
541
|
-
} else {
|
542
|
-
gpr_mu_unlock(&server_->mu);
|
543
|
-
}
|
544
|
-
return;
|
545
|
-
}
|
546
|
-
|
547
|
-
/* Schedule actual write in another thread. */
|
548
|
-
GRPC_CLOSURE_INIT(&do_write_closure_, do_write, do_write_arg, nullptr);
|
549
|
-
|
550
|
-
grpc_core::Executor::Run(&do_write_closure_, GRPC_ERROR_NONE,
|
551
|
-
grpc_core::ExecutorType::DEFAULT,
|
552
|
-
grpc_core::ExecutorJobType::LONG);
|
553
|
-
}
|
554
|
-
|
555
|
-
static int add_socket_to_server(grpc_udp_server* s, int fd,
|
556
|
-
const grpc_resolved_address* addr,
|
557
|
-
int rcv_buf_size, int snd_buf_size) {
|
558
|
-
gpr_log(GPR_DEBUG, "add socket %d to server", fd);
|
559
|
-
|
560
|
-
int port = prepare_socket(s->socket_factory, fd, addr, rcv_buf_size,
|
561
|
-
snd_buf_size, s->so_reuseport);
|
562
|
-
if (port >= 0) {
|
563
|
-
gpr_mu_lock(&s->mu);
|
564
|
-
s->listeners.emplace_back(s, fd, addr);
|
565
|
-
gpr_log(GPR_DEBUG,
|
566
|
-
"add socket %d to server for port %d, %zu listener(s) in total", fd,
|
567
|
-
port, s->listeners.size());
|
568
|
-
gpr_mu_unlock(&s->mu);
|
569
|
-
}
|
570
|
-
return port;
|
571
|
-
}
|
572
|
-
|
573
|
-
int grpc_udp_server_add_port(grpc_udp_server* s, grpc_resolved_address* addr,
|
574
|
-
int rcv_buf_size, int snd_buf_size,
|
575
|
-
GrpcUdpHandlerFactory* handler_factory,
|
576
|
-
size_t num_listeners) {
|
577
|
-
if (num_listeners > 1 && !s->so_reuseport) {
|
578
|
-
gpr_log(GPR_ERROR,
|
579
|
-
"Try to have multiple listeners on same port, but SO_REUSEPORT is "
|
580
|
-
"not supported. Only create 1 listener.");
|
581
|
-
}
|
582
|
-
std::string addr_str = grpc_sockaddr_to_string(addr, true);
|
583
|
-
gpr_log(GPR_DEBUG, "add address: %s to server", addr_str.c_str());
|
584
|
-
|
585
|
-
int allocated_port1 = -1;
|
586
|
-
int allocated_port2 = -1;
|
587
|
-
int fd;
|
588
|
-
grpc_dualstack_mode dsmode;
|
589
|
-
grpc_resolved_address addr6_v4mapped;
|
590
|
-
grpc_resolved_address wild4;
|
591
|
-
grpc_resolved_address wild6;
|
592
|
-
grpc_resolved_address addr4_copy;
|
593
|
-
grpc_resolved_address* allocated_addr = nullptr;
|
594
|
-
grpc_resolved_address sockname_temp;
|
595
|
-
int port = 0;
|
596
|
-
|
597
|
-
/* Check if this is a wildcard port, and if so, try to keep the port the same
|
598
|
-
as some previously created listener. */
|
599
|
-
if (grpc_sockaddr_get_port(addr) == 0) {
|
600
|
-
/* Loop through existing listeners to find the port in use. */
|
601
|
-
for (size_t i = 0; i < s->listeners.size(); ++i) {
|
602
|
-
sockname_temp.len =
|
603
|
-
static_cast<socklen_t>(sizeof(struct sockaddr_storage));
|
604
|
-
if (0 == getsockname(s->listeners[i].fd(),
|
605
|
-
reinterpret_cast<grpc_sockaddr*>(sockname_temp.addr),
|
606
|
-
&sockname_temp.len)) {
|
607
|
-
port = grpc_sockaddr_get_port(&sockname_temp);
|
608
|
-
if (port > 0) {
|
609
|
-
/* Found such a port, update |addr| to reflects this port. */
|
610
|
-
allocated_addr = static_cast<grpc_resolved_address*>(
|
611
|
-
gpr_malloc(sizeof(grpc_resolved_address)));
|
612
|
-
memcpy(allocated_addr, addr, sizeof(grpc_resolved_address));
|
613
|
-
grpc_sockaddr_set_port(allocated_addr, port);
|
614
|
-
addr = allocated_addr;
|
615
|
-
break;
|
616
|
-
}
|
617
|
-
}
|
618
|
-
}
|
619
|
-
}
|
620
|
-
|
621
|
-
if (grpc_sockaddr_to_v4mapped(addr, &addr6_v4mapped)) {
|
622
|
-
addr = &addr6_v4mapped;
|
623
|
-
}
|
624
|
-
|
625
|
-
s->handler_factory = handler_factory;
|
626
|
-
for (size_t i = 0; i < num_listeners; ++i) {
|
627
|
-
/* Treat :: or 0.0.0.0 as a family-agnostic wildcard. */
|
628
|
-
if (grpc_sockaddr_is_wildcard(addr, &port)) {
|
629
|
-
grpc_sockaddr_make_wildcards(port, &wild4, &wild6);
|
630
|
-
|
631
|
-
/* Try listening on IPv6 first. */
|
632
|
-
addr = &wild6;
|
633
|
-
// TODO(rjshade): Test and propagate the returned grpc_error_handle:
|
634
|
-
GRPC_ERROR_UNREF(grpc_create_dualstack_socket_using_factory(
|
635
|
-
s->socket_factory, addr, SOCK_DGRAM, IPPROTO_UDP, &dsmode, &fd));
|
636
|
-
allocated_port1 =
|
637
|
-
add_socket_to_server(s, fd, addr, rcv_buf_size, snd_buf_size);
|
638
|
-
if (fd >= 0 && dsmode == GRPC_DSMODE_DUALSTACK) {
|
639
|
-
if (port == 0) {
|
640
|
-
/* This is the first time to bind to |addr|. If its port is still
|
641
|
-
* wildcard port, update |addr| with the ephermeral port returned by
|
642
|
-
* kernel. Thus |addr| can have a specific port in following
|
643
|
-
* iterations. */
|
644
|
-
grpc_sockaddr_set_port(addr, allocated_port1);
|
645
|
-
port = allocated_port1;
|
646
|
-
} else if (allocated_port1 >= 0) {
|
647
|
-
/* The following successfully created socket should have same port as
|
648
|
-
* the first one. */
|
649
|
-
GPR_ASSERT(port == allocated_port1);
|
650
|
-
}
|
651
|
-
/* A dualstack socket is created, no need to create corresponding IPV4
|
652
|
-
* socket. */
|
653
|
-
continue;
|
654
|
-
}
|
655
|
-
|
656
|
-
/* If we didn't get a dualstack socket, also listen on 0.0.0.0. */
|
657
|
-
if (port == 0 && allocated_port1 > 0) {
|
658
|
-
/* |port| hasn't been assigned to an emphemeral port yet, |wild4| must
|
659
|
-
* have a wildcard port. Update it with the emphemeral port created
|
660
|
-
* during binding.*/
|
661
|
-
grpc_sockaddr_set_port(&wild4, allocated_port1);
|
662
|
-
port = allocated_port1;
|
663
|
-
}
|
664
|
-
/* |wild4| should have been updated with an emphemeral port by now. Use
|
665
|
-
* this IPV4 address to create a IPV4 socket. */
|
666
|
-
addr = &wild4;
|
667
|
-
}
|
668
|
-
|
669
|
-
// TODO(rjshade): Test and propagate the returned grpc_error_handle:
|
670
|
-
GRPC_ERROR_UNREF(grpc_create_dualstack_socket_using_factory(
|
671
|
-
s->socket_factory, addr, SOCK_DGRAM, IPPROTO_UDP, &dsmode, &fd));
|
672
|
-
if (fd < 0) {
|
673
|
-
gpr_log(GPR_ERROR, "Unable to create socket: %s", strerror(errno));
|
674
|
-
}
|
675
|
-
if (dsmode == GRPC_DSMODE_IPV4 &&
|
676
|
-
grpc_sockaddr_is_v4mapped(addr, &addr4_copy)) {
|
677
|
-
addr = &addr4_copy;
|
678
|
-
}
|
679
|
-
allocated_port2 =
|
680
|
-
add_socket_to_server(s, fd, addr, rcv_buf_size, snd_buf_size);
|
681
|
-
if (port == 0) {
|
682
|
-
/* Update |addr| with the ephermeral port returned by kernel. So |addr|
|
683
|
-
* can have a specific port in following iterations. */
|
684
|
-
grpc_sockaddr_set_port(addr, allocated_port2);
|
685
|
-
port = allocated_port2;
|
686
|
-
} else if (allocated_port2 >= 0) {
|
687
|
-
GPR_ASSERT(port == allocated_port2);
|
688
|
-
}
|
689
|
-
}
|
690
|
-
|
691
|
-
gpr_free(allocated_addr);
|
692
|
-
return port;
|
693
|
-
}
|
694
|
-
|
695
|
-
int grpc_udp_server_get_fd(grpc_udp_server* s, unsigned port_index) {
|
696
|
-
if (port_index >= s->listeners.size()) {
|
697
|
-
return -1;
|
698
|
-
}
|
699
|
-
|
700
|
-
return s->listeners[port_index].fd();
|
701
|
-
}
|
702
|
-
|
703
|
-
void grpc_udp_server_start(grpc_udp_server* udp_server,
|
704
|
-
const std::vector<grpc_pollset*>* pollsets,
|
705
|
-
void* user_data) {
|
706
|
-
gpr_log(GPR_DEBUG, "grpc_udp_server_start");
|
707
|
-
gpr_mu_lock(&udp_server->mu);
|
708
|
-
GPR_ASSERT(udp_server->active_ports == 0);
|
709
|
-
udp_server->pollsets = pollsets;
|
710
|
-
udp_server->user_data = user_data;
|
711
|
-
|
712
|
-
for (auto& listener : udp_server->listeners) {
|
713
|
-
listener.StartListening(pollsets, udp_server->handler_factory);
|
714
|
-
}
|
715
|
-
|
716
|
-
gpr_mu_unlock(&udp_server->mu);
|
717
|
-
}
|
718
|
-
|
719
|
-
void GrpcUdpListener::StartListening(const std::vector<grpc_pollset*>* pollsets,
|
720
|
-
GrpcUdpHandlerFactory* handler_factory) {
|
721
|
-
gpr_mu_lock(&mutex_);
|
722
|
-
handler_factory_ = handler_factory;
|
723
|
-
udp_handler_ = handler_factory->CreateUdpHandler(emfd_, server_->user_data);
|
724
|
-
for (grpc_pollset* pollset : *pollsets) {
|
725
|
-
grpc_pollset_add_fd(pollset, emfd_);
|
726
|
-
}
|
727
|
-
GRPC_CLOSURE_INIT(&read_closure_, on_read, this, grpc_schedule_on_exec_ctx);
|
728
|
-
grpc_fd_notify_on_read(emfd_, &read_closure_);
|
729
|
-
|
730
|
-
GRPC_CLOSURE_INIT(&write_closure_, on_write, this, grpc_schedule_on_exec_ctx);
|
731
|
-
notify_on_write_armed_ = true;
|
732
|
-
grpc_fd_notify_on_write(emfd_, &write_closure_);
|
733
|
-
|
734
|
-
/* Registered for both read and write callbacks: increment active_ports
|
735
|
-
* twice to account for this, and delay free-ing of memory until both
|
736
|
-
* on_read and on_write have fired. */
|
737
|
-
server_->active_ports += 2;
|
738
|
-
gpr_mu_unlock(&mutex_);
|
739
|
-
}
|
740
|
-
|
741
|
-
void GrpcUdpListener::OnDestroy() {
|
742
|
-
if (udp_handler_ != nullptr) {
|
743
|
-
handler_factory_->DestroyUdpHandler(udp_handler_);
|
744
|
-
}
|
745
|
-
}
|
746
|
-
|
747
|
-
#endif
|