17 from __future__
import print_function
24 _MAX_HEADER_LIST_SIZE = 16 * 1024 * 1024
26 Setting = collections.namedtuple(
'Setting',
'id default min max on_error')
27 OnError = collections.namedtuple(
'OnError',
'behavior code')
28 clamp_invalid_value =
OnError(
'CLAMP_INVALID_VALUE',
'PROTOCOL_ERROR')
29 disconnect_on_invalid_value =
lambda e:
OnError(
'DISCONNECT_ON_INVALID_VALUE', e
31 DecoratedSetting = collections.namedtuple(
'DecoratedSetting',
36 Setting(1, 4096, 0, 0xffffffff, clamp_invalid_value),
39 'MAX_CONCURRENT_STREAMS':
40 Setting(3, 0xffffffff, 0, 0xffffffff,
42 'INITIAL_WINDOW_SIZE':
43 Setting(4, 65535, 0, 0x7fffffff,
46 Setting(5, 16384, 16384, 16777215,
48 'MAX_HEADER_LIST_SIZE':
49 Setting(6, _MAX_HEADER_LIST_SIZE, 0, _MAX_HEADER_LIST_SIZE,
51 'GRPC_ALLOW_TRUE_BINARY_METADATA':
52 Setting(0xfe03, 0, 0, 1, clamp_invalid_value),
55 H =
open(
'src/core/ext/transport/chttp2/transport/http2_settings.h',
'w')
56 C =
open(
'src/core/ext/transport/chttp2/transport/http2_settings.c',
'w')
64 print(
' * %s' % line, file=f)
70 with open(sys.argv[0])
as my_source:
72 for line
in my_source:
75 for line
in my_source:
77 copyright.append(line)
79 for line
in my_source:
82 copyright.append(line)
83 put_banner([H, C], [line[2:].rstrip()
for line
in copyright])
87 [
"Automatically generated by tools/codegen/core/gen_settings_ids.py"])
89 print(
"#ifndef GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HTTP2_SETTINGS_H",
91 print(
"#define GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HTTP2_SETTINGS_H",
94 print(
"#include <stdint.h>", file=H)
95 print(
"#include <stdbool.h>", file=H)
98 print(
"#include \"src/core/ext/transport/chttp2/transport/http2_settings.h\"",
101 print(
"#include <grpc/support/useful.h>", file=C)
102 print(
"#include \"src/core/lib/transport/http2_errors.h\"", file=C)
105 p = perfection.hash_parameters(sorted(x.id
for x
in list(_SETTINGS.values())))
116 decorated_settings = [
118 for name, setting
in _SETTINGS.items()
121 print(
'typedef enum {', file=H)
122 for decorated_setting
in sorted(decorated_settings):
123 print(
' GRPC_CHTTP2_SETTINGS_%s = %d, /* wire id %d */' %
124 (decorated_setting.name, decorated_setting.enum,
125 decorated_setting.setting.id),
127 print(
'} grpc_chttp2_setting_id;', file=H)
129 print(
'#define GRPC_CHTTP2_NUM_SETTINGS %d' %
130 (
max(x.enum
for x
in decorated_settings) + 1),
133 print(
'extern const uint16_t grpc_setting_id_to_wire_id[];', file=H)
134 print(
'const uint16_t grpc_setting_id_to_wire_id[] = {%s};' %
135 ','.join(
'%d' % s
for s
in p.slots),
139 "bool grpc_wire_id_to_setting_id(uint32_t wire_id, grpc_chttp2_setting_id *out);",
142 'r':
','.join(
'%d' % (r
if r
is not None else 0)
for r
in p.r),
144 'offset': abs(p.offset),
145 'offset_sign':
'+' if p.offset > 0
else '-'
148 bool grpc_wire_id_to_setting_id(uint32_t wire_id, grpc_chttp2_setting_id *out) {
149 uint32_t i = wire_id %(offset_sign)s %(offset)d;
150 uint32_t x = i %% %(t)d;
151 uint32_t y = i / %(t)d;
156 for i, r
in enumerate(p.r):
160 print(
'case %d: h -= %d; break;' % (i, -r), file=C)
162 print(
'case %d: h += %d; break;' % (i, r), file=C)
165 *out = (grpc_chttp2_setting_id)h;
166 return h < GPR_ARRAY_SIZE(grpc_setting_id_to_wire_id) && grpc_setting_id_to_wire_id[h] == wire_id;
173 GRPC_CHTTP2_CLAMP_INVALID_VALUE,
174 GRPC_CHTTP2_DISCONNECT_ON_INVALID_VALUE
175 } grpc_chttp2_invalid_value_behavior;
179 uint32_t default_value;
182 grpc_chttp2_invalid_value_behavior invalid_value_behavior;
183 uint32_t error_value;
184 } grpc_chttp2_setting_parameters;
186 extern const grpc_chttp2_setting_parameters grpc_chttp2_settings_parameters[GRPC_CHTTP2_NUM_SETTINGS];
190 "const grpc_chttp2_setting_parameters grpc_chttp2_settings_parameters[GRPC_CHTTP2_NUM_SETTINGS] = {",
193 for decorated_setting
in sorted(decorated_settings):
194 while i < decorated_setting.enum:
196 "{NULL, 0, 0, 0, GRPC_CHTTP2_DISCONNECT_ON_INVALID_VALUE, GRPC_HTTP2_PROTOCOL_ERROR},",
199 print(
"{\"%s\", %du, %du, %du, GRPC_CHTTP2_%s, GRPC_HTTP2_%s}," % (
200 decorated_setting.name,
201 decorated_setting.setting.default,
202 decorated_setting.setting.min,
203 decorated_setting.setting.max,
204 decorated_setting.setting.on_error.behavior,
205 decorated_setting.setting.on_error.code,
212 print(
"#endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HTTP2_SETTINGS_H */",