grpc 1.26.0 → 1.28.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 (829) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1699 -1482
  3. data/etc/roots.pem +44 -0
  4. data/include/grpc/grpc_security.h +37 -15
  5. data/include/grpc/grpc_security_constants.h +27 -0
  6. data/include/grpc/impl/codegen/grpc_types.h +19 -0
  7. data/include/grpc/impl/codegen/port_platform.h +8 -1
  8. data/include/grpc/impl/codegen/sync.h +5 -3
  9. data/include/grpc/impl/codegen/sync_abseil.h +36 -0
  10. data/include/grpc/module.modulemap +3 -0
  11. data/{src/core/lib/json/json_common.h → include/grpc/support/sync_abseil.h} +7 -15
  12. data/src/core/ext/filters/client_channel/client_channel.cc +74 -32
  13. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +31 -47
  14. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -3
  15. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  16. data/src/core/ext/filters/client_channel/http_proxy.cc +8 -5
  17. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -3
  18. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +291 -0
  19. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +83 -0
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +224 -367
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +88 -121
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +28 -57
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +18 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +9 -13
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +85 -83
  26. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +623 -767
  27. data/src/core/ext/filters/client_channel/lb_policy_factory.h +3 -3
  28. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +43 -75
  29. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  30. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +57 -70
  31. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +1 -1
  32. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -1
  33. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
  34. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +3 -3
  35. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +2 -2
  36. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -1
  37. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +3 -3
  38. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +31 -7
  39. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +228 -286
  40. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
  41. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +37 -176
  42. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +7 -11
  43. data/src/core/ext/filters/client_channel/service_config.cc +91 -160
  44. data/src/core/ext/filters/client_channel/service_config.h +14 -21
  45. data/src/core/ext/filters/client_channel/xds/xds_api.cc +1426 -229
  46. data/src/core/ext/filters/client_channel/xds/xds_api.h +214 -115
  47. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +236 -339
  48. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +32 -45
  49. data/src/core/ext/filters/client_channel/xds/xds_channel.h +3 -1
  50. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +14 -9
  51. data/src/core/ext/filters/client_channel/xds/xds_client.cc +986 -252
  52. data/src/core/ext/filters/client_channel/xds/xds_client.h +84 -36
  53. data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +53 -131
  54. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +119 -152
  55. data/src/core/ext/filters/message_size/message_size_filter.cc +32 -35
  56. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  57. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +3 -6
  58. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +6 -8
  59. data/src/core/ext/transport/chttp2/transport/writing.cc +1 -1
  60. data/src/core/ext/transport/inproc/inproc_transport.cc +22 -42
  61. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +17 -0
  62. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +30 -0
  63. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +27 -0
  64. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +54 -0
  65. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +46 -21
  66. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +116 -29
  67. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +4 -362
  68. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +14 -1337
  69. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +390 -0
  70. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +1411 -0
  71. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +29 -8
  72. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +60 -0
  73. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +1 -0
  74. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +1 -0
  75. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +5 -3
  76. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +6 -2
  77. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +48 -5
  78. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +154 -4
  79. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +19 -15
  80. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +46 -32
  81. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +26 -4
  82. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +70 -0
  83. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +42 -25
  84. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +83 -25
  85. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +1 -0
  86. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +43 -7
  87. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +115 -0
  88. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +1 -0
  89. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +7 -68
  90. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +14 -201
  91. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +91 -0
  92. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +240 -0
  93. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +1 -71
  94. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +3 -228
  95. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +88 -0
  96. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +258 -0
  97. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +1 -0
  98. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +30 -0
  99. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +53 -0
  100. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +104 -0
  101. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +383 -0
  102. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +17 -0
  103. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +33 -0
  104. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +144 -0
  105. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +527 -0
  106. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +42 -0
  107. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +112 -0
  108. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +29 -0
  109. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +53 -0
  110. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +62 -0
  111. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +199 -0
  112. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +17 -0
  113. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +33 -0
  114. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +793 -0
  115. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +2936 -0
  116. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +58 -0
  117. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +134 -0
  118. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +27 -0
  119. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +53 -0
  120. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +227 -0
  121. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +725 -0
  122. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +296 -0
  123. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +1072 -0
  124. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +32 -0
  125. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +65 -0
  126. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +47 -0
  127. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +108 -0
  128. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +52 -0
  129. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +133 -0
  130. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +87 -0
  131. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +258 -0
  132. data/src/core/ext/upb-generated/envoy/type/range.upb.c +11 -0
  133. data/src/core/ext/upb-generated/envoy/type/range.upb.h +27 -0
  134. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +28 -0
  135. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +62 -0
  136. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +88 -0
  137. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +249 -0
  138. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +30 -27
  139. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +64 -52
  140. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +13 -5
  141. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +34 -0
  142. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +48 -0
  143. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +104 -0
  144. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +17 -0
  145. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +30 -0
  146. data/src/core/ext/upb-generated/validate/validate.upb.c +38 -34
  147. data/src/core/ext/upb-generated/validate/validate.upb.h +129 -99
  148. data/src/core/lib/channel/channel_trace.cc +32 -41
  149. data/src/core/lib/channel/channel_trace.h +3 -3
  150. data/src/core/lib/channel/channelz.cc +158 -248
  151. data/src/core/lib/channel/channelz.h +17 -10
  152. data/src/core/lib/channel/channelz_registry.cc +47 -74
  153. data/src/core/lib/channel/channelz_registry.h +4 -4
  154. data/src/core/lib/gpr/sync_abseil.cc +114 -0
  155. data/src/core/lib/gpr/sync_posix.cc +8 -5
  156. data/src/core/lib/gpr/sync_windows.cc +4 -2
  157. data/src/core/lib/gpr/time_precise.cc +1 -1
  158. data/src/core/lib/gprpp/host_port.cc +1 -1
  159. data/src/core/lib/gprpp/inlined_vector.h +1 -210
  160. data/src/core/lib/gprpp/memory.h +2 -6
  161. data/src/core/lib/gprpp/optional.h +6 -21
  162. data/src/core/lib/gprpp/string_view.h +5 -110
  163. data/src/core/lib/gprpp/sync.h +9 -0
  164. data/src/core/lib/iomgr/buffer_list.cc +36 -35
  165. data/src/core/lib/iomgr/error.h +4 -4
  166. data/src/core/lib/iomgr/ev_epollex_linux.cc +12 -4
  167. data/src/core/lib/iomgr/executor.cc +1 -1
  168. data/src/core/lib/iomgr/fork_posix.cc +4 -0
  169. data/src/core/lib/iomgr/load_file.cc +1 -0
  170. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +87 -0
  171. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +88 -0
  172. data/src/core/lib/iomgr/socket_utils_common_posix.cc +14 -0
  173. data/src/core/lib/iomgr/socket_utils_posix.h +12 -0
  174. data/src/core/lib/iomgr/tcp_client_posix.cc +17 -17
  175. data/src/core/lib/iomgr/tcp_client_posix.h +6 -6
  176. data/src/core/lib/iomgr/tcp_custom.h +3 -0
  177. data/src/core/lib/iomgr/tcp_posix.cc +608 -56
  178. data/src/core/lib/iomgr/tcp_server_custom.cc +15 -2
  179. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +8 -0
  180. data/src/core/lib/iomgr/work_serializer.cc +155 -0
  181. data/src/core/lib/iomgr/work_serializer.h +65 -0
  182. data/src/core/lib/json/json.h +208 -68
  183. data/src/core/lib/json/json_reader.cc +511 -319
  184. data/src/core/lib/json/json_writer.cc +201 -110
  185. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  186. data/src/core/lib/security/credentials/composite/composite_credentials.cc +7 -0
  187. data/src/core/lib/security/credentials/composite/composite_credentials.h +5 -1
  188. data/src/core/lib/security/credentials/credentials.h +10 -1
  189. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -1
  190. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +10 -8
  191. data/src/core/lib/security/credentials/jwt/json_token.cc +26 -56
  192. data/src/core/lib/security/credentials/jwt/json_token.h +2 -1
  193. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +8 -18
  194. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +149 -159
  195. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -3
  196. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +38 -35
  197. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  198. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -4
  199. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -1
  200. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +20 -0
  201. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +9 -0
  202. data/src/core/lib/security/credentials/tls/{spiffe_credentials.cc → tls_credentials.cc} +23 -24
  203. data/src/core/lib/security/credentials/tls/{spiffe_credentials.h → tls_credentials.h} +9 -9
  204. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -0
  205. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +22 -2
  206. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +2 -2
  207. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +2 -2
  208. data/src/core/lib/security/security_connector/local/local_security_connector.cc +31 -6
  209. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +3 -15
  210. data/src/core/lib/security/security_connector/ssl_utils.cc +48 -4
  211. data/src/core/lib/security/security_connector/ssl_utils.h +12 -1
  212. data/src/core/lib/security/security_connector/tls/{spiffe_security_connector.cc → tls_security_connector.cc} +106 -70
  213. data/src/core/lib/security/security_connector/tls/{spiffe_security_connector.h → tls_security_connector.h} +22 -19
  214. data/src/core/lib/security/transport/client_auth_filter.cc +33 -0
  215. data/src/core/lib/security/transport/security_handshaker.cc +2 -2
  216. data/src/core/lib/security/util/json_util.cc +22 -15
  217. data/src/core/lib/security/util/json_util.h +2 -2
  218. data/src/core/lib/surface/completion_queue.cc +22 -1
  219. data/src/core/lib/surface/version.cc +1 -1
  220. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  221. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
  222. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
  223. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +3 -3
  224. data/src/core/tsi/fake_transport_security.cc +7 -3
  225. data/src/core/tsi/fake_transport_security.h +2 -0
  226. data/src/core/tsi/grpc_shadow_boringssl.h +1333 -1319
  227. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  228. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +1 -1
  229. data/src/core/tsi/ssl_transport_security.cc +145 -8
  230. data/src/core/tsi/ssl_transport_security.h +15 -1
  231. data/src/core/tsi/transport_security.cc +13 -0
  232. data/src/core/tsi/transport_security_grpc.cc +2 -2
  233. data/src/core/tsi/transport_security_grpc.h +2 -2
  234. data/src/core/tsi/transport_security_interface.h +12 -0
  235. data/src/ruby/bin/math_pb.rb +5 -5
  236. data/src/ruby/ext/grpc/rb_call_credentials.c +4 -1
  237. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  238. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
  239. data/src/ruby/lib/grpc/version.rb +1 -1
  240. data/src/ruby/pb/grpc/health/v1/health_pb.rb +3 -3
  241. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +1 -1
  242. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +23 -13
  243. data/third_party/abseil-cpp/absl/algorithm/algorithm.h +159 -0
  244. data/third_party/abseil-cpp/absl/base/attributes.h +621 -0
  245. data/third_party/abseil-cpp/absl/base/call_once.h +226 -0
  246. data/third_party/abseil-cpp/absl/base/casts.h +184 -0
  247. data/third_party/abseil-cpp/absl/base/config.h +671 -0
  248. data/third_party/abseil-cpp/absl/base/const_init.h +76 -0
  249. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +129 -0
  250. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +389 -0
  251. data/third_party/abseil-cpp/absl/base/internal/atomic_hook.h +200 -0
  252. data/third_party/abseil-cpp/absl/base/internal/bits.h +218 -0
  253. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +107 -0
  254. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +94 -0
  255. data/third_party/abseil-cpp/absl/base/internal/endian.h +266 -0
  256. data/third_party/abseil-cpp/absl/base/internal/errno_saver.h +43 -0
  257. data/third_party/abseil-cpp/absl/base/internal/hide_ptr.h +51 -0
  258. data/third_party/abseil-cpp/absl/base/internal/identity.h +37 -0
  259. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +107 -0
  260. data/third_party/abseil-cpp/absl/base/internal/invoke.h +187 -0
  261. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +107 -0
  262. data/third_party/abseil-cpp/absl/base/internal/per_thread_tls.h +52 -0
  263. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +240 -0
  264. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +183 -0
  265. data/third_party/abseil-cpp/absl/base/internal/scheduling_mode.h +58 -0
  266. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +233 -0
  267. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +243 -0
  268. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +35 -0
  269. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +66 -0
  270. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +46 -0
  271. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc +81 -0
  272. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +93 -0
  273. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +37 -0
  274. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +416 -0
  275. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +66 -0
  276. data/third_party/abseil-cpp/absl/base/internal/thread_annotations.h +271 -0
  277. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +152 -0
  278. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +259 -0
  279. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +108 -0
  280. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.h +75 -0
  281. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +66 -0
  282. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +158 -0
  283. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +140 -0
  284. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +124 -0
  285. data/third_party/abseil-cpp/absl/base/log_severity.cc +27 -0
  286. data/third_party/abseil-cpp/absl/base/log_severity.h +121 -0
  287. data/third_party/abseil-cpp/absl/base/macros.h +220 -0
  288. data/third_party/abseil-cpp/absl/base/optimization.h +181 -0
  289. data/third_party/abseil-cpp/absl/base/options.h +211 -0
  290. data/third_party/abseil-cpp/absl/base/policy_checks.h +111 -0
  291. data/third_party/abseil-cpp/absl/base/port.h +26 -0
  292. data/third_party/abseil-cpp/absl/base/thread_annotations.h +280 -0
  293. data/third_party/abseil-cpp/absl/container/inlined_vector.h +848 -0
  294. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +265 -0
  295. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +892 -0
  296. data/third_party/abseil-cpp/absl/memory/memory.h +695 -0
  297. data/third_party/abseil-cpp/absl/meta/type_traits.h +759 -0
  298. data/third_party/abseil-cpp/absl/numeric/int128.cc +404 -0
  299. data/third_party/abseil-cpp/absl/numeric/int128.h +1091 -0
  300. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +302 -0
  301. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +308 -0
  302. data/third_party/abseil-cpp/absl/strings/ascii.cc +200 -0
  303. data/third_party/abseil-cpp/absl/strings/ascii.h +242 -0
  304. data/third_party/abseil-cpp/absl/strings/charconv.cc +984 -0
  305. data/third_party/abseil-cpp/absl/strings/charconv.h +119 -0
  306. data/third_party/abseil-cpp/absl/strings/escaping.cc +949 -0
  307. data/third_party/abseil-cpp/absl/strings/escaping.h +164 -0
  308. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +156 -0
  309. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +359 -0
  310. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +423 -0
  311. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +504 -0
  312. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.h +99 -0
  313. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +180 -0
  314. data/third_party/abseil-cpp/absl/strings/internal/escaping.h +58 -0
  315. data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +112 -0
  316. data/third_party/abseil-cpp/absl/strings/internal/memutil.h +148 -0
  317. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +36 -0
  318. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.h +89 -0
  319. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +73 -0
  320. data/third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h +248 -0
  321. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +388 -0
  322. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +432 -0
  323. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +245 -0
  324. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +209 -0
  325. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +326 -0
  326. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +51 -0
  327. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +415 -0
  328. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +493 -0
  329. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +23 -0
  330. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +72 -0
  331. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +104 -0
  332. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +334 -0
  333. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +333 -0
  334. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +314 -0
  335. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +455 -0
  336. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +53 -0
  337. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +50 -0
  338. data/third_party/abseil-cpp/absl/strings/match.cc +40 -0
  339. data/third_party/abseil-cpp/absl/strings/match.h +90 -0
  340. data/third_party/abseil-cpp/absl/strings/numbers.cc +965 -0
  341. data/third_party/abseil-cpp/absl/strings/numbers.h +266 -0
  342. data/third_party/abseil-cpp/absl/strings/str_cat.cc +246 -0
  343. data/third_party/abseil-cpp/absl/strings/str_cat.h +408 -0
  344. data/third_party/abseil-cpp/absl/strings/str_format.h +537 -0
  345. data/third_party/abseil-cpp/absl/strings/str_join.h +293 -0
  346. data/third_party/abseil-cpp/absl/strings/str_replace.cc +82 -0
  347. data/third_party/abseil-cpp/absl/strings/str_replace.h +219 -0
  348. data/third_party/abseil-cpp/absl/strings/str_split.cc +139 -0
  349. data/third_party/abseil-cpp/absl/strings/str_split.h +513 -0
  350. data/third_party/abseil-cpp/absl/strings/string_view.cc +235 -0
  351. data/third_party/abseil-cpp/absl/strings/string_view.h +622 -0
  352. data/third_party/abseil-cpp/absl/strings/strip.h +91 -0
  353. data/third_party/abseil-cpp/absl/strings/substitute.cc +171 -0
  354. data/third_party/abseil-cpp/absl/strings/substitute.h +693 -0
  355. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +48 -0
  356. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +78 -0
  357. data/third_party/abseil-cpp/absl/types/internal/optional.h +396 -0
  358. data/third_party/abseil-cpp/absl/types/internal/span.h +128 -0
  359. data/third_party/abseil-cpp/absl/types/optional.h +776 -0
  360. data/third_party/abseil-cpp/absl/types/span.h +713 -0
  361. data/third_party/abseil-cpp/absl/utility/utility.h +350 -0
  362. data/{src/boringssl → third_party/boringssl-with-bazel}/err_data.c +0 -0
  363. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_bitstr.c +0 -0
  364. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_bool.c +0 -0
  365. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_d2i_fp.c +0 -0
  366. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_dup.c +0 -0
  367. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_enum.c +0 -0
  368. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_gentm.c +0 -0
  369. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_i2d_fp.c +0 -0
  370. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_int.c +0 -0
  371. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_mbstr.c +0 -0
  372. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_object.c +0 -0
  373. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_octet.c +0 -0
  374. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_print.c +0 -0
  375. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_strnid.c +0 -0
  376. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_time.c +3 -4
  377. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_type.c +0 -0
  378. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_utctm.c +0 -0
  379. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_utf8.c +0 -0
  380. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_lib.c +0 -0
  381. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_locl.h +0 -0
  382. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_par.c +0 -0
  383. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn_pack.c +0 -0
  384. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/f_enum.c +0 -0
  385. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/f_int.c +0 -0
  386. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/f_string.c +0 -0
  387. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_dec.c +0 -0
  388. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_enc.c +0 -0
  389. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_fre.c +0 -0
  390. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_new.c +0 -0
  391. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_typ.c +0 -0
  392. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_utl.c +0 -0
  393. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/time_support.c +0 -0
  394. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/base64/base64.c +0 -0
  395. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/bio.c +0 -0
  396. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/bio_mem.c +0 -0
  397. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/connect.c +3 -4
  398. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/fd.c +0 -1
  399. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/file.c +5 -6
  400. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/hexdump.c +0 -0
  401. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/internal.h +0 -0
  402. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/pair.c +0 -1
  403. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/printf.c +0 -0
  404. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/socket.c +0 -0
  405. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/socket_helper.c +0 -0
  406. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bn_extra/bn_asn1.c +0 -0
  407. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bn_extra/convert.c +0 -0
  408. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/buf/buf.c +10 -69
  409. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/asn1_compat.c +0 -0
  410. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/ber.c +0 -0
  411. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/cbb.c +41 -2
  412. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/cbs.c +60 -3
  413. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/internal.h +0 -0
  414. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/unicode.c +0 -0
  415. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/chacha/chacha.c +0 -0
  416. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/chacha/internal.h +0 -0
  417. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/cipher_extra.c +0 -0
  418. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/derive_key.c +0 -0
  419. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_aesccm.c +0 -0
  420. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_aesctrhmac.c +0 -0
  421. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_aesgcmsiv.c +8 -0
  422. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_chacha20poly1305.c +0 -0
  423. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_null.c +0 -0
  424. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_rc2.c +0 -0
  425. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_rc4.c +0 -0
  426. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_tls.c +0 -0
  427. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/internal.h +0 -0
  428. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/tls_cbc.c +0 -0
  429. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cmac/cmac.c +0 -0
  430. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/conf.c +0 -0
  431. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/conf_def.h +0 -0
  432. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/internal.h +0 -0
  433. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-aarch64-fuchsia.c +0 -0
  434. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-aarch64-linux.c +0 -0
  435. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-arm-linux.c +0 -1
  436. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-arm-linux.h +0 -0
  437. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-arm.c +0 -0
  438. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-intel.c +0 -0
  439. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-ppc64le.c +0 -0
  440. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/crypto.c +0 -0
  441. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/curve25519/spake25519.c +0 -0
  442. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/check.c +3 -3
  443. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/dh.c +1 -2
  444. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/dh_asn1.c +0 -0
  445. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/params.c +0 -0
  446. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/digest_extra/digest_extra.c +0 -0
  447. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dsa/dsa.c +0 -0
  448. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dsa/dsa_asn1.c +0 -0
  449. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ec_extra/ec_asn1.c +0 -0
  450. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ec_extra/ec_derive.c +2 -3
  451. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ecdh_extra/ecdh_extra.c +0 -0
  452. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ecdsa_extra/ecdsa_asn1.c +0 -0
  453. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/engine/engine.c +0 -0
  454. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/err/err.c +6 -6
  455. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/err/internal.h +0 -0
  456. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/digestsign.c +0 -0
  457. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/evp.c +0 -0
  458. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/evp_asn1.c +0 -0
  459. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/evp_ctx.c +0 -0
  460. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/internal.h +0 -0
  461. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_dsa_asn1.c +0 -0
  462. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ec.c +0 -1
  463. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ec_asn1.c +0 -0
  464. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ed25519.c +0 -0
  465. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ed25519_asn1.c +0 -0
  466. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_rsa.c +14 -2
  467. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_rsa_asn1.c +0 -0
  468. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_x25519.c +0 -0
  469. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_x25519_asn1.c +1 -2
  470. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/pbkdf.c +0 -0
  471. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/print.c +0 -0
  472. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/scrypt.c +0 -0
  473. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/sign.c +0 -0
  474. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ex_data.c +0 -0
  475. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.c +108 -0
  476. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1282 -0
  477. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/aes/internal.h +5 -7
  478. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/aes/key_wrap.c +0 -0
  479. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/aes/mode_wrappers.c +0 -2
  480. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bcm.c +2 -0
  481. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/add.c +0 -0
  482. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/asm/x86_64-gcc.c +0 -0
  483. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/bn.c +0 -0
  484. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/bytes.c +0 -0
  485. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/cmp.c +0 -0
  486. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/ctx.c +0 -0
  487. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/div.c +0 -0
  488. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/div_extra.c +0 -0
  489. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/exponentiation.c +0 -0
  490. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/gcd.c +0 -0
  491. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/gcd_extra.c +0 -0
  492. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/generic.c +0 -0
  493. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/internal.h +0 -0
  494. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/jacobi.c +0 -0
  495. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/montgomery.c +0 -0
  496. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/montgomery_inv.c +0 -0
  497. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/mul.c +0 -0
  498. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/prime.c +11 -12
  499. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/random.c +0 -0
  500. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/rsaz_exp.c +0 -0
  501. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/rsaz_exp.h +0 -0
  502. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/shift.c +0 -0
  503. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/sqrt.c +0 -0
  504. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/aead.c +0 -0
  505. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/cipher.c +0 -0
  506. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/e_aes.c +3 -5
  507. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/e_des.c +0 -0
  508. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/internal.h +0 -0
  509. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/delocate.h +0 -0
  510. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/des/des.c +0 -0
  511. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/des/internal.h +0 -0
  512. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/digest.c +0 -0
  513. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/digests.c +0 -0
  514. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/internal.h +0 -0
  515. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/md32_common.h +0 -0
  516. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/ec.c +0 -0
  517. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/ec_key.c +1 -1
  518. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/ec_montgomery.c +0 -0
  519. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/felem.c +0 -0
  520. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/internal.h +0 -0
  521. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/oct.c +0 -0
  522. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/p224-64.c +0 -0
  523. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/p256-x86_64-table.h +0 -0
  524. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/p256-x86_64.c +0 -0
  525. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/p256-x86_64.h +0 -0
  526. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/scalar.c +0 -0
  527. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/simple.c +0 -0
  528. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/simple_mul.c +0 -0
  529. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/util.c +0 -0
  530. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/wnaf.c +0 -0
  531. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ecdh/ecdh.c +0 -0
  532. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ecdsa/ecdsa.c +0 -0
  533. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/fips_shared_support.c +0 -0
  534. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/hmac/hmac.c +0 -0
  535. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/is_fips.c +0 -0
  536. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/md4/md4.c +0 -0
  537. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/md5/internal.h +0 -0
  538. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/md5/md5.c +0 -0
  539. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/cbc.c +0 -0
  540. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/cfb.c +0 -0
  541. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/ctr.c +0 -0
  542. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/gcm.c +45 -193
  543. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +304 -0
  544. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/internal.h +8 -18
  545. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/ofb.c +0 -0
  546. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/polyval.c +0 -0
  547. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rand/ctrdrbg.c +0 -0
  548. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rand/internal.h +0 -0
  549. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rand/rand.c +0 -0
  550. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rand/urandom.c +0 -0
  551. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/blinding.c +0 -0
  552. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/internal.h +0 -0
  553. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/padding.c +0 -0
  554. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/rsa.c +7 -1
  555. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/rsa_impl.c +60 -51
  556. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/self_check/self_check.c +0 -0
  557. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/internal.h +0 -0
  558. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha1-altivec.c +0 -0
  559. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha1.c +0 -0
  560. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha256.c +0 -0
  561. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha512.c +0 -0
  562. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/tls/internal.h +0 -0
  563. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/tls/kdf.c +0 -0
  564. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/hkdf/hkdf.c +0 -0
  565. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/hrss/hrss.c +210 -311
  566. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/hrss/internal.h +0 -1
  567. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/internal.h +21 -1
  568. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/lhash/lhash.c +0 -0
  569. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/mem.c +70 -0
  570. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/obj/obj.c +16 -21
  571. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/obj/obj_dat.h +27 -6
  572. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/obj/obj_xref.c +0 -0
  573. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_all.c +0 -0
  574. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_info.c +0 -1
  575. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_lib.c +7 -7
  576. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_oth.c +0 -1
  577. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_pk8.c +0 -1
  578. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_pkey.c +0 -1
  579. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_x509.c +0 -0
  580. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_xaux.c +0 -0
  581. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs7/internal.h +0 -0
  582. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs7/pkcs7.c +0 -0
  583. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs7/pkcs7_x509.c +1 -1
  584. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/internal.h +0 -0
  585. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/p5_pbev2.c +0 -0
  586. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/pkcs8.c +0 -0
  587. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/pkcs8_x509.c +0 -0
  588. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/poly1305/internal.h +0 -0
  589. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/poly1305/poly1305.c +2 -2
  590. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/poly1305/poly1305_arm.c +21 -20
  591. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/poly1305/poly1305_vec.c +34 -17
  592. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pool/internal.h +0 -0
  593. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pool/pool.c +1 -2
  594. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/deterministic.c +0 -0
  595. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/forkunsafe.c +0 -0
  596. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/fuchsia.c +0 -0
  597. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/rand_extra.c +0 -0
  598. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/windows.c +0 -0
  599. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rc4/rc4.c +0 -0
  600. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/refcount_c11.c +0 -0
  601. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/refcount_lock.c +0 -0
  602. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rsa_extra/rsa_asn1.c +0 -0
  603. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rsa_extra/rsa_print.c +0 -0
  604. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/siphash/siphash.c +3 -1
  605. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/stack/stack.c +0 -0
  606. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread.c +0 -0
  607. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread_none.c +0 -0
  608. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread_pthread.c +0 -0
  609. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread_win.c +0 -0
  610. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_digest.c +0 -0
  611. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_sign.c +0 -0
  612. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_strex.c +0 -0
  613. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_verify.c +0 -1
  614. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/algorithm.c +0 -0
  615. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/asn1_gen.c +0 -0
  616. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/by_dir.c +1 -1
  617. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/by_file.c +0 -1
  618. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/charmap.h +0 -0
  619. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/i2d_pr.c +0 -0
  620. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/internal.h +0 -0
  621. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/rsa_pss.c +0 -0
  622. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_crl.c +0 -0
  623. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_req.c +0 -0
  624. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_x509.c +0 -0
  625. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_x509a.c +0 -0
  626. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/vpm_int.h +0 -0
  627. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509.c +0 -0
  628. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_att.c +0 -0
  629. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_cmp.c +0 -1
  630. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_d2.c +0 -0
  631. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_def.c +0 -0
  632. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_ext.c +0 -0
  633. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_lu.c +0 -0
  634. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_obj.c +1 -1
  635. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_r2x.c +0 -1
  636. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_req.c +0 -1
  637. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_set.c +0 -0
  638. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_trs.c +1 -2
  639. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_txt.c +0 -0
  640. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_v3.c +0 -0
  641. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_vfy.c +0 -1
  642. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_vpm.c +3 -4
  643. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509cset.c +0 -0
  644. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509name.c +0 -0
  645. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509rset.c +0 -0
  646. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509spki.c +0 -0
  647. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_algor.c +0 -0
  648. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_all.c +0 -1
  649. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_attrib.c +0 -0
  650. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_crl.c +0 -0
  651. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_exten.c +0 -0
  652. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_info.c +0 -0
  653. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_name.c +0 -0
  654. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_pkey.c +0 -0
  655. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_pubkey.c +0 -0
  656. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_req.c +0 -0
  657. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_sig.c +0 -0
  658. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_spki.c +0 -0
  659. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_val.c +0 -0
  660. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_x509.c +0 -0
  661. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_x509a.c +0 -0
  662. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/ext_dat.h +0 -0
  663. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/internal.h +0 -0
  664. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_cache.c +0 -0
  665. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_data.c +0 -0
  666. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_int.h +0 -0
  667. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_lib.c +0 -0
  668. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_map.c +0 -0
  669. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_node.c +0 -0
  670. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_tree.c +0 -0
  671. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_akey.c +0 -0
  672. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_akeya.c +0 -0
  673. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_alt.c +3 -3
  674. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_bcons.c +0 -0
  675. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_bitst.c +0 -0
  676. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_conf.c +0 -0
  677. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_cpols.c +0 -0
  678. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_crld.c +0 -0
  679. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_enum.c +2 -2
  680. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_extku.c +0 -0
  681. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_genn.c +0 -0
  682. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ia5.c +0 -0
  683. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_info.c +4 -5
  684. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_int.c +0 -0
  685. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_lib.c +0 -0
  686. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ncons.c +0 -0
  687. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ocsp.c +0 -0
  688. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pci.c +0 -0
  689. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pcia.c +0 -0
  690. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pcons.c +0 -0
  691. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pku.c +0 -0
  692. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pmaps.c +0 -0
  693. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_prn.c +0 -0
  694. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_purp.c +2 -3
  695. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_skey.c +0 -0
  696. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_sxnet.c +0 -0
  697. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_utl.c +11 -12
  698. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/aead.h +0 -0
  699. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/aes.h +0 -0
  700. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/arm_arch.h +0 -0
  701. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1.h +0 -0
  702. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1_mac.h +0 -0
  703. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1t.h +0 -0
  704. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/base.h +0 -0
  705. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/base64.h +0 -0
  706. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/bio.h +0 -0
  707. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/blowfish.h +0 -0
  708. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/bn.h +32 -20
  709. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/buf.h +9 -9
  710. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/buffer.h +0 -0
  711. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/bytestring.h +34 -0
  712. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cast.h +0 -0
  713. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/chacha.h +0 -0
  714. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cipher.h +0 -0
  715. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cmac.h +0 -0
  716. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/conf.h +0 -0
  717. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cpu.h +0 -0
  718. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/crypto.h +0 -0
  719. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/curve25519.h +0 -0
  720. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/des.h +0 -0
  721. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/dh.h +0 -0
  722. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/digest.h +0 -0
  723. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/dsa.h +0 -0
  724. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/dtls1.h +0 -0
  725. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/e_os2.h +0 -0
  726. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ec.h +11 -4
  727. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ec_key.h +4 -2
  728. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ecdh.h +0 -0
  729. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ecdsa.h +0 -0
  730. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/engine.h +0 -0
  731. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/err.h +11 -9
  732. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/evp.h +20 -0
  733. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ex_data.h +0 -0
  734. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/hkdf.h +0 -0
  735. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/hmac.h +0 -0
  736. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/hrss.h +0 -0
  737. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/is_boringssl.h +0 -0
  738. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/lhash.h +0 -0
  739. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/md4.h +0 -0
  740. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/md5.h +0 -0
  741. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/mem.h +17 -2
  742. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/nid.h +9 -0
  743. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/obj.h +0 -0
  744. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/obj_mac.h +0 -0
  745. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/objects.h +0 -0
  746. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/opensslconf.h +0 -0
  747. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/opensslv.h +0 -0
  748. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ossl_typ.h +0 -0
  749. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pem.h +0 -0
  750. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pkcs12.h +0 -0
  751. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pkcs7.h +0 -0
  752. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pkcs8.h +0 -0
  753. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/poly1305.h +5 -7
  754. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pool.h +0 -0
  755. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/rand.h +0 -0
  756. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/rc4.h +0 -0
  757. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ripemd.h +0 -0
  758. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/rsa.h +0 -0
  759. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/safestack.h +0 -0
  760. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/sha.h +0 -0
  761. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/siphash.h +0 -0
  762. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/span.h +0 -0
  763. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/srtp.h +0 -0
  764. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ssl.h +10 -20
  765. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ssl3.h +0 -0
  766. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/stack.h +0 -0
  767. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/thread.h +0 -0
  768. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/tls1.h +0 -3
  769. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/type_check.h +0 -0
  770. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/x509.h +0 -0
  771. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/x509_vfy.h +0 -0
  772. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/x509v3.h +0 -0
  773. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/bio_ssl.cc +0 -0
  774. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/d1_both.cc +0 -1
  775. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/d1_lib.cc +0 -0
  776. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/d1_pkt.cc +0 -1
  777. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/d1_srtp.cc +0 -0
  778. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/dtls_method.cc +0 -1
  779. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/dtls_record.cc +0 -0
  780. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/handoff.cc +126 -29
  781. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/handshake.cc +5 -4
  782. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/handshake_client.cc +24 -13
  783. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/handshake_server.cc +1 -5
  784. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/internal.h +32 -26
  785. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/s3_both.cc +0 -0
  786. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/s3_lib.cc +2 -3
  787. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/s3_pkt.cc +0 -1
  788. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_aead_ctx.cc +0 -0
  789. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_asn1.cc +1 -2
  790. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_buffer.cc +34 -15
  791. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_cert.cc +0 -1
  792. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_cipher.cc +0 -1
  793. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_file.cc +0 -0
  794. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_key_share.cc +0 -0
  795. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_lib.cc +13 -14
  796. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_privkey.cc +0 -0
  797. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_session.cc +2 -1
  798. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_stat.cc +0 -0
  799. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_transcript.cc +0 -0
  800. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_versions.cc +1 -1
  801. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_x509.cc +0 -0
  802. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/t1_enc.cc +0 -0
  803. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/t1_lib.cc +11 -171
  804. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls13_both.cc +0 -0
  805. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls13_client.cc +3 -4
  806. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls13_enc.cc +5 -1
  807. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls13_server.cc +78 -101
  808. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls_method.cc +1 -1
  809. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/tls_record.cc +7 -2
  810. data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/curve25519.c +0 -0
  811. data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/curve25519_32.h +0 -0
  812. data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/curve25519_64.h +0 -0
  813. data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/curve25519_tables.h +0 -0
  814. data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/internal.h +0 -0
  815. data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/p256.c +0 -0
  816. data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/p256_32.h +0 -0
  817. data/third_party/{boringssl → boringssl-with-bazel/src}/third_party/fiat/p256_64.h +0 -0
  818. data/third_party/upb/upb/decode.c +4 -0
  819. data/third_party/upb/upb/port.c +0 -1
  820. data/third_party/upb/upb/port_def.inc +1 -3
  821. data/third_party/upb/upb/table.c +2 -1
  822. metadata +680 -505
  823. data/src/core/lib/iomgr/logical_thread.cc +0 -103
  824. data/src/core/lib/iomgr/logical_thread.h +0 -52
  825. data/src/core/lib/json/json.cc +0 -94
  826. data/src/core/lib/json/json_reader.h +0 -146
  827. data/src/core/lib/json/json_string.cc +0 -367
  828. data/src/core/lib/json/json_writer.h +0 -84
  829. data/third_party/boringssl/crypto/fipsmodule/aes/aes.c +0 -860
