grpc 1.60.2 → 1.61.0.pre2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +208 -165
  3. data/include/grpc/event_engine/event_engine.h +59 -12
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  5. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  6. data/include/grpc/event_engine/memory_allocator.h +3 -1
  7. data/include/grpc/event_engine/slice.h +5 -0
  8. data/include/grpc/grpc_security.h +22 -1
  9. data/include/grpc/impl/call.h +29 -0
  10. data/include/grpc/impl/channel_arg_names.h +12 -1
  11. data/include/grpc/impl/slice_type.h +1 -1
  12. data/include/grpc/module.modulemap +1 -0
  13. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
  14. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  15. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  17. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  18. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
  20. data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
  21. data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
  29. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
  54. data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
  58. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  59. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  60. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
  61. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  63. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  64. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  65. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  69. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  70. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  71. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  72. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  73. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
  74. data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
  75. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
  76. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  77. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
  78. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
  79. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
  80. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  81. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  82. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  83. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
  84. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  85. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  86. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  87. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  88. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  89. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  90. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  91. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  92. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
  93. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
  94. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  95. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  96. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  97. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  98. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  99. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  103. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  104. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  105. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  106. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  107. data/src/core/ext/xds/xds_api.cc +31 -18
  108. data/src/core/ext/xds/xds_api.h +2 -2
  109. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  110. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  111. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  112. data/src/core/ext/xds/xds_client.cc +420 -414
  113. data/src/core/ext/xds/xds_client.h +31 -22
  114. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  115. data/src/core/ext/xds/xds_cluster.cc +104 -11
  116. data/src/core/ext/xds/xds_cluster.h +9 -1
  117. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  118. data/src/core/ext/xds/xds_common_types.cc +14 -10
  119. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  120. data/src/core/ext/xds/xds_endpoint.h +5 -1
  121. data/src/core/ext/xds/xds_health_status.cc +12 -2
  122. data/src/core/ext/xds/xds_health_status.h +4 -2
  123. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  124. data/src/core/ext/xds/xds_listener.cc +14 -8
  125. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  126. data/src/core/ext/xds/xds_route_config.cc +34 -22
  127. data/src/core/ext/xds/xds_route_config.h +1 -0
  128. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  129. data/src/core/ext/xds/xds_transport.h +3 -0
  130. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  131. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  132. data/src/core/lib/channel/call_tracer.cc +12 -0
  133. data/src/core/lib/channel/call_tracer.h +17 -3
  134. data/src/core/lib/channel/channel_args.cc +24 -14
  135. data/src/core/lib/channel/channel_args.h +74 -13
  136. data/src/core/lib/channel/channel_stack.cc +27 -0
  137. data/src/core/lib/channel/channel_stack.h +10 -10
  138. data/src/core/lib/channel/connected_channel.cc +64 -18
  139. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  140. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  141. data/src/core/lib/compression/compression_internal.cc +0 -3
  142. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  143. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  144. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  145. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  146. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  147. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  148. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  152. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  153. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  154. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  155. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  156. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  158. data/src/core/lib/experiments/config.cc +13 -0
  159. data/src/core/lib/experiments/config.h +3 -0
  160. data/src/core/lib/experiments/experiments.cc +245 -366
  161. data/src/core/lib/experiments/experiments.h +50 -156
  162. data/src/core/lib/gprpp/debug_location.h +13 -0
  163. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  164. data/src/core/lib/gprpp/orphanable.h +27 -0
  165. data/src/core/lib/gprpp/ref_counted.h +63 -22
  166. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  167. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  168. data/src/core/lib/gprpp/status_helper.cc +1 -2
  169. data/src/core/lib/iomgr/combiner.cc +15 -51
  170. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  171. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  173. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  174. data/src/core/lib/promise/activity.cc +17 -2
  175. data/src/core/lib/promise/activity.h +5 -4
  176. data/src/core/lib/promise/all_ok.h +80 -0
  177. data/src/core/lib/promise/detail/join_state.h +2077 -0
  178. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  179. data/src/core/lib/promise/detail/promise_like.h +8 -1
  180. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  181. data/src/core/lib/promise/detail/status.h +42 -5
  182. data/src/core/lib/promise/for_each.h +13 -1
  183. data/src/core/lib/promise/if.h +4 -0
  184. data/src/core/lib/promise/latch.h +6 -3
  185. data/src/core/lib/promise/party.cc +33 -31
  186. data/src/core/lib/promise/party.h +142 -6
  187. data/src/core/lib/promise/poll.h +39 -13
  188. data/src/core/lib/promise/promise.h +4 -0
  189. data/src/core/lib/promise/seq.h +107 -7
  190. data/src/core/lib/promise/status_flag.h +196 -0
  191. data/src/core/lib/promise/try_join.h +132 -0
  192. data/src/core/lib/promise/try_seq.h +132 -10
  193. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  194. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  195. data/src/core/lib/resource_quota/arena.h +2 -2
  196. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  197. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  198. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  199. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  200. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  203. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  207. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  208. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  209. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  210. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  211. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  212. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  213. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  214. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  215. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  216. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  217. data/src/core/lib/security/transport/auth_filters.h +71 -4
  218. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  219. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  220. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  221. data/src/core/lib/slice/slice_buffer.h +3 -0
  222. data/src/core/lib/surface/builtins.cc +1 -1
  223. data/src/core/lib/surface/call.cc +683 -196
  224. data/src/core/lib/surface/call.h +26 -13
  225. data/src/core/lib/surface/call_trace.cc +42 -1
  226. data/src/core/lib/surface/channel.cc +0 -1
  227. data/src/core/lib/surface/channel.h +0 -6
  228. data/src/core/lib/surface/channel_init.h +26 -0
  229. data/src/core/lib/surface/init.cc +14 -8
  230. data/src/core/lib/surface/server.cc +256 -237
  231. data/src/core/lib/surface/server.h +26 -54
  232. data/src/core/lib/surface/version.cc +2 -2
  233. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  234. data/src/core/lib/transport/call_final_info.cc +38 -0
  235. data/src/core/lib/transport/call_final_info.h +54 -0
  236. data/src/core/lib/transport/connectivity_state.cc +3 -2
  237. data/src/core/lib/transport/connectivity_state.h +4 -0
  238. data/src/core/lib/transport/metadata_batch.h +4 -4
  239. data/src/core/lib/transport/transport.cc +70 -19
  240. data/src/core/lib/transport/transport.h +395 -25
  241. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  242. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  243. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  244. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  245. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  246. data/src/core/tsi/ssl_transport_security.cc +65 -43
  247. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  248. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  249. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  250. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  251. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  252. data/src/ruby/lib/grpc/version.rb +1 -1
  253. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  254. data/third_party/zlib/adler32.c +5 -27
  255. data/third_party/zlib/compress.c +5 -16
  256. data/third_party/zlib/crc32.c +86 -162
  257. data/third_party/zlib/deflate.c +233 -336
  258. data/third_party/zlib/deflate.h +8 -8
  259. data/third_party/zlib/gzguts.h +11 -12
  260. data/third_party/zlib/infback.c +7 -23
  261. data/third_party/zlib/inffast.c +1 -4
  262. data/third_party/zlib/inffast.h +1 -1
  263. data/third_party/zlib/inflate.c +30 -99
  264. data/third_party/zlib/inftrees.c +6 -11
  265. data/third_party/zlib/inftrees.h +3 -3
  266. data/third_party/zlib/trees.c +224 -302
  267. data/third_party/zlib/uncompr.c +4 -12
  268. data/third_party/zlib/zconf.h +6 -2
  269. data/third_party/zlib/zlib.h +191 -188
  270. data/third_party/zlib/zutil.c +16 -44
  271. data/third_party/zlib/zutil.h +10 -10
  272. metadata +35 -13
  273. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  274. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  275. data/src/core/lib/transport/pid_controller.cc +0 -51
  276. data/src/core/lib/transport/pid_controller.h +0 -116
  277. data/third_party/upb/upb/collections/array.h +0 -17
  278. data/third_party/upb/upb/collections/map.h +0 -17
  279. data/third_party/upb/upb/upb.hpp +0 -18
