grpc 1.41.0 → 1.42.0.pre1

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.

Files changed (519) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +57 -44
  3. data/etc/roots.pem +335 -326
  4. data/include/grpc/event_engine/event_engine.h +82 -42
  5. data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
  6. data/include/grpc/event_engine/memory_allocator.h +210 -0
  7. data/include/grpc/grpc.h +4 -0
  8. data/include/grpc/grpc_security.h +18 -0
  9. data/include/grpc/grpc_security_constants.h +1 -0
  10. data/include/grpc/impl/codegen/port_platform.h +7 -0
  11. data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
  12. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
  13. data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
  14. data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
  15. data/src/core/ext/filters/client_channel/client_channel.h +74 -27
  16. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
  17. data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
  19. data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
  20. data/src/core/ext/filters/client_channel/config_selector.h +4 -5
  21. data/src/core/ext/filters/client_channel/connector.h +18 -18
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
  23. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
  37. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
  43. data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
  44. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
  45. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
  50. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
  51. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
  53. data/src/core/ext/filters/client_channel/resolver.h +1 -1
  54. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
  55. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
  56. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
  59. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  60. data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
  61. data/src/core/ext/filters/client_channel/server_address.h +1 -1
  62. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
  63. data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
  64. data/src/core/ext/filters/client_channel/subchannel.h +29 -49
  65. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
  66. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
  67. data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
  68. data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
  69. data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
  70. data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
  71. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
  72. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
  73. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  74. data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
  75. data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
  76. data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
  77. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
  78. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
  79. data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
  80. data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
  81. data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
  82. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  83. data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
  84. data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
  85. data/src/core/ext/service_config/service_config_call_data.h +72 -0
  86. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
  87. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
  88. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
  89. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
  90. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
  92. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
  93. data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
  94. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
  95. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
  96. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  97. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
  98. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
  99. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  100. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
  102. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
  103. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
  107. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
  108. data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
  109. data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
  110. data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
  111. data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
  112. data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
  113. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
  114. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
  115. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
  116. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
  117. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
  118. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
  119. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
  120. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
  121. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
  122. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
  123. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
  124. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
  125. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
  126. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
  127. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
  128. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
  129. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
  130. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
  131. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
  132. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
  133. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
  134. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
  135. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
  136. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
  137. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
  138. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
  139. data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
  140. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
  141. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
  142. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
  143. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
  144. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
  145. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
  146. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
  147. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
  148. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
  149. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
  150. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
  151. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
  152. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
  153. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
  154. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
  155. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
  156. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
  157. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
  158. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
  159. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
  160. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
  161. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
  162. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
  163. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
  164. data/src/core/ext/xds/xds_api.cc +325 -362
  165. data/src/core/ext/xds/xds_api.h +134 -82
  166. data/src/core/ext/xds/xds_bootstrap.h +10 -0
  167. data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
  168. data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
  169. data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
  170. data/src/core/ext/xds/xds_client.cc +527 -314
  171. data/src/core/ext/xds/xds_client.h +42 -37
  172. data/src/core/ext/xds/xds_client_stats.h +1 -1
  173. data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
  174. data/src/core/lib/address_utils/parse_address.cc +2 -0
  175. data/src/core/lib/avl/avl.cc +5 -5
  176. data/src/core/lib/backoff/backoff.cc +1 -1
  177. data/src/core/lib/channel/channel_args.cc +24 -6
  178. data/src/core/lib/channel/channel_args.h +9 -0
  179. data/src/core/lib/channel/channel_stack_builder.cc +3 -3
  180. data/src/core/lib/channel/channel_trace.cc +1 -1
  181. data/src/core/lib/channel/channel_trace.h +1 -1
  182. data/src/core/lib/channel/channelz.cc +3 -3
  183. data/src/core/lib/channel/channelz.h +2 -2
  184. data/src/core/lib/channel/channelz_registry.cc +1 -1
  185. data/src/core/lib/channel/channelz_registry.h +1 -1
  186. data/src/core/lib/channel/connected_channel.cc +1 -3
  187. data/src/core/lib/channel/connected_channel.h +1 -2
  188. data/src/core/lib/compression/compression.cc +2 -2
  189. data/src/core/lib/compression/compression_args.cc +6 -4
  190. data/src/core/lib/compression/compression_internal.cc +2 -2
  191. data/src/core/lib/compression/compression_internal.h +1 -1
  192. data/src/core/lib/config/core_configuration.cc +44 -2
  193. data/src/core/lib/config/core_configuration.h +39 -1
  194. data/src/core/lib/debug/stats.cc +1 -1
  195. data/src/core/lib/debug/stats_data.cc +13 -13
  196. data/src/core/lib/gpr/atm.cc +1 -1
  197. data/src/core/lib/gpr/cpu_posix.cc +1 -1
  198. data/src/core/lib/gpr/string.cc +2 -2
  199. data/src/core/lib/gpr/tls.h +1 -1
  200. data/src/core/lib/gpr/useful.h +79 -32
  201. data/src/core/lib/gprpp/arena.h +10 -0
  202. data/src/core/lib/gprpp/bitset.h +38 -16
  203. data/src/core/lib/gprpp/chunked_vector.h +211 -0
  204. data/src/core/lib/gprpp/construct_destruct.h +1 -1
  205. data/src/core/lib/gprpp/match.h +1 -1
  206. data/src/core/lib/gprpp/memory.h +6 -0
  207. data/src/core/lib/gprpp/overload.h +1 -1
  208. data/src/core/lib/gprpp/status_helper.cc +23 -3
  209. data/src/core/lib/gprpp/status_helper.h +12 -1
  210. data/src/core/lib/gprpp/table.h +411 -0
  211. data/src/core/lib/http/httpcli.cc +200 -182
  212. data/src/core/lib/http/parser.cc +2 -2
  213. data/src/core/lib/iomgr/call_combiner.cc +28 -10
  214. data/src/core/lib/iomgr/combiner.cc +6 -21
  215. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
  216. data/src/core/lib/iomgr/error.cc +113 -52
  217. data/src/core/lib/iomgr/error.h +50 -9
  218. data/src/core/lib/iomgr/error_cfstream.cc +5 -0
  219. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
  220. data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
  221. data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
  222. data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
  223. data/src/core/lib/iomgr/event_engine/closure.h +10 -1
  224. data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
  225. data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
  226. data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
  227. data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
  228. data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
  229. data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
  230. data/src/core/lib/iomgr/exec_ctx.cc +1 -9
  231. data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
  232. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
  233. data/src/core/lib/iomgr/executor.cc +6 -20
  234. data/src/core/lib/iomgr/iomgr.cc +3 -1
  235. data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
  236. data/src/core/lib/iomgr/iomgr_internal.h +3 -2
  237. data/src/core/lib/iomgr/load_file.cc +2 -2
  238. data/src/core/lib/iomgr/lockfree_event.cc +18 -0
  239. data/src/core/lib/iomgr/pollset_custom.cc +1 -1
  240. data/src/core/lib/iomgr/pollset_custom.h +1 -1
  241. data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
  242. data/src/core/lib/iomgr/resource_quota.cc +13 -11
  243. data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
  244. data/src/core/lib/iomgr/socket_mutator.cc +2 -2
  245. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
  246. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
  247. data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
  248. data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
  249. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  250. data/src/core/lib/iomgr/tcp_posix.cc +4 -5
  251. data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
  252. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
  253. data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
  254. data/src/core/lib/iomgr/tcp_windows.cc +2 -2
  255. data/src/core/lib/iomgr/timer_generic.cc +13 -13
  256. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  257. data/src/core/lib/json/json_util.cc +68 -0
  258. data/src/core/lib/json/json_util.h +57 -99
  259. data/src/core/lib/json/json_writer.cc +0 -3
  260. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  261. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  262. data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
  263. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
  264. data/src/core/lib/security/context/security_context.cc +4 -2
  265. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  266. data/src/core/lib/security/credentials/credentials.cc +4 -2
  267. data/src/core/lib/security/credentials/credentials.h +6 -1
  268. data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
  269. data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
  270. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
  271. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
  272. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
  273. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
  274. data/src/core/lib/security/security_connector/security_connector.cc +9 -4
  275. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  276. data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
  277. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
  278. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
  279. data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
  280. data/src/core/lib/security/transport/security_handshaker.cc +73 -43
  281. data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
  282. data/src/core/lib/security/transport/tsi_error.cc +3 -5
  283. data/src/core/lib/slice/slice.cc +0 -16
  284. data/src/core/lib/slice/slice_api.cc +39 -0
  285. data/src/core/lib/slice/slice_buffer.cc +5 -5
  286. data/src/core/lib/slice/slice_intern.cc +8 -13
  287. data/src/core/lib/slice/slice_internal.h +1 -244
  288. data/src/core/lib/slice/slice_refcount.cc +17 -0
  289. data/src/core/lib/slice/slice_refcount.h +121 -0
  290. data/src/core/lib/slice/slice_refcount_base.h +173 -0
  291. data/src/core/lib/slice/slice_split.cc +100 -0
  292. data/src/core/lib/slice/slice_split.h +40 -0
  293. data/src/core/lib/slice/slice_string_helpers.cc +0 -83
  294. data/src/core/lib/slice/slice_string_helpers.h +0 -11
  295. data/src/core/lib/slice/static_slice.cc +529 -0
  296. data/src/core/lib/slice/static_slice.h +331 -0
  297. data/src/core/lib/surface/builtins.cc +49 -0
  298. data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
  299. data/src/core/lib/surface/call.cc +103 -120
  300. data/src/core/lib/surface/call.h +0 -6
  301. data/src/core/lib/surface/channel.cc +19 -32
  302. data/src/core/lib/surface/channel.h +0 -9
  303. data/src/core/lib/surface/channel_init.cc +23 -76
  304. data/src/core/lib/surface/channel_init.h +52 -44
  305. data/src/core/lib/surface/completion_queue.cc +6 -5
  306. data/src/core/lib/surface/init.cc +0 -39
  307. data/src/core/lib/surface/init_secure.cc +17 -14
  308. data/src/core/lib/surface/lame_client.cc +18 -11
  309. data/src/core/lib/surface/lame_client.h +1 -1
  310. data/src/core/lib/surface/server.cc +25 -17
  311. data/src/core/lib/surface/server.h +17 -10
  312. data/src/core/lib/surface/validate_metadata.cc +5 -2
  313. data/src/core/lib/surface/version.cc +2 -2
  314. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  315. data/src/core/lib/transport/error_utils.cc +42 -17
  316. data/src/core/lib/transport/error_utils.h +1 -1
  317. data/src/core/lib/transport/metadata.cc +31 -10
  318. data/src/core/lib/transport/metadata.h +2 -1
  319. data/src/core/lib/transport/metadata_batch.cc +35 -371
  320. data/src/core/lib/transport/metadata_batch.h +905 -71
  321. data/src/core/lib/transport/parsed_metadata.h +263 -0
  322. data/src/core/lib/transport/pid_controller.cc +4 -4
  323. data/src/core/lib/transport/static_metadata.cc +714 -846
  324. data/src/core/lib/transport/static_metadata.h +115 -379
  325. data/src/core/lib/transport/status_metadata.cc +1 -0
  326. data/src/core/lib/transport/transport.cc +4 -5
  327. data/src/core/lib/transport/transport_op_string.cc +40 -20
  328. data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
  329. data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
  330. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
  331. data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
  332. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
  333. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  335. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
  336. data/src/core/tsi/fake_transport_security.cc +15 -7
  337. data/src/core/tsi/local_transport_security.cc +36 -73
  338. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
  339. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
  340. data/src/core/tsi/ssl_transport_security.cc +10 -2
  341. data/src/core/tsi/transport_security.cc +12 -0
  342. data/src/core/tsi/transport_security.h +16 -1
  343. data/src/core/tsi/transport_security_interface.h +26 -0
  344. data/src/ruby/ext/grpc/extconf.rb +12 -9
  345. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  346. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  347. data/src/ruby/lib/grpc/version.rb +1 -1
  348. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
  349. data/src/ruby/spec/client_server_spec.rb +1 -1
  350. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
  351. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
  352. data/third_party/address_sorting/address_sorting_posix.c +1 -0
  353. data/third_party/boringssl-with-bazel/err_data.c +278 -272
  354. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +21 -22
  355. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +0 -2
  356. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +5 -0
  357. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +15 -22
  358. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +13 -7
  359. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +19 -29
  360. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/a_strex.c +268 -271
  361. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +106 -153
  362. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  363. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +0 -39
  364. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +1 -1
  365. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/charmap.h +0 -0
  366. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +38 -0
  367. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +8 -8
  368. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +289 -198
  369. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +8 -8
  370. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +9 -13
  371. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +1 -0
  372. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +11 -8
  373. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +1 -7
  374. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -5
  375. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +0 -4
  376. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +1 -7
  377. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -6
  378. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -17
  379. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
  380. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +9 -0
  381. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +8 -0
  382. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
  383. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +45 -65
  384. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +1 -0
  385. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
  386. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +21 -3
  387. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +3 -2
  388. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +5 -2
  389. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
  390. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +10 -0
  391. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
  392. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
  393. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +4 -7
  394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
  395. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +1 -1
  396. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +1 -1
  397. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +24 -9
  398. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +4 -2
  399. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
  400. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
  402. data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
  403. data/third_party/boringssl-with-bazel/src/crypto/mem.c +12 -9
  404. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +0 -9
  405. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +0 -2
  406. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +0 -8
  407. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +0 -2
  408. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +0 -4
  409. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +16 -7
  410. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +9 -4
  411. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +151 -12
  412. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  413. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
  414. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +2 -0
  415. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +181 -1
  416. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +246 -0
  417. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +11 -2
  418. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +0 -2
  419. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +0 -179
  420. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +4 -2
  421. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -5
  422. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -0
  423. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +11 -50
  424. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +1 -1
  425. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +2 -4
  426. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +0 -16
  427. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +22 -18
  428. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +11 -8
  429. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +16 -0
  430. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -0
  431. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  432. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +1 -1
  433. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -0
  434. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +4 -3
  435. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +24 -5
  436. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +17 -8
  437. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -0
  438. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +6 -6
  439. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +4 -0
  440. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +5 -0
  441. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +112 -55
  442. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +2 -1
  443. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +0 -2
  444. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  445. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +71 -26
  446. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +366 -227
  447. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +2 -9
  448. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -4
  449. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +3 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +3 -3
  451. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +9 -0
  452. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +8 -2
  453. data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +4 -0
  454. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +9 -3
  455. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -20
  456. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -5
  457. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +5 -0
  458. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +37 -15
  459. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +28 -14
  460. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -32
  461. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +529 -91
  462. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -695
  463. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +48 -8
  464. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +266 -357
  465. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +90 -152
  466. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +15 -13
  467. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +75 -79
  468. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +96 -97
  469. data/third_party/boringssl-with-bazel/src/ssl/internal.h +63 -43
  470. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
  471. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -2
  472. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +6 -12
  473. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +14 -17
  474. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +14 -27
  475. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +203 -203
  476. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +30 -41
  477. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +47 -33
  478. data/third_party/re2/re2/compile.cc +91 -109
  479. data/third_party/re2/re2/dfa.cc +27 -39
  480. data/third_party/re2/re2/filtered_re2.cc +18 -2
  481. data/third_party/re2/re2/filtered_re2.h +10 -5
  482. data/third_party/re2/re2/nfa.cc +1 -1
  483. data/third_party/re2/re2/parse.cc +42 -23
  484. data/third_party/re2/re2/perl_groups.cc +34 -34
  485. data/third_party/re2/re2/prefilter.cc +3 -2
  486. data/third_party/re2/re2/prog.cc +182 -4
  487. data/third_party/re2/re2/prog.h +28 -9
  488. data/third_party/re2/re2/re2.cc +87 -118
  489. data/third_party/re2/re2/re2.h +156 -141
  490. data/third_party/re2/re2/regexp.cc +12 -5
  491. data/third_party/re2/re2/regexp.h +8 -2
  492. data/third_party/re2/re2/set.cc +31 -9
  493. data/third_party/re2/re2/set.h +9 -4
  494. data/third_party/re2/re2/simplify.cc +11 -3
  495. data/third_party/re2/re2/tostring.cc +1 -1
  496. data/third_party/re2/re2/walker-inl.h +1 -1
  497. data/third_party/re2/util/mutex.h +2 -2
  498. data/third_party/re2/util/pcre.h +3 -3
  499. metadata +83 -70
  500. data/include/grpc/event_engine/slice_allocator.h +0 -71
  501. data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
  502. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
  503. data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
  504. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
  505. data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
  506. data/src/core/ext/transport/chttp2/client/authority.h +0 -36
  507. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
  508. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
  509. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
  510. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
  511. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
  512. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
  513. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
  514. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
  515. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
  516. data/src/core/lib/iomgr/udp_server.cc +0 -747
  517. data/src/core/lib/iomgr/udp_server.h +0 -103
  518. data/src/core/lib/transport/authority_override.cc +0 -40
  519. 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