annotate src/event/ngx_event_quic_transport.c @ 7815:0f9e9786b90d quic

Added primitive flow control mechanisms. + MAX_STREAM_DATA frame is sent when recv() is performed on stream The new value is a sum of total bytes received by stream + free space in a buffer; The sending of MAX_STREM_DATA frame in response to STREAM_DATA_BLOCKED frame is adjusted to follow the same logic as above. + MAX_DATA frame is sent when total amount of received data is 2x of current limit. The limit is doubled. + Default values of transport parameters are adjusted to more meaningful values: initial stream limits are set to quic buffer size instead of unrealistically small 255. initial max data is decreased to 16 buffer sizes, in an assumption that this is enough for a relatively short connection, instead of randomly chosen big number. All this allows to initiate a stable flow of streams that does not block on stream/connection limits (tested with FF 77.0a1 and 100K requests)
author Vladimir Homutov <vl@nginx.com>
date Wed, 15 Apr 2020 18:54:03 +0300
parents 167d32476737
children 76e8ec502c69
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Nginx, Inc.
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_event.h>
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12 #if (NGX_HAVE_NONALIGNED)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
14 #define ngx_quic_parse_uint16(p) ntohs(*(uint16_t *) (p))
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
15 #define ngx_quic_parse_uint32(p) ntohl(*(uint32_t *) (p))
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
16
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
17 #define ngx_quic_write_uint16 ngx_quic_write_uint16_aligned
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
18 #define ngx_quic_write_uint32 ngx_quic_write_uint32_aligned
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
19
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
20 #else
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
21
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
22 #define ngx_quic_parse_uint16(p) ((p)[0] << 8 | (p)[1])
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
23 #define ngx_quic_parse_uint32(p) \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
24 ((uint32_t) (p)[0] << 24 | (p)[1] << 16 | (p)[2] << 8 | (p)[3])
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
25
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
26 #define ngx_quic_write_uint16(p, s) \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
27 ((p)[0] = (u_char) ((s) >> 8), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
28 (p)[1] = (u_char) (s), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
29 (p) + sizeof(uint16_t))
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
30
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
31 #define ngx_quic_write_uint32(p, s) \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
32 ((p)[0] = (u_char) ((s) >> 24), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
33 (p)[1] = (u_char) ((s) >> 16), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
34 (p)[2] = (u_char) ((s) >> 8), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
35 (p)[3] = (u_char) (s), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36 (p) + sizeof(uint32_t))
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
38 #endif
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
39
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
40 #define ngx_quic_write_uint24(p, s) \
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
41 ((p)[0] = (u_char) ((s) >> 16), \
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
42 (p)[1] = (u_char) ((s) >> 8), \
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
43 (p)[2] = (u_char) (s), \
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
44 (p) + 3)
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
45
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
46 #define ngx_quic_write_uint16_aligned(p, s) \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
47 (*(uint16_t *) (p) = htons((uint16_t) (s)), (p) + sizeof(uint16_t))
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
48
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
49 #define ngx_quic_write_uint32_aligned(p, s) \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
50 (*(uint32_t *) (p) = htonl((uint32_t) (s)), (p) + sizeof(uint32_t))
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52 #define ngx_quic_varint_len(value) \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53 ((value) <= 63 ? 1 \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
54 : ((uint32_t) value) <= 16383 ? 2 \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55 : ((uint64_t) value) <= 1073741823 ? 4 \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
56 : 8)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
57
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
58
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
59 static u_char *ngx_quic_parse_int(u_char *pos, u_char *end, uint64_t *out);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
60 static u_char *ngx_quic_parse_int_multi(u_char *pos, u_char *end, ...);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
61 static void ngx_quic_build_int(u_char **pos, uint64_t value);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
63 static u_char *ngx_quic_read_uint8(u_char *pos, u_char *end, uint8_t *value);
7735
c9c3a73df6e8 Support for HTTP/3 ALPN.
Roman Arutyunyan <arut@nginx.com>
parents: 7734
diff changeset
64 /*static*/ u_char *ngx_quic_read_uint16(u_char *pos, u_char *end, uint16_t *value); // usage depends on NGX_QUIC_VERSION
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
65 static u_char *ngx_quic_read_uint32(u_char *pos, u_char *end, uint32_t *value);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
66 static u_char *ngx_quic_read_bytes(u_char *pos, u_char *end, size_t len,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
67 u_char **out);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
68 static u_char *ngx_quic_copy_bytes(u_char *pos, u_char *end, size_t len,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
69 u_char *dst);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
70
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
71 static size_t ngx_quic_create_ack(u_char *p, ngx_quic_ack_frame_t *ack);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
72 static size_t ngx_quic_create_crypto(u_char *p,
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
73 ngx_quic_crypto_frame_t *crypto);
7739
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
74 static size_t ngx_quic_create_hs_done(u_char *p);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
75 static size_t ngx_quic_create_stream(u_char *p, ngx_quic_stream_frame_t *sf);
7711
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
76 static size_t ngx_quic_create_max_streams(u_char *p,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
77 ngx_quic_max_streams_frame_t *ms);
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
78 static size_t ngx_quic_create_max_stream_data(u_char *p,
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
79 ngx_quic_max_stream_data_frame_t *ms);
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
80 static size_t ngx_quic_create_max_data(u_char *p,
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
81 ngx_quic_max_data_frame_t *md);
7701
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
82 static size_t ngx_quic_create_close(u_char *p, ngx_quic_close_frame_t *cl);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
83
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
84 static ngx_int_t ngx_quic_parse_transport_param(u_char *p, u_char *end,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
85 uint16_t id, ngx_quic_tp_t *dst);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
86
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
87
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
88 /* literal errors indexed by corresponding value */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
89 static char *ngx_quic_errors[] = {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
90 "NO_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
91 "INTERNAL_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
92 "SERVER_BUSY",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
93 "FLOW_CONTROL_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
94 "STREAM_LIMIT_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
95 "STREAM_STATE_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
96 "FINAL_SIZE_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
97 "FRAME_ENCODING_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
98 "TRANSPORT_PARAMETER_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
99 "CONNECTION_ID_LIMIT_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
100 "PROTOCOL_VIOLATION",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
101 "INVALID_TOKEN",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
102 "",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
103 "CRYPTO_BUFFER_EXCEEDED",
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
104 "",
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
105 "CRYPTO_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
106 };
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
107
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
109 static ngx_inline u_char *
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
110 ngx_quic_parse_int(u_char *pos, u_char *end, uint64_t *out)
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
111 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
112 u_char *p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
113 uint64_t value;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
114 ngx_uint_t len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
116 if (pos >= end) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
117 printf("OOPS >=\n");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
118 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
119 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
120
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
121 p = pos;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
122 len = 1 << ((*p & 0xc0) >> 6);
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
123
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
124 value = *p++ & 0x3f;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
125
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
126 if ((size_t)(end - p) < (len - 1)) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
127 printf("LEN TOO BIG: need %ld have %ld\n", len, end - p);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
128 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
129 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
130
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131 while (--len) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
132 value = (value << 8) + *p++;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
135 *out = value;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
136
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
137 return p;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
138 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
139
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
140
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
141 static ngx_inline u_char *
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
142 ngx_quic_parse_int_multi(u_char *pos, u_char *end, ...)
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
143 {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
144 u_char *p;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
145 va_list ap;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
146 uint64_t *item;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
147
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
148 p = pos;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
149
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
150 va_start(ap, end);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
151
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
152 do {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
153 item = va_arg(ap, uint64_t *);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
154 if (item == NULL) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
155 break;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
156 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
157
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
158 p = ngx_quic_parse_int(p, end, item);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
159 if (p == NULL) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
160 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
161 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
162
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
163 } while (1);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
164
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
165 va_end(ap);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
166
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
167 return p;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
168 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
169
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
170
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
171 static ngx_inline u_char *
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
172 ngx_quic_read_uint8(u_char *pos, u_char *end, uint8_t *value)
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
173 {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
174 if ((size_t)(end - pos) < 1) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
175 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
176 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
177
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
178 *value = *pos;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
179
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
180 return pos + 1;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
181 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
182
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
183
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
184 /*static*/ ngx_inline u_char *
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
185 ngx_quic_read_uint16(u_char *pos, u_char *end, uint16_t *value)
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
186 {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
187 if ((size_t)(end - pos) < sizeof(uint16_t)) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
188 return NULL;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
189 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
190
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
191 *value = ngx_quic_parse_uint16(pos);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
192
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
193 return pos + sizeof(uint16_t);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
194 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
195
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
196
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
197 static ngx_inline u_char *
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
198 ngx_quic_read_uint32(u_char *pos, u_char *end, uint32_t *value)
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
199 {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
200 if ((size_t)(end - pos) < sizeof(uint32_t)) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
201 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
202 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
203
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
204 *value = ngx_quic_parse_uint32(pos);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
205
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
206 return pos + sizeof(uint32_t);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
207 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
208
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
209
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
210 static ngx_inline u_char *
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
211 ngx_quic_read_bytes(u_char *pos, u_char *end, size_t len, u_char **out)
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
212 {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
213 if ((size_t)(end - pos) < len) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
214 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
215 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
216
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
217 *out = pos;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
218
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
219 return pos + len;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
220 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
221
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
222
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
223 static u_char *
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
224 ngx_quic_copy_bytes(u_char *pos, u_char *end, size_t len, u_char *dst)
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
225 {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
226 if ((size_t)(end - pos) < len) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
227 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
228 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
229
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
230 ngx_memcpy(dst, pos, len);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
231
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
232 return pos + len;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236 static void
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237 ngx_quic_build_int(u_char **pos, uint64_t value)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
239 u_char *p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
240 ngx_uint_t len;//, len2;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
241
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
242 p = *pos;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
243 len = 0;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
245 while (value >> ((1 << len) * 8 - 2)) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
246 len++;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
247 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
248
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249 *p = len << 6;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
250
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
251 // len2 =
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
252 len = (1 << len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
253 len--;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
254 *p |= value >> (len * 8);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
255 p++;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
256
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
257 while (len) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
258 *p++ = value >> ((len-- - 1) * 8);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
259 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
260
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
261 *pos = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
262 // return len2;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
263 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
264
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
265
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
266 u_char *
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
267 ngx_quic_error_text(uint64_t error_code)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
268 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
269 return (u_char *) ngx_quic_errors[error_code];
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
273 ngx_int_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
274 ngx_quic_parse_long_header(ngx_quic_header_t *pkt)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
275 {
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
276 u_char *p, *end;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
277 uint8_t idlen;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
278
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
279 p = pkt->data;
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
280 end = pkt->data + pkt->len;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
281
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
282 ngx_quic_hexdump0(pkt->log, "long input", pkt->data, pkt->len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
283
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
284 p = ngx_quic_read_uint8(p, end, &pkt->flags);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
285 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
286 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
287 "packet is too small to read flags");
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
288 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
289 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
290
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
291 if (!ngx_quic_long_pkt(pkt->flags)) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
292 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "not a long packet");
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
293 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
294 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
295
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
296 p = ngx_quic_read_uint32(p, end, &pkt->version);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
297 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
298 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
299 "packet is too small to read version");
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
300 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
301 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
302
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
303 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
304 "quic flags:%xi version:%xD", pkt->flags, pkt->version);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305
7735
c9c3a73df6e8 Support for HTTP/3 ALPN.
Roman Arutyunyan <arut@nginx.com>
parents: 7734
diff changeset
306 if (pkt->version != NGX_QUIC_VERSION) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
307 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7727
55a3a9c50af2 Add unsupported version into log.
Vladimir Homutov <vl@nginx.com>
parents: 7726
diff changeset
308 "unsupported quic version: 0x%xi", pkt->version);
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
309 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
310 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
311
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
312 p = ngx_quic_read_uint8(p, end, &idlen);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
313 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
314 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
315 "packet is too small to read dcid len");
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
316 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
317 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
318
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
319 pkt->dcid.len = idlen;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
320
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
321 p = ngx_quic_read_bytes(p, end, idlen, &pkt->dcid.data);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
322 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
323 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
324 "packet is too small to read dcid");
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
325 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
326 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
327
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
328 p = ngx_quic_read_uint8(p, end, &idlen);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
329 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
330 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
331 "packet is too small to read scid len");
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
332 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
333 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
334
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
335 pkt->scid.len = idlen;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
336
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
337 p = ngx_quic_read_bytes(p, end, idlen, &pkt->scid.data);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
338 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
339 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
340 "packet is too small to read scid");
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
341 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
342 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
343
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
344 pkt->raw->pos = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
345
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
346 return NGX_OK;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
347 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
348
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
349
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
350 size_t
7751
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
351 ngx_quic_create_long_header(ngx_quic_header_t *pkt, u_char *out,
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
352 size_t pkt_len, u_char **pnp)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
353 {
7751
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
354 u_char *p, *start;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
355
7751
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
356 p = start = out;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
357
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
358 *p++ = pkt->flags;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
359
7735
c9c3a73df6e8 Support for HTTP/3 ALPN.
Roman Arutyunyan <arut@nginx.com>
parents: 7734
diff changeset
360 p = ngx_quic_write_uint32(p, NGX_QUIC_VERSION);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
361
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
362 *p++ = pkt->scid.len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
363 p = ngx_cpymem(p, pkt->scid.data, pkt->scid.len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
364
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
365 *p++ = pkt->dcid.len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
366 p = ngx_cpymem(p, pkt->dcid.data, pkt->dcid.len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
367
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
368 if (pkt->level == ssl_encryption_initial) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
369 ngx_quic_build_int(&p, pkt->token.len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
370 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
371
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
372 ngx_quic_build_int(&p, pkt_len + pkt->num_len);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
373
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
374 *pnp = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
375
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
376 switch (pkt->num_len) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
377 case 1:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
378 *p++ = pkt->trunc;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
379 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
380 case 2:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
381 p = ngx_quic_write_uint16(p, pkt->trunc);
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
382 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
383 case 3:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
384 p = ngx_quic_write_uint24(p, pkt->trunc);
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
385 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
386 case 4:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
387 p = ngx_quic_write_uint32(p, pkt->trunc);
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
388 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
389 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
390
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
391 return p - start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
392 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
393
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
394
7751
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
395 size_t
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
396 ngx_quic_create_short_header(ngx_quic_header_t *pkt, u_char *out,
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
397 size_t pkt_len, u_char **pnp)
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
398 {
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
399 u_char *p, *start;
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
400
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
401 p = start = out;
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
402
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
403 *p++ = pkt->flags;
7751
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
404
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
405 p = ngx_cpymem(p, pkt->scid.data, pkt->scid.len);
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
406
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
407 *pnp = p;
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
408
7781
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
409 switch (pkt->num_len) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
410 case 1:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
411 *p++ = pkt->trunc;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
412 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
413 case 2:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
414 p = ngx_quic_write_uint16(p, pkt->trunc);
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
415 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
416 case 3:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
417 p = ngx_quic_write_uint24(p, pkt->trunc);
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
418 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
419 case 4:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
420 p = ngx_quic_write_uint32(p, pkt->trunc);
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
421 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 7774
diff changeset
422 }
7751
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
423
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
424 return p - start;
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
425 }
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
426
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 7743
diff changeset
427
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
428 ngx_int_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
429 ngx_quic_parse_short_header(ngx_quic_header_t *pkt, ngx_str_t *dcid)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
430 {
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
431 u_char *p, *end;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
432
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
433 p = pkt->data;
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
434 end = pkt->data + pkt->len;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
435
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
436 ngx_quic_hexdump0(pkt->log, "short input", pkt->data, pkt->len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
437
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
438 p = ngx_quic_read_uint8(p, end, &pkt->flags);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
439 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
440 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
441 "packet is too small to read flags");
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
442 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
443 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
444
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
445 if (!ngx_quic_short_pkt(pkt->flags)) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
446 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "not a short packet");
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
447 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
448 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
449
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
450 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
451 "quic flags:%xi", pkt->flags);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
452
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
453 if (ngx_memcmp(p, dcid->data, dcid->len) != 0) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
454 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "unexpected quic dcid");
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
455 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
456 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
457
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
458 pkt->dcid.len = dcid->len;
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
459
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
460 p = ngx_quic_read_bytes(p, end, dcid->len, &pkt->dcid.data);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
461 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
462 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
463 "packet is too small to read dcid");
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
464 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
465 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
466
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
467 pkt->raw->pos = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
468
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
469 return NGX_OK;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
470 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
471
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
472
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
473 ngx_int_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
474 ngx_quic_parse_initial_header(ngx_quic_header_t *pkt)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
475 {
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
476 u_char *p, *end;
7708
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7707
diff changeset
477 uint64_t varint;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
478
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
479 p = pkt->raw->pos;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
480
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
481 end = pkt->raw->last;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
482
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
483 pkt->log->action = "parsing quic initial header";
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
484
7708
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7707
diff changeset
485 p = ngx_quic_parse_int(p, end, &varint);
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
486 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
487 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
488 "failed to parse token length");
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
489 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
490 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
491
7708
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7707
diff changeset
492 pkt->token.len = varint;
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7707
diff changeset
493
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
494 p = ngx_quic_read_bytes(p, end, pkt->token.len, &pkt->token.data);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
495 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
496 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
497 "packet too small to read token data");
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
498 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
499 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
500
7708
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7707
diff changeset
501 p = ngx_quic_parse_int(p, end, &varint);
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
502 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
503 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "bad packet length");
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
504 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
505 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
506
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
507 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
7709
59e639379c7c Fixed specifiers in "quic packet length" logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7708
diff changeset
508 "quic packet length: %uL", varint);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
509
7708
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7707
diff changeset
510 if (varint > (uint64_t) ((pkt->data + pkt->len) - p)) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
511 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "truncated initial packet");
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
512 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
513 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
514
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
515 pkt->raw->pos = p;
7708
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7707
diff changeset
516 pkt->len = varint;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
517
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
518 ngx_quic_hexdump0(pkt->log, "DCID", pkt->dcid.data, pkt->dcid.len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
519 ngx_quic_hexdump0(pkt->log, "SCID", pkt->scid.data, pkt->scid.len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
520 ngx_quic_hexdump0(pkt->log, "token", pkt->token.data, pkt->token.len);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
521
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
522 return NGX_OK;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
523 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
524
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
525
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
526 ngx_int_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
527 ngx_quic_parse_handshake_header(ngx_quic_header_t *pkt)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
528 {
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
529 u_char *p, *end;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
530 uint64_t plen;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
531
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
532 p = pkt->raw->pos;
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
533 end = pkt->raw->last;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
534
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
535 pkt->log->action = "parsing quic handshake header";
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
536
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
537 p = ngx_quic_parse_int(p, end, &plen);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
538 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
539 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "bad packet length");
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
540 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
541 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
542
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
543 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
7709
59e639379c7c Fixed specifiers in "quic packet length" logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7708
diff changeset
544 "quic packet length: %uL", plen);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
545
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
546 if (plen > (uint64_t)((pkt->data + pkt->len) - p)) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
547 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "truncated handshake packet");
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
548 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
549 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
550
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
551 pkt->raw->pos = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
552 pkt->len = plen;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
553
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
554 return NGX_OK;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
555 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
556
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
557
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
558 #define ngx_quic_stream_bit_off(val) (((val) & 0x04) ? 1 : 0)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
559 #define ngx_quic_stream_bit_len(val) (((val) & 0x02) ? 1 : 0)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
560 #define ngx_quic_stream_bit_fin(val) (((val) & 0x01) ? 1 : 0)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
561
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
562 ssize_t
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
563 ngx_quic_parse_frame(ngx_quic_header_t *pkt, u_char *start, u_char *end,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
564 ngx_quic_frame_t *f)
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
565 {
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
566 u_char *p;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
567 uint8_t flags;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
568 uint64_t varint;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
569 ngx_uint_t i;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
570
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
571 flags = pkt->flags;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
572 p = start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
573
7708
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7707
diff changeset
574 p = ngx_quic_parse_int(p, end, &varint);
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
575 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
576 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
577 "failed to obtain quic frame type");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
578 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
579 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
580
7708
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7707
diff changeset
581 f->type = varint;
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7707
diff changeset
582
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
583 switch (f->type) {
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
584
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
585 case NGX_QUIC_FT_CRYPTO:
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
586
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
587 if (ngx_quic_pkt_zrtt(flags)) {
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
588 goto not_allowed;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
589 }
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
590
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
591 p = ngx_quic_parse_int(p, end, &f->u.crypto.offset);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
592 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
593 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
594 "failed to parse crypto frame offset");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
595 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
596 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
597
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7792
diff changeset
598 p = ngx_quic_parse_int(p, end, &f->u.crypto.length);
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
599 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
600 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
601 "failed to parse crypto frame len");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
602 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
603 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
604
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7792
diff changeset
605 p = ngx_quic_read_bytes(p, end, f->u.crypto.length, &f->u.crypto.data);
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
606 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
607 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
608 "failed to parse crypto frame data");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
609 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
610 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
611
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
612 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
613 "quic CRYPTO frame length: %uL off:%uL pp:%p",
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7792
diff changeset
614 f->u.crypto.length, f->u.crypto.offset,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
615 f->u.crypto.data);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
616
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
617 ngx_quic_hexdump0(pkt->log, "CRYPTO frame contents",
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7792
diff changeset
618 f->u.crypto.data, f->u.crypto.length);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
619 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
620
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
621 case NGX_QUIC_FT_PADDING:
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
622
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
623 /* allowed in any packet type */
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
624
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
625 while (p < end && *p == NGX_QUIC_FT_PADDING) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
626 p++;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
627 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
628
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
629 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
630
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
631 case NGX_QUIC_FT_ACK:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
632 case NGX_QUIC_FT_ACK_ECN:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
633
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
634 if (ngx_quic_pkt_zrtt(flags)) {
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
635 goto not_allowed;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
636 }
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
637
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
638 p = ngx_quic_parse_int_multi(p, end, &f->u.ack.largest,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
639 &f->u.ack.delay, &f->u.ack.range_count,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
640 &f->u.ack.first_range, NULL);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
641 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
642 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
643 "failed to parse ack frame");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
644 return NGX_ERROR;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
645 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
646
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
647 f->u.ack.ranges_start = p;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
648
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
649 /* process all ranges to get bounds, values are ignored */
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
650 for (i = 0; i < f->u.ack.range_count; i++) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
651 p = ngx_quic_parse_int_multi(p, end, &varint, &varint, NULL);
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
652 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
653 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
654 "failed to parse ack frame range %ui", i);
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
655 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
656 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
657 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
658
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
659 f->u.ack.ranges_end = p;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
660
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
661 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
7730
c58bbe31e87d Fixed received ACK fields order in debug logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7728
diff changeset
662 "ACK: { largest=%ui delay=%ui count=%ui first=%ui}",
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
663 f->u.ack.largest,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
664 f->u.ack.delay,
7730
c58bbe31e87d Fixed received ACK fields order in debug logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7728
diff changeset
665 f->u.ack.range_count,
c58bbe31e87d Fixed received ACK fields order in debug logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7728
diff changeset
666 f->u.ack.first_range);
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
667
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
668 if (f->type == NGX_QUIC_FT_ACK_ECN) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
669
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
670 p = ngx_quic_parse_int_multi(p, end, &f->u.ack.ect0,
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
671 &f->u.ack.ect1, &f->u.ack.ce, NULL);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
672 if (p == NULL) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
673 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
674 "failed to parse ack frame ECT counts", i);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
675 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
676 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
677
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
678 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
679 "ACK ECN counters: %ui %ui %ui",
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
680 f->u.ack.ect0, f->u.ack.ect1, f->u.ack.ce);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
681 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
682
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
683 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
684
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
685 case NGX_QUIC_FT_PING:
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
686
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
687 /* allowed in any packet type */
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
688
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
689 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
691 case NGX_QUIC_FT_NEW_CONNECTION_ID:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
692
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
693 if (!(ngx_quic_short_pkt(flags) || ngx_quic_pkt_zrtt(flags))) {
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
694 goto not_allowed;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
695 }
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
696
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
697 p = ngx_quic_parse_int_multi(p, end, &f->u.ncid.seqnum,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
698 &f->u.ncid.retire, NULL);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
699 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
700 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
701 "failed to parse new connection id frame");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
702 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
703 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
704
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
705 p = ngx_quic_read_uint8(p, end, &f->u.ncid.len);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
706 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
707 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
708 "failed to parse new connection id length");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
709 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
710 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
711
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
712 p = ngx_quic_copy_bytes(p, end, f->u.ncid.len, f->u.ncid.cid);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
713 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
714 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
715 "failed to parse new connection id cid");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
716 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
717 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
718
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
719 p = ngx_quic_copy_bytes(p, end, 16, f->u.ncid.srt);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
720 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
721 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
722 "failed to parse new connection id srt");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
723 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
724 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
725
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
726 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
727 "NCID: { seq=%ui retire=%ui len=%ui}",
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
728 f->u.ncid.seqnum, f->u.ncid.retire, f->u.ncid.len);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
729 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
730
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
731 case NGX_QUIC_FT_CONNECTION_CLOSE2:
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
732
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
733 if (!ngx_quic_short_pkt(flags)) {
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
734 goto not_allowed;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
735 }
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
736
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
737 /* fall through */
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
738
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
739 case NGX_QUIC_FT_CONNECTION_CLOSE:
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
740
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
741 if (ngx_quic_pkt_zrtt(flags)) {
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
742 goto not_allowed;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
743 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
744
7716
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 7715
diff changeset
745 p = ngx_quic_parse_int(p, end, &f->u.close.error_code);
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
746 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
747 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7716
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 7715
diff changeset
748 "failed to parse close connection frame error code");
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 7715
diff changeset
749 return NGX_ERROR;
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 7715
diff changeset
750 }
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 7715
diff changeset
751
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 7715
diff changeset
752 if (f->type == NGX_QUIC_FT_CONNECTION_CLOSE) {
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 7715
diff changeset
753 p = ngx_quic_parse_int(p, end, &f->u.close.frame_type);
7722
0a18893299fe Fixed parsing NGX_QUIC_FT_CONNECTION_CLOSE.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7721
diff changeset
754 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
755 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7722
0a18893299fe Fixed parsing NGX_QUIC_FT_CONNECTION_CLOSE.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7721
diff changeset
756 "failed to parse close connection frame type");
0a18893299fe Fixed parsing NGX_QUIC_FT_CONNECTION_CLOSE.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7721
diff changeset
757 return NGX_ERROR;
0a18893299fe Fixed parsing NGX_QUIC_FT_CONNECTION_CLOSE.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7721
diff changeset
758 }
7716
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 7715
diff changeset
759 }
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 7715
diff changeset
760
7720
856d5a2de258 Fixed build with macOS's long long abomination.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7717
diff changeset
761 p = ngx_quic_parse_int(p, end, &varint);
7716
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 7715
diff changeset
762 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
763 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7716
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 7715
diff changeset
764 "failed to parse close reason length");
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
765 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
766 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
767
7720
856d5a2de258 Fixed build with macOS's long long abomination.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7717
diff changeset
768 f->u.close.reason.len = varint;
856d5a2de258 Fixed build with macOS's long long abomination.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7717
diff changeset
769
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
770 p = ngx_quic_read_bytes(p, end, f->u.close.reason.len,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
771 &f->u.close.reason.data);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
772 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
773 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
774 "failed to parse close reason");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
775 return NGX_ERROR;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
776 }
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
777
7715
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
778 if (f->type == NGX_QUIC_FT_CONNECTION_CLOSE) {
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
779
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
780 if (f->u.close.error_code >= NGX_QUIC_ERR_LAST) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
781 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7715
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
782 "unkown error code: %ui, truncated",
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
783 f->u.close.error_code);
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
784 f->u.close.error_code = NGX_QUIC_ERR_LAST - 1;
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
785 }
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
786
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
787 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
788 "CONN.CLOSE: { %s (0x%xi) type=0x%xi reason='%V'}",
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
789 ngx_quic_error_text(f->u.close.error_code),
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
790 f->u.close.error_code, f->u.close.frame_type,
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
791 &f->u.close.reason);
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
792 } else {
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 7713
diff changeset
793
7716
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 7715
diff changeset
794 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 7715
diff changeset
795 "CONN.CLOSE2: { (0x%xi) reason '%V'}",
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 7715
diff changeset
796 f->u.close.error_code, &f->u.close.reason);
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
797 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
798
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
799 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
800
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
801 case NGX_QUIC_FT_STREAM0:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
802 case NGX_QUIC_FT_STREAM1:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
803 case NGX_QUIC_FT_STREAM2:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
804 case NGX_QUIC_FT_STREAM3:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
805 case NGX_QUIC_FT_STREAM4:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
806 case NGX_QUIC_FT_STREAM5:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
807 case NGX_QUIC_FT_STREAM6:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
808 case NGX_QUIC_FT_STREAM7:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
809
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
810 if (!(ngx_quic_short_pkt(flags) || ngx_quic_pkt_zrtt(flags))) {
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
811 goto not_allowed;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
812 }
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
813
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
814 f->u.stream.type = f->type;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
815
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
816 f->u.stream.off = ngx_quic_stream_bit_off(f->type);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
817 f->u.stream.len = ngx_quic_stream_bit_len(f->type);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
818 f->u.stream.fin = ngx_quic_stream_bit_fin(f->type);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
819
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
820 p = ngx_quic_parse_int(p, end, &f->u.stream.stream_id);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
821 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
822 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
823 "failed to parse stream frame id");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
824 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
825 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
826
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
827 if (f->type & 0x04) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
828 p = ngx_quic_parse_int(p, end, &f->u.stream.offset);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
829 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
830 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
831 "failed to parse stream frame offset");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
832 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
833 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
834
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
835 } else {
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
836 f->u.stream.offset = 0;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
837 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
838
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
839 if (f->type & 0x02) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
840 p = ngx_quic_parse_int(p, end, &f->u.stream.length);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
841 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
842 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
843 "failed to parse stream frame length");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
844 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
845 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
846
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
847 } else {
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
848 f->u.stream.length = end - p; /* up to packet end */
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
849 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
850
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
851 p = ngx_quic_read_bytes(p, end, f->u.stream.length,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
852 &f->u.stream.data);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
853 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
854 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7789
853908b5a216 Added a bit more debugging in STREAM frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7781
diff changeset
855 "failed to parse stream frame data len=%ui "
853908b5a216 Added a bit more debugging in STREAM frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7781
diff changeset
856 "offset=%ui", f->u.stream.length, f->u.stream.offset);
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
857 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
858 }
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
859
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
860 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
861 "STREAM frame { 0x%xi id 0x%xi offset 0x%xi "
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
862 "len 0x%xi bits:off=%d len=%d fin=%d }",
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
863 f->type, f->u.stream.stream_id, f->u.stream.offset,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
864 f->u.stream.length, f->u.stream.off, f->u.stream.len,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
865 f->u.stream.fin);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
866
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
867 ngx_quic_hexdump0(pkt->log, "STREAM frame contents",
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
868 f->u.stream.data, f->u.stream.length);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
869 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
870
7703
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7702
diff changeset
871 case NGX_QUIC_FT_MAX_DATA:
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
872
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
873 if (!(ngx_quic_short_pkt(flags) || ngx_quic_pkt_zrtt(flags))) {
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
874 goto not_allowed;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
875 }
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
876
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
877 p = ngx_quic_parse_int(p, end, &f->u.max_data.max_data);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
878 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
879 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
880 "failed to parse max data frame");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
881 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
882 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
883
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
884 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
885 "MAX_DATA frame { Maximum Data %ui }",
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
886 f->u.max_data.max_data);
7703
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7702
diff changeset
887 break;
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7702
diff changeset
888
7697
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
889 case NGX_QUIC_FT_RESET_STREAM:
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
890
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
891 if (!(ngx_quic_short_pkt(flags) || ngx_quic_pkt_zrtt(flags))) {
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
892 goto not_allowed;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
893 }
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
894
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
895 p = ngx_quic_parse_int_multi(p, end, &f->u.reset_stream.id,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
896 &f->u.reset_stream.error_code,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
897 &f->u.reset_stream.final_size, NULL);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
898 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
899 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
900 "failed to parse reset stream frame");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
901 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
902 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
903
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
904 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
905 "RESET STREAM frame"
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
906 " { id 0x%xi error_code 0x%xi final_size 0x%xi }",
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
907 f->u.reset_stream.id, f->u.reset_stream.error_code,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
908 f->u.reset_stream.final_size);
7697
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
909 break;
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
910
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
911 case NGX_QUIC_FT_STOP_SENDING:
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
912
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
913 if (!(ngx_quic_short_pkt(flags) || ngx_quic_pkt_zrtt(flags))) {
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
914 goto not_allowed;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
915 }
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
916
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
917 p = ngx_quic_parse_int_multi(p, end, &f->u.stop_sending.id,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
918 &f->u.stop_sending.error_code, NULL);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
919 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
920 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
921 "failed to parse stop sending frame");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
922 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
923 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
924
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
925 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
926 "STOP SENDING frame { id 0x%xi error_code 0x%xi}",
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
927 f->u.stop_sending.id, f->u.stop_sending.error_code);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
928
7697
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
929 break;
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 7690
diff changeset
930
7702
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 7701
diff changeset
931 case NGX_QUIC_FT_STREAMS_BLOCKED:
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
932 case NGX_QUIC_FT_STREAMS_BLOCKED2:
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
933
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
934 if (!(ngx_quic_short_pkt(flags) || ngx_quic_pkt_zrtt(flags))) {
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
935 goto not_allowed;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
936 }
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
937
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
938 p = ngx_quic_parse_int(p, end, &f->u.streams_blocked.limit);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
939 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
940 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
941 "failed to parse streams blocked frame limit");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
942 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
943 }
7702
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 7701
diff changeset
944
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
945 f->u.streams_blocked.bidi =
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
946 (f->type == NGX_QUIC_FT_STREAMS_BLOCKED) ? 1 : 0;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
947
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
948 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
7723
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
949 "STREAMS BLOCKED frame { limit %ui bidi: %d }",
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
950 f->u.streams_blocked.limit,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
951 f->u.streams_blocked.bidi);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
952
7702
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 7701
diff changeset
953 break;
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 7701
diff changeset
954
7739
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
955 case NGX_QUIC_FT_HANDSHAKE_DONE:
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
956 /* only sent by server, not by client */
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
957 goto not_allowed;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
958
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
959 case NGX_QUIC_FT_NEW_TOKEN:
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
960
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
961 if (!ngx_quic_short_pkt(flags)) {
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
962 goto not_allowed;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
963 }
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
964
7739
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
965 /* TODO: implement */
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
966
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
967 ngx_log_error(NGX_LOG_ALERT, pkt->log, 0,
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
968 "unimplemented frame type 0x%xi in packet", f->type);
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
969
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
970 break;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
971
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
972 case NGX_QUIC_FT_MAX_STREAMS:
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
973 case NGX_QUIC_FT_MAX_STREAMS2:
7723
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
974
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
975 if (!(ngx_quic_short_pkt(flags) || ngx_quic_pkt_zrtt(flags))) {
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
976 goto not_allowed;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
977 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
978
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
979 p = ngx_quic_parse_int(p, end, &f->u.max_streams.limit);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
980 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
981 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7723
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
982 "failed to parse max streams frame limit");
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
983 return NGX_ERROR;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
984 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
985
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
986 f->u.max_streams.bidi = (f->type == NGX_QUIC_FT_MAX_STREAMS) ? 1 : 0;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
987
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
988 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
989 "MAX STREAMS frame { limit %ui bidi: %d }",
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
990 f->u.max_streams.limit,
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
991 f->u.max_streams.bidi);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
992 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
993
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
994 case NGX_QUIC_FT_MAX_STREAM_DATA:
7723
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
995
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
996 if (!(ngx_quic_short_pkt(flags) || ngx_quic_pkt_zrtt(flags))) {
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
997 goto not_allowed;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
998 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
999
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1000 p = ngx_quic_parse_int_multi(p, end, &f->u.max_stream_data.id,
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1001 &f->u.max_stream_data.limit, NULL);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1002 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
1003 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7723
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1004 "failed to parse max stream data frame");
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1005 return NGX_ERROR;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1006 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1007
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1008 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1009 "MAX STREAM DATA frame { id: %ui limit: %ui }",
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1010 f->u.max_stream_data.id,
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1011 f->u.max_stream_data.limit);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1012 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1013
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1014 case NGX_QUIC_FT_DATA_BLOCKED:
7723
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1015
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1016 if (!(ngx_quic_short_pkt(flags) || ngx_quic_pkt_zrtt(flags))) {
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1017 goto not_allowed;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1018 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1019
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1020 p = ngx_quic_parse_int(p, end, &f->u.data_blocked.limit);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1021 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
1022 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7723
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1023 "failed to parse data blocked frame limit");
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1024 return NGX_ERROR;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1025 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1026
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1027 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1028 "DATA BLOCKED frame { limit %ui }",
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1029 f->u.data_blocked.limit);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1030 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1031
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1032 case NGX_QUIC_FT_STREAM_DATA_BLOCKED:
7723
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1033
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1034 if (!(ngx_quic_short_pkt(flags) || ngx_quic_pkt_zrtt(flags))) {
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1035 goto not_allowed;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1036 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1037
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1038 p = ngx_quic_parse_int_multi(p, end, &f->u.stream_data_blocked.id,
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1039 &f->u.stream_data_blocked.limit, NULL);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1040 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
1041 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7723
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1042 "failed to parse tream data blocked frame");
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1043 return NGX_ERROR;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1044 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1045
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1046 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1047 "STREAM DATA BLOCKED frame { id: %ui limit: %ui }",
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1048 f->u.stream_data_blocked.id,
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1049 f->u.stream_data_blocked.limit);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1050 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1051
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1052 case NGX_QUIC_FT_RETIRE_CONNECTION_ID:
7723
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1053
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1054 if (!(ngx_quic_short_pkt(flags) || ngx_quic_pkt_zrtt(flags))) {
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1055 goto not_allowed;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1056 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1057
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1058 p = ngx_quic_parse_int(p, end, &f->u.retire_cid.sequence_number);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1059 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
1060 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7723
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1061 "failed to parse retire connection id"
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1062 " frame sequence number");
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1063 return NGX_ERROR;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1064 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1065
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1066 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1067 "RETIRE CONNECTION ID frame { sequence_number %ui }",
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1068 f->u.retire_cid.sequence_number);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1069 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1070
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1071 case NGX_QUIC_FT_PATH_CHALLENGE:
7723
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1072
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1073 if (!(ngx_quic_short_pkt(flags) || ngx_quic_pkt_zrtt(flags))) {
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1074 goto not_allowed;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1075 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1076
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1077 p = ngx_quic_copy_bytes(p, end, 8, f->u.path_challenge.data);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1078 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
1079 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7723
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1080 "failed to get path challenge frame data");
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1081 return NGX_ERROR;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1082 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1083
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1084 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1085 "PATH CHALLENGE frame");
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1086
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1087 ngx_quic_hexdump0(pkt->log, "path challenge data",
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1088 f->u.path_challenge.data, 8);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1089 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1090
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1091 case NGX_QUIC_FT_PATH_RESPONSE:
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1092
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1093 if (!(ngx_quic_short_pkt(flags) || ngx_quic_pkt_zrtt(flags))) {
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1094 goto not_allowed;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1095 }
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1096
7723
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1097 p = ngx_quic_copy_bytes(p, end, 8, f->u.path_response.data);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1098 if (p == NULL) {
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
1099 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7723
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1100 "failed to get path response frame data");
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1101 return NGX_ERROR;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1102 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1103
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1104 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1105 "PATH RESPONSE frame");
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1106
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1107 ngx_quic_hexdump0(pkt->log, "path response data",
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7722
diff changeset
1108 f->u.path_response.data, 8);
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1109 break;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1110
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1111 default:
7741
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 7739
diff changeset
1112 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1113 "unknown frame type 0x%xi in packet", f->type);
7706
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 7703
diff changeset
1114
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1115 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1116 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1117
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1118 return p - start;
7717
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1119
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1120 not_allowed:
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1121
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1122 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1123 "frame type 0x%xi is not allowed in packet with flags 0x%xi",
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1124 f->type, pkt->flags);
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1125
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 7716
diff changeset
1126 return NGX_DECLINED;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1127 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1128
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1129
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1130 ssize_t
7792
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1131 ngx_quic_parse_ack_range(ngx_quic_header_t *pkt, u_char *start, u_char *end,
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1132 uint64_t *gap, uint64_t *range)
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1133 {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1134 u_char *p;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1135
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1136 p = start;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1137
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1138 p = ngx_quic_parse_int(p, end, gap);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1139 if (p == NULL) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1140 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1141 "failed to parse ack frame gap");
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1142 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1143 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1144
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1145 p = ngx_quic_parse_int(p, end, range);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1146 if (p == NULL) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1147 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1148 "failed to parse ack frame range");
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1149 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1150 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1151
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1152 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1153 "ACK range: gap %ui range %ui", *gap, *range);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1154
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1155 return p - start;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1156 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1157
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1158
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 7789
diff changeset
1159 ssize_t
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1160 ngx_quic_create_frame(u_char *p, ngx_quic_frame_t *f)
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1161 {
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1162 /*
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1163 * QUIC-recovery, section 2:
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1164 *
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1165 * Ack-eliciting Frames: All frames other than ACK, PADDING, and
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1166 * CONNECTION_CLOSE are considered ack-eliciting.
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1167 */
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1168 f->need_ack = 1;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1169
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1170 switch (f->type) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1171 case NGX_QUIC_FT_ACK:
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1172 f->need_ack = 0;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1173 return ngx_quic_create_ack(p, &f->u.ack);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1174
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1175 case NGX_QUIC_FT_CRYPTO:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1176 return ngx_quic_create_crypto(p, &f->u.crypto);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1177
7739
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1178 case NGX_QUIC_FT_HANDSHAKE_DONE:
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1179 return ngx_quic_create_hs_done(p);
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1180
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1181 case NGX_QUIC_FT_STREAM0:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1182 case NGX_QUIC_FT_STREAM1:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1183 case NGX_QUIC_FT_STREAM2:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1184 case NGX_QUIC_FT_STREAM3:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1185 case NGX_QUIC_FT_STREAM4:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1186 case NGX_QUIC_FT_STREAM5:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1187 case NGX_QUIC_FT_STREAM6:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1188 case NGX_QUIC_FT_STREAM7:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1189 return ngx_quic_create_stream(p, &f->u.stream);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1190
7701
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1191 case NGX_QUIC_FT_CONNECTION_CLOSE:
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1192 f->need_ack = 0;
7701
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1193 return ngx_quic_create_close(p, &f->u.close);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1194
7711
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1195 case NGX_QUIC_FT_MAX_STREAMS:
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1196 return ngx_quic_create_max_streams(p, &f->u.max_streams);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1197
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1198 case NGX_QUIC_FT_MAX_STREAM_DATA:
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1199 return ngx_quic_create_max_stream_data(p, &f->u.max_stream_data);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1200
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1201 case NGX_QUIC_FT_MAX_DATA:
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1202 return ngx_quic_create_max_data(p, &f->u.max_data);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1203
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1204 default:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1205 /* BUG: unsupported frame type generated */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1206 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1207 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1208 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1209
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1210
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1211 static size_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1212 ngx_quic_create_ack(u_char *p, ngx_quic_ack_frame_t *ack)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1213 {
7710
d60205f37f5a Fixed ACKs to packet numbers greater than 63.
Roman Arutyunyan <arut@nginx.com>
parents: 7709
diff changeset
1214 size_t len;
d60205f37f5a Fixed ACKs to packet numbers greater than 63.
Roman Arutyunyan <arut@nginx.com>
parents: 7709
diff changeset
1215 u_char *start;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1216
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1217 /* minimal ACK packet */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1218
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1219 if (p == NULL) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1220 len = ngx_quic_varint_len(NGX_QUIC_FT_ACK);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1221 len += ngx_quic_varint_len(ack->largest);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1222 len += ngx_quic_varint_len(0);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1223 len += ngx_quic_varint_len(0);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1224 len += ngx_quic_varint_len(ack->first_range);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1225
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1226 return len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1227 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1228
7710
d60205f37f5a Fixed ACKs to packet numbers greater than 63.
Roman Arutyunyan <arut@nginx.com>
parents: 7709
diff changeset
1229 start = p;
d60205f37f5a Fixed ACKs to packet numbers greater than 63.
Roman Arutyunyan <arut@nginx.com>
parents: 7709
diff changeset
1230
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1231 ngx_quic_build_int(&p, NGX_QUIC_FT_ACK);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1232 ngx_quic_build_int(&p, ack->largest);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1233 ngx_quic_build_int(&p, 0);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1234 ngx_quic_build_int(&p, 0);
7774
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 7773
diff changeset
1235 ngx_quic_build_int(&p, ack->first_range);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1236
7710
d60205f37f5a Fixed ACKs to packet numbers greater than 63.
Roman Arutyunyan <arut@nginx.com>
parents: 7709
diff changeset
1237 return p - start;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1238 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1239
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1240
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1241 static size_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1242 ngx_quic_create_crypto(u_char *p, ngx_quic_crypto_frame_t *crypto)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1243 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1244 size_t len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1245 u_char *start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1246
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1247 if (p == NULL) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1248 len = ngx_quic_varint_len(NGX_QUIC_FT_CRYPTO);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1249 len += ngx_quic_varint_len(crypto->offset);
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7792
diff changeset
1250 len += ngx_quic_varint_len(crypto->length);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7792
diff changeset
1251 len += crypto->length;
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1252
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1253 return len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1254 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1255
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1256 start = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1257
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1258 ngx_quic_build_int(&p, NGX_QUIC_FT_CRYPTO);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1259 ngx_quic_build_int(&p, crypto->offset);
7810
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7792
diff changeset
1260 ngx_quic_build_int(&p, crypto->length);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 7792
diff changeset
1261 p = ngx_cpymem(p, crypto->data, crypto->length);
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1262
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1263 return p - start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1264 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1265
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1266
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1267 static size_t
7739
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1268 ngx_quic_create_hs_done(u_char *p)
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1269 {
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1270 u_char *start;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1271
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1272 if (p == NULL) {
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1273 return ngx_quic_varint_len(NGX_QUIC_FT_HANDSHAKE_DONE);
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1274 }
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1275
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1276 start = p;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1277
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1278 ngx_quic_build_int(&p, NGX_QUIC_FT_HANDSHAKE_DONE);
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1279
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1280 return p - start;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1281 }
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1282
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1283
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 7735
diff changeset
1284 static size_t
7690
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1285 ngx_quic_create_stream(u_char *p, ngx_quic_stream_frame_t *sf)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1286 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1287 size_t len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1288 u_char *start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1289
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1290 if (!sf->len) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1291 #if 0
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1292 ngx_log_error(NGX_LOG_INFO, log, 0,
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1293 "attempt to generate a stream frame without length");
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1294 #endif
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1295 // XXX: handle error in caller
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1296 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1297 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1298
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1299 if (p == NULL) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1300 len = ngx_quic_varint_len(sf->type);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1301
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1302 if (sf->off) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1303 len += ngx_quic_varint_len(sf->offset);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1304 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1305
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1306 len += ngx_quic_varint_len(sf->stream_id);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1307
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1308 /* length is always present in generated frames */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1309 len += ngx_quic_varint_len(sf->length);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1310
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1311 len += sf->length;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1312
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1313 return len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1314 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1315
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1316 start = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1317
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1318 ngx_quic_build_int(&p, sf->type);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1319 ngx_quic_build_int(&p, sf->stream_id);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1320
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1321 if (sf->off) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1322 ngx_quic_build_int(&p, sf->offset);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1323 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1324
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1325 /* length is always present in generated frames */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1326 ngx_quic_build_int(&p, sf->length);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1327
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1328 p = ngx_cpymem(p, sf->data, sf->length);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1329
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1330 return p - start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1331 }
7701
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1332
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1333
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1334 static size_t
7711
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1335 ngx_quic_create_max_streams(u_char *p, ngx_quic_max_streams_frame_t *ms)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1336 {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1337 size_t len;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1338 u_char *start;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1339 ngx_uint_t type;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1340
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1341 type = ms->bidi ? NGX_QUIC_FT_MAX_STREAMS : NGX_QUIC_FT_MAX_STREAMS2;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1342
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1343 if (p == NULL) {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1344 len = ngx_quic_varint_len(type);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1345 len += ngx_quic_varint_len(ms->limit);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1346 return len;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1347 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1348
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1349 start = p;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1350
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1351 ngx_quic_build_int(&p, type);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1352 ngx_quic_build_int(&p, ms->limit);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1353
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1354 return p - start;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1355 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1356
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1357
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1358 static ngx_int_t
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1359 ngx_quic_parse_transport_param(u_char *p, u_char *end, uint16_t id,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1360 ngx_quic_tp_t *dst)
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1361 {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1362 uint64_t varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1363
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1364 switch (id) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1365 case NGX_QUIC_TP_ORIGINAL_CONNECTION_ID:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1366 case NGX_QUIC_TP_STATELESS_RESET_TOKEN:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1367 case NGX_QUIC_TP_PREFERRED_ADDRESS:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1368 // TODO
7728
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1369 return NGX_DECLINED;
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1370 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1371
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1372 switch (id) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1373
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1374 case NGX_QUIC_TP_DISABLE_ACTIVE_MIGRATION:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1375 /* zero-length option */
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1376 if (end - p != 0) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1377 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1378 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1379 dst->disable_active_migration = 1;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1380 return NGX_OK;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1381
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1382 case NGX_QUIC_TP_MAX_IDLE_TIMEOUT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1383 case NGX_QUIC_TP_MAX_PACKET_SIZE:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1384 case NGX_QUIC_TP_INITIAL_MAX_DATA:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1385 case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1386 case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1387 case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_UNI:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1388 case NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1389 case NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1390 case NGX_QUIC_TP_ACK_DELAY_EXPONENT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1391 case NGX_QUIC_TP_MAX_ACK_DELAY:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1392 case NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1393
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1394 p = ngx_quic_parse_int(p, end, &varint);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1395 if (p == NULL) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1396 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1397 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1398 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1399
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1400 default:
7728
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1401 return NGX_DECLINED;
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1402 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1403
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1404 switch (id) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1405
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1406 case NGX_QUIC_TP_MAX_IDLE_TIMEOUT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1407 dst->max_idle_timeout = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1408 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1409
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1410 case NGX_QUIC_TP_MAX_PACKET_SIZE:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1411 dst->max_packet_size = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1412 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1413
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1414 case NGX_QUIC_TP_INITIAL_MAX_DATA:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1415 dst->initial_max_data = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1416 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1417
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1418 case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1419 dst->initial_max_stream_data_bidi_local = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1420 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1421
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1422 case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1423 dst->initial_max_stream_data_bidi_remote = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1424 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1425
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1426 case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_UNI:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1427 dst->initial_max_stream_data_uni = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1428 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1429
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1430 case NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1431 dst->initial_max_streams_bidi = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1432 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1433
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1434 case NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1435 dst->initial_max_streams_uni = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1436 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1437
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1438 case NGX_QUIC_TP_ACK_DELAY_EXPONENT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1439 dst->ack_delay_exponent = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1440 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1441
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1442 case NGX_QUIC_TP_MAX_ACK_DELAY:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1443 dst->max_ack_delay = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1444 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1445
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1446 case NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1447 dst->active_connection_id_limit = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1448 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1449
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1450 default:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1451 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1452 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1453
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1454 return NGX_OK;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1455 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1456
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1457
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1458 ngx_int_t
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1459 ngx_quic_parse_transport_params(u_char *p, u_char *end, ngx_quic_tp_t *tp,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1460 ngx_log_t *log)
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1461 {
7728
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1462 ngx_int_t rc;
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1463
7735
c9c3a73df6e8 Support for HTTP/3 ALPN.
Roman Arutyunyan <arut@nginx.com>
parents: 7734
diff changeset
1464 #if (NGX_QUIC_DRAFT_VERSION < 27)
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1465
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1466 uint16_t id, len, tp_len;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1467
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1468 p = ngx_quic_read_uint16(p, end, &tp_len);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1469 if (p == NULL) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1470 ngx_log_error(NGX_LOG_INFO, log, 0,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1471 "failed to parse total transport params length");
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1472 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1473 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1474
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1475 while (p < end) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1476
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1477 p = ngx_quic_read_uint16(p, end, &id);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1478 if (p == NULL) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1479 ngx_log_error(NGX_LOG_INFO, log, 0,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1480 "failed to parse transport param id");
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1481 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1482 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1483
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1484 p = ngx_quic_read_uint16(p, end, &len);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1485 if (p == NULL) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1486 ngx_log_error(NGX_LOG_INFO, log, 0,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1487 "failed to parse transport param id 0x%xi length", id);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1488 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1489 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1490
7728
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1491 rc = ngx_quic_parse_transport_param(p, p + len, id, tp);
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1492
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1493 if (rc == NGX_ERROR) {
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1494 ngx_log_error(NGX_LOG_INFO, log, 0,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1495 "failed to parse transport param id 0x%xi data", id);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1496 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1497 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1498
7728
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1499 if (rc == NGX_DECLINED) {
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1500 ngx_log_error(NGX_LOG_INFO, log, 0,
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1501 "unknown transport param id 0x%xi, skipped", id);
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1502 }
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1503
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1504 p += len;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1505 };
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1506
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1507 #else
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1508
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1509 uint64_t id, len;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1510
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1511 while (p < end) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1512 p = ngx_quic_parse_int(p, end, &id);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1513 if (p == NULL) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1514 ngx_log_error(NGX_LOG_INFO, log, 0,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1515 "failed to parse transport param id");
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1516 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1517 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1518
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1519 p = ngx_quic_parse_int(p, end, &len);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1520 if (p == NULL) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1521 ngx_log_error(NGX_LOG_INFO, log, 0,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1522 "failed to parse transport param id 0x%xi length", id);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1523 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1524 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1525
7728
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1526 rc = ngx_quic_parse_transport_param(p, p + len, id, tp);
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1527
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1528 if (rc == NGX_ERROR) {
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1529 ngx_log_error(NGX_LOG_INFO, log, 0,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1530 "failed to parse transport param id 0x%xi data", id);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1531 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1532 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1533
7728
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1534 if (rc == NGX_DECLINED) {
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1535 ngx_log_error(NGX_LOG_INFO, log, 0,
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1536 "unknown transport param id 0x%xi,skipped", id);
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1537 }
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7727
diff changeset
1538
7726
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1539 p += len;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1540
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1541 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1542
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1543 #endif
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1544
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1545 if (p != end) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1546 ngx_log_error(NGX_LOG_INFO, log, 0,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1547 "trailing garbage in transport parameters: %ui bytes",
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1548 end - p);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1549 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1550 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1551
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1552
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1553 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, log, 0,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1554 "client transport parameters parsed successfully");
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1555
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1556 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1557 "disable active migration: %ui",
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1558 tp->disable_active_migration);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1559
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1560 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "idle timeout: %ui",
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1561 tp->max_idle_timeout);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1562
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1563 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "max packet size: %ui",
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1564 tp->max_packet_size);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1565
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1566 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "max data: %ui",
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1567 tp->initial_max_data);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1568
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1569 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1570 "max stream data bidi local: %ui",
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1571 tp->initial_max_stream_data_bidi_local);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1572
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1573 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1574 "max stream data bidi remote: %ui",
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1575 tp->initial_max_stream_data_bidi_remote);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1576
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1577 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "max stream data uni: %ui",
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1578 tp->initial_max_stream_data_uni);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1579
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1580 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1581 "initial max streams bidi: %ui",
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1582 tp->initial_max_streams_bidi);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1583
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1584 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "initial max streams uni: %ui",
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1585 tp->initial_max_streams_uni);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1586
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1587 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "ack delay exponent: %ui",
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1588 tp->ack_delay_exponent);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1589
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1590 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "max ack delay: %ui",
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1591 tp->max_ack_delay);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1592
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1593 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1594 "active connection id limit: %ui",
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1595 tp->active_connection_id_limit);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1596
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1597 return NGX_OK;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1598 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1599
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7723
diff changeset
1600
7732
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1601 static size_t
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1602 ngx_quic_create_max_stream_data(u_char *p, ngx_quic_max_stream_data_frame_t *ms)
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1603 {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1604 size_t len;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1605 u_char *start;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1606
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1607 if (p == NULL) {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1608 len = ngx_quic_varint_len(NGX_QUIC_FT_MAX_STREAM_DATA);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1609 len += ngx_quic_varint_len(ms->id);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1610 len += ngx_quic_varint_len(ms->limit);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1611 return len;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1612 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1613
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1614 start = p;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1615
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1616 ngx_quic_build_int(&p, NGX_QUIC_FT_MAX_STREAM_DATA);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1617 ngx_quic_build_int(&p, ms->id);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1618 ngx_quic_build_int(&p, ms->limit);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1619
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1620 return p - start;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1621 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1622
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 7730
diff changeset
1623
7815
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1624 static size_t
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1625 ngx_quic_create_max_data(u_char *p, ngx_quic_max_data_frame_t *md)
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1626 {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1627 size_t len;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1628 u_char *start;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1629
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1630 if (p == NULL) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1631 len = ngx_quic_varint_len(NGX_QUIC_FT_MAX_DATA);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1632 len += ngx_quic_varint_len(md->max_data);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1633 return len;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1634 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1635
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1636 start = p;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1637
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1638 ngx_quic_build_int(&p, NGX_QUIC_FT_MAX_DATA);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1639 ngx_quic_build_int(&p, md->max_data);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1640
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1641 return p - start;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1642 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1643
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 7810
diff changeset
1644
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1645 ssize_t
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1646 ngx_quic_create_transport_params(u_char *pos, u_char *end, ngx_quic_tp_t *tp)
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1647 {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1648 u_char *p;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1649 size_t len;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1650
7735
c9c3a73df6e8 Support for HTTP/3 ALPN.
Roman Arutyunyan <arut@nginx.com>
parents: 7734
diff changeset
1651 #if (NGX_QUIC_DRAFT_VERSION < 27)
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1652
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1653 /* older drafts with static transport parameters encoding */
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1654
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1655 #define ngx_quic_tp_len(id, value) \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1656 4 + ngx_quic_varint_len(value)
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1657
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1658 #define ngx_quic_tp_vint(id, value) \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1659 do { \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1660 p = ngx_quic_write_uint16(p, id); \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1661 p = ngx_quic_write_uint16(p, ngx_quic_varint_len(value)); \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1662 ngx_quic_build_int(&p, value); \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1663 } while (0)
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1664
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1665 #else
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1666
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1667 /* recent drafts with variable integer transport parameters encoding */
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1668
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1669 #define ngx_quic_tp_len(id, value) \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1670 ngx_quic_varint_len(id) \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1671 + ngx_quic_varint_len(value) \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1672 + ngx_quic_varint_len(ngx_quic_varint_len(value))
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1673
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1674 #define ngx_quic_tp_vint(id, value) \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1675 do { \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1676 ngx_quic_build_int(&p, id); \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1677 ngx_quic_build_int(&p, ngx_quic_varint_len(value)); \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1678 ngx_quic_build_int(&p, value); \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1679 } while (0)
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1680
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1681 #endif
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1682
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1683 p = pos;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1684
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1685 len = ngx_quic_tp_len(NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1686 tp->active_connection_id_limit);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1687
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1688 len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_DATA,tp->initial_max_data);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1689
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1690 len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1691 tp->initial_max_streams_uni);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1692
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1693 len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1694 tp->initial_max_streams_bidi);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1695
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1696 len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1697 tp->initial_max_stream_data_bidi_local);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1698
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1699 len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1700 tp->initial_max_stream_data_bidi_remote);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1701
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1702 len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_UNI,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1703 tp->initial_max_stream_data_uni);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1704
7743
50db7ce374b7 Advertise our max_idle_timeout in transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7741
diff changeset
1705 len += ngx_quic_tp_len(NGX_QUIC_TP_MAX_IDLE_TIMEOUT,
50db7ce374b7 Advertise our max_idle_timeout in transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7741
diff changeset
1706 tp->max_idle_timeout);
50db7ce374b7 Advertise our max_idle_timeout in transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7741
diff changeset
1707
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1708 if (pos == NULL) {
7735
c9c3a73df6e8 Support for HTTP/3 ALPN.
Roman Arutyunyan <arut@nginx.com>
parents: 7734
diff changeset
1709 #if (NGX_QUIC_DRAFT_VERSION < 27)
7721
556b34a863b2 Fixed buffer overrun in create_transport_params() with -24.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7720
diff changeset
1710 len += 2;
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1711 #endif
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1712 return len;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1713 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1714
7735
c9c3a73df6e8 Support for HTTP/3 ALPN.
Roman Arutyunyan <arut@nginx.com>
parents: 7734
diff changeset
1715 #if (NGX_QUIC_DRAFT_VERSION < 27)
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1716 /* TLS extension length */
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1717 p = ngx_quic_write_uint16(p, len);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1718 #endif
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1719
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1720 ngx_quic_tp_vint(NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1721 tp->active_connection_id_limit);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1722
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1723 ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_DATA,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1724 tp->initial_max_data);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1725
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1726 ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1727 tp->initial_max_streams_uni);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1728
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1729 ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1730 tp->initial_max_streams_bidi);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1731
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1732 ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1733 tp->initial_max_stream_data_bidi_local);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1734
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1735 ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1736 tp->initial_max_stream_data_bidi_remote);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1737
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1738 ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_UNI,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1739 tp->initial_max_stream_data_uni);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1740
7743
50db7ce374b7 Advertise our max_idle_timeout in transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7741
diff changeset
1741 ngx_quic_tp_vint(NGX_QUIC_TP_MAX_IDLE_TIMEOUT,
50db7ce374b7 Advertise our max_idle_timeout in transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7741
diff changeset
1742 tp->max_idle_timeout);
50db7ce374b7 Advertise our max_idle_timeout in transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7741
diff changeset
1743
7713
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1744 ngx_quic_hexdump0(ngx_cycle->log, "transport parameters", pos, p - pos);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1745
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1746 return p - pos;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1747 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1748
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 7711
diff changeset
1749
7711
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 7710
diff changeset
1750 static size_t
7701
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1751 ngx_quic_create_close(u_char *p, ngx_quic_close_frame_t *cl)
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1752 {
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1753 size_t len;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1754 u_char *start;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1755
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1756 if (p == NULL) {
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1757 len = ngx_quic_varint_len(NGX_QUIC_FT_CONNECTION_CLOSE);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1758 len += ngx_quic_varint_len(cl->error_code);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1759 len += ngx_quic_varint_len(cl->frame_type);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1760 len += ngx_quic_varint_len(cl->reason.len);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1761 len += cl->reason.len;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1762
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1763 return len;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1764 }
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1765
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1766 start = p;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1767
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1768 ngx_quic_build_int(&p, NGX_QUIC_FT_CONNECTION_CLOSE);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1769 ngx_quic_build_int(&p, cl->error_code);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1770 ngx_quic_build_int(&p, cl->frame_type);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1771 ngx_quic_build_int(&p, cl->reason.len);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1772 p = ngx_cpymem(p, cl->reason.data, cl->reason.len);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1773
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1774 return p - start;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7697
diff changeset
1775 }