grpc 1.50.0 → 1.51.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.

Files changed (459) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +131 -42
  3. data/include/grpc/event_engine/event_engine.h +10 -3
  4. data/include/grpc/event_engine/slice_buffer.h +17 -0
  5. data/include/grpc/grpc.h +0 -10
  6. data/include/grpc/impl/codegen/grpc_types.h +1 -5
  7. data/include/grpc/impl/codegen/port_platform.h +0 -3
  8. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +19 -13
  9. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +1 -0
  10. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  11. data/src/core/ext/filters/client_channel/channel_connectivity.cc +7 -5
  12. data/src/core/ext/filters/client_channel/client_channel.cc +120 -140
  13. data/src/core/ext/filters/client_channel/client_channel.h +3 -4
  14. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +0 -2
  15. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  16. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  17. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
  18. data/src/core/ext/filters/client_channel/connector.h +1 -1
  19. data/src/core/ext/filters/client_channel/dynamic_filters.cc +20 -47
  20. data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
  21. data/src/core/ext/filters/client_channel/health/health_check_client.cc +3 -4
  22. data/src/core/ext/filters/client_channel/http_proxy.cc +0 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
  24. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +5 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +8 -7
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +35 -44
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -3
  29. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +3 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +41 -29
  32. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
  33. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +9 -11
  34. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -12
  35. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +8 -10
  36. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +26 -27
  37. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +7 -9
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +44 -26
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +17 -27
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +13 -7
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +48 -47
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -126
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
  46. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -9
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -32
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -2
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +22 -23
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +50 -52
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +2 -4
  53. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
  54. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -26
  55. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
  56. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
  57. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +63 -46
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +80 -102
  59. data/src/core/ext/filters/client_channel/retry_service_config.cc +192 -234
  60. data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
  61. data/src/core/ext/filters/client_channel/retry_throttle.cc +8 -8
  62. data/src/core/ext/filters/client_channel/retry_throttle.h +8 -7
  63. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
  64. data/src/core/ext/filters/client_channel/subchannel.cc +21 -25
  65. data/src/core/ext/filters/client_channel/subchannel.h +2 -2
  66. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
  67. data/src/core/ext/filters/deadline/deadline_filter.cc +13 -14
  68. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
  70. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  71. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
  72. data/src/core/ext/filters/http/client/http_client_filter.cc +16 -16
  73. data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
  74. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +13 -13
  75. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +34 -34
  76. data/src/core/ext/filters/http/server/http_server_filter.cc +26 -25
  77. data/src/core/ext/filters/message_size/message_size_filter.cc +86 -117
  78. data/src/core/ext/filters/message_size/message_size_filter.h +22 -15
  79. data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
  80. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
  81. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
  82. data/src/core/ext/filters/server_config_selector/server_config_selector.h +1 -1
  83. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -7
  84. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +17 -21
  85. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +57 -72
  86. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
  87. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -1
  88. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +212 -253
  89. data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -11
  90. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -3
  91. data/src/core/ext/transport/chttp2/transport/frame_data.cc +16 -15
  92. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  93. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +13 -13
  94. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -3
  95. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +10 -7
  96. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +15 -17
  97. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +5 -4
  98. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -6
  99. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +1 -1
  100. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +31 -39
  102. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +7 -6
  103. data/src/core/ext/transport/chttp2/transport/internal.h +24 -8
  104. data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -52
  105. data/src/core/ext/transport/chttp2/transport/varint.cc +2 -3
  106. data/src/core/ext/transport/chttp2/transport/varint.h +11 -8
  107. data/src/core/ext/transport/chttp2/transport/writing.cc +16 -16
  108. data/src/core/ext/transport/inproc/inproc_transport.cc +97 -115
  109. data/src/core/ext/xds/certificate_provider_store.cc +4 -4
  110. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
  111. data/src/core/ext/xds/xds_api.cc +15 -68
  112. data/src/core/ext/xds/xds_api.h +3 -7
  113. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  114. data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
  115. data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
  116. data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
  117. data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
  118. data/src/core/ext/xds/xds_client.cc +122 -90
  119. data/src/core/ext/xds/xds_client.h +7 -2
  120. data/src/core/ext/xds/xds_client_grpc.cc +5 -24
  121. data/src/core/ext/xds/xds_cluster.cc +291 -183
  122. data/src/core/ext/xds/xds_cluster.h +11 -15
  123. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +32 -29
  124. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +35 -16
  125. data/src/core/ext/xds/xds_common_types.cc +208 -141
  126. data/src/core/ext/xds/xds_common_types.h +19 -13
  127. data/src/core/ext/xds/xds_endpoint.cc +214 -129
  128. data/src/core/ext/xds/xds_endpoint.h +4 -7
  129. data/src/core/ext/xds/xds_http_fault_filter.cc +56 -43
  130. data/src/core/ext/xds/xds_http_fault_filter.h +13 -21
  131. data/src/core/ext/xds/xds_http_filters.cc +60 -73
  132. data/src/core/ext/xds/xds_http_filters.h +67 -19
  133. data/src/core/ext/xds/xds_http_rbac_filter.cc +152 -207
  134. data/src/core/ext/xds/xds_http_rbac_filter.h +12 -15
  135. data/src/core/ext/xds/xds_lb_policy_registry.cc +122 -169
  136. data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
  137. data/src/core/ext/xds/xds_listener.cc +459 -417
  138. data/src/core/ext/xds/xds_listener.h +43 -47
  139. data/src/core/ext/xds/xds_resource_type.h +3 -11
  140. data/src/core/ext/xds/xds_resource_type_impl.h +8 -13
  141. data/src/core/ext/xds/xds_route_config.cc +94 -80
  142. data/src/core/ext/xds/xds_route_config.h +10 -10
  143. data/src/core/ext/xds/xds_routing.cc +2 -1
  144. data/src/core/ext/xds/xds_routing.h +2 -0
  145. data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -94
  146. data/src/core/ext/xds/xds_transport_grpc.cc +4 -5
  147. data/src/core/lib/address_utils/parse_address.cc +11 -10
  148. data/src/core/lib/channel/channel_args.h +16 -1
  149. data/src/core/lib/channel/channel_stack.cc +23 -20
  150. data/src/core/lib/channel/channel_stack.h +17 -4
  151. data/src/core/lib/channel/channel_stack_builder.cc +4 -7
  152. data/src/core/lib/channel/channel_stack_builder.h +14 -6
  153. data/src/core/lib/channel/channel_stack_builder_impl.cc +25 -7
  154. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
  155. data/src/core/lib/channel/channel_trace.cc +4 -5
  156. data/src/core/lib/channel/channelz.cc +1 -1
  157. data/src/core/lib/channel/connected_channel.cc +695 -35
  158. data/src/core/lib/channel/connected_channel.h +0 -4
  159. data/src/core/lib/channel/promise_based_filter.cc +1004 -140
  160. data/src/core/lib/channel/promise_based_filter.h +364 -87
  161. data/src/core/lib/compression/message_compress.cc +5 -5
  162. data/src/core/lib/debug/event_log.cc +88 -0
  163. data/src/core/lib/debug/event_log.h +81 -0
  164. data/src/core/lib/debug/histogram_view.cc +69 -0
  165. data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
  166. data/src/core/lib/debug/stats.cc +22 -119
  167. data/src/core/lib/debug/stats.h +29 -35
  168. data/src/core/lib/debug/stats_data.cc +224 -73
  169. data/src/core/lib/debug/stats_data.h +263 -122
  170. data/src/core/lib/event_engine/common_closures.h +71 -0
  171. data/src/core/lib/event_engine/default_event_engine.cc +38 -15
  172. data/src/core/lib/event_engine/default_event_engine.h +15 -3
  173. data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
  174. data/src/core/lib/event_engine/memory_allocator.cc +1 -1
  175. data/src/core/lib/event_engine/poller.h +10 -4
  176. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +618 -0
  177. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
  178. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +901 -0
  179. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  180. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  181. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  182. data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +13 -16
  183. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  184. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  185. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +267 -0
  186. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  187. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1270 -0
  188. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +682 -0
  189. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +453 -18
  190. data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
  191. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  192. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1081 -0
  193. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +361 -0
  194. data/src/core/lib/event_engine/posix_engine/timer.h +9 -8
  195. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +57 -194
  196. data/src/core/lib/event_engine/posix_engine/timer_manager.h +21 -49
  197. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +301 -0
  198. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +179 -0
  199. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +126 -0
  200. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  201. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +151 -0
  202. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +45 -0
  203. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  204. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  205. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  206. data/src/core/lib/event_engine/slice.cc +7 -6
  207. data/src/core/lib/event_engine/slice_buffer.cc +2 -2
  208. data/src/core/lib/event_engine/thread_pool.cc +106 -25
  209. data/src/core/lib/event_engine/thread_pool.h +32 -9
  210. data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
  211. data/src/core/lib/event_engine/windows/windows_engine.cc +18 -12
  212. data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
  213. data/src/core/lib/experiments/config.cc +1 -1
  214. data/src/core/lib/experiments/experiments.cc +13 -2
  215. data/src/core/lib/experiments/experiments.h +8 -1
  216. data/src/core/lib/gpr/cpu_linux.cc +6 -2
  217. data/src/core/lib/gpr/log_linux.cc +3 -4
  218. data/src/core/lib/gpr/string.h +1 -1
  219. data/src/core/lib/gpr/tmpfile_posix.cc +3 -2
  220. data/src/core/lib/gprpp/load_file.cc +75 -0
  221. data/src/core/lib/gprpp/load_file.h +33 -0
  222. data/src/core/lib/gprpp/per_cpu.h +46 -0
  223. data/src/core/lib/gprpp/stat_posix.cc +5 -4
  224. data/src/core/lib/gprpp/stat_windows.cc +3 -2
  225. data/src/core/lib/gprpp/status_helper.h +1 -3
  226. data/src/core/lib/gprpp/strerror.cc +41 -0
  227. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/strerror.h} +9 -13
  228. data/src/core/lib/gprpp/thd_windows.cc +1 -2
  229. data/src/core/lib/gprpp/time.cc +3 -4
  230. data/src/core/lib/gprpp/time.h +13 -2
  231. data/src/core/lib/gprpp/validation_errors.h +18 -1
  232. data/src/core/lib/http/httpcli.cc +40 -44
  233. data/src/core/lib/http/httpcli.h +6 -5
  234. data/src/core/lib/http/httpcli_security_connector.cc +4 -6
  235. data/src/core/lib/http/parser.cc +54 -65
  236. data/src/core/lib/iomgr/buffer_list.cc +105 -116
  237. data/src/core/lib/iomgr/buffer_list.h +60 -44
  238. data/src/core/lib/iomgr/call_combiner.cc +11 -10
  239. data/src/core/lib/iomgr/call_combiner.h +3 -4
  240. data/src/core/lib/iomgr/cfstream_handle.cc +13 -16
  241. data/src/core/lib/iomgr/closure.h +49 -5
  242. data/src/core/lib/iomgr/combiner.cc +2 -2
  243. data/src/core/lib/iomgr/endpoint.h +1 -1
  244. data/src/core/lib/iomgr/endpoint_cfstream.cc +26 -25
  245. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
  246. data/src/core/lib/iomgr/error.cc +27 -42
  247. data/src/core/lib/iomgr/error.h +22 -152
  248. data/src/core/lib/iomgr/ev_apple.cc +4 -4
  249. data/src/core/lib/iomgr/ev_epoll1_linux.cc +26 -25
  250. data/src/core/lib/iomgr/ev_poll_posix.cc +27 -31
  251. data/src/core/lib/iomgr/exec_ctx.cc +3 -4
  252. data/src/core/lib/iomgr/exec_ctx.h +2 -3
  253. data/src/core/lib/iomgr/executor.cc +1 -2
  254. data/src/core/lib/iomgr/internal_errqueue.cc +3 -1
  255. data/src/core/lib/iomgr/iocp_windows.cc +1 -0
  256. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  257. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -1
  258. data/src/core/lib/iomgr/iomgr_windows.cc +2 -1
  259. data/src/core/lib/iomgr/load_file.cc +5 -9
  260. data/src/core/lib/iomgr/lockfree_event.cc +10 -10
  261. data/src/core/lib/iomgr/pollset_windows.cc +4 -4
  262. data/src/core/lib/iomgr/python_util.h +2 -2
  263. data/src/core/lib/iomgr/resolve_address.cc +8 -3
  264. data/src/core/lib/iomgr/resolve_address.h +3 -4
  265. data/src/core/lib/iomgr/resolve_address_impl.h +1 -1
  266. data/src/core/lib/iomgr/resolve_address_posix.cc +14 -25
  267. data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
  268. data/src/core/lib/iomgr/resolve_address_windows.cc +14 -17
  269. data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
  270. data/src/core/lib/iomgr/socket_utils_common_posix.cc +30 -29
  271. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -0
  272. data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
  273. data/src/core/lib/iomgr/socket_windows.cc +2 -2
  274. data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -10
  275. data/src/core/lib/iomgr/tcp_client_posix.cc +31 -35
  276. data/src/core/lib/iomgr/tcp_client_windows.cc +8 -12
  277. data/src/core/lib/iomgr/tcp_posix.cc +92 -108
  278. data/src/core/lib/iomgr/tcp_server_posix.cc +34 -34
  279. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  280. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +18 -21
  281. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +12 -13
  282. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +1 -1
  283. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -29
  284. data/src/core/lib/iomgr/tcp_windows.cc +27 -34
  285. data/src/core/lib/iomgr/timer.h +8 -8
  286. data/src/core/lib/iomgr/timer_generic.cc +9 -15
  287. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
  288. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +4 -3
  289. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +10 -8
  290. data/src/core/lib/json/json_channel_args.h +42 -0
  291. data/src/core/lib/json/json_object_loader.cc +7 -2
  292. data/src/core/lib/json/json_object_loader.h +22 -0
  293. data/src/core/lib/json/json_util.cc +5 -5
  294. data/src/core/lib/json/json_util.h +4 -4
  295. data/src/core/lib/load_balancing/lb_policy.cc +1 -1
  296. data/src/core/lib/load_balancing/lb_policy.h +4 -0
  297. data/src/core/lib/load_balancing/subchannel_interface.h +0 -7
  298. data/src/core/lib/matchers/matchers.cc +3 -4
  299. data/src/core/lib/promise/activity.cc +16 -2
  300. data/src/core/lib/promise/activity.h +38 -15
  301. data/src/core/lib/promise/arena_promise.h +80 -51
  302. data/src/core/lib/promise/context.h +13 -6
  303. data/src/core/lib/promise/detail/basic_seq.h +9 -28
  304. data/src/core/lib/promise/detail/promise_factory.h +58 -10
  305. data/src/core/lib/promise/detail/status.h +28 -0
  306. data/src/core/lib/promise/detail/switch.h +1455 -0
  307. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +3 -1
  308. data/src/core/lib/promise/for_each.h +129 -0
  309. data/src/core/lib/promise/loop.h +7 -5
  310. data/src/core/lib/promise/map_pipe.h +87 -0
  311. data/src/core/lib/promise/pipe.cc +19 -0
  312. data/src/core/lib/promise/pipe.h +505 -0
  313. data/src/core/lib/promise/poll.h +13 -0
  314. data/src/core/lib/promise/seq.h +3 -5
  315. data/src/core/lib/promise/sleep.cc +5 -4
  316. data/src/core/lib/promise/sleep.h +1 -2
  317. data/src/core/lib/promise/try_concurrently.h +341 -0
  318. data/src/core/lib/promise/try_seq.h +10 -13
  319. data/src/core/lib/resolver/server_address.cc +1 -0
  320. data/src/core/lib/resolver/server_address.h +1 -3
  321. data/src/core/lib/resource_quota/api.cc +0 -1
  322. data/src/core/lib/resource_quota/arena.cc +19 -0
  323. data/src/core/lib/resource_quota/arena.h +89 -0
  324. data/src/core/lib/resource_quota/memory_quota.cc +1 -0
  325. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
  326. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
  327. data/src/core/lib/security/authorization/matchers.cc +25 -22
  328. data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
  329. data/src/core/lib/security/context/security_context.h +10 -0
  330. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
  331. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  332. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
  333. data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
  334. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
  335. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
  336. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
  337. data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -0
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -24
  339. data/src/core/lib/security/credentials/iam/iam_credentials.cc +1 -0
  340. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -2
  341. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
  342. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -5
  343. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +24 -30
  344. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -5
  345. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +3 -3
  346. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +19 -27
  347. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
  348. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -41
  349. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
  350. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +6 -11
  351. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +8 -15
  352. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  353. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +2 -6
  354. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +1 -4
  355. data/src/core/lib/security/security_connector/local/local_security_connector.cc +7 -11
  356. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +9 -14
  357. data/src/core/lib/security/security_connector/ssl_utils.cc +5 -7
  358. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -27
  359. data/src/core/lib/security/transport/client_auth_filter.cc +1 -1
  360. data/src/core/lib/security/transport/secure_endpoint.cc +26 -28
  361. data/src/core/lib/security/transport/security_handshaker.cc +53 -53
  362. data/src/core/lib/security/transport/server_auth_filter.cc +21 -21
  363. data/src/core/lib/security/transport/tsi_error.cc +6 -3
  364. data/src/core/lib/security/util/json_util.cc +4 -5
  365. data/src/core/lib/service_config/service_config.h +1 -1
  366. data/src/core/lib/service_config/service_config_impl.cc +111 -158
  367. data/src/core/lib/service_config/service_config_impl.h +14 -17
  368. data/src/core/lib/service_config/service_config_parser.cc +14 -31
  369. data/src/core/lib/service_config/service_config_parser.h +14 -10
  370. data/src/core/lib/slice/b64.cc +2 -2
  371. data/src/core/lib/slice/slice.cc +7 -1
  372. data/src/core/lib/slice/slice.h +19 -6
  373. data/src/core/lib/slice/slice_buffer.cc +13 -14
  374. data/src/core/lib/slice/slice_internal.h +13 -21
  375. data/src/core/lib/slice/slice_refcount.h +34 -19
  376. data/src/core/lib/surface/byte_buffer.cc +3 -4
  377. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  378. data/src/core/lib/surface/call.cc +1366 -239
  379. data/src/core/lib/surface/call.h +44 -0
  380. data/src/core/lib/surface/call_details.cc +3 -3
  381. data/src/core/lib/surface/call_trace.cc +113 -0
  382. data/src/core/lib/surface/call_trace.h +30 -0
  383. data/src/core/lib/surface/channel.cc +44 -49
  384. data/src/core/lib/surface/channel.h +9 -1
  385. data/src/core/lib/surface/channel_ping.cc +1 -1
  386. data/src/core/lib/surface/channel_stack_type.cc +4 -0
  387. data/src/core/lib/surface/channel_stack_type.h +2 -0
  388. data/src/core/lib/surface/completion_queue.cc +38 -52
  389. data/src/core/lib/surface/init.cc +8 -39
  390. data/src/core/lib/surface/init_internally.h +8 -0
  391. data/src/core/lib/surface/lame_client.cc +10 -8
  392. data/src/core/lib/surface/server.cc +48 -70
  393. data/src/core/lib/surface/server.h +3 -4
  394. data/src/core/lib/surface/validate_metadata.cc +11 -12
  395. data/src/core/lib/surface/version.cc +2 -2
  396. data/src/core/lib/transport/connectivity_state.cc +2 -2
  397. data/src/core/lib/transport/error_utils.cc +34 -28
  398. data/src/core/lib/transport/error_utils.h +3 -3
  399. data/src/core/lib/transport/handshaker.cc +14 -14
  400. data/src/core/lib/transport/handshaker.h +1 -1
  401. data/src/core/lib/transport/handshaker_factory.h +26 -0
  402. data/src/core/lib/transport/handshaker_registry.cc +8 -2
  403. data/src/core/lib/transport/handshaker_registry.h +3 -4
  404. data/src/core/lib/transport/http_connect_handshaker.cc +23 -24
  405. data/src/core/lib/transport/metadata_batch.h +17 -1
  406. data/src/core/lib/transport/parsed_metadata.cc +2 -6
  407. data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
  408. data/src/core/lib/transport/transport.cc +63 -17
  409. data/src/core/lib/transport/transport.h +64 -68
  410. data/src/core/lib/transport/transport_impl.h +1 -1
  411. data/src/core/lib/transport/transport_op_string.cc +7 -6
  412. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -10
  413. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -14
  414. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +10 -10
  415. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +8 -8
  416. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
  417. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +7 -7
  418. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +7 -6
  419. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  420. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +5 -5
  421. data/src/core/tsi/fake_transport_security.cc +3 -3
  422. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +7 -3
  423. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  424. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +6 -2
  425. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +0 -2
  426. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +0 -3
  427. data/src/ruby/lib/grpc/version.rb +1 -1
  428. data/src/ruby/spec/channel_spec.rb +0 -43
  429. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  430. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  431. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  432. data/third_party/zlib/compress.c +3 -3
  433. data/third_party/zlib/crc32.c +21 -12
  434. data/third_party/zlib/deflate.c +112 -106
  435. data/third_party/zlib/deflate.h +2 -2
  436. data/third_party/zlib/gzlib.c +1 -1
  437. data/third_party/zlib/gzread.c +3 -5
  438. data/third_party/zlib/gzwrite.c +1 -1
  439. data/third_party/zlib/infback.c +10 -7
  440. data/third_party/zlib/inflate.c +5 -2
  441. data/third_party/zlib/inftrees.c +2 -2
  442. data/third_party/zlib/inftrees.h +1 -1
  443. data/third_party/zlib/trees.c +61 -62
  444. data/third_party/zlib/uncompr.c +2 -2
  445. data/third_party/zlib/zconf.h +16 -3
  446. data/third_party/zlib/zlib.h +10 -10
  447. data/third_party/zlib/zutil.c +9 -7
  448. data/third_party/zlib/zutil.h +1 -0
  449. metadata +55 -18
  450. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
  451. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
  452. data/src/core/lib/event_engine/executor/threaded_executor.h +0 -44
  453. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  454. data/src/core/lib/gpr/murmur_hash.h +0 -29
  455. data/src/core/lib/gpr/tls.h +0 -156
  456. data/src/core/lib/promise/call_push_pull.h +0 -148
  457. data/src/core/lib/slice/slice_api.cc +0 -39
  458. data/src/core/lib/slice/slice_buffer_api.cc +0 -35
  459. data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -0,0 +1,1081 @@