@@ -31,10 +31,22 @@
31
31
  #include "src/core/lib/iomgr/socket_factory_posix.h"
32
32
  #include "src/core/lib/iomgr/socket_mutator.h"
33
33
 
34
+ #ifdef GRPC_LINUX_ERRQUEUE
35
+ #ifndef SO_ZEROCOPY
36
+ #define SO_ZEROCOPY 60
37
+ #endif
38
+ #ifndef SO_EE_ORIGIN_ZEROCOPY
39
+ #define SO_EE_ORIGIN_ZEROCOPY 5
40
+ #endif
41
+ #endif /* ifdef GRPC_LINUX_ERRQUEUE */
42
+
34
43
  /* a wrapper for accept or accept4 */
35
44
  int grpc_accept4(int sockfd, grpc_resolved_address* resolved_addr, int nonblock,
36
45
  int cloexec);
37
46
 
47
+ /* set a socket to use zerocopy */
48
+ grpc_error* grpc_set_socket_zerocopy(int fd);
49
+
38
50
  /* set a socket to non blocking mode */
39
51
  grpc_error* grpc_set_socket_nonblocking(int fd, int non_blocking);
40
52
 
@@ -247,13 +247,10 @@ finish:
247
247
  grpc_error* grpc_tcp_client_prepare_fd(const grpc_channel_args* channel_args,
248
248
  const grpc_resolved_address* addr,
249
249
  grpc_resolved_address* mapped_addr,
250
- grpc_fd** fdobj) {
250
+ int* fd) {
251
251
  grpc_dualstack_mode dsmode;
252
- int fd;
253
252
  grpc_error* error;
254
- char* name;
255
- char* addr_str;
256
- *fdobj = nullptr;
253
+ *fd = -1;
257
254
  /* Use dualstack sockets where available. Set mapped to v6 or v4 mapped to
258
255
  v6. */
259
256
  if (!grpc_sockaddr_to_v4mapped(addr, mapped_addr)) {
@@ -261,7 +258,7 @@ grpc_error* grpc_tcp_client_prepare_fd(const grpc_channel_args* channel_args,
261
258
  memcpy(mapped_addr, addr, sizeof(*mapped_addr));
262
259
  }
263
260
  error =
264
- grpc_create_dualstack_socket(mapped_addr, SOCK_STREAM, 0, &dsmode, &fd);
261
+ grpc_create_dualstack_socket(mapped_addr, SOCK_STREAM, 0, &dsmode, fd);
265
262
  if (error != GRPC_ERROR_NONE) {
266
263
  return error;
267
264
  }
@@ -271,29 +268,32 @@ grpc_error* grpc_tcp_client_prepare_fd(const grpc_channel_args* channel_args,
271
268
  memcpy(mapped_addr, addr, sizeof(*mapped_addr));
272
269
  }
273
270
  }
274
- if ((error = prepare_socket(mapped_addr, fd, channel_args)) !=
271
+ if ((error = prepare_socket(mapped_addr, *fd, channel_args)) !=
275
272
  GRPC_ERROR_NONE) {
276
273
  return error;
277
274
  }
278
- addr_str = grpc_sockaddr_to_uri(mapped_addr);
279
- gpr_asprintf(&name, "tcp-client:%s", addr_str);
280
- *fdobj = grpc_fd_create(fd, name, true);
281
- gpr_free(name);
282
- gpr_free(addr_str);
283
275
  return GRPC_ERROR_NONE;
284
276
  }
285
277
 
286
278
  void grpc_tcp_client_create_from_prepared_fd(
287
- grpc_pollset_set* interested_parties, grpc_closure* closure, grpc_fd* fdobj,
279
+ grpc_pollset_set* interested_parties, grpc_closure* closure, const int fd,
288
280
  const grpc_channel_args* channel_args, const grpc_resolved_address* addr,
289
281
  grpc_millis deadline, grpc_endpoint** ep) {
290
- const int fd = grpc_fd_wrapped_fd(fdobj);
291
282
  int err;
292
283
  async_connect* ac;
293
284
  do {
294
285
  err = connect(fd, reinterpret_cast<const grpc_sockaddr*>(addr->addr),
295
286
  addr->len);
296
287
  } while (err < 0 && errno == EINTR);
288
+
289
+ char* name;
290
+ char* addr_str;
291
+ addr_str = grpc_sockaddr_to_uri(addr);
292
+ gpr_asprintf(&name, "tcp-client:%s", addr_str);
293
+ grpc_fd* fdobj = grpc_fd_create(fd, name, true);
294
+ gpr_free(name);
295
+ gpr_free(addr_str);
296
+
297
297
  if (err >= 0) {
298
298
  char* addr_str = grpc_sockaddr_to_uri(addr);
299
299
  *ep = grpc_tcp_client_create_from_fd(fdobj, channel_args, addr_str);
@@ -340,15 +340,15 @@ static void tcp_connect(grpc_closure* closure, grpc_endpoint** ep,
340
340
  const grpc_resolved_address* addr,
341
341
  grpc_millis deadline) {
342
342
  grpc_resolved_address mapped_addr;
343
- grpc_fd* fdobj = nullptr;
343
+ int fd = -1;
344
344
  grpc_error* error;
345
345
  *ep = nullptr;
346
346
  if ((error = grpc_tcp_client_prepare_fd(channel_args, addr, &mapped_addr,
347
- &fdobj)) != GRPC_ERROR_NONE) {
347
+ &fd)) != GRPC_ERROR_NONE) {
348
348
  grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, error);
349
349
  return;
350
350
  }
351
- grpc_tcp_client_create_from_prepared_fd(interested_parties, closure, fdobj,
351
+ grpc_tcp_client_create_from_prepared_fd(interested_parties, closure, fd,
352
352
  channel_args, &mapped_addr, deadline,
353
353
  ep);
354
354
  }
@@ -35,33 +35,33 @@
35
35
  grpc_endpoint* grpc_tcp_client_create_from_fd(
36
36
  grpc_fd* fd, const grpc_channel_args* channel_args, const char* addr_str);
37
37
 
38
- /* Return a configured, unbound, unconnected TCP client grpc_fd.
38
+ /* Return a configured, unbound, unconnected TCP client fd.
39
39
 
40
40
  channel_args: may contain custom settings for the fd
41
41
  addr: the destination address
42
42
  mapped_addr: out parameter. addr mapped to an address appropriate to the
43
43
  type of socket FD created. For example, if addr is IPv4 and dual stack
44
44
  sockets are available, mapped_addr will be an IPv4-mapped IPv6 address
45
- fdobj: out parameter. The new FD
45
+ fd: out parameter. The new FD
46
46
  Returns: error, if any. Out parameters are not set on error
47
47
  */
48
48
  grpc_error* grpc_tcp_client_prepare_fd(const grpc_channel_args* channel_args,
49
49
  const grpc_resolved_address* addr,
50
50
  grpc_resolved_address* mapped_addr,
51
- grpc_fd** fdobj);
51
+ int* fd);
52
52
 
