parsing.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
20 
21 #include <stdint.h>
22 #include <string.h>
23 
24 #include <string>
25 
26 #include "absl/base/attributes.h"
27 #include "absl/status/status.h"
28 #include "absl/strings/str_cat.h"
29 #include "absl/strings/str_format.h"
30 
31 #include <grpc/slice.h>
32 #include <grpc/support/log.h>
33 
58 
60 
63  int is_continuation);
73 
75  const grpc_slice& slice,
76  int is_last);
77 
78 static char get_utf8_safe_char(char c) {
79  return static_cast<unsigned char>(c) < 128 ? c : 32;
80 }
81 
83  const grpc_slice& slice) {
84  const uint8_t* beg = GRPC_SLICE_START_PTR(slice);
86  const uint8_t* cur = beg;
88 
89  if (cur == end) return GRPC_ERROR_NONE;
90 
91  switch (t->deframe_state) {
116  while (cur != end && t->deframe_state != GRPC_DTS_FH_0) {
117  if (*cur != GRPC_CHTTP2_CLIENT_CONNECT_STRING[t->deframe_state]) {
119  "Connect string mismatch: expected '%c' (%d) got '%c' (%d) "
120  "at byte %d",
122  GRPC_CHTTP2_CLIENT_CONNECT_STRING[t->deframe_state]),
123  static_cast<int>(static_cast<uint8_t>(
124  GRPC_CHTTP2_CLIENT_CONNECT_STRING[t->deframe_state])),
125  get_utf8_safe_char(*cur), static_cast<int>(*cur),
126  t->deframe_state));
127  }
128  ++cur;
129  // NOLINTNEXTLINE(bugprone-misplaced-widening-cast)
130  t->deframe_state = static_cast<grpc_chttp2_deframe_transport_state>(
131  1 + static_cast<int>(t->deframe_state));
132  }
133  if (cur == end) {
134  return GRPC_ERROR_NONE;
135  }
136  dts_fh_0:
138  case GRPC_DTS_FH_0:
140  t->incoming_frame_size = (static_cast<uint32_t>(*cur)) << 16;
141  if (++cur == end) {
142  t->deframe_state = GRPC_DTS_FH_1;
143  return GRPC_ERROR_NONE;
144  }
146  case GRPC_DTS_FH_1:
148  t->incoming_frame_size |= (static_cast<uint32_t>(*cur)) << 8;
149  if (++cur == end) {
150  t->deframe_state = GRPC_DTS_FH_2;
151  return GRPC_ERROR_NONE;
152  }
154  case GRPC_DTS_FH_2:
156  t->incoming_frame_size |= *cur;
157  if (++cur == end) {
158  t->deframe_state = GRPC_DTS_FH_3;
159  return GRPC_ERROR_NONE;
160  }
162  case GRPC_DTS_FH_3:
164  t->incoming_frame_type = *cur;
165  if (++cur == end) {
166  t->deframe_state = GRPC_DTS_FH_4;
167  return GRPC_ERROR_NONE;
168  }
170  case GRPC_DTS_FH_4:
172  t->incoming_frame_flags = *cur;
173  if (++cur == end) {
174  t->deframe_state = GRPC_DTS_FH_5;
175  return GRPC_ERROR_NONE;
176  }
178  case GRPC_DTS_FH_5:
180  t->incoming_stream_id = ((static_cast<uint32_t>(*cur)) & 0x7f) << 24;
181  if (++cur == end) {
182  t->deframe_state = GRPC_DTS_FH_6;
183  return GRPC_ERROR_NONE;
184  }
186  case GRPC_DTS_FH_6:
188  t->incoming_stream_id |= (static_cast<uint32_t>(*cur)) << 16;
189  if (++cur == end) {
190  t->deframe_state = GRPC_DTS_FH_7;
191  return GRPC_ERROR_NONE;
192  }
194  case GRPC_DTS_FH_7:
196  t->incoming_stream_id |= (static_cast<uint32_t>(*cur)) << 8;
197  if (++cur == end) {
198  t->deframe_state = GRPC_DTS_FH_8;
199  return GRPC_ERROR_NONE;
200  }
202  case GRPC_DTS_FH_8:
204  t->incoming_stream_id |= (static_cast<uint32_t>(*cur));
205  t->deframe_state = GRPC_DTS_FRAME;
206  err = init_frame_parser(t);
207  if (!GRPC_ERROR_IS_NONE(err)) {
208  return err;
209  }
210  if (t->incoming_frame_size == 0) {
212  if (!GRPC_ERROR_IS_NONE(err)) {
213  return err;
214  }
215  t->incoming_stream = nullptr;
216  if (++cur == end) {
217  t->deframe_state = GRPC_DTS_FH_0;
218  return GRPC_ERROR_NONE;
219  }
220  goto dts_fh_0; /* loop */
221  } else if (t->incoming_frame_size >
222  t->settings[GRPC_ACKED_SETTINGS]
225  absl::StrFormat("Frame size %d is larger than max frame size %d",
226  t->incoming_frame_size,
227  t->settings[GRPC_ACKED_SETTINGS]
229  }
230  if (++cur == end) {
231  return GRPC_ERROR_NONE;
232  }
234  case GRPC_DTS_FRAME:
236  if (static_cast<uint32_t>(end - cur) == t->incoming_frame_size) {
238  t,
239  grpc_slice_sub_no_ref(slice, static_cast<size_t>(cur - beg),
240  static_cast<size_t>(end - beg)),
241  1);
242  if (!GRPC_ERROR_IS_NONE(err)) {
243  return err;
244  }
245  t->deframe_state = GRPC_DTS_FH_0;
246  t->incoming_stream = nullptr;
247  return GRPC_ERROR_NONE;
248  } else if (static_cast<uint32_t>(end - cur) > t->incoming_frame_size) {
249  size_t cur_offset = static_cast<size_t>(cur - beg);
251  t,
252  grpc_slice_sub_no_ref(slice, cur_offset,
253  cur_offset + t->incoming_frame_size),
254  1);
255  if (!GRPC_ERROR_IS_NONE(err)) {
256  return err;
257  }
258  cur += t->incoming_frame_size;
259  t->incoming_stream = nullptr;
260  goto dts_fh_0; /* loop */
261  } else {
263  t,
264  grpc_slice_sub_no_ref(slice, static_cast<size_t>(cur - beg),
265  static_cast<size_t>(end - beg)),
266  0);
267  if (!GRPC_ERROR_IS_NONE(err)) {
268  return err;
269  }
270  t->incoming_frame_size -= static_cast<uint32_t>(end - cur);
271  return GRPC_ERROR_NONE;
272  }
274  }
275 
277 }
278 
280  if (t->is_first_frame &&
281  t->incoming_frame_type != GRPC_CHTTP2_FRAME_SETTINGS) {
283  "Expected SETTINGS frame as the first frame, got frame type ",
284  t->incoming_frame_type));
285  }
286  t->is_first_frame = false;
287  if (t->expect_continuation_stream_id != 0) {
288  if (t->incoming_frame_type != GRPC_CHTTP2_FRAME_CONTINUATION) {
290  absl::StrFormat("Expected CONTINUATION frame, got frame type %02x",
291  t->incoming_frame_type));
292  }
293  if (t->expect_continuation_stream_id != t->incoming_stream_id) {
295  "Expected CONTINUATION frame for grpc_chttp2_stream %08x, got "
296  "grpc_chttp2_stream %08x",
297  t->expect_continuation_stream_id, t->incoming_stream_id));
298  }
299  return init_header_frame_parser(t, 1);
300  }
301  switch (t->incoming_frame_type) {
303  return init_data_frame_parser(t);
305  return init_header_frame_parser(t, 0);
308  "Unexpected CONTINUATION frame");
310  return init_rst_stream_parser(t);
312  return init_settings_frame_parser(t);
316  return init_ping_parser(t);
318  return init_goaway_parser(t);
319  default:
321  gpr_log(GPR_ERROR, "Unknown frame type %02x", t->incoming_frame_type);
322  }
324  }
325 }
326 
327 static grpc_error_handle skip_parser(void* /*parser*/,
328  grpc_chttp2_transport* /*t*/,
329  grpc_chttp2_stream* /*s*/,
330  const grpc_slice& /*slice*/,
331  int /*is_last*/) {
332  return GRPC_ERROR_NONE;
333 }
334 
335 static HPackParser::Boundary hpack_boundary_type(grpc_chttp2_transport* t,
336  bool is_eoh) {
337  if (is_eoh) {
338  if (t->header_eof) {
339  return HPackParser::Boundary::EndOfStream;
340  } else {
341  return HPackParser::Boundary::EndOfHeaders;
342  }
343  } else {
345  }
346 }
347 
348 static HPackParser::LogInfo hpack_parser_log_info(
350  return HPackParser::LogInfo{
351  t->incoming_stream_id,
352  type,
353  t->is_client,
354  };
355 }
356 
358  grpc_chttp2_transport* t, HPackParser::Priority priority_type) {
359  bool is_eoh = t->expect_continuation_stream_id != 0;
361  t->parser_data = &t->hpack_parser;
362  t->hpack_parser.BeginFrame(
363  nullptr,
364  t->settings[GRPC_ACKED_SETTINGS]
366  hpack_boundary_type(t, is_eoh), priority_type,
367  hpack_parser_log_info(t, HPackParser::LogInfo::kDontKnow));
368  return GRPC_ERROR_NONE;
369 }
370 
373  t->parser = skip_parser;
374  return GRPC_ERROR_NONE;
375 }
376 
378  if (t->parser == grpc_chttp2_header_parser_parse) {
379  t->hpack_parser.StopBufferingFrame();
380  } else {
381  t->parser = skip_parser;
382  }
383 }
384 
386  // Update BDP accounting since we have received a data frame.
387  grpc_core::BdpEstimator* bdp_est = t->flow_control.bdp_estimator();
388  if (bdp_est) {
389  if (t->bdp_ping_blocked) {
390  t->bdp_ping_blocked = false;
391  GRPC_CHTTP2_REF_TRANSPORT(t, "bdp_ping");
393  }
394  bdp_est->AddIncomingBytes(t->incoming_frame_size);
395  }
396  grpc_chttp2_stream* s =
397  grpc_chttp2_parsing_lookup_stream(t, t->incoming_stream_id);
400  if (s == nullptr) {
402  &t->flow_control);
403  status = upd.RecvData(t->incoming_frame_size);
404  action = upd.MakeAction();
405  } else {
407  &s->flow_control);
408  status = upd.RecvData(t->incoming_frame_size);
409  action = upd.MakeAction();
410  }
412  if (!status.ok()) {
413  goto error_handler;
414  }
415  if (s == nullptr) {
417  }
418  s->received_bytes += t->incoming_frame_size;
419  s->stats.incoming.framing_bytes += 9;
420  if (s->read_closed) {
422  }
423  status =
424  grpc_chttp2_data_parser_begin_frame(t->incoming_frame_flags, s->id, s);
425 error_handler:
426  if (status.ok()) {
427  t->incoming_stream = s;
428  /* t->parser = grpc_chttp2_data_parser_parse;*/
429  t->parser = grpc_chttp2_data_parser_parse;
430  t->parser_data = nullptr;
431  t->ping_state.last_ping_sent_time = grpc_core::Timestamp::InfPast();
432  return GRPC_ERROR_NONE;
433  } else if (s != nullptr) {
434  /* handle stream errors by closing the stream */
435  grpc_chttp2_mark_stream_closed(t, s, true, false,
437  grpc_chttp2_add_rst_stream_to_next_write(t, t->incoming_stream_id,
439  &s->stats.outgoing);
441  } else {
443  }
444 }
445 
447  int is_continuation) {
448  const bool is_eoh =
449  (t->incoming_frame_flags & GRPC_CHTTP2_DATA_FLAG_END_HEADERS) != 0;
451 
452  /* TODO(ctiller): when to increment header_frames_received? */
453 
454  if (is_eoh) {
455  t->expect_continuation_stream_id = 0;
456  } else {
457  t->expect_continuation_stream_id = t->incoming_stream_id;
458  }
459 
460  if (!is_continuation) {
461  t->header_eof =
462  (t->incoming_frame_flags & GRPC_CHTTP2_DATA_FLAG_END_STREAM) != 0;
463  }
464 
465  const auto priority_type = !is_continuation && (t->incoming_frame_flags &
467  ? HPackParser::Priority::Included
469 
470  t->ping_state.last_ping_sent_time = grpc_core::Timestamp::InfPast();
471 
472  /* could be a new grpc_chttp2_stream or an existing grpc_chttp2_stream */
473  s = grpc_chttp2_parsing_lookup_stream(t, t->incoming_stream_id);
474  if (s == nullptr) {
475  if (GPR_UNLIKELY(is_continuation)) {
478  "grpc_chttp2_stream disbanded before CONTINUATION received"));
479  return init_header_skip_frame_parser(t, priority_type);
480  }
481  if (t->is_client) {
482  if (GPR_LIKELY((t->incoming_stream_id & 1) &&
483  t->incoming_stream_id < t->next_stream_id)) {
484  /* this is an old (probably cancelled) grpc_chttp2_stream */
485  } else {
487  GPR_ERROR, "ignoring new grpc_chttp2_stream creation on client"));
488  }
489  return init_header_skip_frame_parser(t, priority_type);
490  } else if (GPR_UNLIKELY(t->last_new_stream_id >= t->incoming_stream_id)) {
492  GPR_ERROR,
493  "ignoring out of order new grpc_chttp2_stream request on server; "
494  "last grpc_chttp2_stream "
495  "id=%d, new grpc_chttp2_stream id=%d",
496  t->last_new_stream_id, t->incoming_stream_id));
497  return init_header_skip_frame_parser(t, priority_type);
498  } else if (GPR_UNLIKELY((t->incoming_stream_id & 1) == 0)) {
500  GPR_ERROR,
501  "ignoring grpc_chttp2_stream with non-client generated index %d",
502  t->incoming_stream_id));
503  return init_header_skip_frame_parser(t, priority_type);
504  } else if (GPR_UNLIKELY(
505  grpc_chttp2_stream_map_size(&t->stream_map) >=
506  t->settings[GRPC_ACKED_SETTINGS]
508  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Max stream count exceeded");
509  } else if (t->sent_goaway_state == GRPC_CHTTP2_FINAL_GOAWAY_SENT) {
511  GPR_INFO,
512  "transport:%p SERVER peer:%s Final GOAWAY sent. Ignoring new "
513  "grpc_chttp2_stream request id=%d, last grpc_chttp2_stream id=%d",
514  t, t->peer_string.c_str(), t->incoming_stream_id,
515  t->last_new_stream_id));
516  return init_header_skip_frame_parser(t, priority_type);
517  }
518  t->last_new_stream_id = t->incoming_stream_id;
519  s = t->incoming_stream =
520  grpc_chttp2_parsing_accept_stream(t, t->incoming_stream_id);
521  if (GPR_UNLIKELY(s == nullptr)) {
523  gpr_log(GPR_ERROR, "grpc_chttp2_stream not accepted"));
524  return init_header_skip_frame_parser(t, priority_type);
525  }
526  if (t->channelz_socket != nullptr) {
527  t->channelz_socket->RecordStreamStartedFromRemote();
528  }
529  } else {
530  t->incoming_stream = s;
531  }
532  GPR_DEBUG_ASSERT(s != nullptr);
533  s->stats.incoming.framing_bytes += 9;
534  if (GPR_UNLIKELY(s->read_closed)) {
536  GPR_ERROR, "skipping already closed grpc_chttp2_stream header"));
537  t->incoming_stream = nullptr;
538  return init_header_skip_frame_parser(t, priority_type);
539  }
541  t->parser_data = &t->hpack_parser;
542  if (t->header_eof) {
543  s->eos_received = true;
544  }
545  grpc_metadata_batch* incoming_metadata_buffer = nullptr;
546  HPackParser::LogInfo::Type frame_type = HPackParser::LogInfo::kDontKnow;
547  switch (s->header_frames_received) {
548  case 0:
549  if (t->is_client && t->header_eof) {
550  GRPC_CHTTP2_IF_TRACING(gpr_log(GPR_INFO, "parsing Trailers-Only"));
551  if (s->trailing_metadata_available != nullptr) {
552  *s->trailing_metadata_available = true;
553  }
554  incoming_metadata_buffer = &s->trailing_metadata_buffer;
555  frame_type = HPackParser::LogInfo::kTrailers;
556  } else {
557  GRPC_CHTTP2_IF_TRACING(gpr_log(GPR_INFO, "parsing initial_metadata"));
558  incoming_metadata_buffer = &s->initial_metadata_buffer;
559  frame_type = HPackParser::LogInfo::kHeaders;
560  }
561  break;
562  case 1:
563  GRPC_CHTTP2_IF_TRACING(gpr_log(GPR_INFO, "parsing trailing_metadata"));
564  incoming_metadata_buffer = &s->trailing_metadata_buffer;
565  frame_type = HPackParser::LogInfo::kTrailers;
566  break;
567  case 2:
568  gpr_log(GPR_ERROR, "too many header frames received");
569  return init_header_skip_frame_parser(t, priority_type);
570  }
571  if (frame_type == HPackParser::LogInfo::kTrailers && !t->header_eof) {
573  "Trailing metadata frame received without an end-o-stream");
574  }
575  t->hpack_parser.BeginFrame(
576  incoming_metadata_buffer,
577  t->settings[GRPC_ACKED_SETTINGS]
579  hpack_boundary_type(t, is_eoh), priority_type,
580  hpack_parser_log_info(t, frame_type));
581  return GRPC_ERROR_NONE;
582 }
583 
587  &t->simple.window_update, t->incoming_frame_size,
588  t->incoming_frame_flags);
589  if (!GRPC_ERROR_IS_NONE(err)) return err;
590  if (t->incoming_stream_id != 0) {
591  grpc_chttp2_stream* s = t->incoming_stream =
592  grpc_chttp2_parsing_lookup_stream(t, t->incoming_stream_id);
593  if (s == nullptr) {
595  }
596  s->stats.incoming.framing_bytes += 9;
597  }
599  t->parser_data = &t->simple.window_update;
600  return GRPC_ERROR_NONE;
601 }
602 
605  &t->simple.ping, t->incoming_frame_size, t->incoming_frame_flags);
606  if (!GRPC_ERROR_IS_NONE(err)) return err;
607  t->parser = grpc_chttp2_ping_parser_parse;
608  t->parser_data = &t->simple.ping;
609  return GRPC_ERROR_NONE;
610 }
611 
614  &t->simple.rst_stream, t->incoming_frame_size, t->incoming_frame_flags);
615  if (!GRPC_ERROR_IS_NONE(err)) return err;
616  grpc_chttp2_stream* s = t->incoming_stream =
617  grpc_chttp2_parsing_lookup_stream(t, t->incoming_stream_id);
618  if (!t->incoming_stream) {
620  }
621  s->stats.incoming.framing_bytes += 9;
623  t->parser_data = &t->simple.rst_stream;
624  return GRPC_ERROR_NONE;
625 }
626 
629  &t->goaway_parser, t->incoming_frame_size, t->incoming_frame_flags);
630  if (!GRPC_ERROR_IS_NONE(err)) return err;
632  t->parser_data = &t->goaway_parser;
633  return GRPC_ERROR_NONE;
634 }
635 
637  if (t->incoming_stream_id != 0) {
639  "Settings frame received for grpc_chttp2_stream");
640  }
641 
643  &t->simple.settings, t->incoming_frame_size, t->incoming_frame_flags,
644  t->settings[GRPC_PEER_SETTINGS]);
645  if (!GRPC_ERROR_IS_NONE(err)) {
646  return err;
647  }
648  if (t->incoming_frame_flags & GRPC_CHTTP2_FLAG_ACK) {
649  memcpy(t->settings[GRPC_ACKED_SETTINGS], t->settings[GRPC_SENT_SETTINGS],
651  t->hpack_parser.hpack_table()->SetMaxBytes(
652  t->settings[GRPC_ACKED_SETTINGS]
654  t->flow_control.SetAckedInitialWindow(
655  t->settings[GRPC_ACKED_SETTINGS]
657  t->sent_local_settings = false;
658  }
660  t->parser_data = &t->simple.settings;
661  return GRPC_ERROR_NONE;
662 }
663 
665  const grpc_slice& slice,
666  int is_last) {
667  grpc_chttp2_stream* s = t->incoming_stream;
668  grpc_error_handle err = t->parser(t->parser_data, t, s, slice, is_last);
669  intptr_t unused;
671  return err;
672  } else if (grpc_error_get_int(err, GRPC_ERROR_INT_STREAM_ID, &unused)) {
675  }
677  if (s) {
678  s->forced_close_error = err;
679  grpc_chttp2_add_rst_stream_to_next_write(t, t->incoming_stream_id,
681  &s->stats.outgoing);
682  } else {
684  }
685  }
686  return err;
687 }
GRPC_DTS_CLIENT_PREFIX_11
@ GRPC_DTS_CLIENT_PREFIX_11
Definition: src/core/ext/transport/chttp2/transport/internal.h:168
GRPC_DTS_FH_7
@ GRPC_DTS_FH_7
Definition: src/core/ext/transport/chttp2/transport/internal.h:190
trace.h
Type
struct Type Type
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:673
GPR_INFO
#define GPR_INFO
Definition: include/grpc/impl/codegen/log.h:56
GRPC_DTS_FH_2
@ GRPC_DTS_FH_2
Definition: src/core/ext/transport/chttp2/transport/internal.h:185
GRPC_ERROR_NONE
#define GRPC_ERROR_NONE
Definition: error.h:234
get_utf8_safe_char
static char get_utf8_safe_char(char c)
Definition: parsing.cc:78
log.h
metadata_batch.h
GRPC_SENT_SETTINGS
@ GRPC_SENT_SETTINGS
Definition: src/core/ext/transport/chttp2/transport/internal.h:212
GRPC_DTS_FH_5
@ GRPC_DTS_FH_5
Definition: src/core/ext/transport/chttp2/transport/internal.h:188
GRPC_DTS_CLIENT_PREFIX_8
@ GRPC_DTS_CLIENT_PREFIX_8
Definition: src/core/ext/transport/chttp2/transport/internal.h:165
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
grpc_chttp2_parsing_lookup_stream
grpc_chttp2_stream * grpc_chttp2_parsing_lookup_stream(grpc_chttp2_transport *t, uint32_t id)
Definition: src/core/ext/transport/chttp2/transport/internal.h:651
absl::StrFormat
ABSL_MUST_USE_RESULT std::string StrFormat(const FormatSpec< Args... > &format, const Args &... args)
Definition: abseil-cpp/absl/strings/str_format.h:338
GPR_DEBUG_ASSERT
#define GPR_DEBUG_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:103
GRPC_CHTTP2_FRAME_WINDOW_UPDATE
#define GRPC_CHTTP2_FRAME_WINDOW_UPDATE
Definition: frame.h:35
grpc_chttp2_parsing_accept_stream
grpc_chttp2_stream * grpc_chttp2_parsing_accept_stream(grpc_chttp2_transport *t, uint32_t id)
Definition: chttp2_transport.cc:766
slice.h
internal.h
GRPC_CHTTP2_FLAG_ACK
#define GRPC_CHTTP2_FLAG_ACK
Definition: frame.h:38
grpc_chttp2_ping_parser_begin_frame
grpc_error_handle grpc_chttp2_ping_parser_begin_frame(grpc_chttp2_ping_parser *parser, uint32_t length, uint8_t flags)
Definition: frame_ping.cc:64
init_header_skip_frame_parser
static grpc_error_handle init_header_skip_frame_parser(grpc_chttp2_transport *t, HPackParser::Priority priority_type)
Definition: parsing.cc:357
GRPC_DTS_CLIENT_PREFIX_16
@ GRPC_DTS_CLIENT_PREFIX_16
Definition: src/core/ext/transport/chttp2/transport/internal.h:173
init_frame_parser
static grpc_error_handle init_frame_parser(grpc_chttp2_transport *t)
Definition: parsing.cc:279
GPR_LIKELY
#define GPR_LIKELY(x)
Definition: impl/codegen/port_platform.h:769
string.h
grpc_chttp2_rst_stream_parser_parse
grpc_error_handle grpc_chttp2_rst_stream_parser_parse(void *parser, grpc_chttp2_transport *t, grpc_chttp2_stream *s, const grpc_slice &slice, int is_last)
Definition: frame_rst_stream.cc:85
GRPC_DTS_CLIENT_PREFIX_0
@ GRPC_DTS_CLIENT_PREFIX_0
Definition: src/core/ext/transport/chttp2/transport/internal.h:157
init_settings_frame_parser
static grpc_error_handle init_settings_frame_parser(grpc_chttp2_transport *t)
Definition: parsing.cc:636
GRPC_DTS_CLIENT_PREFIX_12
@ GRPC_DTS_CLIENT_PREFIX_12
Definition: src/core/ext/transport/chttp2/transport/internal.h:169
error_ref_leak.err
err
Definition: error_ref_leak.py:35
GRPC_DTS_CLIENT_PREFIX_6
@ GRPC_DTS_CLIENT_PREFIX_6
Definition: src/core/ext/transport/chttp2/transport/internal.h:163
GRPC_DTS_CLIENT_PREFIX_19
@ GRPC_DTS_CLIENT_PREFIX_19
Definition: src/core/ext/transport/chttp2/transport/internal.h:176
grpc_http_trace
grpc_core::TraceFlag grpc_http_trace(false, "http")
GRPC_CHTTP2_DATA_FLAG_END_HEADERS
#define GRPC_CHTTP2_DATA_FLAG_END_HEADERS
Definition: frame.h:39
frame_settings.h
grpc_core::HPackParser
Definition: hpack_parser.h:40
status
absl::Status status
Definition: rls.cc:251
grpc_chttp2_settings_parser_parse
grpc_error_handle grpc_chttp2_settings_parser_parse(void *p, grpc_chttp2_transport *t, grpc_chttp2_stream *, const grpc_slice &slice, int is_last)
Definition: frame_settings.cc:120
frame_data.h
grpc_core::Timestamp::InfPast
static constexpr Timestamp InfPast()
Definition: src/core/lib/gprpp/time.h:83
GRPC_CHTTP2_SETTINGS_HEADER_TABLE_SIZE
@ GRPC_CHTTP2_SETTINGS_HEADER_TABLE_SIZE
Definition: http2_settings.h:29
grpc_chttp2_parsing_become_skip_parser
void grpc_chttp2_parsing_become_skip_parser(grpc_chttp2_transport *t)
Definition: parsing.cc:377
skip_parser
static grpc_error_handle skip_parser(void *, grpc_chttp2_transport *, grpc_chttp2_stream *, const grpc_slice &, int)
Definition: parsing.cc:327
GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS
@ GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS
Definition: http2_settings.h:31
GRPC_DTS_CLIENT_PREFIX_10
@ GRPC_DTS_CLIENT_PREFIX_10
Definition: src/core/ext/transport/chttp2/transport/internal.h:167
grpc_chttp2_window_update_parser_parse
grpc_error_handle grpc_chttp2_window_update_parser_parse(void *parser, grpc_chttp2_transport *t, grpc_chttp2_stream *s, const grpc_slice &slice, int is_last)
Definition: frame_window_update.cc:70
channelz.h
grpc_slice_sub_no_ref
GPRAPI grpc_slice grpc_slice_sub_no_ref(grpc_slice s, size_t begin, size_t end)
Definition: slice/slice.cc:264
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
GRPC_TRACE_FLAG_ENABLED
#define GRPC_TRACE_FLAG_ENABLED(f)
Definition: debug/trace.h:114
GRPC_CHTTP2_FRAME_HEADER
#define GRPC_CHTTP2_FRAME_HEADER
Definition: frame.h:29
grpc_chttp2_stream
Definition: src/core/ext/transport/chttp2/transport/internal.h:456
grpc_core::chttp2::StreamFlowControl::IncomingUpdateContext::MakeAction
FlowControlAction MakeAction()
Definition: flow_control.h:308
init_goaway_parser
static grpc_error_handle init_goaway_parser(grpc_chttp2_transport *t)
Definition: parsing.cc:627
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
GRPC_DTS_CLIENT_PREFIX_18
@ GRPC_DTS_CLIENT_PREFIX_18
Definition: src/core/ext/transport/chttp2/transport/internal.h:175
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
http2_settings.h
GRPC_DTS_CLIENT_PREFIX_7
@ GRPC_DTS_CLIENT_PREFIX_7
Definition: src/core/ext/transport/chttp2/transport/internal.h:164
c
void c(T a)
Definition: miscompile_with_no_unique_address_test.cc:40
hpack_parser.h
grpc_chttp2_goaway_parser_begin_frame
grpc_error_handle grpc_chttp2_goaway_parser_begin_frame(grpc_chttp2_goaway_parser *p, uint32_t length, uint8_t)
Definition: frame_goaway.cc:43
init_rst_stream_parser
static grpc_error_handle init_rst_stream_parser(grpc_chttp2_transport *t)
Definition: parsing.cc:612
end
char * end
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1008
gen_stats_data.c_str
def c_str(s, encoding='ascii')
Definition: gen_stats_data.py:38
GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE
@ GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE
Definition: http2_settings.h:33
GRPC_DTS_CLIENT_PREFIX_3
@ GRPC_DTS_CLIENT_PREFIX_3
Definition: src/core/ext/transport/chttp2/transport/internal.h:160
grpc_core::chttp2::StreamFlowControl::IncomingUpdateContext
Definition: flow_control.h:303
grpc_chttp2_goaway_parser_parse
grpc_error_handle grpc_chttp2_goaway_parser_parse(void *parser, grpc_chttp2_transport *t, grpc_chttp2_stream *, const grpc_slice &slice, int is_last)
Definition: frame_goaway.cc:58
slice
grpc_slice slice
Definition: src/core/lib/surface/server.cc:467
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
GPR_UNLIKELY
#define GPR_UNLIKELY(x)
Definition: impl/codegen/port_platform.h:770
init_header_frame_parser
static grpc_error_handle init_header_frame_parser(grpc_chttp2_transport *t, int is_continuation)
Definition: parsing.cc:446
GRPC_CHTTP2_FINAL_GOAWAY_SENT
@ GRPC_CHTTP2_FINAL_GOAWAY_SENT
Definition: src/core/ext/transport/chttp2/transport/internal.h:222
GRPC_DTS_CLIENT_PREFIX_4
@ GRPC_DTS_CLIENT_PREFIX_4
Definition: src/core/ext/transport/chttp2/transport/internal.h:161
grpc_chttp2_act_on_flowctl_action
void grpc_chttp2_act_on_flowctl_action(const grpc_core::chttp2::FlowControlAction &action, grpc_chttp2_transport *t, grpc_chttp2_stream *s)
Definition: chttp2_transport.cc:2452
GRPC_CHTTP2_FRAME_PING
#define GRPC_CHTTP2_FRAME_PING
Definition: frame.h:33
grpc_chttp2_window_update_parser_begin_frame
grpc_error_handle grpc_chttp2_window_update_parser_begin_frame(grpc_chttp2_window_update_parser *parser, uint32_t length, uint8_t flags)
Definition: frame_window_update.cc:59
GRPC_DTS_FH_0
@ GRPC_DTS_FH_0
Definition: src/core/ext/transport/chttp2/transport/internal.h:183
frame_goaway.h
GRPC_ERROR_INT_STREAM_ID
@ GRPC_ERROR_INT_STREAM_ID
Definition: error.h:63
GRPC_SLICE_START_PTR
#define GRPC_SLICE_START_PTR(slice)
Definition: include/grpc/impl/codegen/slice.h:101
GRPC_CHTTP2_FRAME_CONTINUATION
#define GRPC_CHTTP2_FRAME_CONTINUATION
Definition: frame.h:30
grpc_error_get_int
bool grpc_error_get_int(grpc_error_handle err, grpc_error_ints which, intptr_t *p)
Definition: error.cc:635
GRPC_DTS_FH_8
@ GRPC_DTS_FH_8
Definition: src/core/ext/transport/chttp2/transport/internal.h:192
time.h
grpc_empty_slice
GPRAPI grpc_slice grpc_empty_slice(void)
Definition: slice/slice.cc:42
grpc_slice
Definition: include/grpc/impl/codegen/slice.h:65
intptr_t
_W64 signed int intptr_t
Definition: stdint-msvc2008.h:118
GRPC_DTS_CLIENT_PREFIX_22
@ GRPC_DTS_CLIENT_PREFIX_22
Definition: src/core/ext/transport/chttp2/transport/internal.h:179
frame_ping.h
error.h
init_window_update_frame_parser
static grpc_error_handle init_window_update_frame_parser(grpc_chttp2_transport *t)
Definition: parsing.cc:584
grpc_core::chttp2::TransportFlowControl::IncomingUpdateContext::RecvData
absl::Status RecvData(int64_t incoming_frame_size, absl::FunctionRef< absl::Status()> stream=[]() { return absl::OkStatus();})
Definition: flow_control.cc:152
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
GPR_UNREACHABLE_CODE
#define GPR_UNREACHABLE_CODE(STATEMENT)
Definition: impl/codegen/port_platform.h:652
grpc_chttp2_settings_parser_begin_frame
grpc_error_handle grpc_chttp2_settings_parser_begin_frame(grpc_chttp2_settings_parser *parser, uint32_t length, uint8_t flags, uint32_t *settings)
Definition: frame_settings.cc:94
GRPC_SLICE_END_PTR
#define GRPC_SLICE_END_PTR(slice)
Definition: include/grpc/impl/codegen/slice.h:110
grpc_core::chttp2::FlowControlAction
Definition: flow_control.h:71
GRPC_DTS_CLIENT_PREFIX_23
@ GRPC_DTS_CLIENT_PREFIX_23
Definition: src/core/ext/transport/chttp2/transport/internal.h:180
grpc_chttp2_data_parser_parse
grpc_error_handle grpc_chttp2_data_parser_parse(void *, grpc_chttp2_transport *t, grpc_chttp2_stream *s, const grpc_slice &slice, int is_last)
Definition: frame_data.cc:137
schedule_bdp_ping_locked
void schedule_bdp_ping_locked(grpc_chttp2_transport *t)
Definition: chttp2_transport.cc:2612
GRPC_PEER_SETTINGS
@ GRPC_PEER_SETTINGS
Definition: src/core/ext/transport/chttp2/transport/internal.h:208
GRPC_CHTTP2_FRAME_GOAWAY
#define GRPC_CHTTP2_FRAME_GOAWAY
Definition: frame.h:34
stdint.h
stream_map.h
grpc_chttp2_deframe_transport_state
grpc_chttp2_deframe_transport_state
Definition: src/core/ext/transport/chttp2/transport/internal.h:155
bdp_estimator.h
GRPC_CHTTP2_FRAME_RST_STREAM
#define GRPC_CHTTP2_FRAME_RST_STREAM
Definition: frame.h:31
GRPC_ERROR_CREATE_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
Definition: error.h:291
grpc_chttp2_stream_map_size
size_t grpc_chttp2_stream_map_size(grpc_chttp2_stream_map *map)
Definition: stream_map.cc:150
frame.h
GRPC_DTS_CLIENT_PREFIX_2
@ GRPC_DTS_CLIENT_PREFIX_2
Definition: src/core/ext/transport/chttp2/transport/internal.h:159
grpc_core::chttp2::StreamFlowControl::IncomingUpdateContext::RecvData
absl::Status RecvData(int64_t incoming_frame_size)
Definition: flow_control.cc:133
grpc_chttp2_rst_stream_parser_begin_frame
grpc_error_handle grpc_chttp2_rst_stream_parser_begin_frame(grpc_chttp2_rst_stream_parser *parser, uint32_t length, uint8_t flags)
Definition: frame_rst_stream.cc:75
GRPC_ACKED_SETTINGS
@ GRPC_ACKED_SETTINGS
Definition: src/core/ext/transport/chttp2/transport/internal.h:214
GRPC_CHTTP2_REF_TRANSPORT
#define GRPC_CHTTP2_REF_TRANSPORT(t, r)
Definition: src/core/ext/transport/chttp2/transport/internal.h:713
GRPC_DTS_FH_4
@ GRPC_DTS_FH_4
Definition: src/core/ext/transport/chttp2/transport/internal.h:187
memory_diff.cur
def cur
Definition: memory_diff.py:83
GRPC_DTS_FH_3
@ GRPC_DTS_FH_3
Definition: src/core/ext/transport/chttp2/transport/internal.h:186
hpack_parser_table.h
GRPC_DTS_CLIENT_PREFIX_13
@ GRPC_DTS_CLIENT_PREFIX_13
Definition: src/core/ext/transport/chttp2/transport/internal.h:170
resolver_component_tests_runner.None
None
Definition: resolver_component_tests_runner.py:28
GRPC_CHTTP2_FRAME_SETTINGS
#define GRPC_CHTTP2_FRAME_SETTINGS
Definition: frame.h:32
absl_status_to_grpc_error
grpc_error_handle absl_status_to_grpc_error(absl::Status status)
Definition: error_utils.cc:167
GRPC_CHTTP2_NUM_SETTINGS
#define GRPC_CHTTP2_NUM_SETTINGS
Definition: http2_settings.h:38
GRPC_DTS_CLIENT_PREFIX_14
@ GRPC_DTS_CLIENT_PREFIX_14
Definition: src/core/ext/transport/chttp2/transport/internal.h:171
client.action
action
Definition: examples/python/xds/client.py:49
grpc_core::chttp2::TransportFlowControl::IncomingUpdateContext
Definition: flow_control.h:162
GRPC_CHTTP2_IF_TRACING
#define GRPC_CHTTP2_IF_TRACING(stmt)
Definition: src/core/ext/transport/chttp2/transport/internal.h:682
grpc_error_std_string
std::string grpc_error_std_string(grpc_error_handle error)
Definition: error.cc:944
GRPC_CHTTP2_FLAG_HAS_PRIORITY
#define GRPC_CHTTP2_FLAG_HAS_PRIORITY
Definition: frame.h:41
GRPC_CHTTP2_CLIENT_CONNECT_STRING
#define GRPC_CHTTP2_CLIENT_CONNECT_STRING
Definition: src/core/ext/transport/chttp2/transport/internal.h:675
GRPC_CHTTP2_DATA_FLAG_END_STREAM
#define GRPC_CHTTP2_DATA_FLAG_END_STREAM
Definition: frame.h:37
absl::Status
Definition: third_party/abseil-cpp/absl/status/status.h:424
GRPC_CHTTP2_FRAME_DATA
#define GRPC_CHTTP2_FRAME_DATA
Definition: frame.h:28
GRPC_ERROR_CREATE_FROM_CPP_STRING
#define GRPC_ERROR_CREATE_FROM_CPP_STRING(desc)
Definition: error.h:297
GRPC_DTS_CLIENT_PREFIX_15
@ GRPC_DTS_CLIENT_PREFIX_15
Definition: src/core/ext/transport/chttp2/transport/internal.h:172
init_non_header_skip_frame_parser
static grpc_error_handle init_non_header_skip_frame_parser(grpc_chttp2_transport *t)
Definition: parsing.cc:371
frame_window_update.h
flow_control.h
GRPC_DTS_FH_6
@ GRPC_DTS_FH_6
Definition: src/core/ext/transport/chttp2/transport/internal.h:189
init_data_frame_parser
static grpc_error_handle init_data_frame_parser(grpc_chttp2_transport *t)
Definition: parsing.cc:385
GRPC_DTS_CLIENT_PREFIX_17
@ GRPC_DTS_CLIENT_PREFIX_17
Definition: src/core/ext/transport/chttp2/transport/internal.h:174
http2_errors.h
grpc_chttp2_transport
Definition: src/core/ext/transport/chttp2/transport/internal.h:238
GRPC_DTS_FRAME
@ GRPC_DTS_FRAME
Definition: src/core/ext/transport/chttp2/transport/internal.h:194
hpack_encoder.h
GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE
@ GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE
Definition: http2_settings.h:32
absl::Status::ok
ABSL_MUST_USE_RESULT bool ok() const
Definition: third_party/abseil-cpp/absl/status/status.h:802
GRPC_DTS_FH_1
@ GRPC_DTS_FH_1
Definition: src/core/ext/transport/chttp2/transport/internal.h:184
grpc_chttp2_mark_stream_closed
void grpc_chttp2_mark_stream_closed(grpc_chttp2_transport *t, grpc_chttp2_stream *s, int close_reads, int close_writes, grpc_error_handle error)
Definition: chttp2_transport.cc:2193
GRPC_ERROR_UNREF
#define GRPC_ERROR_UNREF(err)
Definition: error.h:262
ref_counted_ptr.h
hpack_boundary_type
static HPackParser::Boundary hpack_boundary_type(grpc_chttp2_transport *t, bool is_eoh)
Definition: parsing.cc:335
transport.h
grpc_chttp2_add_rst_stream_to_next_write
void grpc_chttp2_add_rst_stream_to_next_write(grpc_chttp2_transport *t, uint32_t id, uint32_t code, grpc_transport_one_way_stats *stats)
Definition: frame_rst_stream.cc:67
GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE
@ GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE
Definition: http2_settings.h:34
parse_frame_slice
static grpc_error_handle parse_frame_slice(grpc_chttp2_transport *t, const grpc_slice &slice, int is_last)
Definition: parsing.cc:664
init_ping_parser
static grpc_error_handle init_ping_parser(grpc_chttp2_transport *t)
Definition: parsing.cc:603
GRPC_DTS_CLIENT_PREFIX_9
@ GRPC_DTS_CLIENT_PREFIX_9
Definition: src/core/ext/transport/chttp2/transport/internal.h:166
grpc_chttp2_perform_read
grpc_error_handle grpc_chttp2_perform_read(grpc_chttp2_transport *t, const grpc_slice &slice)
Definition: parsing.cc:82
grpc_core::chttp2::TransportFlowControl::IncomingUpdateContext::MakeAction
FlowControlAction MakeAction()
Definition: flow_control.h:172
grpc_core::BdpEstimator::AddIncomingBytes
void AddIncomingBytes(int64_t num_bytes)
Definition: bdp_estimator.h:45
hpack_parser_log_info
static HPackParser::LogInfo hpack_parser_log_info(grpc_chttp2_transport *t, HPackParser::LogInfo::Type type)
Definition: parsing.cc:348
grpc_chttp2_data_parser_begin_frame
absl::Status grpc_chttp2_data_parser_begin_frame(uint8_t flags, uint32_t stream_id, grpc_chttp2_stream *s)
Definition: frame_data.cc:36
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
grpc_error
Definition: error_internal.h:42
GRPC_DTS_CLIENT_PREFIX_1
@ GRPC_DTS_CLIENT_PREFIX_1
Definition: src/core/ext/transport/chttp2/transport/internal.h:158
grpc_chttp2_ping_parser_parse
grpc_error_handle grpc_chttp2_ping_parser_parse(void *parser, grpc_chttp2_transport *t, grpc_chttp2_stream *, const grpc_slice &slice, int is_last)
Definition: frame_ping.cc:76
GRPC_HTTP2_PROTOCOL_ERROR
@ GRPC_HTTP2_PROTOCOL_ERROR
Definition: http2_errors.h:25
grpc_metadata_batch
Definition: metadata_batch.h:1259
ABSL_FALLTHROUGH_INTENDED
#define ABSL_FALLTHROUGH_INTENDED
Definition: abseil-cpp/absl/base/attributes.h:641
GRPC_DTS_CLIENT_PREFIX_20
@ GRPC_DTS_CLIENT_PREFIX_20
Definition: src/core/ext/transport/chttp2/transport/internal.h:177
frame_rst_stream.h
GRPC_DTS_CLIENT_PREFIX_21
@ GRPC_DTS_CLIENT_PREFIX_21
Definition: src/core/ext/transport/chttp2/transport/internal.h:178
grpc_core::BdpEstimator
Definition: bdp_estimator.h:37
error_utils.h
GRPC_ERROR_IS_NONE
#define GRPC_ERROR_IS_NONE(err)
Definition: error.h:241
port_platform.h
GRPC_DTS_CLIENT_PREFIX_5
@ GRPC_DTS_CLIENT_PREFIX_5
Definition: src/core/ext/transport/chttp2/transport/internal.h:162
grpc_chttp2_header_parser_parse
grpc_error_handle grpc_chttp2_header_parser_parse(void *hpack_parser, grpc_chttp2_transport *t, grpc_chttp2_stream *s, const grpc_slice &slice, int is_last)
Definition: hpack_parser.cc:1353


grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:41