1
+ // Copyright 2022 The gRPC Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include <grpc/support/port_platform.h>
16
+
17
+ #include "src/core/lib/event_engine/posix_engine/tcp_socket_utils.h"
18
+
19
+ #include <errno.h>
20
+ #include <inttypes.h>
21
+ #include <limits.h>
22
+ #include <stdlib.h>
23
+
24
+ #include "absl/cleanup/cleanup.h"
25
+ #include "absl/status/statusor.h"
26
+ #include "absl/strings/str_cat.h"
27
+ #include "absl/strings/string_view.h"
28
+ #include "absl/types/optional.h"
29
+
30
+ #include <grpc/event_engine/event_engine.h>
31
+
32
+ #include "src/core/lib/gpr/useful.h"
33
+ #include "src/core/lib/iomgr/port.h"
34
+
35
+ #ifdef GRPC_POSIX_SOCKET_UTILS_COMMON
36
+ #include <arpa/inet.h> // IWYU pragma: keep
37
+ #ifdef GRPC_LINUX_TCP_H
38
+ #include <linux/tcp.h>
39
+ #else
40
+ #include <netinet/in.h> // IWYU pragma: keep
41
+ #include <netinet/tcp.h>
42
+ #endif
43
+ #include <fcntl.h>
44
+ #include <sys/socket.h>
45
+ #include <unistd.h>
46
+ #endif
47
+
48
+ #include <atomic>
49
+ #include <cstring>
50
+
51
+ #include "absl/status/status.h"
52
+ #include "absl/strings/str_format.h"
53
+
54
+ #include <grpc/impl/codegen/grpc_types.h>
55
+ #include <grpc/support/log.h>
56
+
57
+ #include "src/core/lib/gprpp/host_port.h"
58
+ #include "src/core/lib/gprpp/status_helper.h"
59
+ #include "src/core/lib/gprpp/strerror.h"
60
+
61
+ #ifdef GRPC_HAVE_UNIX_SOCKET
62
+ #include <sys/stat.h> // IWYU pragma: keep
63
+ #include <sys/un.h>
64
+ #endif
65
+
66
+ namespace grpc_event_engine {
67
+ namespace posix_engine {
68
+
69
+ using ::grpc_event_engine::experimental::EndpointConfig;
70
+ using ::grpc_event_engine::experimental::EventEngine;
71
+
72
+ namespace {
73
+
74
+ int AdjustValue(int default_value, int min_value, int max_value,
75
+ absl::optional<int> actual_value) {
76
+ if (!actual_value.has_value() || *actual_value < min_value ||
77
+ *actual_value > max_value) {
78
+ return default_value;
79
+ }
80
+ return *actual_value;
81
+ }
82
+
83
+ // The default values for TCP_USER_TIMEOUT are currently configured to be in
84
+ // line with the default values of KEEPALIVE_TIMEOUT as proposed in
85
+ // https://github.com/grpc/proposal/blob/master/A18-tcp-user-timeout.md */
86
+ int kDefaultClientUserTimeoutMs = 20000;
87
+ int kDefaultServerUserTimeoutMs = 20000;
88
+ bool kDefaultClientUserTimeoutEnabled = false;
89
+ bool kDefaultServerUserTimeoutEnabled = true;
90
+
91
+ #ifdef GRPC_POSIX_SOCKET_UTILS_COMMON
92
+
93
+ absl::Status ErrorForFd(
94
+ int fd, const experimental::EventEngine::ResolvedAddress& addr) {
95
+ if (fd >= 0) return absl::OkStatus();
96
+ const char* addr_str = reinterpret_cast<const char*>(addr.address());
97
+ return absl::Status(absl::StatusCode::kInternal,
98
+ absl::StrCat("socket: ", grpc_core::StrError(errno),
99
+ std::string(addr_str, addr.size())));
100
+ }
101
+
102
+ int CreateSocket(std::function<int(int, int, int)> socket_factory, int family,
103
+ int type, int protocol) {
104
+ return socket_factory != nullptr ? socket_factory(family, type, protocol)
105
+ : socket(family, type, protocol);
106
+ }
107
+
108
+ const uint8_t kV4MappedPrefix[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff};
109
+
110
+ absl::Status PrepareTcpClientSocket(PosixSocketWrapper sock,
111
+ const EventEngine::ResolvedAddress& addr,
112
+ const PosixTcpOptions& options) {
113
+ bool close_fd = true;
114
+ auto sock_cleanup = absl::MakeCleanup([&close_fd, &sock]() -> void {
115
+ if (close_fd and sock.Fd() >= 0) {
116
+ close(sock.Fd());
117
+ }
118
+ });
119
+ GRPC_RETURN_IF_ERROR(sock.SetSocketNonBlocking(1));
120
+ GRPC_RETURN_IF_ERROR(sock.SetSocketCloexec(1));
121
+
122
+ if (reinterpret_cast<const sockaddr*>(addr.address())->sa_family != AF_UNIX) {
123
+ // If its not a unix socket address.
124
+ GRPC_RETURN_IF_ERROR(sock.SetSocketLowLatency(1));
125
+ GRPC_RETURN_IF_ERROR(sock.SetSocketReuseAddr(1));
126
+ sock.TrySetSocketTcpUserTimeout(options, true);
127
+ }
128
+ GRPC_RETURN_IF_ERROR(sock.SetSocketNoSigpipeIfPossible());
129
+ GRPC_RETURN_IF_ERROR(sock.ApplySocketMutatorInOptions(
130
+ GRPC_FD_CLIENT_CONNECTION_USAGE, options));
131
+ // No errors. Set close_fd to false to ensure the socket is not closed.
132
+ close_fd = false;
133
+ return absl::OkStatus();
134
+ }
135
+
136
+ #endif /* GRPC_POSIX_SOCKET_UTILS_COMMON */
137
+
138
+ } // namespace
139
+
140
+ PosixTcpOptions TcpOptionsFromEndpointConfig(const EndpointConfig& config) {
141
+ void* value;
142
+ PosixTcpOptions options;
143
+ options.tcp_read_chunk_size = AdjustValue(
144
+ PosixTcpOptions::kDefaultReadChunkSize, 1, PosixTcpOptions::kMaxChunkSize,
145
+ config.GetInt(GRPC_ARG_TCP_READ_CHUNK_SIZE));
146
+ options.tcp_min_read_chunk_size =
147
+ AdjustValue(PosixTcpOptions::kDefaultMinReadChunksize, 1,
148
+ PosixTcpOptions::kMaxChunkSize,
149
+ config.GetInt(GRPC_ARG_TCP_MIN_READ_CHUNK_SIZE));
150
+ options.tcp_max_read_chunk_size =
151
+ AdjustValue(PosixTcpOptions::kDefaultMaxReadChunksize, 1,
152
+ PosixTcpOptions::kMaxChunkSize,
153
+ config.GetInt(GRPC_ARG_TCP_MAX_READ_CHUNK_SIZE));
154
+ options.tcp_tx_zerocopy_send_bytes_threshold =
155
+ AdjustValue(PosixTcpOptions::kDefaultSendBytesThreshold, 0, INT_MAX,
156
+ config.GetInt(GRPC_ARG_TCP_TX_ZEROCOPY_SEND_BYTES_THRESHOLD));
157
+ options.tcp_tx_zerocopy_max_simultaneous_sends =
158
+ AdjustValue(PosixTcpOptions::kDefaultMaxSends, 0, INT_MAX,
159
+ config.GetInt(GRPC_ARG_TCP_TX_ZEROCOPY_MAX_SIMULT_SENDS));
160
+ options.tcp_tx_zero_copy_enabled =
161
+ (AdjustValue(PosixTcpOptions::kZerocpTxEnabledDefault, 0, 1,
162
+ config.GetInt(GRPC_ARG_TCP_TX_ZEROCOPY_ENABLED)) != 0);
163
+ options.keep_alive_time_ms =
164
+ AdjustValue(0, 1, INT_MAX, config.GetInt(GRPC_ARG_KEEPALIVE_TIME_MS));
165
+ options.keep_alive_timeout_ms =
166
+ AdjustValue(0, 1, INT_MAX, config.GetInt(GRPC_ARG_KEEPALIVE_TIMEOUT_MS));
167
+ options.expand_wildcard_addrs =
168
+ (AdjustValue(0, 1, INT_MAX,
169
+ config.GetInt(GRPC_ARG_EXPAND_WILDCARD_ADDRS)) != 0);
170
+ options.allow_reuse_port =
171
+ (AdjustValue(0, 1, INT_MAX, config.GetInt(GRPC_ARG_ALLOW_REUSEPORT)) !=
172
+ 0);
173
+
174
+ if (options.tcp_min_read_chunk_size > options.tcp_max_read_chunk_size) {
175
+ options.tcp_min_read_chunk_size = options.tcp_max_read_chunk_size;
176
+ }
177
+ options.tcp_read_chunk_size = grpc_core::Clamp(
178
+ options.tcp_read_chunk_size, options.tcp_min_read_chunk_size,
179
+ options.tcp_max_read_chunk_size);
180
+
181
+ value = config.GetVoidPointer(GRPC_ARG_RESOURCE_QUOTA);
182
+ if (value != nullptr) {
183
+ options.resource_quota =
184
+ reinterpret_cast<grpc_core::ResourceQuota*>(value)->Ref();
185
+ }
186
+ value = config.GetVoidPointer(GRPC_ARG_SOCKET_MUTATOR);
187
+ if (value != nullptr) {
188
+ options.socket_mutator =
189
+ grpc_socket_mutator_ref(static_cast<grpc_socket_mutator*>(value));
190
+ }
191
+ return options;
192
+ }
193
+
194
+ #ifdef GRPC_POSIX_SOCKETUTILS
195
+
196
+ int Accept4(int sockfd,
197
+ grpc_event_engine::experimental::EventEngine::ResolvedAddress& addr,
198
+ int nonblock, int cloexec) {
199
+ int fd, flags;
200
+ socklen_t len = EventEngine::ResolvedAddress::MAX_SIZE_BYTES;
201
+ fd = accept(sockfd, const_cast<sockaddr*>(addr.address()), &len);
202
+ if (fd >= 0) {
203
+ if (nonblock) {
204
+ flags = fcntl(fd, F_GETFL, 0);
205
+ if (flags < 0) goto close_and_error;
206
+ if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) != 0) goto close_and_error;
207
+ }
208
+ if (cloexec) {
209
+ flags = fcntl(fd, F_GETFD, 0);
210
+ if (flags < 0) goto close_and_error;
211
+ if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) != 0) goto close_and_error;
212
+ }
213
+ }
214
+ return fd;
215
+
216
+ close_and_error:
217
+ close(fd);
218
+ return -1;
219
+ }
220
+
221
+ #elif GRPC_LINUX_SOCKETUTILS
222
+
223
+ int Accept4(int sockfd,
224
+ grpc_event_engine::experimental::EventEngine::ResolvedAddress& addr,
225
+ int nonblock, int cloexec) {
226
+ int flags = 0;
227
+ flags |= nonblock ? SOCK_NONBLOCK : 0;
228
+ flags |= cloexec ? SOCK_CLOEXEC : 0;
229
+ socklen_t len = EventEngine::ResolvedAddress::MAX_SIZE_BYTES;
230
+ return accept4(sockfd, const_cast<sockaddr*>(addr.address()), &len, flags);
231
+ }
232
+
233
+ #endif /* GRPC_LINUX_SOCKETUTILS */
234
+
235
+ #ifdef GRPC_POSIX_SOCKET_UTILS_COMMON
236
+
237
+ bool SockaddrIsV4Mapped(const EventEngine::ResolvedAddress* resolved_addr,
238
+ EventEngine::ResolvedAddress* resolved_addr4_out) {
239
+ const sockaddr* addr = resolved_addr->address();
240
+ if (addr->sa_family == AF_INET6) {
241
+ const sockaddr_in6* addr6 = reinterpret_cast<const sockaddr_in6*>(addr);
242
+ sockaddr_in* addr4_out =
243
+ resolved_addr4_out == nullptr
244
+ ? nullptr
245
+ : reinterpret_cast<sockaddr_in*>(
246
+ const_cast<sockaddr*>(resolved_addr4_out->address()));
247
+
248
+ if (memcmp(addr6->sin6_addr.s6_addr, kV4MappedPrefix,
249
+ sizeof(kV4MappedPrefix)) == 0) {
250
+ if (resolved_addr4_out != nullptr) {
251
+ // Normalize ::ffff:0.0.0.0/96 to IPv4.
252
+ memset(addr4_out, 0, sizeof(sockaddr_in));
253
+ addr4_out->sin_family = AF_INET;
254
+ // s6_addr32 would be nice, but it's non-standard.
255
+ memcpy(&addr4_out->sin_addr, &addr6->sin6_addr.s6_addr[12], 4);
256
+ addr4_out->sin_port = addr6->sin6_port;
257
+ *resolved_addr4_out = EventEngine::ResolvedAddress(
258
+ reinterpret_cast<sockaddr*>(addr4_out),
259
+ static_cast<socklen_t>(sizeof(sockaddr_in)));
260
+ }
261
+ return true;
262
+ }
263
+ }
264
+ return false;
265
+ }
266
+
267
+ bool SockaddrToV4Mapped(const EventEngine::ResolvedAddress* resolved_addr,
268
+ EventEngine::ResolvedAddress* resolved_addr6_out) {
269
+ GPR_ASSERT(resolved_addr != resolved_addr6_out);
270
+ const sockaddr* addr = resolved_addr->address();
271
+ sockaddr_in6* addr6_out = const_cast<sockaddr_in6*>(
272
+ reinterpret_cast<const sockaddr_in6*>(resolved_addr6_out->address()));
273
+ if (addr->sa_family == AF_INET) {
274
+ const sockaddr_in* addr4 = reinterpret_cast<const sockaddr_in*>(addr);
275
+ memset(resolved_addr6_out, 0, sizeof(*resolved_addr6_out));
276
+ addr6_out->sin6_family = AF_INET6;
277
+ memcpy(&addr6_out->sin6_addr.s6_addr[0], kV4MappedPrefix, 12);
278
+ memcpy(&addr6_out->sin6_addr.s6_addr[12], &addr4->sin_addr, 4);
279
+ addr6_out->sin6_port = addr4->sin_port;
280
+ *resolved_addr6_out = EventEngine::ResolvedAddress(
281
+ reinterpret_cast<sockaddr*>(addr6_out),
282
+ static_cast<socklen_t>(sizeof(sockaddr_in6)));
283
+ return true;
284
+ }
285
+ return false;
286
+ }
287
+
288
+ absl::StatusOr<std::string> SockaddrToString(
289
+ const EventEngine::ResolvedAddress* resolved_addr, bool normalize) {
290
+ const int save_errno = errno;
291
+ EventEngine::ResolvedAddress addr_normalized;
292
+ if (normalize && SockaddrIsV4Mapped(resolved_addr, &addr_normalized)) {
293
+ resolved_addr = &addr_normalized;
294
+ }
295
+ const sockaddr* addr =
296
+ reinterpret_cast<const sockaddr*>(resolved_addr->address());
297
+ std::string out;
298
+ #ifdef GRPC_HAVE_UNIX_SOCKET
299
+ if (addr->sa_family == AF_UNIX) {
300
+ const sockaddr_un* addr_un = reinterpret_cast<const sockaddr_un*>(addr);
301
+ bool abstract = addr_un->sun_path[0] == '\0';
302
+ if (abstract) {
303
+ #ifdef GPR_APPLE
304
+ int len = resolved_addr->size() - sizeof(addr_un->sun_family) -
305
+ sizeof(addr_un->sun_len);
306
+ #else
307
+ int len = resolved_addr->size() - sizeof(addr_un->sun_family);
308
+ #endif
309
+ if (len <= 0) {
310
+ return absl::InvalidArgumentError("Empty UDS abstract path");
311
+ }
312
+ out = std::string(addr_un->sun_path, len);
313
+ } else {
314
+ size_t maxlen = sizeof(addr_un->sun_path);
315
+ if (strnlen(addr_un->sun_path, maxlen) == maxlen) {
316
+ return absl::InvalidArgumentError("UDS path is not null-terminated");
317
+ }
318
+ out = std::string(addr_un->sun_path);
319
+ }
320
+ return out;
321
+ }
322
+ #endif
323
+
324
+ const void* ip = nullptr;
325
+ int port = 0;
326
+ uint32_t sin6_scope_id = 0;
327
+ if (addr->sa_family == AF_INET) {
328
+ const sockaddr_in* addr4 = reinterpret_cast<const sockaddr_in*>(addr);
329
+ ip = &addr4->sin_addr;
330
+ port = ntohs(addr4->sin_port);
331
+ } else if (addr->sa_family == AF_INET6) {
332
+ const sockaddr_in6* addr6 = reinterpret_cast<const sockaddr_in6*>(addr);
333
+ ip = &addr6->sin6_addr;
334
+ port = ntohs(addr6->sin6_port);
335
+ sin6_scope_id = addr6->sin6_scope_id;
336
+ }
337
+ char ntop_buf[INET6_ADDRSTRLEN];
338
+ if (ip != nullptr &&
339
+ inet_ntop(addr->sa_family, ip, ntop_buf, sizeof(ntop_buf)) != nullptr) {
340
+ if (sin6_scope_id != 0) {
341
+ // Enclose sin6_scope_id with the format defined in RFC 6874
342
+ // section 2.
343
+ std::string host_with_scope =
344
+ absl::StrFormat("%s%%%" PRIu32, ntop_buf, sin6_scope_id);
345
+ out = grpc_core::JoinHostPort(host_with_scope, port);
346
+ } else {
347
+ out = grpc_core::JoinHostPort(ntop_buf, port);
348
+ }
349
+ } else {
350
+ return absl::InvalidArgumentError(
351
+ absl::StrCat("Unknown sockaddr family: ", addr->sa_family));
352
+ }
353
+ // This is probably redundant, but we wouldn't want to log the wrong
354
+ // error.
355
+ errno = save_errno;
356
+ return out;
357
+ }
358
+
359
+ EventEngine::ResolvedAddress SockaddrMakeWild6(int port) {
360
+ EventEngine::ResolvedAddress resolved_wild_out;
361
+ sockaddr_in6* wild_out = reinterpret_cast<sockaddr_in6*>(
362
+ const_cast<sockaddr*>(resolved_wild_out.address()));
363
+ GPR_ASSERT(port >= 0 && port < 65536);
364
+ memset(wild_out, 0, sizeof(sockaddr_in6));
365
+ wild_out->sin6_family = AF_INET6;
366
+ wild_out->sin6_port = htons(static_cast<uint16_t>(port));
367
+ return EventEngine::ResolvedAddress(
368
+ reinterpret_cast<sockaddr*>(wild_out),
369
+ static_cast<socklen_t>(sizeof(sockaddr_in6)));
370
+ }
371
+
372
+ EventEngine::ResolvedAddress SockaddrMakeWild4(int port) {
373
+ EventEngine::ResolvedAddress resolved_wild_out;
374
+ sockaddr_in* wild_out = reinterpret_cast<sockaddr_in*>(
375
+ const_cast<sockaddr*>(resolved_wild_out.address()));
376
+ GPR_ASSERT(port >= 0 && port < 65536);
377
+ memset(wild_out, 0, sizeof(sockaddr_in));
378
+ wild_out->sin_family = AF_INET;
379
+ wild_out->sin_port = htons(static_cast<uint16_t>(port));
380
+ return EventEngine::ResolvedAddress(
381
+ reinterpret_cast<sockaddr*>(wild_out),
382
+ static_cast<socklen_t>(sizeof(sockaddr_in)));
383
+ }
384
+
385
+ int SockaddrGetPort(const EventEngine::ResolvedAddress& resolved_addr) {
386
+ const sockaddr* addr = resolved_addr.address();
387
+ switch (addr->sa_family) {
388
+ case AF_INET:
389
+ return ntohs((reinterpret_cast<const sockaddr_in*>(addr))->sin_port);
390
+ case AF_INET6:
391
+ return ntohs((reinterpret_cast<const sockaddr_in6*>(addr))->sin6_port);
392
+ #ifdef GRPC_HAVE_UNIX_SOCKET
393
+ case AF_UNIX:
394
+ return 1;
395
+ #endif
396
+ default:
397
+ gpr_log(GPR_ERROR, "Unknown socket family %d in SockaddrGetPort",
398
+ addr->sa_family);
399
+ abort();
400
+ }
401
+ }
402
+
403
+ void SockaddrSetPort(EventEngine::ResolvedAddress& resolved_addr, int port) {
404
+ sockaddr* addr = const_cast<sockaddr*>(resolved_addr.address());
405
+ switch (addr->sa_family) {
406
+ case AF_INET:
407
+ GPR_ASSERT(port >= 0 && port < 65536);
408
+ (reinterpret_cast<sockaddr_in*>(addr))->sin_port =
409
+ htons(static_cast<uint16_t>(port));
410
+ return;
411
+ case AF_INET6:
412
+ GPR_ASSERT(port >= 0 && port < 65536);
413
+ (reinterpret_cast<sockaddr_in6*>(addr))->sin6_port =
414
+ htons(static_cast<uint16_t>(port));
415
+ return;
416
+ default:
417
+ gpr_log(GPR_ERROR, "Unknown socket family %d in grpc_sockaddr_set_port",
418
+ addr->sa_family);
419
+ abort();
420
+ }
421
+ }
422
+
423
+ void UnlinkIfUnixDomainSocket(
424
+ const EventEngine::ResolvedAddress& resolved_addr) {
425
+ #ifdef GRPC_HAVE_UNIX_SOCKET
426
+ if (resolved_addr.address()->sa_family != AF_UNIX) {
427
+ return;
428
+ }
429
+ struct sockaddr_un* un = reinterpret_cast<struct sockaddr_un*>(
430
+ const_cast<sockaddr*>(resolved_addr.address()));
431
+
432
+ // There is nothing to unlink for an abstract unix socket
433
+ if (un->sun_path[0] == '\0' && un->sun_path[1] != '\0') {
434
+ return;
435
+ }
436
+
437
+ struct stat st;
438
+ if (stat(un->sun_path, &st) == 0 && (st.st_mode & S_IFMT) == S_IFSOCK) {
439
+ unlink(un->sun_path);
440
+ }
441
+ #else
442
+ (void)resolved_addr;
443
+ #endif
444
+ }
445
+
446
+ absl::optional<int> SockaddrIsWildcard(
447
+ const EventEngine::ResolvedAddress& addr) {
448
+ const EventEngine::ResolvedAddress* resolved_addr = &addr;
449
+ EventEngine::ResolvedAddress addr4_normalized;
450
+ if (SockaddrIsV4Mapped(resolved_addr, &addr4_normalized)) {
451
+ resolved_addr = &addr4_normalized;
452
+ }
453
+ if (resolved_addr->address()->sa_family == AF_INET) {
454
+ // Check for 0.0.0.0
455
+ const sockaddr_in* addr4 =
456
+ reinterpret_cast<const sockaddr_in*>(resolved_addr->address());
457
+ if (addr4->sin_addr.s_addr != 0) {
458
+ return absl::nullopt;
459
+ }
460
+ return static_cast<int>(ntohs(addr4->sin_port));
461
+ } else if (resolved_addr->address()->sa_family == AF_INET6) {
462
+ // Check for ::
463
+ const sockaddr_in6* addr6 =
464
+ reinterpret_cast<const sockaddr_in6*>(resolved_addr->address());
465
+ int i;
466
+ for (i = 0; i < 16; i++) {
467
+ if (addr6->sin6_addr.s6_addr[i] != 0) {
468
+ return absl::nullopt;
469
+ }
470
+ }
471
+ return static_cast<int>(ntohs(addr6->sin6_port));
472
+ } else {
473
+ return absl::nullopt;
474
+ }
475
+ }
476
+
477
+ // Instruct the kernel to wait for specified number of bytes to be received on
478
+ // the socket before generating an interrupt for packet receive. If the call
479
+ // succeeds, it returns the number of bytes (wait threshold) that was actually
480
+ // set.
481
+ absl::StatusOr<int> PosixSocketWrapper::SetSocketRcvLowat(int bytes) {
482
+ if (setsockopt(fd_, SOL_SOCKET, SO_RCVLOWAT, &bytes, sizeof(bytes)) != 0) {
483
+ return absl::Status(
484
+ absl::StatusCode::kInternal,
485
+ absl::StrCat("setsockopt(SO_RCVLOWAT): ", grpc_core::StrError(errno)));
486
+ }
487
+ return bytes;
488
+ }
489
+
490
+ // Set a socket to use zerocopy
491
+ absl::Status PosixSocketWrapper::SetSocketZeroCopy() {
492
+ #ifdef GRPC_LINUX_ERRQUEUE
493
+ const int enable = 1;
494
+ auto err = setsockopt(fd_, SOL_SOCKET, SO_ZEROCOPY, &enable, sizeof(enable));
495
+ if (err != 0) {
496
+ return absl::Status(
497
+ absl::StatusCode::kInternal,
498
+ absl::StrCat("setsockopt(SO_ZEROCOPY): ", grpc_core::StrError(errno)));
499
+ }
500
+ return absl::OkStatus();
501
+ #else
502
+ return absl::Status(absl::StatusCode::kInternal,
503
+ absl::StrCat("setsockopt(SO_ZEROCOPY): ",
504
+ grpc_core::StrError(ENOSYS).c_str()));
505
+ #endif
506
+ }
507
+
508
+ // Set a socket to non blocking mode
509
+ absl::Status PosixSocketWrapper::SetSocketNonBlocking(int non_blocking) {
510
+ int oldflags = fcntl(fd_, F_GETFL, 0);
511
+ if (oldflags < 0) {
512
+ return absl::Status(absl::StatusCode::kInternal,
513
+ absl::StrCat("fcntl: ", grpc_core::StrError(errno)));
514
+ }
515
+
516
+ if (non_blocking) {
517
+ oldflags |= O_NONBLOCK;
518
+ } else {
519
+ oldflags &= ~O_NONBLOCK;
520
+ }
521
+
522
+ if (fcntl(fd_, F_SETFL, oldflags) != 0) {
523
+ return absl::Status(absl::StatusCode::kInternal,
524
+ absl::StrCat("fcntl: ", grpc_core::StrError(errno)));
525
+ }
526
+
527
+ return absl::OkStatus();
528
+ }
529
+
530
+ absl::Status PosixSocketWrapper::SetSocketNoSigpipeIfPossible() {
531
+ #ifdef GRPC_HAVE_SO_NOSIGPIPE
532
+ int val = 1;
533
+ int newval;
534
+ socklen_t intlen = sizeof(newval);
535
+ if (0 != setsockopt(fd_, SOL_SOCKET, SO_NOSIGPIPE, &val, sizeof(val))) {
536
+ return absl::Status(
537
+ absl::StatusCode::kInternal,
538
+ absl::StrCat("setsockopt(SO_NOSIGPIPE): ", grpc_core::StrError(errno)));
539
+ }
540
+ if (0 != getsockopt(fd_, SOL_SOCKET, SO_NOSIGPIPE, &newval, &intlen)) {
541
+ return absl::Status(
542
+ absl::StatusCode::kInternal,
543
+ absl::StrCat("getsockopt(SO_NOSIGPIPE): ", grpc_core::StrError(errno)));
544
+ }
545
+ if ((newval != 0) != (val != 0)) {
546
+ return absl::Status(absl::StatusCode::kInternal,
547
+ "Failed to set SO_NOSIGPIPE");
548
+ }
549
+ #endif
550
+ return absl::OkStatus();
551
+ }
552
+
553
+ absl::Status PosixSocketWrapper::SetSocketIpPktInfoIfPossible() {
554
+ #ifdef GRPC_HAVE_IP_PKTINFO
555
+ int get_local_ip = 1;
556
+ if (0 != setsockopt(fd_, IPPROTO_IP, IP_PKTINFO, &get_local_ip,
557
+ sizeof(get_local_ip))) {
558
+ return absl::Status(
559
+ absl::StatusCode::kInternal,
560
+ absl::StrCat("setsockopt(IP_PKTINFO): ", grpc_core::StrError(errno)));
561
+ }
562
+ #endif
563
+ return absl::OkStatus();
564
+ }
565
+
566
+ absl::Status PosixSocketWrapper::SetSocketIpv6RecvPktInfoIfPossible() {
567
+ #ifdef GRPC_HAVE_IPV6_RECVPKTINFO
568
+ int get_local_ip = 1;
569
+ if (0 != setsockopt(fd_, IPPROTO_IPV6, IPV6_RECVPKTINFO, &get_local_ip,
570
+ sizeof(get_local_ip))) {
571
+ return absl::Status(absl::StatusCode::kInternal,
572
+ absl::StrCat("setsockopt(IPV6_RECVPKTINFO): ",
573
+ grpc_core::StrError(errno)));
574
+ }
575
+ #endif
576
+ return absl::OkStatus();
577
+ }
578
+
579
+ absl::Status PosixSocketWrapper::SetSocketSndBuf(int buffer_size_bytes) {
580
+ return 0 == setsockopt(fd_, SOL_SOCKET, SO_SNDBUF, &buffer_size_bytes,
581
+ sizeof(buffer_size_bytes))
582
+ ? absl::OkStatus()
583
+ : absl::Status(absl::StatusCode::kInternal,
584
+ absl::StrCat("setsockopt(SO_SNDBUF): ",
585
+ grpc_core::StrError(errno)));
586
+ }
587
+
588
+ absl::Status PosixSocketWrapper::SetSocketRcvBuf(int buffer_size_bytes) {
589
+ return 0 == setsockopt(fd_, SOL_SOCKET, SO_RCVBUF, &buffer_size_bytes,
590
+ sizeof(buffer_size_bytes))
591
+ ? absl::OkStatus()
592
+ : absl::Status(absl::StatusCode::kInternal,
593
+ absl::StrCat("setsockopt(SO_RCVBUF): ",
594
+ grpc_core::StrError(errno)));
595
+ }
596
+
597
+ // Set a socket to close on exec
598
+ absl::Status PosixSocketWrapper::SetSocketCloexec(int close_on_exec) {
599
+ int oldflags = fcntl(fd_, F_GETFD, 0);
600
+ if (oldflags < 0) {
601
+ return absl::Status(absl::StatusCode::kInternal,
602
+ absl::StrCat("fcntl: ", grpc_core::StrError(errno)));
603
+ }
604
+
605
+ if (close_on_exec) {
606
+ oldflags |= FD_CLOEXEC;
607
+ } else {
608
+ oldflags &= ~FD_CLOEXEC;
609
+ }
610
+
611
+ if (fcntl(fd_, F_SETFD, oldflags) != 0) {
612
+ return absl::Status(absl::StatusCode::kInternal,
613
+ absl::StrCat("fcntl: ", grpc_core::StrError(errno)));
614
+ }
615
+
616
+ return absl::OkStatus();
617
+ }
618
+
619
+ // set a socket to reuse old addresses
620
+ absl::Status PosixSocketWrapper::SetSocketReuseAddr(int reuse) {
621
+ int val = (reuse != 0);
622
+ int newval;
623
+ socklen_t intlen = sizeof(newval);
624
+ if (0 != setsockopt(fd_, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val))) {
625
+ return absl::Status(
626
+ absl::StatusCode::kInternal,
627
+ absl::StrCat("setsockopt(SO_REUSEADDR): ", grpc_core::StrError(errno)));
628
+ }
629
+ if (0 != getsockopt(fd_, SOL_SOCKET, SO_REUSEADDR, &newval, &intlen)) {
630
+ return absl::Status(
631
+ absl::StatusCode::kInternal,
632
+ absl::StrCat("getsockopt(SO_REUSEADDR): ", grpc_core::StrError(errno)));
633
+ }
634
+ if ((newval != 0) != val) {
635
+ return absl::Status(absl::StatusCode::kInternal,
636
+ "Failed to set SO_REUSEADDR");
637
+ }
638
+
639
+ return absl::OkStatus();
640
+ }
641
+
642
+ // set a socket to reuse old ports
643
+ absl::Status PosixSocketWrapper::SetSocketReusePort(int reuse) {
644
+ #ifndef SO_REUSEPORT
645
+ return absl::Status(absl::StatusCode::kInternal,
646
+ "SO_REUSEPORT unavailable on compiling system");
647
+ #else
648
+ int val = (reuse != 0);
649
+ int newval;
650
+ socklen_t intlen = sizeof(newval);
651
+ if (0 != setsockopt(fd_, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val))) {
652
+ return absl::Status(
653
+ absl::StatusCode::kInternal,
654
+ absl::StrCat("setsockopt(SO_REUSEPORT): ", grpc_core::StrError(errno)));
655
+ }
656
+ if (0 != getsockopt(fd_, SOL_SOCKET, SO_REUSEPORT, &newval, &intlen)) {
657
+ return absl::Status(
658
+ absl::StatusCode::kInternal,
659
+ absl::StrCat("getsockopt(SO_REUSEPORT): ", grpc_core::StrError(errno)));
660
+ }
661
+ if ((newval != 0) != val) {
662
+ return absl::Status(absl::StatusCode::kInternal,
663
+ "Failed to set SO_REUSEPORT");
664
+ }
665
+
666
+ return absl::OkStatus();
667
+ #endif
668
+ }
669
+
670
+ bool PosixSocketWrapper::IsSocketReusePortSupported() {
671
+ static bool kSupportSoReusePort = []() -> bool {
672
+ int s = socket(AF_INET, SOCK_STREAM, 0);
673
+ if (s < 0) {
674
+ // This might be an ipv6-only environment in which case
675
+ // 'socket(AF_INET,..)' call would fail. Try creating IPv6 socket in
676
+ // that case
677
+ s = socket(AF_INET6, SOCK_STREAM, 0);
678
+ }
679
+ if (s >= 0) {
680
+ PosixSocketWrapper sock(s);
681
+ return sock.SetSocketReusePort(1).ok();
682
+ } else {
683
+ return false;
684
+ }
685
+ }();
686
+ return kSupportSoReusePort;
687
+ }
688
+
689
+ // Disable nagle algorithm
690
+ absl::Status PosixSocketWrapper::SetSocketLowLatency(int low_latency) {
691
+ int val = (low_latency != 0);
692
+ int newval;
693
+ socklen_t intlen = sizeof(newval);
694
+ if (0 != setsockopt(fd_, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val))) {
695
+ return absl::Status(
696
+ absl::StatusCode::kInternal,
697
+ absl::StrCat("setsockopt(TCP_NODELAY): ", grpc_core::StrError(errno)));
698
+ }
699
+ if (0 != getsockopt(fd_, IPPROTO_TCP, TCP_NODELAY, &newval, &intlen)) {
700
+ return absl::Status(
701
+ absl::StatusCode::kInternal,
702
+ absl::StrCat("getsockopt(TCP_NODELAY): ", grpc_core::StrError(errno)));
703
+ }
704
+ if ((newval != 0) != val) {
705
+ return absl::Status(absl::StatusCode::kInternal,
706
+ "Failed to set TCP_NODELAY");
707
+ }
708
+ return absl::OkStatus();
709
+ }
710
+
711
+ #if GPR_LINUX == 1
712
+ // For Linux, it will be detected to support TCP_USER_TIMEOUT
713
+ #ifndef TCP_USER_TIMEOUT
714
+ #define TCP_USER_TIMEOUT 18
715
+ #endif
716
+ #define SOCKET_SUPPORTS_TCP_USER_TIMEOUT_DEFAULT 0
717
+ #else
718
+ // For non-Linux, TCP_USER_TIMEOUT will be used if TCP_USER_TIMEOUT is defined.
719
+ #ifdef TCP_USER_TIMEOUT
720
+ #define SOCKET_SUPPORTS_TCP_USER_TIMEOUT_DEFAULT 0
721
+ #else
722
+ #define TCP_USER_TIMEOUT 0
723
+ #define SOCKET_SUPPORTS_TCP_USER_TIMEOUT_DEFAULT -1
724
+ #endif // TCP_USER_TIMEOUT
725
+ #endif // GPR_LINUX == 1
726
+
727
+ // Whether the socket supports TCP_USER_TIMEOUT option.
728
+ // (0: don't know, 1: support, -1: not support)
729
+ static std::atomic<int> g_socket_supports_tcp_user_timeout(
730
+ SOCKET_SUPPORTS_TCP_USER_TIMEOUT_DEFAULT);
731
+
732
+ void PosixSocketWrapper::ConfigureDefaultTcpUserTimeout(bool enable,
733
+ int timeout,
734
+ bool is_client) {
735
+ if (is_client) {
736
+ kDefaultClientUserTimeoutEnabled = enable;
737
+ if (timeout > 0) {
738
+ kDefaultClientUserTimeoutMs = timeout;
739
+ }
740
+ } else {
741
+ kDefaultServerUserTimeoutEnabled = enable;
742
+ if (timeout > 0) {
743
+ kDefaultServerUserTimeoutMs = timeout;
744
+ }
745
+ }
746
+ }
747
+
748
+ // Set TCP_USER_TIMEOUT
749
+ void PosixSocketWrapper::TrySetSocketTcpUserTimeout(
750
+ const PosixTcpOptions& options, bool is_client) {
751
+ if (g_socket_supports_tcp_user_timeout.load() < 0) {
752
+ return;
753
+ }
754
+ bool enable = is_client ? kDefaultClientUserTimeoutEnabled
755
+ : kDefaultServerUserTimeoutEnabled;
756
+ int timeout =
757
+ is_client ? kDefaultClientUserTimeoutMs : kDefaultServerUserTimeoutMs;
758
+ if (options.keep_alive_time_ms > 0) {
759
+ enable = options.keep_alive_time_ms != INT_MAX;
760
+ }
761
+ if (options.keep_alive_timeout_ms > 0) {
762
+ timeout = options.keep_alive_timeout_ms;
763
+ }
764
+ if (enable) {
765
+ int newval;
766
+ socklen_t len = sizeof(newval);
767
+ // If this is the first time to use TCP_USER_TIMEOUT, try to check
768
+ // if it is available.
769
+ if (g_socket_supports_tcp_user_timeout.load() == 0) {
770
+ if (0 != getsockopt(fd_, IPPROTO_TCP, TCP_USER_TIMEOUT, &newval, &len)) {
771
+ gpr_log(GPR_INFO,
772
+ "TCP_USER_TIMEOUT is not available. TCP_USER_TIMEOUT won't "
773
+ "be used thereafter");
774
+ g_socket_supports_tcp_user_timeout.store(-1);
775
+ } else {
776
+ gpr_log(GPR_INFO,
777
+ "TCP_USER_TIMEOUT is available. TCP_USER_TIMEOUT will be "
778
+ "used thereafter");
779
+ g_socket_supports_tcp_user_timeout.store(1);
780
+ }
781
+ }
782
+ if (g_socket_supports_tcp_user_timeout.load() > 0) {
783
+ if (0 != setsockopt(fd_, IPPROTO_TCP, TCP_USER_TIMEOUT, &timeout,
784
+ sizeof(timeout))) {
785
+ gpr_log(GPR_ERROR, "setsockopt(TCP_USER_TIMEOUT) %s",
786
+ grpc_core::StrError(errno).c_str());
787
+ return;
788
+ }
789
+ if (0 != getsockopt(fd_, IPPROTO_TCP, TCP_USER_TIMEOUT, &newval, &len)) {
790
+ gpr_log(GPR_ERROR, "getsockopt(TCP_USER_TIMEOUT) %s",
791
+ grpc_core::StrError(errno).c_str());
792
+ return;
793
+ }
794
+ if (newval != timeout) {
795
+ // Do not fail on failing to set TCP_USER_TIMEOUT
796
+ gpr_log(GPR_ERROR, "Failed to set TCP_USER_TIMEOUT");
797
+ return;
798
+ }
799
+ }
800
+ }
801
+ }
802
+
803
+ // Set a socket using a grpc_socket_mutator
804
+ absl::Status PosixSocketWrapper::SetSocketMutator(
805
+ grpc_fd_usage usage, grpc_socket_mutator* mutator) {
806
+ GPR_ASSERT(mutator);
807
+ if (!grpc_socket_mutator_mutate_fd(mutator, fd_, usage)) {
808
+ return absl::Status(absl::StatusCode::kInternal,
809
+ "grpc_socket_mutator failed.");
810
+ }
811
+ return absl::OkStatus();
812
+ }
813
+
814
+ absl::Status PosixSocketWrapper::ApplySocketMutatorInOptions(
815
+ grpc_fd_usage usage, const PosixTcpOptions& options) {
816
+ if (options.socket_mutator == nullptr) {
817
+ return absl::OkStatus();
818
+ }
819
+ return SetSocketMutator(usage, options.socket_mutator);
820
+ }
821
+
822
+ bool PosixSocketWrapper::SetSocketDualStack() {
823
+ const int off = 0;
824
+ return 0 == setsockopt(fd_, IPPROTO_IPV6, IPV6_V6ONLY, &off, sizeof(off));
825
+ }
826
+
827
+ bool PosixSocketWrapper::IsIpv6LoopbackAvailable() {
828
+ static bool kIpv6LoopbackAvailable = []() -> bool {
829
+ int fd = socket(AF_INET6, SOCK_STREAM, 0);
830
+ bool loopback_available = false;
831
+ if (fd < 0) {
832
+ gpr_log(GPR_INFO, "Disabling AF_INET6 sockets because socket() failed.");
833
+ } else {
834
+ sockaddr_in6 addr;
835
+ memset(&addr, 0, sizeof(addr));
836
+ addr.sin6_family = AF_INET6;
837
+ addr.sin6_addr.s6_addr[15] = 1; /* [::1]:0 */
838
+ if (bind(fd, reinterpret_cast<sockaddr*>(&addr), sizeof(addr)) == 0) {
839
+ loopback_available = true;
840
+ } else {
841
+ gpr_log(GPR_INFO,
842
+ "Disabling AF_INET6 sockets because ::1 is not available.");
843
+ }
844
+ close(fd);
845
+ }
846
+ return loopback_available;
847
+ }();
848
+ return kIpv6LoopbackAvailable;
849
+ }
850
+
851
+ absl::StatusOr<EventEngine::ResolvedAddress>
852
+ PosixSocketWrapper::LocalAddress() {
853
+ EventEngine::ResolvedAddress addr;
854
+ socklen_t len = EventEngine::ResolvedAddress::MAX_SIZE_BYTES;
855
+ if (getsockname(fd_, const_cast<sockaddr*>(addr.address()), &len) < 0) {
856
+ return absl::InternalError(
857
+ absl::StrCat("getsockname:", grpc_core::StrError(errno)));
858
+ }
859
+ return addr;
860
+ }
861
+
862
+ absl::StatusOr<EventEngine::ResolvedAddress> PosixSocketWrapper::PeerAddress() {
863
+ EventEngine::ResolvedAddress addr;
864
+ socklen_t len = EventEngine::ResolvedAddress::MAX_SIZE_BYTES;
865
+ if (getpeername(fd_, const_cast<sockaddr*>(addr.address()), &len) < 0) {
866
+ return absl::InternalError(
867
+ absl::StrCat("getpeername:", grpc_core::StrError(errno)));
868
+ }
869
+ return addr;
870
+ }
871
+
872
+ absl::StatusOr<std::string> PosixSocketWrapper::LocalAddressString() {
873
+ auto status = LocalAddress();
874
+ if (!status.ok()) {
875
+ return status.status();
876
+ }
877
+ return SockaddrToString(&(*status), true);
878
+ }
879
+
880
+ absl::StatusOr<std::string> PosixSocketWrapper::PeerAddressString() {
881
+ auto status = PeerAddress();
882
+ if (!status.ok()) {
883
+ return status.status();
884
+ }
885
+ return SockaddrToString(&(*status), true);
886
+ }
887
+
888
+ absl::StatusOr<PosixSocketWrapper> PosixSocketWrapper::CreateDualStackSocket(
889
+ std::function<int(int, int, int)> socket_factory,
890
+ const experimental::EventEngine::ResolvedAddress& addr, int type,
891
+ int protocol, PosixSocketWrapper::DSMode& dsmode) {
892
+ const sockaddr* sock_addr = addr.address();
893
+ int family = sock_addr->sa_family;
894
+ int newfd;
895
+ if (family == AF_INET6) {
896
+ if (IsIpv6LoopbackAvailable()) {
897
+ newfd = CreateSocket(socket_factory, family, type, protocol);
898
+ } else {
899
+ newfd = -1;
900
+ errno = EAFNOSUPPORT;
901
+ }
902
+ if (newfd < 0) {
903
+ return ErrorForFd(newfd, addr);
904
+ }
905
+ PosixSocketWrapper sock(newfd);
906
+ // Check if we've got a valid dualstack socket.
907
+ if (sock.SetSocketDualStack()) {
908
+ dsmode = PosixSocketWrapper::DSMode::DSMODE_DUALSTACK;
909
+ return sock;
910
+ }
911
+ // If this isn't an IPv4 address, then return whatever we've got.
912
+ if (!SockaddrIsV4Mapped(&addr, nullptr)) {
913
+ dsmode = PosixSocketWrapper::DSMode::DSMODE_IPV6;
914
+ return sock;
915
+ }
916
+ // Fall back to AF_INET.
917
+ if (newfd >= 0) {
918
+ close(newfd);
919
+ }
920
+ family = AF_INET;
921
+ }
922
+ dsmode = family == AF_INET ? PosixSocketWrapper::DSMode::DSMODE_IPV4
923
+ : PosixSocketWrapper::DSMode::DSMODE_NONE;
924
+ newfd = CreateSocket(socket_factory, family, type, protocol);
925
+ if (newfd < 0) {
926
+ return ErrorForFd(newfd, addr);
927
+ }
928
+ return PosixSocketWrapper(newfd);
929
+ }
930
+
931
+ absl::StatusOr<PosixSocketWrapper::PosixSocketCreateResult>
932
+ PosixSocketWrapper::CreateAndPrepareTcpClientSocket(
933
+ const PosixTcpOptions& options,
934
+ const EventEngine::ResolvedAddress& target_addr) {
935
+ PosixSocketWrapper::DSMode dsmode;
936
+ EventEngine::ResolvedAddress mapped_target_addr;
937
+
938
+ // Use dualstack sockets where available. Set mapped to v6 or v4 mapped to
939
+ // v6.
940
+ if (!SockaddrToV4Mapped(&target_addr, &mapped_target_addr)) {
941
+ // addr is v4 mapped to v6 or just v6.
942
+ mapped_target_addr = target_addr;
943
+ }
944
+ absl::StatusOr<PosixSocketWrapper> posix_socket_wrapper =
945
+ PosixSocketWrapper::CreateDualStackSocket(nullptr, mapped_target_addr,
946
+ SOCK_STREAM, 0, dsmode);
947
+ if (!posix_socket_wrapper.ok()) {
948
+ return posix_socket_wrapper.status();
949
+ }
950
+
951
+ if (dsmode == PosixSocketWrapper::DSMode::DSMODE_IPV4) {
952
+ // Original addr is either v4 or v4 mapped to v6. Set mapped_addr to v4.
953
+ if (!SockaddrIsV4Mapped(&target_addr, &mapped_target_addr)) {
954
+ mapped_target_addr = target_addr;
955
+ }
956
+ }
957
+
958
+ auto error = PrepareTcpClientSocket(*posix_socket_wrapper, mapped_target_addr,
959
+ options);
960
+ if (!error.ok()) {
961
+ return error;
962
+ }
963
+ return PosixSocketWrapper::PosixSocketCreateResult{*posix_socket_wrapper,
964
+ mapped_target_addr};
965
+ }
966
+
967
+ #else /* GRPC_POSIX_SOCKET_UTILS_COMMON */
968
+
969
+ bool SockaddrIsV4Mapped(const EventEngine::ResolvedAddress* /*resolved_addr*/,
970
+ EventEngine::ResolvedAddress* /*resolved_addr4_out*/) {
971
+ GPR_ASSERT(false && "unimplemented");
972
+ }
973
+
974
+ bool SockaddrToV4Mapped(const EventEngine::ResolvedAddress* /*resolved_addr*/,
975
+ EventEngine::ResolvedAddress* /*resolved_addr6_out*/) {
976
+ GPR_ASSERT(false && "unimplemented");
977
+ }
978
+
979
+ absl::StatusOr<std::string> SockaddrToString(
980
+ const EventEngine::ResolvedAddress* /*resolved_addr*/, bool /*normalize*/) {
981
+ GPR_ASSERT(false && "unimplemented");
982
+ }
983
+
984
+ absl::StatusOr<int> PosixSocketWrapper::SetSocketRcvLowat(int /*bytes*/) {
985
+ GPR_ASSERT(false && "unimplemented");
986
+ }
987
+
988
+ absl::Status PosixSocketWrapper::SetSocketZeroCopy() {
989
+ GPR_ASSERT(false && "unimplemented");
990
+ }
991
+
992
+ absl::Status PosixSocketWrapper::SetSocketNonBlocking(int /*non_blocking*/) {
993
+ GPR_ASSERT(false && "unimplemented");
994
+ }
995
+
996
+ absl::Status PosixSocketWrapper::SetSocketCloexec(int /*close_on_exec*/) {
997
+ GPR_ASSERT(false && "unimplemented");
998
+ }
999
+
1000
+ absl::Status PosixSocketWrapper::SetSocketReuseAddr(int /*reuse*/) {
1001
+ GPR_ASSERT(false && "unimplemented");
1002
+ }
1003
+
1004
+ absl::Status PosixSocketWrapper::SetSocketLowLatency(int /*low_latency*/) {
1005
+ GPR_ASSERT(false && "unimplemented");
1006
+ }
1007
+
1008
+ absl::Status PosixSocketWrapper::SetSocketReusePort(int /*reuse*/) {
1009
+ GPR_ASSERT(false && "unimplemented");
1010
+ }
1011
+
1012
+ void PosixSocketWrapper::ConfigureDefaultTcpUserTimeout(bool /*enable*/,
1013
+ int /*timeout*/,
1014
+ bool /*is_client*/) {}
1015
+
1016
+ void PosixSocketWrapper::TrySetSocketTcpUserTimeout(
1017
+ const PosixTcpOptions& /*options*/, bool /*is_client*/) {
1018
+ GPR_ASSERT(false && "unimplemented");
1019
+ }
1020
+
1021
+ absl::Status PosixSocketWrapper::SetSocketNoSigpipeIfPossible() {
1022
+ GPR_ASSERT(false && "unimplemented");
1023
+ }
1024
+
1025
+ absl::Status PosixSocketWrapper::SetSocketIpPktInfoIfPossible() {
1026
+ GPR_ASSERT(false && "unimplemented");
1027
+ }
1028
+
1029
+ absl::Status PosixSocketWrapper::SetSocketIpv6RecvPktInfoIfPossible() {
1030
+ GPR_ASSERT(false && "unimplemented");
1031
+ }
1032
+
1033
+ absl::Status PosixSocketWrapper::SetSocketSndBuf(int /*buffer_size_bytes*/) {
1034
+ GPR_ASSERT(false && "unimplemented");
1035
+ }
1036
+
1037
+ absl::Status PosixSocketWrapper::SetSocketRcvBuf(int /*buffer_size_bytes*/) {
1038
+ GPR_ASSERT(false && "unimplemented");
1039
+ }
1040
+
1041
+ absl::Status PosixSocketWrapper::SetSocketMutator(
1042
+ grpc_fd_usage /*usage*/, grpc_socket_mutator* /*mutator*/) {
1043
+ GPR_ASSERT(false && "unimplemented");
1044
+ }
1045
+
1046
+ absl::Status PosixSocketWrapper::ApplySocketMutatorInOptions(
1047
+ grpc_fd_usage /*usage*/, const PosixTcpOptions& /*options*/) {
1048
+ GPR_ASSERT(false && "unimplemented");
1049
+ }
1050
+
1051
+ bool PosixSocketWrapper::SetSocketDualStack() {
1052
+ GPR_ASSERT(false && "unimplemented");
1053
+ }
1054
+
1055
+ bool PosixSocketWrapper::IsSocketReusePortSupported() {
1056
+ GPR_ASSERT(false && "unimplemented");
1057
+ }
1058
+
1059
+ bool PosixSocketWrapper::IsIpv6LoopbackAvailable() {
1060
+ GPR_ASSERT(false && "unimplemented");
1061
+ }
1062
+
1063
+ absl::StatusOr<PosixSocketWrapper> PosixSocketWrapper::CreateDualStackSocket(
1064
+ std::function<int(int /*domain*/, int /*type*/, int /*protocol*/)>
1065
+ /* socket_factory */,
1066
+ const experimental::EventEngine::ResolvedAddress& /*addr*/, int /*type*/,
1067
+ int /*protocol*/, DSMode& /*dsmode*/) {
1068
+ GPR_ASSERT(false && "unimplemented");
1069
+ }
1070
+
1071
+ absl::StatusOr<PosixSocketWrapper::PosixSocketCreateResult>
1072
+ PosixSocketWrapper::CreateAndPrepareTcpClientSocket(
1073
+ const PosixTcpOptions& /*options*/,
1074
+ const EventEngine::ResolvedAddress& /*target_addr*/) {
1075
+ GPR_ASSERT(false && "unimplemented");
1076
+ }
1077
+
1078
+ #endif /* GRPC_POSIX_SOCKET_UTILS_COMMON */
1079
+
1080
+ } // namespace posix_engine
1081
+ } // namespace grpc_event_engine