53
- /* Connect a configured TCP client grpc_fd.
53
+ /* Connect a configured TCP client fd.
54
54
 
55
55
  interested_parties: a set of pollsets that would be interested in this
56
56
  connection being established (in order to continue their work
57
57
  closure: called when complete. On success, *ep will be set.
58
- fdobj: an FD returned from grpc_tcp_client_prepare_fd(). Ownership is taken
58
+ fd: an FD returned from grpc_tcp_client_prepare_fd().
59
59
  channel_args: may contain custom settings for the endpoint
60
60
  deadline: connection deadline
61
61
  ep: out parameter. Set before closure is called if successful
62
62
  */
63
63
  void grpc_tcp_client_create_from_prepared_fd(
64
- grpc_pollset_set* interested_parties, grpc_closure* closure, grpc_fd* fdobj,
64
+ grpc_pollset_set* interested_parties, grpc_closure* closure, const int fd,
65
65
  const grpc_channel_args* channel_args, const grpc_resolved_address* addr,
66
66
  grpc_millis deadline, grpc_endpoint** ep);
67
67
 
@@ -24,6 +24,9 @@
24
24
  #include "src/core/lib/iomgr/endpoint.h"
25
25
  #include "src/core/lib/iomgr/sockaddr.h"
26
26
 
