frame_settings.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 
22 
23 #include <string.h>
24 
25 #include <string>
26 
27 #include "absl/base/attributes.h"
28 #include "absl/strings/str_format.h"
29 
30 #include <grpc/slice_buffer.h>
31 #include <grpc/support/log.h>
32 
42 
44  *out++ = static_cast<uint8_t>(length >> 16);
45  *out++ = static_cast<uint8_t>(length >> 8);
46  *out++ = static_cast<uint8_t>(length);
48  *out++ = flags;
49  *out++ = 0;
50  *out++ = 0;
51  *out++ = 0;
52  *out++ = 0;
53  return out;
54 }
55 
57  const uint32_t* new_settings,
58  uint32_t force_mask, size_t count) {
59  size_t i;
60  uint32_t n = 0;
62  uint8_t* p;
63 
64  for (i = 0; i < count; i++) {
65  n += (new_settings[i] != old_settings[i] || (force_mask & (1u << i)) != 0);
66  }
67 
68  output = GRPC_SLICE_MALLOC(9 + 6 * n);
70 
71  for (i = 0; i < count; i++) {
72  if (new_settings[i] != old_settings[i] || (force_mask & (1u << i)) != 0) {
73  *p++ = static_cast<uint8_t>(grpc_setting_id_to_wire_id[i] >> 8);
74  *p++ = static_cast<uint8_t>(grpc_setting_id_to_wire_id[i]);
75  *p++ = static_cast<uint8_t>(new_settings[i] >> 24);
76  *p++ = static_cast<uint8_t>(new_settings[i] >> 16);
77  *p++ = static_cast<uint8_t>(new_settings[i] >> 8);
78  *p++ = static_cast<uint8_t>(new_settings[i]);
79  old_settings[i] = new_settings[i];
80  }
81  }
82 
84 
85  return output;
86 }
87 
91  return output;
92 }
93 
96  uint32_t* settings) {
97  parser->target_settings = settings;
98  memcpy(parser->incoming_settings, settings,
100  parser->is_ack = 0;
101  parser->state = GRPC_CHTTP2_SPS_ID0;
102  if (flags == GRPC_CHTTP2_FLAG_ACK) {
103  parser->is_ack = 1;
104  if (length != 0) {
106  "non-empty settings ack frame received");
107  }
108  return GRPC_ERROR_NONE;
109  } else if (flags != 0) {
111  "invalid flags on settings frame");
112  } else if (length % 6 != 0) {
114  "settings frames must be a multiple of six bytes");
115  } else {
116  return GRPC_ERROR_NONE;
117  }
118 }
119 
122  grpc_chttp2_stream* /*s*/,
123  const grpc_slice& slice,
124  int is_last) {
126  static_cast<grpc_chttp2_settings_parser*>(p);
130 
131  if (parser->is_ack) {
132  return GRPC_ERROR_NONE;
133  }
134 
135  for (;;) {
136  switch (parser->state) {
137  case GRPC_CHTTP2_SPS_ID0:
138  if (cur == end) {
139  parser->state = GRPC_CHTTP2_SPS_ID0;
140  if (is_last) {
141  memcpy(parser->target_settings, parser->incoming_settings,
143  t->num_pending_induced_frames++;
147  if (t->notify_on_receive_settings != nullptr) {
149  t->notify_on_receive_settings,
151  t->notify_on_receive_settings = nullptr;
152  }
153  }
154  return GRPC_ERROR_NONE;
155  }
156  parser->id = static_cast<uint16_t>((static_cast<uint16_t>(*cur)) << 8);
157  cur++;
159  case GRPC_CHTTP2_SPS_ID1:
160  if (cur == end) {
161  parser->state = GRPC_CHTTP2_SPS_ID1;
162  return GRPC_ERROR_NONE;
163  }
164  parser->id = static_cast<uint16_t>(parser->id | (*cur));
165  cur++;
168  if (cur == end) {
169  parser->state = GRPC_CHTTP2_SPS_VAL0;
170  return GRPC_ERROR_NONE;
171  }
172  parser->value = (static_cast<uint32_t>(*cur)) << 24;
173  cur++;
176  if (cur == end) {
177  parser->state = GRPC_CHTTP2_SPS_VAL1;
178  return GRPC_ERROR_NONE;
179  }
180  parser->value |= (static_cast<uint32_t>(*cur)) << 16;
181  cur++;
184  if (cur == end) {
185  parser->state = GRPC_CHTTP2_SPS_VAL2;
186  return GRPC_ERROR_NONE;
187  }
188  parser->value |= (static_cast<uint32_t>(*cur)) << 8;
189  cur++;
192  if (cur == end) {
193  parser->state = GRPC_CHTTP2_SPS_VAL3;
194  return GRPC_ERROR_NONE;
195  } else {
196  parser->state = GRPC_CHTTP2_SPS_ID0;
197  }
198  parser->value |= *cur;
199  cur++;
200 
201  if (grpc_wire_id_to_setting_id(parser->id, &id)) {
204  if (parser->value < sp->min_value || parser->value > sp->max_value) {
205  switch (sp->invalid_value_behavior) {
207  parser->value = grpc_core::Clamp(parser->value, sp->min_value,
208  sp->max_value);
209  break;
212  t->last_new_stream_id, sp->error_value,
213  grpc_slice_from_static_string("HTTP2 settings error"),
214  &t->qbuf);
216  "invalid value %u passed for %s", parser->value, sp->name));
217  }
218  }
220  parser->incoming_settings[id] != parser->value) {
221  t->initial_window_update += static_cast<int64_t>(parser->value) -
222  parser->incoming_settings[id];
225  gpr_log(GPR_INFO, "%p[%s] adding %d for initial_window change", t,
226  t->is_client ? "cli" : "svr",
227  static_cast<int>(t->initial_window_update));
228  }
229  }
230  parser->incoming_settings[id] = parser->value;
232  gpr_log(GPR_INFO, "CHTTP2:%s:%s: got setting %s = %d",
233  t->is_client ? "CLI" : "SVR", t->peer_string.c_str(),
234  sp->name, parser->value);
235  }
237  gpr_log(GPR_ERROR, "CHTTP2: Ignoring unknown setting %d (value %d)",
238  parser->id, parser->value);
239  }
240  break;
241  }
242  }
243 }
trace.h
grpc_setting_id_to_wire_id
const uint16_t grpc_setting_id_to_wire_id[]
Definition: http2_settings.cc:28
GPR_INFO
#define GPR_INFO
Definition: include/grpc/impl/codegen/log.h:56
gen_build_yaml.out
dictionary out
Definition: src/benchmark/gen_build_yaml.py:24
GRPC_ERROR_NONE
#define GRPC_ERROR_NONE
Definition: error.h:234
log.h
GRPC_CHTTP2_CLAMP_INVALID_VALUE
@ GRPC_CHTTP2_CLAMP_INVALID_VALUE
Definition: http2_settings.h:45
grpc_flowctl_trace
grpc_core::TraceFlag grpc_flowctl_trace(false, "flowctl")
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
internal.h
uint16_t
unsigned short uint16_t
Definition: stdint-msvc2008.h:79
grpc_chttp2_setting_parameters
Definition: http2_settings.h:49
GRPC_CHTTP2_FLAG_ACK
#define GRPC_CHTTP2_FLAG_ACK
Definition: frame.h:38
grpc_chttp2_setting_parameters::error_value
uint32_t error_value
Definition: http2_settings.h:55
string.h
grpc_chttp2_settings_parser
Definition: frame_settings.h:42
useful.h
GRPC_SLICE_MALLOC
#define GRPC_SLICE_MALLOC(len)
Definition: include/grpc/slice.h:70
grpc_chttp2_settings_ack_create
grpc_slice grpc_chttp2_settings_ack_create(void)
Definition: frame_settings.cc:88
grpc_http_trace
grpc_core::TraceFlag grpc_http_trace(false, "http")
u
OPENSSL_EXPORT pem_password_cb void * u
Definition: pem.h:351
frame_settings.h
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
xds_manager.p
p
Definition: xds_manager.py:60
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_stream
Definition: src/core/ext/transport/chttp2/transport/internal.h:456
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
DEBUG_LOCATION
#define DEBUG_LOCATION
Definition: debug_location.h:41
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
grpc_chttp2_goaway_append
void grpc_chttp2_goaway_append(uint32_t last_stream_id, uint32_t error_code, const grpc_slice &debug_data, grpc_slice_buffer *slice_buffer)
Definition: frame_goaway.cc:155
asyncio_get_stats.parser
parser
Definition: asyncio_get_stats.py:34
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
end
char * end
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1008
int64_t
signed __int64 int64_t
Definition: stdint-msvc2008.h:89
gmock_output_test.output
output
Definition: bloaty/third_party/googletest/googlemock/test/gmock_output_test.py:175
GRPC_CHTTP2_SPS_VAL1
@ GRPC_CHTTP2_SPS_VAL1
Definition: frame_settings.h:37
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
frame_goaway.h
GRPC_CHTTP2_SPS_VAL3
@ GRPC_CHTTP2_SPS_VAL3
Definition: frame_settings.h:39
GRPC_SLICE_START_PTR
#define GRPC_SLICE_START_PTR(slice)
Definition: include/grpc/impl/codegen/slice.h:101
slice_buffer.h
grpc_slice_from_static_string
GPRAPI grpc_slice grpc_slice_from_static_string(const char *source)
Definition: slice/slice.cc:89
grpc_slice
Definition: include/grpc/impl/codegen/slice.h:65
GRPC_CHTTP2_DISCONNECT_ON_INVALID_VALUE
@ GRPC_CHTTP2_DISCONNECT_ON_INVALID_VALUE
Definition: http2_settings.h:46
grpc_chttp2_setting_parameters::invalid_value_behavior
grpc_chttp2_invalid_value_behavior invalid_value_behavior
Definition: http2_settings.h:54
grpc_wire_id_to_setting_id
bool grpc_wire_id_to_setting_id(uint32_t wire_id, grpc_chttp2_setting_id *out)
Definition: http2_settings.cc:30
grpc_chttp2_setting_parameters::max_value
uint32_t max_value
Definition: http2_settings.h:53
grpc_chttp2_setting_parameters::name
const char * name
Definition: http2_settings.h:50
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
grpc_chttp2_settings_create
grpc_slice grpc_chttp2_settings_create(uint32_t *old_settings, const uint32_t *new_settings, uint32_t force_mask, size_t count)
Definition: frame_settings.cc:56
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_chttp2_setting_id
grpc_chttp2_setting_id
Definition: http2_settings.h:28
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
GRPC_CHTTP2_SPS_ID1
@ GRPC_CHTTP2_SPS_ID1
Definition: frame_settings.h:35
GRPC_ERROR_CREATE_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
Definition: error.h:291
frame.h
memory_diff.cur
def cur
Definition: memory_diff.py:83
fill_header
static uint8_t * fill_header(uint8_t *out, uint32_t length, uint8_t flags)
Definition: frame_settings.cc:43
grpc_slice_buffer_add
GPRAPI void grpc_slice_buffer_add(grpc_slice_buffer *sb, grpc_slice slice)
Definition: slice/slice_buffer.cc:170
grpc_core::Clamp
T Clamp(T val, T min, T max)
Definition: useful.h:31
GRPC_CHTTP2_FRAME_SETTINGS
#define GRPC_CHTTP2_FRAME_SETTINGS
Definition: frame.h:32
debug_location.h
GRPC_CHTTP2_NUM_SETTINGS
#define GRPC_CHTTP2_NUM_SETTINGS
Definition: http2_settings.h:38
check_version.settings
settings
Definition: check_version.py:61
absl::flags_internal
Definition: abseil-cpp/absl/flags/commandlineflag.h:40
count
int * count
Definition: bloaty/third_party/googletest/googlemock/test/gmock_stress_test.cc:96
grpc_chttp2_initiate_write
void grpc_chttp2_initiate_write(grpc_chttp2_transport *t, grpc_chttp2_initiate_write_reason reason)
Definition: chttp2_transport.cc:891
GRPC_ERROR_CREATE_FROM_CPP_STRING
#define GRPC_ERROR_CREATE_FROM_CPP_STRING(desc)
Definition: error.h:297
flow_control.h
GRPC_CHTTP2_INITIATE_WRITE_SETTINGS_ACK
@ GRPC_CHTTP2_INITIATE_WRITE_SETTINGS_ACK
Definition: src/core/ext/transport/chttp2/transport/internal.h:121
grpc_chttp2_transport
Definition: src/core/ext/transport/chttp2/transport/internal.h:238
hpack_encoder.h
GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE
@ GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE
Definition: http2_settings.h:32
exec_ctx.h
GRPC_CHTTP2_SPS_VAL0
@ GRPC_CHTTP2_SPS_VAL0
Definition: frame_settings.h:36
grpc_core::ExecCtx::Run
static void Run(const DebugLocation &location, grpc_closure *closure, grpc_error_handle error)
Definition: exec_ctx.cc:98
GRPC_CHTTP2_SPS_VAL2
@ GRPC_CHTTP2_SPS_VAL2
Definition: frame_settings.h:38
grpc_chttp2_settings_parameters
const grpc_chttp2_setting_parameters grpc_chttp2_settings_parameters[GRPC_CHTTP2_NUM_SETTINGS]
Definition: http2_settings.cc:46
flags
uint32_t flags
Definition: retry_filter.cc:632
grpc_error
Definition: error_internal.h:42
length
std::size_t length
Definition: abseil-cpp/absl/time/internal/test_util.cc:57
ABSL_FALLTHROUGH_INTENDED
#define ABSL_FALLTHROUGH_INTENDED
Definition: abseil-cpp/absl/base/attributes.h:641
GRPC_CHTTP2_SPS_ID0
@ GRPC_CHTTP2_SPS_ID0
Definition: frame_settings.h:34
if
if(p->owned &&p->wrapped !=NULL)
Definition: call.c:42
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
id
uint32_t id
Definition: flow_control_fuzzer.cc:70
grpc_chttp2_setting_parameters::min_value
uint32_t min_value
Definition: http2_settings.h:52
port_platform.h


grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:59:22