@@ -22,43 +22,133 @@
22
22
 
23
23
  #include "src/core/ext/transport/chttp2/transport/http2_settings.h"
24
24
 
25
+ #include "absl/strings/str_cat.h"
26
+
27
+ #include "src/core/ext/transport/chttp2/transport/frame.h"
25
28
  #include "src/core/lib/gpr/useful.h"
26
29
  #include "src/core/lib/transport/http2_errors.h"
27
30
 
28
- const uint16_t grpc_setting_id_to_wire_id[] = {1, 2, 3, 4, 5, 6, 65027, 65028};
31
+ namespace grpc_core {
32
+
33
+ void Http2Settings::Diff(
34
+ bool is_first_send, const Http2Settings& old,
35
+ absl::FunctionRef<void(uint16_t key, uint32_t value)> cb) const {
36
+ if (header_table_size_ != old.header_table_size_) {
37
+ cb(kHeaderTableSizeWireId, header_table_size_);
38
+ }
39
+ if (enable_push_ != old.enable_push_) {
40
+ cb(kEnablePushWireId, enable_push_);
41
+ }
42
+ if (max_concurrent_streams_ != old.max_concurrent_streams_) {
43
+ cb(kMaxConcurrentStreamsWireId, max_concurrent_streams_);
44
+ }
45
+ if (is_first_send || initial_window_size_ != old.initial_window_size_) {
46
+ cb(kInitialWindowSizeWireId, initial_window_size_);
47
+ }
48
+ if (max_frame_size_ != old.max_frame_size_) {
49
+ cb(kMaxFrameSizeWireId, max_frame_size_);
50
+ }
51
+ if (max_header_list_size_ != old.max_header_list_size_) {
52
+ cb(kMaxHeaderListSizeWireId, max_header_list_size_);
53
+ }
54
+ if (allow_true_binary_metadata_ != old.allow_true_binary_metadata_) {
55
+ cb(kGrpcAllowTrueBinaryMetadataWireId, allow_true_binary_metadata_);
56
+ }
57
+ if (preferred_receive_crypto_message_size_ !=
58
+ old.preferred_receive_crypto_message_size_) {
59
+ cb(kGrpcPreferredReceiveCryptoFrameSizeWireId,
60
+ preferred_receive_crypto_message_size_);
61
+ }
62
+ }
63
+
64
+ std::string Http2Settings::WireIdToName(uint16_t wire_id) {
65
+ switch (wire_id) {
66
+ case kHeaderTableSizeWireId:
67
+ return std::string(header_table_size_name());
68
+ case kEnablePushWireId:
69
+ return std::string(enable_push_name());
70
+ case kMaxConcurrentStreamsWireId:
71
+ return std::string(max_concurrent_streams_name());
72
+ case kInitialWindowSizeWireId:
73
+ return std::string(initial_window_size_name());
74
+ case kMaxFrameSizeWireId:
75
+ return std::string(max_frame_size_name());
76
+ case kMaxHeaderListSizeWireId:
77
+ return std::string(max_header_list_size_name());
78
+ case kGrpcAllowTrueBinaryMetadataWireId:
79
+ return std::string(allow_true_binary_metadata_name());
80
+ case kGrpcPreferredReceiveCryptoFrameSizeWireId:
81
+ return std::string(preferred_receive_crypto_message_size_name());
82
+ default:
83
+ return absl::StrCat("UNKNOWN (", wire_id, ")");
84
+ }
85
+ }
86
+
87
+ grpc_http2_error_code Http2Settings::Apply(uint16_t key, uint32_t value) {
88
+ switch (key) {
89
+ case kHeaderTableSizeWireId:
90
+ header_table_size_ = value;
91
+ break;
92
+ case kEnablePushWireId:
93
+ if (value > 1) return GRPC_HTTP2_PROTOCOL_ERROR;
94
+ enable_push_ = value != 0;
95
+ break;
96
+ case kMaxConcurrentStreamsWireId:
97
+ max_concurrent_streams_ = value;
98
+ break;
99
+ case kInitialWindowSizeWireId:
100
+ if (value > max_initial_window_size()) {
101
+ return GRPC_HTTP2_FLOW_CONTROL_ERROR;
102
+ }
103
+ initial_window_size_ = value;
104
+ break;
105
+ case kMaxFrameSizeWireId:
106
+ if (value < min_max_frame_size() || value > max_max_frame_size()) {
107
+ return GRPC_HTTP2_PROTOCOL_ERROR;
108
+ }
109
+ max_frame_size_ = value;
110
+ break;
111
+ case kMaxHeaderListSizeWireId:
112
+ max_header_list_size_ = std::min(value, 16777216u);
113
+ break;
114
+ case kGrpcAllowTrueBinaryMetadataWireId:
115
+ if (value > 1) return GRPC_HTTP2_PROTOCOL_ERROR;
116
+ allow_true_binary_metadata_ = value != 0;
117
+ break;
118
+ case kGrpcPreferredReceiveCryptoFrameSizeWireId:
119
+ preferred_receive_crypto_message_size_ =
120
+ Clamp(value, min_preferred_receive_crypto_message_size(),
121
+ max_preferred_receive_crypto_message_size());
122
+ break;
123
+ }
124
+ return GRPC_HTTP2_NO_ERROR;
125
+ }
29
126
 
30
- bool grpc_wire_id_to_setting_id(uint32_t wire_id, grpc_chttp2_setting_id* out) {
31
- uint32_t i = wire_id - 1;
32
- uint32_t x = i % 256;
33
- uint32_t y = i / 256;
34
- uint32_t h = x;
35
- switch (y) {
36
- case 254:
37
- h += 4;
127
+ absl::optional<Http2SettingsFrame> Http2SettingsManager::MaybeSendUpdate() {
128
+ switch (update_state_) {
129
+ case UpdateState::kSending:
130
+ return absl::nullopt;
131
+ case UpdateState::kIdle:
132
+ if (local_ == sent_) return absl::nullopt;
133
+ break;
134
+ case UpdateState::kFirst:
38
135
  break;
39
136
  }
40
- *out = static_cast<grpc_chttp2_setting_id>(h);
41
- return h < GPR_ARRAY_SIZE(grpc_setting_id_to_wire_id) &&
42
- grpc_setting_id_to_wire_id[h] == wire_id;
137
+ Http2SettingsFrame frame;
138
+ local_.Diff(update_state_ == UpdateState::kFirst, sent_,
139
+ [&frame](uint16_t key, uint32_t value) {
140
+ frame.settings.emplace_back(key, value);
141
+ });
142
+ sent_ = local_;
143
+ update_state_ = UpdateState::kSending;
144
+ return frame;
145
+ }
146
+
147
+ bool Http2SettingsManager::AckLastSend() {
148
+ if (update_state_ != UpdateState::kSending) return false;
149
+ update_state_ = UpdateState::kIdle;
150
+ acked_ = sent_;
151
+ return true;
43
152
  }
44
153
 
45
- const grpc_chttp2_setting_parameters
46
- grpc_chttp2_settings_parameters[GRPC_CHTTP2_NUM_SETTINGS] = {
47
- {"HEADER_TABLE_SIZE", 4096u, 0u, 4294967295u,
48
- GRPC_CHTTP2_CLAMP_INVALID_VALUE, GRPC_HTTP2_PROTOCOL_ERROR},
49
- {"ENABLE_PUSH", 1u, 0u, 1u, GRPC_CHTTP2_DISCONNECT_ON_INVALID_VALUE,
50
- GRPC_HTTP2_PROTOCOL_ERROR},
51
- {"MAX_CONCURRENT_STREAMS", 4294967295u, 0u, 4294967295u,
52
- GRPC_CHTTP2_DISCONNECT_ON_INVALID_VALUE, GRPC_HTTP2_PROTOCOL_ERROR},
53
- {"INITIAL_WINDOW_SIZE", 65535u, 0u, 2147483647u,
54
- GRPC_CHTTP2_DISCONNECT_ON_INVALID_VALUE,
55
- GRPC_HTTP2_FLOW_CONTROL_ERROR},
56
- {"MAX_FRAME_SIZE", 16384u, 16384u, 16777215u,
57
- GRPC_CHTTP2_DISCONNECT_ON_INVALID_VALUE, GRPC_HTTP2_PROTOCOL_ERROR},
58
- {"MAX_HEADER_LIST_SIZE", 16777216u, 0u, 16777216u,
59
- GRPC_CHTTP2_CLAMP_INVALID_VALUE, GRPC_HTTP2_PROTOCOL_ERROR},
60
- {"GRPC_ALLOW_TRUE_BINARY_METADATA", 0u, 0u, 1u,
61
- GRPC_CHTTP2_CLAMP_INVALID_VALUE, GRPC_HTTP2_PROTOCOL_ERROR},
62
- {"GRPC_PREFERRED_RECEIVE_CRYPTO_FRAME_SIZE", 0u, 16384u, 2147483647u,
63
- GRPC_CHTTP2_CLAMP_INVALID_VALUE, GRPC_HTTP2_PROTOCOL_ERROR},
64
- };
154
+ } // namespace grpc_core
@@ -14,10 +14,6 @@
14
14
  // limitations under the License.
15
15
  //
16
16
 
17
- //
18
- // Automatically generated by tools/codegen/core/gen_settings_ids.py
19
- //
20
-
21
17
  #ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HTTP2_SETTINGS_H
22
18
  #define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HTTP2_SETTINGS_H
23
19
 
@@ -25,38 +21,147 @@
25
21
 
26
22
  #include <stdint.h>
27
23
 
28
- typedef enum {
29
- GRPC_CHTTP2_SETTINGS_HEADER_TABLE_SIZE = 0, // wire id 1
30
- GRPC_CHTTP2_SETTINGS_ENABLE_PUSH = 1, // wire id 2
31
- GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS = 2, // wire id 3
32
- GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE = 3, // wire id 4
33
- GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE = 4, // wire id 5
34
- GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE = 5, // wire id 6
35
- GRPC_CHTTP2_SETTINGS_GRPC_ALLOW_TRUE_BINARY_METADATA = 6, // wire id 65027
36
- GRPC_CHTTP2_SETTINGS_GRPC_PREFERRED_RECEIVE_CRYPTO_FRAME_SIZE =
37
- 7, // wire id 65028
38
- } grpc_chttp2_setting_id;
39
-
40
- #define GRPC_CHTTP2_NUM_SETTINGS 8
41
- extern const uint16_t grpc_setting_id_to_wire_id[];
42
-
43
- bool grpc_wire_id_to_setting_id(uint32_t wire_id, grpc_chttp2_setting_id* out);
44
-
45
- typedef enum {
46
- GRPC_CHTTP2_CLAMP_INVALID_VALUE,
47
- GRPC_CHTTP2_DISCONNECT_ON_INVALID_VALUE
48
- } grpc_chttp2_invalid_value_behavior;
49
-
50
- typedef struct {
51
- const char* name;
52
- uint32_t default_value;
53
- uint32_t min_value;
54
- uint32_t max_value;
55
- grpc_chttp2_invalid_value_behavior invalid_value_behavior;
56
- uint32_t error_value;
57
- } grpc_chttp2_setting_parameters;
58
-
59
- extern const grpc_chttp2_setting_parameters
60
- grpc_chttp2_settings_parameters[GRPC_CHTTP2_NUM_SETTINGS];
24
+ #include <cstdint>
25
+
26
+ #include "absl/functional/function_ref.h"
27
+ #include "absl/strings/string_view.h"
28
+ #include "absl/types/optional.h"
29
+
30
+ #include "src/core/ext/transport/chttp2/transport/frame.h"
31
+ #include "src/core/lib/gpr/useful.h"
32
+ #include "src/core/lib/transport/http2_errors.h"
33
+
34
+ namespace grpc_core {
35
+
36
+ class Http2Settings {
37
+ public:
38
+ enum : uint16_t {
39
+ kHeaderTableSizeWireId = 1,
40
+ kEnablePushWireId = 2,
41
+ kMaxConcurrentStreamsWireId = 3,
42
+ kInitialWindowSizeWireId = 4,
43
+ kMaxFrameSizeWireId = 5,
44
+ kMaxHeaderListSizeWireId = 6,
45
+ kGrpcAllowTrueBinaryMetadataWireId = 65027,
46
+ kGrpcPreferredReceiveCryptoFrameSizeWireId = 65028,
47
+ };
48
+
49
+ void Diff(bool is_first_send, const Http2Settings& old,
50
+ absl::FunctionRef<void(uint16_t key, uint32_t value)> cb) const;
51
+ GRPC_MUST_USE_RESULT grpc_http2_error_code Apply(uint16_t key,
52
+ uint32_t value);
53
+ uint32_t header_table_size() const { return header_table_size_; }
54
+ uint32_t max_concurrent_streams() const { return max_concurrent_streams_; }
55
+ uint32_t initial_window_size() const { return initial_window_size_; }
56
+ uint32_t max_frame_size() const { return max_frame_size_; }
57
+ uint32_t max_header_list_size() const { return max_header_list_size_; }
58
+ uint32_t preferred_receive_crypto_message_size() const {
59
+ return preferred_receive_crypto_message_size_;
60
+ }
61
+ bool enable_push() const { return enable_push_; }
62
+ bool allow_true_binary_metadata() const {
63
+ return allow_true_binary_metadata_;
64
+ }
65
+
66
+ void SetHeaderTableSize(uint32_t x) { header_table_size_ = x; }
67
+ void SetMaxConcurrentStreams(uint32_t x) { max_concurrent_streams_ = x; }
68
+ void SetInitialWindowSize(uint32_t x) {
69
+ initial_window_size_ = std::min(x, max_initial_window_size());
70
+ }
71
+ void SetEnablePush(bool x) { enable_push_ = x; }
72
+ void SetMaxHeaderListSize(uint32_t x) {
73
+ max_header_list_size_ = std::min(x, 16777216u);
74
+ }
75
+ void SetAllowTrueBinaryMetadata(bool x) { allow_true_binary_metadata_ = x; }
76
+ void SetMaxFrameSize(uint32_t x) {
77
+ max_frame_size_ = Clamp(x, min_max_frame_size(), max_max_frame_size());
78
+ }
79
+ void SetPreferredReceiveCryptoMessageSize(uint32_t x) {
80
+ preferred_receive_crypto_message_size_ =
81
+ Clamp(x, min_preferred_receive_crypto_message_size(),
82
+ max_preferred_receive_crypto_message_size());
83
+ }
84
+
85
+ static absl::string_view header_table_size_name() {
86
+ return "HEADER_TABLE_SIZE";
87
+ }
88
+ static absl::string_view max_concurrent_streams_name() {
89
+ return "MAX_CONCURRENT_STREAMS";
90
+ }
91
+ static absl::string_view initial_window_size_name() {
92
+ return "INITIAL_WINDOW_SIZE";
93
+ }
94
+ static absl::string_view max_frame_size_name() { return "MAX_FRAME_SIZE"; }
95
+ static absl::string_view max_header_list_size_name() {
96
+ return "MAX_HEADER_LIST_SIZE";
97
+ }
98
+ static absl::string_view enable_push_name() { return "ENABLE_PUSH"; }
99
+ static absl::string_view allow_true_binary_metadata_name() {
100
+ return "GRPC_ALLOW_TRUE_BINARY_METADATA";
101
+ }
102
+ static absl::string_view preferred_receive_crypto_message_size_name() {
103
+ return "GRPC_PREFERRED_RECEIVE_MESSAGE_SIZE";
104
+ }
105
+
106
+ static uint32_t max_initial_window_size() { return 2147483647u; }
107
+ static uint32_t max_max_frame_size() { return 16777215u; }
108
+ static uint32_t min_max_frame_size() { return 16384u; }
109
+ static uint32_t min_preferred_receive_crypto_message_size() { return 16384u; }
110
+ static uint32_t max_preferred_receive_crypto_message_size() {
111
+ return 2147483647u;
112
+ }
113
+
114
+ static std::string WireIdToName(uint16_t wire_id);
115
+
116
+ bool operator==(const Http2Settings& rhs) const {
117
+ return header_table_size_ == rhs.header_table_size_ &&
118
+ max_concurrent_streams_ == rhs.max_concurrent_streams_ &&
119
+ initial_window_size_ == rhs.initial_window_size_ &&
120
+ max_frame_size_ == rhs.max_frame_size_ &&
121
+ max_header_list_size_ == rhs.max_header_list_size_ &&
122
+ preferred_receive_crypto_message_size_ ==
123
+ rhs.preferred_receive_crypto_message_size_ &&
124
+ enable_push_ == rhs.enable_push_ &&
125
+ allow_true_binary_metadata_ == rhs.allow_true_binary_metadata_;
126
+ }
127
+
128
+ bool operator!=(const Http2Settings& rhs) const { return !operator==(rhs); }
129
+
130
+ private:
131
+ uint32_t header_table_size_ = 4096;
132
+ uint32_t max_concurrent_streams_ = 4294967295u;
133
+ uint32_t initial_window_size_ = 65535u;
134
+ uint32_t max_frame_size_ = 16384u;
135
+ uint32_t max_header_list_size_ = 16777216u;
136
+ uint32_t preferred_receive_crypto_message_size_ = 0u;
137
+ bool enable_push_ = true;
138
+ bool allow_true_binary_metadata_ = false;
139
+ };
140
+
141
+ class Http2SettingsManager {
142
+ public:
143
+ Http2Settings& mutable_local() { return local_; }
144
+ const Http2Settings& local() const { return local_; }
145
+ const Http2Settings& acked() const { return acked_; }
146
+ Http2Settings& mutable_peer() { return peer_; }
147
+ const Http2Settings& peer() const { return peer_; }
148
+
149
+ absl::optional<Http2SettingsFrame> MaybeSendUpdate();
150
+ GRPC_MUST_USE_RESULT bool AckLastSend();
151
+
152
+ private:
153
+ enum class UpdateState : uint8_t {
154
+ kFirst,
155
+ kSending,
156
+ kIdle,
157
+ };
158
+ UpdateState update_state_ = UpdateState::kFirst;
159
+ Http2Settings local_;
160
+ Http2Settings sent_;
161
+ Http2Settings peer_;
162
+ Http2Settings acked_;
163
+ };
164
+
165
+ } // namespace grpc_core
61
166
 
62
167
  #endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HTTP2_SETTINGS_H
@@ -203,18 +203,6 @@ struct grpc_chttp2_stream_link {
203
203
  grpc_chttp2_stream* next;
204
204
  grpc_chttp2_stream* prev;
205
205
  };
206
- // We keep several sets of connection wide parameters
207
- typedef enum {
208
- // The settings our peer has asked for (and we have acked)
209
- GRPC_PEER_SETTINGS = 0,
210
- // The settings we'd like to have
211
- GRPC_LOCAL_SETTINGS,
212
- // The settings we've published to our peer
213
- GRPC_SENT_SETTINGS,
214
- // The settings the peer has acked
215
- GRPC_ACKED_SETTINGS,
216
- GRPC_NUM_SETTING_SETS
217
- } grpc_chttp2_setting_set;
218
206
 
219
207
  typedef enum {
220
208
  GRPC_CHTTP2_NO_GOAWAY_SEND,
@@ -359,12 +347,8 @@ struct grpc_chttp2_transport final
359
347
 
360
348
  grpc_chttp2_sent_goaway_state sent_goaway_state = GRPC_CHTTP2_NO_GOAWAY_SEND;
361
349
 
362
- /// bitmask of setting indexes to send out
363
- /// Hack: it's common for implementations to assume 65536 bytes initial send
364
- /// window -- this should by rights be 0
365
- uint32_t force_send_settings = 1 << GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE;
366
350
  /// settings values
367
- uint32_t settings[GRPC_NUM_SETTING_SETS][GRPC_CHTTP2_NUM_SETTINGS];
351
+ grpc_core::Http2SettingsManager settings;
368
352
 
369
353
  grpc_event_engine::experimental::EventEngine::TaskHandle
370
354
  settings_ack_watchdog =
@@ -538,11 +522,6 @@ struct grpc_chttp2_transport final
538
522
  /// is this a client?
539
523
  bool is_client;
540
524
 
541
- /// are the local settings dirty and need to be sent?
542
- bool dirtied_local_settings = true;
543
- /// have local settings been sent?
544
- bool sent_local_settings = false;
545
-
546
525
  /// If start_bdp_ping_locked has been called
547
526
  bool bdp_ping_started = false;
548
527
  // True if pings should be acked
@@ -357,13 +357,10 @@ absl::variant<size_t, absl::Status> grpc_chttp2_perform_read(
357
357
  }
358
358
  goto dts_fh_0; // loop
359
359
  } else if (t->incoming_frame_size >
360
- t->settings[GRPC_ACKED_SETTINGS]
361
- [GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE]) {
362
- return GRPC_ERROR_CREATE(
363
- absl::StrFormat("Frame size %d is larger than max frame size %d",
364
- t->incoming_frame_size,
365
- t->settings[GRPC_ACKED_SETTINGS]
366
- [GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE]));
360
+ t->settings.acked().max_frame_size()) {
361
+ return GRPC_ERROR_CREATE(absl::StrFormat(
362
+ "Frame size %d is larger than max frame size %d",
363
+ t->incoming_frame_size, t->settings.acked().max_frame_size()));
367
364
  }
368
365
  if (++cur == end) {
369
366
  return absl::OkStatus();
@@ -395,8 +392,7 @@ absl::variant<size_t, absl::Status> grpc_chttp2_perform_read(
395
392
  }
396
393
  cur += t->incoming_frame_size;
397
394
  t->incoming_stream = nullptr;
398
- if (t->incoming_frame_type == GRPC_CHTTP2_FRAME_RST_STREAM &&
399
- grpc_core::IsChttp2OffloadOnRstStreamEnabled()) {
395
+ if (t->incoming_frame_type == GRPC_CHTTP2_FRAME_RST_STREAM) {
400
396
  requests_started = std::numeric_limits<size_t>::max();
401
397
  }
402
398
  goto dts_fh_0; // loop
@@ -506,8 +502,7 @@ static grpc_error_handle init_header_skip_frame_parser(
506
502
  /*metadata_size_soft_limit=*/
507
503
  t->max_header_list_size_soft_limit,
508
504
  /*metadata_size_hard_limit=*/
509
- t->settings[GRPC_ACKED_SETTINGS]
510
- [GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE],
505
+ t->settings.acked().max_header_list_size(),
511
506
  hpack_boundary_type(t, is_eoh), priority_type,
512
507
  hpack_parser_log_info(t, HPackParser::LogInfo::kDontKnow));
513
508
  return absl::OkStatus();
@@ -647,10 +642,8 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
647
642
  "ignoring grpc_chttp2_stream with non-client generated index %d",
648
643
  t->incoming_stream_id));
649
644
  return init_header_skip_frame_parser(t, priority_type, is_eoh);
650
- } else if (GPR_UNLIKELY(
651
- t->stream_map.size() + t->extra_streams >=
652
- t->settings[GRPC_ACKED_SETTINGS]
653
- [GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS])) {
645
+ } else if (GPR_UNLIKELY(t->stream_map.size() + t->extra_streams >=
646
+ t->settings.acked().max_concurrent_streams())) {
654
647
  if (grpc_core::IsRfcMaxConcurrentStreamsEnabled()) {
655
648
  ++t->num_pending_induced_frames;
656
649
  grpc_slice_buffer_add(
@@ -675,13 +668,11 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
675
668
  grpc_chttp2_initiate_write(t, GRPC_CHTTP2_INITIATE_WRITE_RST_STREAM);
676
669
  return init_header_skip_frame_parser(t, priority_type, is_eoh);
677
670
  } else if (GPR_UNLIKELY(
678
- grpc_core::IsRedMaxConcurrentStreamsEnabled() &&
679
671
  t->stream_map.size() >=
680
672
  t->max_concurrent_streams_policy.AdvertiseValue() &&
681
673
  grpc_core::RandomEarlyDetection(
682
674
  t->max_concurrent_streams_policy.AdvertiseValue(),
683
- t->settings[GRPC_ACKED_SETTINGS]
684
- [GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS])
675
+ t->settings.acked().max_concurrent_streams())
685
676
  .Reject(t->stream_map.size(), t->bitgen))) {
686
677
  // We are under the limit of max concurrent streams for the current
687
678
  // setting, but are over the next value that will be advertised.
@@ -702,8 +693,7 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
702
693
  t, std::string(t->peer_string.as_string_view()).c_str(),
703
694
  t->incoming_stream_id, t->last_new_stream_id));
704
695
  return init_header_skip_frame_parser(t, priority_type, is_eoh);
705
- } else if (grpc_core::IsBlockExcessiveRequestsBeforeSettingsAckEnabled() &&
706
- t->num_incoming_streams_before_settings_ack == 0) {
696
+ } else if (t->num_incoming_streams_before_settings_ack == 0) {
707
697
  GRPC_CHTTP2_IF_TRACING(gpr_log(
708
698
  GPR_ERROR,
709
699
  "transport:%p SERVER peer:%s rejecting grpc_chttp2_stream id=%d, "
@@ -791,15 +781,13 @@ static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport* t,
791
781
  return GRPC_ERROR_CREATE(
792
782
  "Trailing metadata frame received without an end-o-stream");
793
783
  }
794
- t->hpack_parser.BeginFrame(
795
- incoming_metadata_buffer,
796
- /*metadata_size_soft_limit=*/
797
- t->max_header_list_size_soft_limit,
798
- /*metadata_size_hard_limit=*/
799
- t->settings[GRPC_ACKED_SETTINGS]
800
- [GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE],
801
- hpack_boundary_type(t, is_eoh), priority_type,
802
- hpack_parser_log_info(t, frame_type));
784
+ t->hpack_parser.BeginFrame(incoming_metadata_buffer,
785
+ /*metadata_size_soft_limit=*/
786
+ t->max_header_list_size_soft_limit,
787
+ /*metadata_size_hard_limit=*/
788
+ t->settings.acked().max_header_list_size(),
789
+ hpack_boundary_type(t, is_eoh), priority_type,
790
+ hpack_parser_log_info(t, frame_type));
803
791
  return absl::OkStatus();
804
792
  }
805
793
 
@@ -870,21 +858,20 @@ static grpc_error_handle init_settings_frame_parser(grpc_chttp2_transport* t) {
870
858
 
871
859
  grpc_error_handle err = grpc_chttp2_settings_parser_begin_frame(
872
860
  &t->simple.settings, t->incoming_frame_size, t->incoming_frame_flags,
873
- t->settings[GRPC_PEER_SETTINGS]);
861
+ t->settings.mutable_peer());
874
862
  if (!err.ok()) {
875
863
  return err;
876
864
  }
877
865
  if (t->incoming_frame_flags & GRPC_CHTTP2_FLAG_ACK) {
878
866
  t->max_concurrent_streams_policy.AckLastSend();
879
- memcpy(t->settings[GRPC_ACKED_SETTINGS], t->settings[GRPC_SENT_SETTINGS],
880
- GRPC_CHTTP2_NUM_SETTINGS * sizeof(uint32_t));
867
+ if (!t->settings.AckLastSend()) {
868
+ return GRPC_ERROR_CREATE("Received unexpected settings ack");
869
+ }
881
870
  t->hpack_parser.hpack_table()->SetMaxBytes(
882
- t->settings[GRPC_ACKED_SETTINGS]
883
- [GRPC_CHTTP2_SETTINGS_HEADER_TABLE_SIZE]);
871
+ t->settings.acked().header_table_size());
884
872
  grpc_chttp2_act_on_flowctl_action(
885
873
  t->flow_control.SetAckedInitialWindow(
886
- t->settings[GRPC_ACKED_SETTINGS]
887
- [GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE]),
874
+ t->settings.acked().initial_window_size()),
888
875
  t, nullptr);
889
876
  if (t->settings_ack_watchdog !=
890
877
  grpc_event_engine::experimental::EventEngine::TaskHandle::kInvalid) {
@@ -892,7 +879,6 @@ static grpc_error_handle init_settings_frame_parser(grpc_chttp2_transport* t) {
892
879
  t->settings_ack_watchdog,
893
880
  grpc_event_engine::experimental::EventEngine::TaskHandle::kInvalid));
894
881
  }
895
- t->sent_local_settings = false;
896
882
  // This is more streams than can be started in http2, so setting this
897
883
  // effictively removes the limit for the rest of the connection.
898
884
  t->num_incoming_streams_before_settings_ack =