27
+ // Same number as the micro of SO_REUSEPORT in kernel
28
+ #define GRPC_CUSTOM_SOCKET_OPT_SO_REUSEPORT (0x00000200u)
29
+
27
30
  typedef struct grpc_tcp_listener grpc_tcp_listener;
28
31
  typedef struct grpc_custom_tcp_connect grpc_custom_tcp_connect;
29
32
 
@@ -36,6 +36,7 @@
36
36
  #include <sys/types.h>
37
37
  #include <unistd.h>
38
38
  #include <algorithm>
39
+ #include <unordered_map>
39
40
 
40
41
  #include <grpc/slice.h>
41
42
  #include <grpc/support/alloc.h>
@@ -49,9 +50,11 @@
49
50
  #include "src/core/lib/debug/trace.h"
50
51
  #include "src/core/lib/gpr/string.h"
51
52
  #include "src/core/lib/gpr/useful.h"
53
+ #include "src/core/lib/gprpp/sync.h"
52
54
  #include "src/core/lib/iomgr/buffer_list.h"
53
55
  #include "src/core/lib/iomgr/ev_posix.h"
54
56
  #include "src/core/lib/iomgr/executor.h"
57
+ #include "src/core/lib/iomgr/socket_utils_posix.h"
55
58
  #include "src/core/lib/profiling/timers.h"
56
59
  #include "src/core/lib/slice/slice_internal.h"
57
60
  #include "src/core/lib/slice/slice_string_helpers.h"
@@ -71,6 +74,15 @@
71
74
  #define SENDMSG_FLAGS 0
72
75
  #endif
73
76
 
77
+ // TCP zero copy sendmsg flag.
78
+ // NB: We define this here as a fallback in case we're using an older set of
79
+ // library headers that has not defined MSG_ZEROCOPY. Since this constant is
80
+ // part of the kernel, we are guaranteed it will never change/disagree so
81
+ // defining it here is safe.
82
+ #ifndef MSG_ZEROCOPY
83
+ #define MSG_ZEROCOPY 0x4000000
84
+ #endif
85
+
74
86
  #ifdef GRPC_MSG_IOVLEN_TYPE
75
87
  typedef GRPC_MSG_IOVLEN_TYPE msg_iovlen_type;
76
88
  #else
@@ -79,6 +91,264 @@ typedef size_t msg_iovlen_type;
79
91
 
80
92
  extern grpc_core::TraceFlag grpc_tcp_trace;
81
93
 
94
+ namespace grpc_core {
95
+
96
+ class TcpZerocopySendRecord {
97
+ public:
98
+ TcpZerocopySendRecord() { grpc_slice_buffer_init(&buf_); }
99
+
100
+ ~TcpZerocopySendRecord() {
101
+ AssertEmpty();
102
+ grpc_slice_buffer_destroy_internal(&buf_);
103
+ }
104
+
105
+ // Given the slices that we wish to send, and the current offset into the
106
+ // slice buffer (indicating which have already been sent), populate an iovec
107
+ // array that will be used for a zerocopy enabled sendmsg().
108
+ msg_iovlen_type PopulateIovs(size_t* unwind_slice_idx,
109
+ size_t* unwind_byte_idx, size_t* sending_length,
110
+ iovec* iov);
111
+
112
+ // A sendmsg() may not be able to send the bytes that we requested at this
113
+ // time, returning EAGAIN (possibly due to backpressure). In this case,
114
+ // unwind the offset into the slice buffer so we retry sending these bytes.
115
+ void UnwindIfThrottled(size_t unwind_slice_idx, size_t unwind_byte_idx) {
116
+ out_offset_.byte_idx = unwind_byte_idx;
117
+ out_offset_.slice_idx = unwind_slice_idx;
118
+ }
119
+
120
+ // Update the offset into the slice buffer based on how much we wanted to sent
121
+ // vs. what sendmsg() actually sent (which may be lower, possibly due to
122
+ // backpressure).
123
+ void UpdateOffsetForBytesSent(size_t sending_length, size_t actually_sent);
124
+
125
+ // Indicates whether all underlying data has been sent or not.
126
+ bool AllSlicesSent() { return out_offset_.slice_idx == buf_.count; }
127
+
128
+ // Reset this structure for a new tcp_write() with zerocopy.
129
+ void PrepareForSends(grpc_slice_buffer* slices_to_send) {
130
+ AssertEmpty();
131
+ out_offset_.slice_idx = 0;
132
+ out_offset_.byte_idx = 0;
133
+ grpc_slice_buffer_swap(slices_to_send, &buf_);
134
+ Ref();
135
+ }
136
+
137
+ // References: 1 reference per sendmsg(), and 1 for the tcp_write().
138
+ void Ref() { ref_.FetchAdd(1, MemoryOrder::RELAXED); }
139
+
140
+ // Unref: called when we get an error queue notification for a sendmsg(), if a
141
+ // sendmsg() failed or when tcp_write() is done.
142
+ bool Unref() {
143
+ const intptr_t prior = ref_.FetchSub(1, MemoryOrder::ACQ_REL);
144
+ GPR_DEBUG_ASSERT(prior > 0);
145
+ if (prior == 1) {
146
+ AllSendsComplete();
147
+ return true;
148
+ }
149
+ return false;
150
+ }
151
+
152
+ private:
153
+ struct OutgoingOffset {
154
+ size_t slice_idx = 0;
155
+ size_t byte_idx = 0;
156
+ };
157
+
158
+ void AssertEmpty() {
159
+ GPR_DEBUG_ASSERT(buf_.count == 0);
160
+ GPR_DEBUG_ASSERT(buf_.length == 0);
161
+ GPR_DEBUG_ASSERT(ref_.Load(MemoryOrder::RELAXED) == 0);
162
+ }
163
+
164
+ // When all sendmsg() calls associated with this tcp_write() have been
165
+ // completed (ie. we have received the notifications for each sequence number
166
+ // for each sendmsg()) and all reference counts have been dropped, drop our
167
+ // reference to the underlying data since we no longer need it.
168
+ void AllSendsComplete() {
169
+ GPR_DEBUG_ASSERT(ref_.Load(MemoryOrder::RELAXED) == 0);
170
+ grpc_slice_buffer_reset_and_unref_internal(&buf_);
171
+ }
172
+
173
+ grpc_slice_buffer buf_;
174
+ Atomic<intptr_t> ref_;
175
+ OutgoingOffset out_offset_;
176
+ };
177
+
178
+ class TcpZerocopySendCtx {
179
+ public:
180
+ static constexpr int kDefaultMaxSends = 4;
181
+ static constexpr size_t kDefaultSendBytesThreshold = 16 * 1024; // 16KB
182
+
183
+ TcpZerocopySendCtx(int max_sends = kDefaultMaxSends,
184
+ size_t send_bytes_threshold = kDefaultSendBytesThreshold)
185
+ : max_sends_(max_sends),
186
+ free_send_records_size_(max_sends),
187
+ threshold_bytes_(send_bytes_threshold) {
188
+ send_records_ = static_cast<TcpZerocopySendRecord*>(
189
+ gpr_malloc(max_sends * sizeof(*send_records_)));
190
+ free_send_records_ = static_cast<TcpZerocopySendRecord**>(
191
+ gpr_malloc(max_sends * sizeof(*free_send_records_)));
192
+ if (send_records_ == nullptr || free_send_records_ == nullptr) {
193
+ gpr_free(send_records_);
194
+ gpr_free(free_send_records_);
195
+ gpr_log(GPR_INFO, "Disabling TCP TX zerocopy due to memory pressure.\n");
196
+ memory_limited_ = true;
197
+ } else {
198
+ for (int idx = 0; idx < max_sends_; ++idx) {
199
+ new (send_records_ + idx) TcpZerocopySendRecord();
200
+ free_send_records_[idx] = send_records_ + idx;
201
+ }
202
+ }
203
+ }
204
+
205
+ ~TcpZerocopySendCtx() {
206
+ if (send_records_ != nullptr) {
207
+ for (int idx = 0; idx < max_sends_; ++idx) {
208
+ send_records_[idx].~TcpZerocopySendRecord();
209
+ }
210
+ }
211
+ gpr_free(send_records_);
212
+ gpr_free(free_send_records_);
213
+ }
214
+
215
+ // True if we were unable to allocate the various bookkeeping structures at
216
+ // transport initialization time. If memory limited, we do not zerocopy.
217
+ bool memory_limited() const { return memory_limited_; }
218
+
219
+ // TCP send zerocopy maintains an implicit sequence number for every
220
+ // successful sendmsg() with zerocopy enabled; the kernel later gives us an
221
+ // error queue notification with this sequence number indicating that the
222
+ // underlying data buffers that we sent can now be released. Once that
223
+ // notification is received, we can release the buffers associated with this
224
+ // zerocopy send record. Here, we associate the sequence number with the data
225
+ // buffers that were sent with the corresponding call to sendmsg().
226
+ void NoteSend(TcpZerocopySendRecord* record) {
227
+ record->Ref();
228
+ AssociateSeqWithSendRecord(last_send_, record);
229
+ ++last_send_;
230
+ }
231
+
232
+ // If sendmsg() actually failed, though, we need to revert the sequence number
233
+ // that we speculatively bumped before calling sendmsg(). Note that we bump
234
+ // this sequence number and perform relevant bookkeeping (see: NoteSend())
235
+ // *before* calling sendmsg() since, if we called it *after* sendmsg(), then
236
+ // there is a possible race with the release notification which could occur on
237
+ // another thread before we do the necessary bookkeeping. Hence, calling
238
+ // NoteSend() *before* sendmsg() and implementing an undo function is needed.
239
+ void UndoSend() {
240
+ --last_send_;
241
+ if (ReleaseSendRecord(last_send_)->Unref()) {
242
+ // We should still be holding the ref taken by tcp_write().
243
+ GPR_DEBUG_ASSERT(0);
244
+ }
245
+ }
246
+
247
+ // Simply associate this send record (and the underlying sent data buffers)
248
+ // with the implicit sequence number for this zerocopy sendmsg().
249
+ void AssociateSeqWithSendRecord(uint32_t seq, TcpZerocopySendRecord* record) {
250
+ MutexLock guard(&lock_);
251
+ ctx_lookup_.emplace(seq, record);
252
+ }
253
+
254
+ // Get a send record for a send that we wish to do with zerocopy.
255
+ TcpZerocopySendRecord* GetSendRecord() {
256
+ MutexLock guard(&lock_);
257
+ return TryGetSendRecordLocked();
258
+ }
259
+
260
+ // A given send record corresponds to a single tcp_write() with zerocopy
261
+ // enabled. This can result in several sendmsg() calls to flush all of the
262
+ // data to wire. Each sendmsg() takes a reference on the
263
+ // TcpZerocopySendRecord, and corresponds to a single sequence number.
264
+ // ReleaseSendRecord releases a reference on TcpZerocopySendRecord for a
265
+ // single sequence number. This is called either when we receive the relevant
266
+ // error queue notification (saying that we can discard the underlying
267
+ // buffers for this sendmsg()) is received from the kernel - or, in case
268
+ // sendmsg() was unsuccessful to begin with.
269
+ TcpZerocopySendRecord* ReleaseSendRecord(uint32_t seq) {
270
+ MutexLock guard(&lock_);
271
+ return ReleaseSendRecordLocked(seq);
272
+ }
273
+
274
+ // After all the references to a TcpZerocopySendRecord are released, we can
275
+ // add it back to the pool (of size max_sends_). Note that we can only have
276
+ // max_sends_ tcp_write() instances with zerocopy enabled in flight at the
277
+ // same time.
278
+ void PutSendRecord(TcpZerocopySendRecord* record) {
279
+ GPR_DEBUG_ASSERT(record >= send_records_ &&
280
+ record < send_records_ + max_sends_);
281
+ MutexLock guard(&lock_);
282
+ PutSendRecordLocked(record);
283
+ }
284
+
285
+ // Indicate that we are disposing of this zerocopy context. This indicator
286
+ // will prevent new zerocopy writes from being issued.
287
+ void Shutdown() { shutdown_.Store(true, MemoryOrder::RELEASE); }
288
+
289
+ // Indicates that there are no inflight tcp_write() instances with zerocopy
290
+ // enabled.
291
+ bool AllSendRecordsEmpty() {
292
+ MutexLock guard(&lock_);
293
+ return free_send_records_size_ == max_sends_;
294
+ }
295
+
296
+ bool enabled() const { return enabled_; }
297
+
298
+ void set_enabled(bool enabled) {
299
+ GPR_DEBUG_ASSERT(!enabled || !memory_limited());
300
+ enabled_ = enabled;
301
+ }
302
+
303
+ // Only use zerocopy if we are sending at least this many bytes. The
304
+ // additional overhead of reading the error queue for notifications means that
305
+ // zerocopy is not useful for small transfers.
306
+ size_t threshold_bytes() const { return threshold_bytes_; }
307
+
308
+ private:
309
+ TcpZerocopySendRecord* ReleaseSendRecordLocked(uint32_t seq) {
310
+ auto iter = ctx_lookup_.find(seq);
311
+ GPR_DEBUG_ASSERT(iter != ctx_lookup_.end());
312
+ TcpZerocopySendRecord* record = iter->second;
313
+ ctx_lookup_.erase(iter);
314
+ return record;
315
+ }
316
+
317
+ TcpZerocopySendRecord* TryGetSendRecordLocked() {
318
+ if (shutdown_.Load(MemoryOrder::ACQUIRE)) {
319
+ return nullptr;
320
+ }
321
+ if (free_send_records_size_ == 0) {
322
+ return nullptr;
323
+ }
324
+ free_send_records_size_--;
325
+ return free_send_records_[free_send_records_size_];
326
+ }
327
+
328
+ void PutSendRecordLocked(TcpZerocopySendRecord* record) {
329
+ GPR_DEBUG_ASSERT(free_send_records_size_ < max_sends_);
330
+ free_send_records_[free_send_records_size_] = record;
331
+ free_send_records_size_++;
332
+ }
333
+
334
+ TcpZerocopySendRecord* send_records_;
335
+ TcpZerocopySendRecord** free_send_records_;
336
+ int max_sends_;
337
+ int free_send_records_size_;
338
+ Mutex lock_;
339
+ uint32_t last_send_ = 0;
340
+ Atomic<bool> shutdown_;
341
+ bool enabled_ = false;
342
+ size_t threshold_bytes_ = kDefaultSendBytesThreshold;
343
+ std::unordered_map<uint32_t, TcpZerocopySendRecord*> ctx_lookup_;
344
+ bool memory_limited_ = false;
345
+ };
346
+
347
+ } // namespace grpc_core
348
+
349
+ using grpc_core::TcpZerocopySendCtx;
350
+ using grpc_core::TcpZerocopySendRecord;
351
+
82
352
  namespace {
83
353
  struct grpc_tcp {
84
354
  grpc_endpoint base;
@@ -142,6 +412,8 @@ struct grpc_tcp {
142
412
  bool ts_capable; /* Cache whether we can set timestamping options */
143
413
  gpr_atm stop_error_notification; /* Set to 1 if we do not want to be notified
144
414
  on errors anymore */
415
+ TcpZerocopySendCtx tcp_zerocopy_send_ctx;
416
+ TcpZerocopySendRecord* current_zerocopy_send = nullptr;
145
417
  };
146
418
 
147
419
  struct backup_poller {
@@ -151,6 +423,8 @@ struct backup_poller {
151
423
 
152
424
  } // namespace
153
425
 
426
+ static void ZerocopyDisableAndWaitForRemaining(grpc_tcp* tcp);
427
+
154
428
  #define BACKUP_POLLER_POLLSET(b) ((grpc_pollset*)((b) + 1))
155
429
 
156
430
  static gpr_atm g_uncovered_notifications_pending;
@@ -339,6 +613,7 @@ static void tcp_handle_write(void* arg /* grpc_tcp */, grpc_error* error);
339
613
 
340
614
  static void tcp_shutdown(grpc_endpoint* ep, grpc_error* why) {
341
615
  grpc_tcp* tcp = reinterpret_cast<grpc_tcp*>(ep);
616
+ ZerocopyDisableAndWaitForRemaining(tcp);
342
617
  grpc_fd_shutdown(tcp->em_fd, why);
343
618
  grpc_resource_user_shutdown(tcp->resource_user);
344
619
  }
@@ -357,6 +632,7 @@ static void tcp_free(grpc_tcp* tcp) {
357
632
  gpr_mu_unlock(&tcp->tb_mu);
358
633
  tcp->outgoing_buffer_arg = nullptr;
359
634
  gpr_mu_destroy(&tcp->tb_mu);
635
+ tcp->tcp_zerocopy_send_ctx.~TcpZerocopySendCtx();
360
636
  gpr_free(tcp);
361
637
  }
362
638
 
@@ -390,6 +666,7 @@ static void tcp_destroy(grpc_endpoint* ep) {
390
666
  grpc_tcp* tcp = reinterpret_cast<grpc_tcp*>(ep);
391
667
  grpc_slice_buffer_reset_and_unref_internal(&tcp->last_read_buffer);
392
668
  if (grpc_event_engine_can_track_errors()) {
669
+ ZerocopyDisableAndWaitForRemaining(tcp);
393
670
  gpr_atm_no_barrier_store(&tcp->stop_error_notification, true);
394
671
  grpc_fd_set_error(tcp->em_fd);
395
672
  }
@@ -652,13 +929,13 @@ static void tcp_read(grpc_endpoint* ep, grpc_slice_buffer* incoming_buffer,
652
929
 
653
930
  /* A wrapper around sendmsg. It sends \a msg over \a fd and returns the number
654
931
  * of bytes sent. */
655
- ssize_t tcp_send(int fd, const struct msghdr* msg) {
932
+ ssize_t tcp_send(int fd, const struct msghdr* msg, int additional_flags = 0) {
656
933
  GPR_TIMER_SCOPE("sendmsg", 1);
657
934
  ssize_t sent_length;
658
935
  do {
659
936
  /* TODO(klempner): Cork if this is a partial write */
660
937
  GRPC_STATS_INC_SYSCALL_WRITE();
661
- sent_length = sendmsg(fd, msg, SENDMSG_FLAGS);
938
+ sent_length = sendmsg(fd, msg, SENDMSG_FLAGS | additional_flags);
662
939
  } while (sent_length < 0 && errno == EINTR);
663
940
  return sent_length;
664
941
  }
@@ -671,16 +948,52 @@ ssize_t tcp_send(int fd, const struct msghdr* msg) {
671
948
  */
672
949
  static bool tcp_write_with_timestamps(grpc_tcp* tcp, struct msghdr* msg,
673
950
  size_t sending_length,
674
- ssize_t* sent_length);
951
+ ssize_t* sent_length,
952
+ int additional_flags = 0);
675
953
 
676
954
  /** The callback function to be invoked when we get an error on the socket. */
677
955
  static void tcp_handle_error(void* arg /* grpc_tcp */, grpc_error* error);
678
956
 
957
+ static TcpZerocopySendRecord* tcp_get_send_zerocopy_record(
958
+ grpc_tcp* tcp, grpc_slice_buffer* buf);
959
+
679
960
  #ifdef GRPC_LINUX_ERRQUEUE
961
+ static bool process_errors(grpc_tcp* tcp);
962
+
963
+ static TcpZerocopySendRecord* tcp_get_send_zerocopy_record(
964
+ grpc_tcp* tcp, grpc_slice_buffer* buf) {
965
+ TcpZerocopySendRecord* zerocopy_send_record = nullptr;
966
+ const bool use_zerocopy =
967
+ tcp->tcp_zerocopy_send_ctx.enabled() &&
968
+ tcp->tcp_zerocopy_send_ctx.threshold_bytes() < buf->length;
969
+ if (use_zerocopy) {
970
+ zerocopy_send_record = tcp->tcp_zerocopy_send_ctx.GetSendRecord();
971
+ if (zerocopy_send_record == nullptr) {
972
+ process_errors(tcp);
973
+ zerocopy_send_record = tcp->tcp_zerocopy_send_ctx.GetSendRecord();
974
+ }
975
+ if (zerocopy_send_record != nullptr) {
976
+ zerocopy_send_record->PrepareForSends(buf);
977
+ GPR_DEBUG_ASSERT(buf->count == 0);
978
+ GPR_DEBUG_ASSERT(buf->length == 0);
979
+ tcp->outgoing_byte_idx = 0;
980
+ tcp->outgoing_buffer = nullptr;
981
+ }
982
+ }
983
+ return zerocopy_send_record;
984
+ }
985
+
986
+ static void ZerocopyDisableAndWaitForRemaining(grpc_tcp* tcp) {
987
+ tcp->tcp_zerocopy_send_ctx.Shutdown();
988
+ while (!tcp->tcp_zerocopy_send_ctx.AllSendRecordsEmpty()) {
989
+ process_errors(tcp);
990
+ }
991
+ }
680
992
 
681
993
  static bool tcp_write_with_timestamps(grpc_tcp* tcp, struct msghdr* msg,
682
994
  size_t sending_length,
683
- ssize_t* sent_length) {
995
+ ssize_t* sent_length,
996
+ int additional_flags) {
684
997
  if (!tcp->socket_ts_enabled) {
685
998
  uint32_t opt = grpc_core::kTimestampingSocketOptions;
686
999
  if (setsockopt(tcp->fd, SOL_SOCKET, SO_TIMESTAMPING,
@@ -708,7 +1021,7 @@ static bool tcp_write_with_timestamps(grpc_tcp* tcp, struct msghdr* msg,
708
1021
  msg->msg_controllen = CMSG_SPACE(sizeof(uint32_t));
709
1022
 
710
1023
  /* If there was an error on sendmsg the logic in tcp_flush will handle it. */
711
- ssize_t length = tcp_send(tcp->fd, msg);
1024
+ ssize_t length = tcp_send(tcp->fd, msg, additional_flags);
712
1025
  *sent_length = length;
713
1026
  /* Only save timestamps if all the bytes were taken by sendmsg. */
714
1027
  if (sending_length == static_cast<size_t>(length)) {
@@ -722,6 +1035,43 @@ static bool tcp_write_with_timestamps(grpc_tcp* tcp, struct msghdr* msg,
722
1035
  return true;
723
1036
  }
724
1037
 
1038
+ static void UnrefMaybePutZerocopySendRecord(grpc_tcp* tcp,
1039
+ TcpZerocopySendRecord* record,
1040
+ uint32_t seq, const char* tag);
1041
+ // Reads \a cmsg to process zerocopy control messages.
1042
+ static void process_zerocopy(grpc_tcp* tcp, struct cmsghdr* cmsg) {
1043
+ GPR_DEBUG_ASSERT(cmsg);
1044
+ auto serr = reinterpret_cast<struct sock_extended_err*>(CMSG_DATA(cmsg));
1045
+ GPR_DEBUG_ASSERT(serr->ee_errno == 0);
1046
+ GPR_DEBUG_ASSERT(serr->ee_origin == SO_EE_ORIGIN_ZEROCOPY);
1047
+ const uint32_t lo = serr->ee_info;
1048
+ const uint32_t hi = serr->ee_data;
1049
+ for (uint32_t seq = lo; seq <= hi; ++seq) {
1050
+ // TODO(arjunroy): It's likely that lo and hi refer to zerocopy sequence
1051
+ // numbers that are generated by a single call to grpc_endpoint_write; ie.
1052
+ // we can batch the unref operation. So, check if record is the same for
1053
+ // both; if so, batch the unref/put.
1054
+ TcpZerocopySendRecord* record =
1055
+ tcp->tcp_zerocopy_send_ctx.ReleaseSendRecord(seq);
1056
+ GPR_DEBUG_ASSERT(record);
1057
+ UnrefMaybePutZerocopySendRecord(tcp, record, seq, "CALLBACK RCVD");
1058
+ }
1059
+ }
1060
+
1061
+ // Whether the cmsg received from error queue is of the IPv4 or IPv6 levels.
1062
+ static bool CmsgIsIpLevel(const cmsghdr& cmsg) {
1063
+ return (cmsg.cmsg_level == SOL_IPV6 && cmsg.cmsg_type == IPV6_RECVERR) ||
1064
+ (cmsg.cmsg_level == SOL_IP && cmsg.cmsg_type == IP_RECVERR);
1065
+ }
1066
+
1067
+ static bool CmsgIsZeroCopy(const cmsghdr& cmsg) {
1068
+ if (!CmsgIsIpLevel(cmsg)) {
1069
+ return false;
1070
+ }
1071
+ auto serr = reinterpret_cast<const sock_extended_err*> CMSG_DATA(&cmsg);
1072
+ return serr->ee_errno == 0 && serr->ee_origin == SO_EE_ORIGIN_ZEROCOPY;
1073
+ }
1074
+
725
1075
  /** Reads \a cmsg to derive timestamps from the control messages. If a valid
726
1076
  * timestamp is found, the traced buffer list is updated with this timestamp.
727
1077
  * The caller of this function should be looping on the control messages found
@@ -783,73 +1133,76 @@ struct cmsghdr* process_timestamp(grpc_tcp* tcp, msghdr* msg,
783
1133
  /** For linux platforms, reads the socket's error queue and processes error
784
1134
  * messages from the queue.
785
1135
  */
786
- static void process_errors(grpc_tcp* tcp) {
1136
+ static bool process_errors(grpc_tcp* tcp) {
1137
+ bool processed_err = false;
1138
+ struct iovec iov;
1139
+ iov.iov_base = nullptr;
1140
+ iov.iov_len = 0;
1141
+ struct msghdr msg;
1142
+ msg.msg_name = nullptr;
1143
+ msg.msg_namelen = 0;
1144
+ msg.msg_iov = &iov;
1145
+ msg.msg_iovlen = 0;
1146
+ msg.msg_flags = 0;
1147
+ /* Allocate enough space so we don't need to keep increasing this as size
1148
+ * of OPT_STATS increase */
1149
+ constexpr size_t cmsg_alloc_space =
1150
+ CMSG_SPACE(sizeof(grpc_core::scm_timestamping)) +
1151
+ CMSG_SPACE(sizeof(sock_extended_err) + sizeof(sockaddr_in)) +
1152
+ CMSG_SPACE(32 * NLA_ALIGN(NLA_HDRLEN + sizeof(uint64_t)));
1153
+ /* Allocate aligned space for cmsgs received along with timestamps */
1154
+ union {
1155
+ char rbuf[cmsg_alloc_space];
1156
+ struct cmsghdr align;
1157
+ } aligned_buf;
1158
+ msg.msg_control = aligned_buf.rbuf;
1159
+ msg.msg_controllen = sizeof(aligned_buf.rbuf);
1160
+ int r, saved_errno;
787
1161
  while (true) {
788
- struct iovec iov;
789
- iov.iov_base = nullptr;
790
- iov.iov_len = 0;
791
- struct msghdr msg;
792
- msg.msg_name = nullptr;
793
- msg.msg_namelen = 0;
794
- msg.msg_iov = &iov;
795
- msg.msg_iovlen = 0;
796
- msg.msg_flags = 0;
797
-
798
- /* Allocate enough space so we don't need to keep increasing this as size
799
- * of OPT_STATS increase */
800
- constexpr size_t cmsg_alloc_space =
801
- CMSG_SPACE(sizeof(grpc_core::scm_timestamping)) +
802
- CMSG_SPACE(sizeof(sock_extended_err) + sizeof(sockaddr_in)) +
803
- CMSG_SPACE(32 * NLA_ALIGN(NLA_HDRLEN + sizeof(uint64_t)));
804
- /* Allocate aligned space for cmsgs received along with timestamps */
805
- union {
806
- char rbuf[cmsg_alloc_space];
807
- struct cmsghdr align;
808
- } aligned_buf;
809
- memset(&aligned_buf, 0, sizeof(aligned_buf));
810
-
811
- msg.msg_control = aligned_buf.rbuf;
812
- msg.msg_controllen = sizeof(aligned_buf.rbuf);
813
-
814
- int r, saved_errno;
815
1162
  do {
816
1163
  r = recvmsg(tcp->fd, &msg, MSG_ERRQUEUE);
817
1164
  saved_errno = errno;
818
1165
  } while (r < 0 && saved_errno == EINTR);
819
1166
 
820
1167
  if (r == -1 && saved_errno == EAGAIN) {
821
- return; /* No more errors to process */
1168
+ return processed_err; /* No more errors to process */
822
1169
  }
823
1170
  if (r == -1) {
824
- return;
1171
+ return processed_err;
825
1172
  }
826
- if ((msg.msg_flags & MSG_CTRUNC) != 0) {
1173
+ if (GPR_UNLIKELY((msg.msg_flags & MSG_CTRUNC) != 0)) {
827
1174
  gpr_log(GPR_ERROR, "Error message was truncated.");
828
1175
  }
829
1176
 
830
1177
  if (msg.msg_controllen == 0) {
831
1178
  /* There was no control message found. It was probably spurious. */
832
- return;
1179
+ return processed_err;
833
1180
  }
834
1181
  bool seen = false;
835
1182
  for (auto cmsg = CMSG_FIRSTHDR(&msg); cmsg && cmsg->cmsg_len;
836
1183
  cmsg = CMSG_NXTHDR(&msg, cmsg)) {
837
- if (cmsg->cmsg_level != SOL_SOCKET ||
838
- cmsg->cmsg_type != SCM_TIMESTAMPING) {
839
- /* Got a control message that is not a timestamp. Don't know how to
840
- * handle this. */
1184
+ if (CmsgIsZeroCopy(*cmsg)) {
1185
+ process_zerocopy(tcp, cmsg);
1186
+ seen = true;
1187
+ processed_err = true;
1188
+ } else if (cmsg->cmsg_level == SOL_SOCKET &&
1189
+ cmsg->cmsg_type == SCM_TIMESTAMPING) {
1190
+ cmsg = process_timestamp(tcp, &msg, cmsg);
1191
+ seen = true;
1192
+ processed_err = true;
1193
+ } else {
1194
+ /* Got a control message that is not a timestamp or zerocopy. Don't know
1195
+ * how to handle this. */
841
1196
  if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
842
1197
  gpr_log(GPR_INFO,
843
1198
  "unknown control message cmsg_level:%d cmsg_type:%d",
844
1199
  cmsg->cmsg_level, cmsg->cmsg_type);
845
1200
  }
846
- return;
1201
+ return processed_err;
847
1202
  }
848
- cmsg = process_timestamp(tcp, &msg, cmsg);
849
- seen = true;
850
1203
  }
851
1204
  if (!seen) {
852
- return;
1205
+ return processed_err;
853
1206
  }
854
1207
  }
855
1208
  }
@@ -870,18 +1223,28 @@ static void tcp_handle_error(void* arg /* grpc_tcp */, grpc_error* error) {
870
1223
 
871
1224
  /* We are still interested in collecting timestamps, so let's try reading
872
1225
  * them. */
873
- process_errors(tcp);
1226
+ bool processed = process_errors(tcp);
874
1227
  /* This might not a timestamps error. Set the read and write closures to be
875
1228
  * ready. */
876
- grpc_fd_set_readable(tcp->em_fd);
877
- grpc_fd_set_writable(tcp->em_fd);
1229
+ if (!processed) {
1230
+ grpc_fd_set_readable(tcp->em_fd);
1231
+ grpc_fd_set_writable(tcp->em_fd);
1232
+ }
878
1233
  grpc_fd_notify_on_error(tcp->em_fd, &tcp->error_closure);
879
1234
  }
880
1235
 
881
1236
  #else /* GRPC_LINUX_ERRQUEUE */
1237
+ static TcpZerocopySendRecord* tcp_get_send_zerocopy_record(
1238
+ grpc_tcp* tcp, grpc_slice_buffer* buf) {
1239
+ return nullptr;
1240
+ }
1241
+
1242
+ static void ZerocopyDisableAndWaitForRemaining(grpc_tcp* tcp) {}
1243
+
882
1244
  static bool tcp_write_with_timestamps(grpc_tcp* /*tcp*/, struct msghdr* /*msg*/,
883
1245
  size_t /*sending_length*/,
884
- ssize_t* /*sent_length*/) {
1246
+ ssize_t* /*sent_length*/,
1247
+ int /*additional_flags*/) {
885
1248
  gpr_log(GPR_ERROR, "Write with timestamps not supported for this platform");
886
1249
  GPR_ASSERT(0);
887
1250
  return false;
@@ -907,12 +1270,139 @@ void tcp_shutdown_buffer_list(grpc_tcp* tcp) {
907
1270
  }
908
1271
  }
909
1272
 
910
- /* returns true if done, false if pending; if returning true, *error is set */
911
1273
  #if defined(IOV_MAX) && IOV_MAX < 1000
912
1274
  #define MAX_WRITE_IOVEC IOV_MAX
913
1275
  #else
914
1276
  #define MAX_WRITE_IOVEC 1000
915
1277
  #endif
1278
+ msg_iovlen_type TcpZerocopySendRecord::PopulateIovs(size_t* unwind_slice_idx,
1279
+ size_t* unwind_byte_idx,
1280
+ size_t* sending_length,
1281
+ iovec* iov) {
1282
+ msg_iovlen_type iov_size;
1283
+ *unwind_slice_idx = out_offset_.slice_idx;
1284
+ *unwind_byte_idx = out_offset_.byte_idx;
1285
+ for (iov_size = 0;
1286
+ out_offset_.slice_idx != buf_.count && iov_size != MAX_WRITE_IOVEC;
1287
+ iov_size++) {
1288
+ iov[iov_size].iov_base =
1289
+ GRPC_SLICE_START_PTR(buf_.slices[out_offset_.slice_idx]) +
1290
+ out_offset_.byte_idx;
1291
+ iov[iov_size].iov_len =
1292
+ GRPC_SLICE_LENGTH(buf_.slices[out_offset_.slice_idx]) -
1293
+ out_offset_.byte_idx;
1294
+ *sending_length += iov[iov_size].iov_len;
1295
+ ++(out_offset_.slice_idx);
1296
+ out_offset_.byte_idx = 0;
1297
+ }
1298
+ GPR_DEBUG_ASSERT(iov_size > 0);
1299
+ return iov_size;
1300
+ }
1301
+
1302
+ void TcpZerocopySendRecord::UpdateOffsetForBytesSent(size_t sending_length,
1303
+ size_t actually_sent) {
1304
+ size_t trailing = sending_length - actually_sent;
1305
+ while (trailing > 0) {
1306
+ size_t slice_length;
1307
+ out_offset_.slice_idx--;
1308
+ slice_length = GRPC_SLICE_LENGTH(buf_.slices[out_offset_.slice_idx]);
1309
+ if (slice_length > trailing) {
1310
+ out_offset_.byte_idx = slice_length - trailing;
1311
+ break;
1312
+ } else {
1313
+ trailing -= slice_length;
1314
+ }
1315
+ }
1316
+ }
1317
+
1318
+ // returns true if done, false if pending; if returning true, *error is set
1319
+ static bool do_tcp_flush_zerocopy(grpc_tcp* tcp, TcpZerocopySendRecord* record,
1320
+ grpc_error** error) {
1321
+ struct msghdr msg;
1322
+ struct iovec iov[MAX_WRITE_IOVEC];
1323
+ msg_iovlen_type iov_size;
1324
+ ssize_t sent_length = 0;
1325
+ size_t sending_length;
1326
+ size_t unwind_slice_idx;
1327
+ size_t unwind_byte_idx;
1328
+ while (true) {
1329
+ sending_length = 0;
1330
+ iov_size = record->PopulateIovs(&unwind_slice_idx, &unwind_byte_idx,
1331
+ &sending_length, iov);
1332
+ msg.msg_name = nullptr;
1333
+ msg.msg_namelen = 0;
1334
+ msg.msg_iov = iov;
1335
+ msg.msg_iovlen = iov_size;
1336
+ msg.msg_flags = 0;
1337
+ bool tried_sending_message = false;
1338
+ // Before calling sendmsg (with or without timestamps): we
1339
+ // take a single ref on the zerocopy send record.
1340
+ tcp->tcp_zerocopy_send_ctx.NoteSend(record);
1341
+ if (tcp->outgoing_buffer_arg != nullptr) {
1342
+ if (!tcp->ts_capable ||
1343
+ !tcp_write_with_timestamps(tcp, &msg, sending_length, &sent_length,
1344
+ MSG_ZEROCOPY)) {
1345
+ /* We could not set socket options to collect Fathom timestamps.
1346
+ * Fallback on writing without timestamps. */
1347
+ tcp->ts_capable = false;
1348
+ tcp_shutdown_buffer_list(tcp);
1349
+ } else {
1350
+ tried_sending_message = true;
1351
+ }
1352
+ }
1353
+ if (!tried_sending_message) {
1354
+ msg.msg_control = nullptr;
1355
+ msg.msg_controllen = 0;
1356
+ GRPC_STATS_INC_TCP_WRITE_SIZE(sending_length);
1357
+ GRPC_STATS_INC_TCP_WRITE_IOV_SIZE(iov_size);
1358
+ sent_length = tcp_send(tcp->fd, &msg, MSG_ZEROCOPY);
1359
+ }
1360
+ if (sent_length < 0) {
1361
+ // If this particular send failed, drop ref taken earlier in this method.
1362
+ tcp->tcp_zerocopy_send_ctx.UndoSend();
1363
+ if (errno == EAGAIN) {
1364
+ record->UnwindIfThrottled(unwind_slice_idx, unwind_byte_idx);
1365
+ return false;
1366
+ } else if (errno == EPIPE) {
1367
+ *error = tcp_annotate_error(GRPC_OS_ERROR(errno, "sendmsg"), tcp);
1368
+ tcp_shutdown_buffer_list(tcp);
1369
+ return true;
1370
+ } else {
1371
+ *error = tcp_annotate_error(GRPC_OS_ERROR(errno, "sendmsg"), tcp);
1372
+ tcp_shutdown_buffer_list(tcp);
1373
+ return true;
1374
+ }
1375
+ }
1376
+ tcp->bytes_counter += sent_length;
1377
+ record->UpdateOffsetForBytesSent(sending_length,
1378
+ static_cast<size_t>(sent_length));
1379
+ if (record->AllSlicesSent()) {
1380
+ *error = GRPC_ERROR_NONE;
1381
+ return true;
1382
+ }
1383
+ }
1384
+ }
1385
+
1386
+ static void UnrefMaybePutZerocopySendRecord(grpc_tcp* tcp,
1387
+ TcpZerocopySendRecord* record,
1388
+ uint32_t seq,
1389
+ const char* /* tag */) {
1390
+ if (record->Unref()) {
1391
+ tcp->tcp_zerocopy_send_ctx.PutSendRecord(record);
1392
+ }
1393
+ }
1394
+
1395
+ static bool tcp_flush_zerocopy(grpc_tcp* tcp, TcpZerocopySendRecord* record,
1396
+ grpc_error** error) {
1397
+ bool done = do_tcp_flush_zerocopy(tcp, record, error);
1398
+ if (done) {
1399
+ // Either we encountered an error, or we successfully sent all the bytes.
1400
+ // In either case, we're done with this record.
1401
+ UnrefMaybePutZerocopySendRecord(tcp, record, 0, "flush_done");
1402
+ }
1403
+ return done;
1404
+ }
1405
+
916
1406
  static bool tcp_flush(grpc_tcp* tcp, grpc_error** error) {
917
1407
  struct msghdr msg;
918
1408
  struct iovec iov[MAX_WRITE_IOVEC];
@@ -927,7 +1417,7 @@ static bool tcp_flush(grpc_tcp* tcp, grpc_error** error) {
927
1417
  // buffer as we write
928
1418
  size_t outgoing_slice_idx = 0;
929
1419
 
930
- for (;;) {
1420
+ while (true) {
931
1421
  sending_length = 0;
932
1422
  unwind_slice_idx = outgoing_slice_idx;
933
1423
  unwind_byte_idx = tcp->outgoing_byte_idx;
@@ -1027,12 +1517,21 @@ static void tcp_handle_write(void* arg /* grpc_tcp */, grpc_error* error) {
1027
1517
  if (error != GRPC_ERROR_NONE) {
1028
1518
  cb = tcp->write_cb;
1029
1519
  tcp->write_cb = nullptr;
1520
+ if (tcp->current_zerocopy_send != nullptr) {
1521
+ UnrefMaybePutZerocopySendRecord(tcp, tcp->current_zerocopy_send, 0,
1522
+ "handle_write_err");
1523
+ tcp->current_zerocopy_send = nullptr;
1524
+ }
1030
1525
  grpc_core::Closure::Run(DEBUG_LOCATION, cb, GRPC_ERROR_REF(error));
1031
1526
  TCP_UNREF(tcp, "write");
1032
1527
  return;
1033
1528
  }
1034
1529
 
1035
- if (!tcp_flush(tcp, &error)) {
1530
+ bool flush_result =
1531
+ tcp->current_zerocopy_send != nullptr
1532
+ ? tcp_flush_zerocopy(tcp, tcp->current_zerocopy_send, &error)
1533
+ : tcp_flush(tcp, &error);
1534
+ if (!flush_result) {
1036
1535
  if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
1037
1536
  gpr_log(GPR_INFO, "write: delayed");
1038
1537
  }
@@ -1042,6 +1541,7 @@ static void tcp_handle_write(void* arg /* grpc_tcp */, grpc_error* error) {
1042
1541
  } else {
1043
1542
  cb = tcp->write_cb;
1044
1543
  tcp->write_cb = nullptr;
1544
+ tcp->current_zerocopy_send = nullptr;
1045
1545
  if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
1046
1546
  const char* str = grpc_error_string(error);
1047
1547
  gpr_log(GPR_INFO, "write: %s", str);
@@ -1057,6 +1557,7 @@ static void tcp_write(grpc_endpoint* ep, grpc_slice_buffer* buf,
1057
1557
  GPR_TIMER_SCOPE("tcp_write", 0);
1058
1558
  grpc_tcp* tcp = reinterpret_cast<grpc_tcp*>(ep);
1059
1559
  grpc_error* error = GRPC_ERROR_NONE;
1560
+ TcpZerocopySendRecord* zerocopy_send_record = nullptr;
1060
1561
 
1061
1562
  if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
1062
1563
  size_t i;
@@ -1073,8 +1574,8 @@ static void tcp_write(grpc_endpoint* ep, grpc_slice_buffer* buf,
1073
1574
  }
1074
1575
 
1075
1576
  GPR_ASSERT(tcp->write_cb == nullptr);
1577
+ GPR_DEBUG_ASSERT(tcp->current_zerocopy_send == nullptr);
1076
1578
 
1077
- tcp->outgoing_buffer_arg = arg;
1078
1579
  if (buf->length == 0) {
1079
1580
  grpc_core::Closure::Run(
1080
1581
  DEBUG_LOCATION, cb,
@@ -1085,15 +1586,26 @@ static void tcp_write(grpc_endpoint* ep, grpc_slice_buffer* buf,
1085
1586
  tcp_shutdown_buffer_list(tcp);
1086
1587
  return;
1087
1588
  }
1088
- tcp->outgoing_buffer = buf;
1089
- tcp->outgoing_byte_idx = 0;
1589
+
1590
+ zerocopy_send_record = tcp_get_send_zerocopy_record(tcp, buf);
1591
+ if (zerocopy_send_record == nullptr) {
1592
+ // Either not enough bytes, or couldn't allocate a zerocopy context.
1593
+ tcp->outgoing_buffer = buf;
1594
+ tcp->outgoing_byte_idx = 0;
1595
+ }
1596
+ tcp->outgoing_buffer_arg = arg;
1090
1597
  if (arg) {
1091
1598
  GPR_ASSERT(grpc_event_engine_can_track_errors());
1092
1599
  }
1093
1600
 
1094
- if (!tcp_flush(tcp, &error)) {
1601
+ bool flush_result =
1602
+ zerocopy_send_record != nullptr
1603
+ ? tcp_flush_zerocopy(tcp, zerocopy_send_record, &error)
1604
+ : tcp_flush(tcp, &error);
1605
+ if (!flush_result) {
1095
1606
  TCP_REF(tcp, "write");
1096
1607
  tcp->write_cb = cb;
1608
+ tcp->current_zerocopy_send = zerocopy_send_record;
1097
1609
  if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
1098
1610
  gpr_log(GPR_INFO, "write: delayed");
1099
1611
  }
@@ -1121,6 +1633,7 @@ static void tcp_add_to_pollset_set(grpc_endpoint* ep,
1121
1633
  static void tcp_delete_from_pollset_set(grpc_endpoint* ep,
1122
1634
  grpc_pollset_set* pollset_set) {
1123
1635
  grpc_tcp* tcp = reinterpret_cast<grpc_tcp*>(ep);
1636
+ ZerocopyDisableAndWaitForRemaining(tcp);
1124
1637
  grpc_pollset_set_del_fd(pollset_set, tcp->em_fd);
1125
1638
  }
1126
1639
 
@@ -1172,9 +1685,15 @@ static const grpc_endpoint_vtable vtable = {tcp_read,
1172
1685
  grpc_endpoint* grpc_tcp_create(grpc_fd* em_fd,
1173
1686
  const grpc_channel_args* channel_args,
1174
1687
  const char* peer_string) {
1688
+ static constexpr bool kZerocpTxEnabledDefault = false;
1175
1689
  int tcp_read_chunk_size = GRPC_TCP_DEFAULT_READ_SLICE_SIZE;
1176
1690
  int tcp_max_read_chunk_size = 4 * 1024 * 1024;
1177
1691
  int tcp_min_read_chunk_size = 256;
1692
+ bool tcp_tx_zerocopy_enabled = kZerocpTxEnabledDefault;
1693
+ int tcp_tx_zerocopy_send_bytes_thresh =
1694
+ grpc_core::TcpZerocopySendCtx::kDefaultSendBytesThreshold;
1695
+ int tcp_tx_zerocopy_max_simult_sends =
1696
+ grpc_core::TcpZerocopySendCtx::kDefaultMaxSends;
1178
1697
  grpc_resource_quota* resource_quota = grpc_resource_quota_create(nullptr);
1179
1698
  if (channel_args != nullptr) {
1180
1699
  for (size_t i = 0; i < channel_args->num_args; i++) {
@@ -1199,6 +1718,23 @@ grpc_endpoint* grpc_tcp_create(grpc_fd* em_fd,
1199
1718
  resource_quota =
1200
1719
  grpc_resource_quota_ref_internal(static_cast<grpc_resource_quota*>(
1201
1720
  channel_args->args[i].value.pointer.p));
1721
+ } else if (0 == strcmp(channel_args->args[i].key,
1722
+ GRPC_ARG_TCP_TX_ZEROCOPY_ENABLED)) {
1723
+ tcp_tx_zerocopy_enabled = grpc_channel_arg_get_bool(
1724
+ &channel_args->args[i], kZerocpTxEnabledDefault);
1725
+ } else if (0 == strcmp(channel_args->args[i].key,
1726
+ GRPC_ARG_TCP_TX_ZEROCOPY_SEND_BYTES_THRESHOLD)) {
1727
+ grpc_integer_options options = {
1728
+ grpc_core::TcpZerocopySendCtx::kDefaultSendBytesThreshold, 0,
1729
+ INT_MAX};
1730
+ tcp_tx_zerocopy_send_bytes_thresh =
1731
+ grpc_channel_arg_get_integer(&channel_args->args[i], options);
1732
+ } else if (0 == strcmp(channel_args->args[i].key,
1733
+ GRPC_ARG_TCP_TX_ZEROCOPY_MAX_SIMULT_SENDS)) {
1734
+ grpc_integer_options options = {
1735
+ grpc_core::TcpZerocopySendCtx::kDefaultMaxSends, 0, INT_MAX};
1736
+ tcp_tx_zerocopy_max_simult_sends =
1737
+ grpc_channel_arg_get_integer(&channel_args->args[i], options);
1202
1738
  }
1203
1739
  }
1204
1740
  }
@@ -1215,6 +1751,7 @@ grpc_endpoint* grpc_tcp_create(grpc_fd* em_fd,
1215
1751
  tcp->fd = grpc_fd_wrapped_fd(em_fd);
1216
1752
  tcp->read_cb = nullptr;
1217
1753
  tcp->write_cb = nullptr;
1754
+ tcp->current_zerocopy_send = nullptr;
1218
1755
  tcp->release_fd_cb = nullptr;
1219
1756
  tcp->release_fd = nullptr;
1220
1757
  tcp->incoming_buffer = nullptr;
@@ -1228,6 +1765,20 @@ grpc_endpoint* grpc_tcp_create(grpc_fd* em_fd,
1228
1765
  tcp->socket_ts_enabled = false;
1229
1766
  tcp->ts_capable = true;
1230
1767
  tcp->outgoing_buffer_arg = nullptr;
1768
+ new (&tcp->tcp_zerocopy_send_ctx) TcpZerocopySendCtx(
1769
+ tcp_tx_zerocopy_max_simult_sends, tcp_tx_zerocopy_send_bytes_thresh);
1770
+ if (tcp_tx_zerocopy_enabled && !tcp->tcp_zerocopy_send_ctx.memory_limited()) {
1771
+ #ifdef GRPC_LINUX_ERRQUEUE
1772
+ const int enable = 1;
1773
+ auto err =
1774
+ setsockopt(tcp->fd, SOL_SOCKET, SO_ZEROCOPY, &enable, sizeof(enable));
1775
+ if (err == 0) {
1776
+ tcp->tcp_zerocopy_send_ctx.set_enabled(true);
1777
+ } else {
1778
+ gpr_log(GPR_ERROR, "Failed to set zerocopy options on the socket.");
1779
+ }
1780
+ #endif
1781
+ }
1231
1782
  /* paired with unref in grpc_tcp_destroy */
1232
1783
  new (&tcp->refcount) grpc_core::RefCount(1, &grpc_tcp_trace);
1233
1784
  gpr_atm_no_barrier_store(&tcp->shutdown_count, 0);
@@ -1294,6 +1845,7 @@ void grpc_tcp_destroy_and_release_fd(grpc_endpoint* ep, int* fd,
1294
1845
  grpc_slice_buffer_reset_and_unref_internal(&tcp->last_read_buffer);
1295
1846
  if (grpc_event_engine_can_track_errors()) {
1296
1847
  /* Stop errors notification. */
1848
+ ZerocopyDisableAndWaitForRemaining(tcp);
1297
1849
  gpr_atm_no_barrier_store(&tcp->stop_error_notification, true);
1298
1850
  grpc_fd_set_error(tcp->em_fd);
1299
1851
  }