annotate src/event/ngx_event_quic_transport.c @ 8385:fb7422074258 quic

Added generation of CC frames with error on connection termination. When an error occurs, then c->quic->error field may be populated with an appropriate error code, and the CONNECTION CLOSE frame will be sent to the peer before the connection is closed. Otherwise, the error treated as internal and INTERNAL_ERROR code is sent. The pkt->error field is populated by functions processing packets to indicate an error when it does not fit into pass/fail return status.
author Vladimir Homutov <vl@nginx.com>
date Thu, 14 May 2020 15:54:45 +0300
parents 52d0c4832570
children 81f85c479d7e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8224
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
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
40 #define ngx_quic_write_uint24(p, s) \
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
41 ((p)[0] = (u_char) ((s) >> 16), \
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
42 (p)[1] = (u_char) ((s) >> 8), \
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
43 (p)[2] = (u_char) (s), \
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
44 (p) + 3)
8224
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
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
59 static u_char *ngx_quic_parse_int(u_char *pos, u_char *end, uint64_t *out);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60 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
61
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
62 static u_char *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: 8237
diff changeset
63 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: 8237
diff changeset
64 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: 8237
diff changeset
65 u_char **out);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
66 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: 8237
diff changeset
67 u_char *dst);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
68
8370
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
69 static ngx_int_t ngx_quic_frame_allowed(ngx_quic_header_t *pkt,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
70 ngx_uint_t frame_type);
8224
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);
8273
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
74 static size_t ngx_quic_create_hs_done(u_char *p);
8384
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
75 static size_t ngx_quic_create_new_token(u_char *p,
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
76 ngx_quic_new_token_frame_t *token);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
77 static size_t ngx_quic_create_stream(u_char *p, ngx_quic_stream_frame_t *sf);
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
78 static size_t ngx_quic_create_max_streams(u_char *p,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
79 ngx_quic_max_streams_frame_t *ms);
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
80 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: 8264
diff changeset
81 ngx_quic_max_stream_data_frame_t *ms);
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
82 static size_t ngx_quic_create_max_data(u_char *p,
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
83 ngx_quic_max_data_frame_t *md);
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
84 static size_t ngx_quic_create_close(u_char *p, ngx_quic_close_frame_t *cl);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
85
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
86 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: 8257
diff changeset
87 uint16_t id, ngx_quic_tp_t *dst);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
88
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
89
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
90 /* literal errors indexed by corresponding value */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
91 static char *ngx_quic_errors[] = {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
92 "NO_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
93 "INTERNAL_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
94 "SERVER_BUSY",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
95 "FLOW_CONTROL_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
96 "STREAM_LIMIT_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
97 "STREAM_STATE_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
98 "FINAL_SIZE_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
99 "FRAME_ENCODING_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
100 "TRANSPORT_PARAMETER_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
101 "CONNECTION_ID_LIMIT_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
102 "PROTOCOL_VIOLATION",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
103 "INVALID_TOKEN",
8342
76e8ec502c69 Fixed error descriptions.
Vladimir Homutov <vl@nginx.com>
parents: 8338
diff changeset
104 "unknown error 0xC",
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
105 "CRYPTO_BUFFER_EXCEEDED",
8342
76e8ec502c69 Fixed error descriptions.
Vladimir Homutov <vl@nginx.com>
parents: 8338
diff changeset
106 "unknown error 0xE",
76e8ec502c69 Fixed error descriptions.
Vladimir Homutov <vl@nginx.com>
parents: 8338
diff changeset
107 "unknown error 0xF",
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
108 "CRYPTO_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
109 };
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
110
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
111
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
112 static ngx_inline u_char *
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
113 ngx_quic_parse_int(u_char *pos, u_char *end, uint64_t *out)
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
114 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115 u_char *p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
116 uint64_t value;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
117 ngx_uint_t len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
118
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
119 if (pos >= end) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
120 printf("OOPS >=\n");
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
121 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
122 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
123
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
124 p = pos;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
125 len = 1 << ((*p & 0xc0) >> 6);
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
126
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
127 value = *p++ & 0x3f;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
128
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
129 if ((size_t)(end - p) < (len - 1)) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
130 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: 8237
diff changeset
131 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
132 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
133
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134 while (--len) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
135 value = (value << 8) + *p++;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
138 *out = value;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
139
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
140 return p;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
141 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
142
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
143
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
144 static ngx_inline u_char *
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
145 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: 8237
diff changeset
146 {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
147 if ((size_t)(end - pos) < 1) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
148 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
149 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
150
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
151 *value = *pos;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
152
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
153 return pos + 1;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
154 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
155
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
156
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
157 static ngx_inline u_char *
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
158 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: 8237
diff changeset
159 {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
160 if ((size_t)(end - pos) < sizeof(uint32_t)) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
161 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
162 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
163
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
164 *value = ngx_quic_parse_uint32(pos);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
165
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
166 return pos + sizeof(uint32_t);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
167 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
168
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
169
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
170 static ngx_inline u_char *
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
171 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: 8237
diff changeset
172 {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
173 if ((size_t)(end - pos) < len) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
174 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
175 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
176
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
177 *out = pos;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
178
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
179 return pos + len;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
180 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
181
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
182
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
183 static u_char *
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
184 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: 8237
diff changeset
185 {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
186 if ((size_t)(end - pos) < len) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
187 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
188 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
189
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
190 ngx_memcpy(dst, pos, len);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
191
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
192 return pos + len;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
193 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196 static void
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197 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
198 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
199 u_char *p;
8351
dd84c9cef75b Improved ngx_quic_build_int() code and readability.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8344
diff changeset
200 ngx_uint_t bits, len;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202 p = *pos;
8351
dd84c9cef75b Improved ngx_quic_build_int() code and readability.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8344
diff changeset
203 bits = 0;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
204
8351
dd84c9cef75b Improved ngx_quic_build_int() code and readability.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8344
diff changeset
205 while (value >> ((8 << bits) - 2)) {
dd84c9cef75b Improved ngx_quic_build_int() code and readability.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8344
diff changeset
206 bits++;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208
8351
dd84c9cef75b Improved ngx_quic_build_int() code and readability.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8344
diff changeset
209 len = (1 << bits);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
210
8351
dd84c9cef75b Improved ngx_quic_build_int() code and readability.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8344
diff changeset
211 while (len--) {
dd84c9cef75b Improved ngx_quic_build_int() code and readability.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8344
diff changeset
212 *p++ = value >> (len * 8);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
213 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214
8351
dd84c9cef75b Improved ngx_quic_build_int() code and readability.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8344
diff changeset
215 **pos |= bits << 6;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
216 *pos = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220 u_char *
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221 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
222 {
8342
76e8ec502c69 Fixed error descriptions.
Vladimir Homutov <vl@nginx.com>
parents: 8338
diff changeset
223
76e8ec502c69 Fixed error descriptions.
Vladimir Homutov <vl@nginx.com>
parents: 8338
diff changeset
224 if (error_code >= NGX_QUIC_ERR_LAST) {
76e8ec502c69 Fixed error descriptions.
Vladimir Homutov <vl@nginx.com>
parents: 8338
diff changeset
225 return (u_char *) "unknown error";
76e8ec502c69 Fixed error descriptions.
Vladimir Homutov <vl@nginx.com>
parents: 8338
diff changeset
226 }
76e8ec502c69 Fixed error descriptions.
Vladimir Homutov <vl@nginx.com>
parents: 8338
diff changeset
227
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
228 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
229 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
230
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
231
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
232 ngx_int_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 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
234 {
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
235 u_char *p, *end;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
236 uint8_t idlen;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238 p = pkt->data;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
239 end = pkt->data + pkt->len;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
240
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
241 #ifdef NGX_QUIC_DEBUG_PACKETS
8360
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
242 ngx_quic_hexdump(pkt->log, "quic long packet in", pkt->data, pkt->len);
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
243 #endif
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
245 p = ngx_quic_read_uint8(p, end, &pkt->flags);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
246 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
247 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
248 "quic packet is too small to read flags");
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249 return NGX_ERROR;
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
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
252 if (!ngx_quic_long_pkt(pkt->flags)) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
253 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic not a long packet");
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
254 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
255 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
256
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
257 p = ngx_quic_read_uint32(p, end, &pkt->version);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
258 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
259 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
260 "quic packet is too small to read version");
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
261 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
262 }
8224
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 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
265 "quic long packet flags:%xi version:%xD",
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
266 pkt->flags, pkt->version);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
267
8269
c9c3a73df6e8 Support for HTTP/3 ALPN.
Roman Arutyunyan <arut@nginx.com>
parents: 8268
diff changeset
268 if (pkt->version != NGX_QUIC_VERSION) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
269 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
270 "quic unsupported version: 0x%xi", pkt->version);
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
271 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
272 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
273
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
274 p = ngx_quic_read_uint8(p, end, &idlen);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
275 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
276 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
277 "quic packet is too small to read dcid len");
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
278 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
279 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
281 pkt->dcid.len = idlen;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
282
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
283 p = ngx_quic_read_bytes(p, end, idlen, &pkt->dcid.data);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
284 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
285 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
286 "quic packet is too small to read dcid");
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
287 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
288 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
289
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
290 p = ngx_quic_read_uint8(p, end, &idlen);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
291 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
292 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
293 "quic packet is too small to read scid len");
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
294 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
295 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
296
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
297 pkt->scid.len = idlen;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
298
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
299 p = ngx_quic_read_bytes(p, end, idlen, &pkt->scid.data);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
300 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
301 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
302 "quic packet is too small to read scid");
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
303 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
304 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306 pkt->raw->pos = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
307
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
308 return NGX_OK;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
309 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
311
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
312 size_t
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
313 ngx_quic_create_long_header(ngx_quic_header_t *pkt, u_char *out,
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314 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
315 {
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
316 u_char *p, *start;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
317
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
318 p = start = out;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
319
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
320 *p++ = pkt->flags;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
321
8269
c9c3a73df6e8 Support for HTTP/3 ALPN.
Roman Arutyunyan <arut@nginx.com>
parents: 8268
diff changeset
322 p = ngx_quic_write_uint32(p, NGX_QUIC_VERSION);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
323
8344
e0abe17a2878 Removed source/destination swap from the function creating header.
Vladimir Homutov <vl@nginx.com>
parents: 8342
diff changeset
324 *p++ = pkt->dcid.len;
e0abe17a2878 Removed source/destination swap from the function creating header.
Vladimir Homutov <vl@nginx.com>
parents: 8342
diff changeset
325 p = ngx_cpymem(p, pkt->dcid.data, pkt->dcid.len);
e0abe17a2878 Removed source/destination swap from the function creating header.
Vladimir Homutov <vl@nginx.com>
parents: 8342
diff changeset
326
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
327 *p++ = pkt->scid.len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
328 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
329
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
330 if (pkt->level == ssl_encryption_initial) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
331 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
332 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
333
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
334 ngx_quic_build_int(&p, pkt_len + pkt->num_len);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
335
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
336 *pnp = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
337
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
338 switch (pkt->num_len) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
339 case 1:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
340 *p++ = pkt->trunc;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
341 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
342 case 2:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
343 p = ngx_quic_write_uint16(p, pkt->trunc);
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
344 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
345 case 3:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
346 p = ngx_quic_write_uint24(p, pkt->trunc);
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
347 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
348 case 4:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
349 p = ngx_quic_write_uint32(p, pkt->trunc);
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
350 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
351 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
352
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
353 return p - start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
354 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
355
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
356
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
357 size_t
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
358 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: 8277
diff changeset
359 size_t pkt_len, u_char **pnp)
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
360 {
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
361 u_char *p, *start;
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
362
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
363 p = start = out;
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
364
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
365 *p++ = pkt->flags;
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
366
8344
e0abe17a2878 Removed source/destination swap from the function creating header.
Vladimir Homutov <vl@nginx.com>
parents: 8342
diff changeset
367 p = ngx_cpymem(p, pkt->dcid.data, pkt->dcid.len);
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
368
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
369 *pnp = p;
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
370
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
371 switch (pkt->num_len) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
372 case 1:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
373 *p++ = pkt->trunc;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
374 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
375 case 2:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
376 p = ngx_quic_write_uint16(p, pkt->trunc);
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
377 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
378 case 3:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
379 p = ngx_quic_write_uint24(p, pkt->trunc);
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
380 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
381 case 4:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
382 p = ngx_quic_write_uint32(p, pkt->trunc);
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
383 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
384 }
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
385
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
386 return p - start;
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
387 }
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
388
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
389
8383
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
390 size_t
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
391 ngx_quic_create_retry_itag(ngx_quic_header_t *pkt, u_char *out,
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
392 u_char **start)
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
393 {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
394 u_char *p;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
395
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
396 p = out;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
397
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
398 *p++ = pkt->odcid.len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
399 p = ngx_cpymem(p, pkt->odcid.data, pkt->odcid.len);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
400
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
401 *start = p;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
402
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
403 *p++ = 0xff;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
404
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
405 p = ngx_quic_write_uint32(p, NGX_QUIC_VERSION);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
406
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
407 *p++ = pkt->dcid.len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
408 p = ngx_cpymem(p, pkt->dcid.data, pkt->dcid.len);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
409
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
410 *p++ = pkt->scid.len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
411 p = ngx_cpymem(p, pkt->scid.data, pkt->scid.len);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
412
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
413 p = ngx_cpymem(p, pkt->token.data, pkt->token.len);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
414
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
415 return p - out;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
416 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
417
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
418
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
419 ngx_int_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
420 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
421 {
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
422 u_char *p, *end;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
423
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
424 p = pkt->data;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
425 end = pkt->data + pkt->len;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
426
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
427 #ifdef NGX_QUIC_DEBUG_PACKETS
8360
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
428 ngx_quic_hexdump(pkt->log, "quic short packet in", pkt->data, pkt->len);
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
429 #endif
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
430
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
431 p = ngx_quic_read_uint8(p, end, &pkt->flags);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
432 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
433 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
434 "quic packet is too small to read flags");
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
435 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
436 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
437
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
438 if (!ngx_quic_short_pkt(pkt->flags)) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
439 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic not a short packet");
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
440 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
441 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
442
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
443 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
444 "quic short packet flags:%xi", pkt->flags);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
445
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
446 if (ngx_memcmp(p, dcid->data, dcid->len) != 0) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
447 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "unexpected quic dcid");
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
448 return NGX_ERROR;
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
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
451 pkt->dcid.len = dcid->len;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
452
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
453 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: 8237
diff changeset
454 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
455 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
456 "quic packet is too small to read dcid");
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
457 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
458 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
459
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
460 pkt->raw->pos = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
461
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
462 return NGX_OK;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
463 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
464
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
465
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
466 ngx_int_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
467 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
468 {
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
469 u_char *p, *end;
8242
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
470 uint64_t varint;
8224
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 p = pkt->raw->pos;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
473
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
474 end = pkt->raw->last;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
475
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
476 pkt->log->action = "parsing quic initial header";
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
477
8242
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
478 p = ngx_quic_parse_int(p, end, &varint);
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
479 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
480 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
481 "quic failed to parse token length");
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
482 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
483 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
484
8242
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
485 pkt->token.len = varint;
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
486
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
487 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: 8237
diff changeset
488 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
489 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
490 "quic packet too small to read token data");
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
491 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
492 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
493
8242
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
494 p = ngx_quic_parse_int(p, end, &varint);
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
495 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
496 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic bad packet length");
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
497 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
498 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
499
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
500 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
501 "quic initial packet length: %uL", varint);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
502
8242
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
503 if (varint > (uint64_t) ((pkt->data + pkt->len) - p)) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
504 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
505 "quic truncated initial packet");
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
506 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
507 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
508
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
509 pkt->raw->pos = p;
8242
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
510 pkt->len = varint;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
511
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
512 #ifdef NGX_QUIC_DEBUG_PACKETS
8360
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
513 ngx_quic_hexdump(pkt->log, "quic DCID", pkt->dcid.data, pkt->dcid.len);
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
514 ngx_quic_hexdump(pkt->log, "quic SCID", pkt->scid.data, pkt->scid.len);
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
515 ngx_quic_hexdump(pkt->log, "quic token", pkt->token.data, pkt->token.len);
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
516 #endif
8224
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 return NGX_OK;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
519 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
520
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 ngx_int_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
523 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
524 {
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
525 u_char *p, *end;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
526 uint64_t plen;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
527
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
528 p = pkt->raw->pos;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
529 end = pkt->raw->last;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
530
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
531 pkt->log->action = "parsing quic handshake header";
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
532
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
533 p = ngx_quic_parse_int(p, end, &plen);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
534 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
535 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic bad packet length");
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
536 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
537 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
538
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
539 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
540 "quic handshake packet length: %uL", plen);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
541
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
542 if (plen > (uint64_t)((pkt->data + pkt->len) - p)) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
543 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
544 "quic truncated handshake packet");
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
545 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
546 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
547
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
548 pkt->raw->pos = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
549 pkt->len = plen;
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 return NGX_OK;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
552 }
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
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
555 #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
556 #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
557 #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
558
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
559 ssize_t
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
560 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: 8237
diff changeset
561 ngx_quic_frame_t *f)
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
562 {
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
563 u_char *p;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
564 uint64_t varint;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
565 ngx_uint_t i;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
566
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
567 p = start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
568
8242
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
569 p = ngx_quic_parse_int(p, end, &varint);
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
570 if (p == NULL) {
8385
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 8384
diff changeset
571 pkt->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
572 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
573 "quic failed to obtain quic frame type");
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
574 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
575 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
576
8242
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
577 f->type = varint;
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
578
8370
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
579 if (ngx_quic_frame_allowed(pkt, f->type) != NGX_OK) {
8385
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 8384
diff changeset
580 pkt->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION;
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 8384
diff changeset
581 return NGX_ERROR;
8370
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
582 }
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
583
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
584 switch (f->type) {
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
585
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
586 case NGX_QUIC_FT_CRYPTO:
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
587
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
588 p = ngx_quic_parse_int(p, end, &f->u.crypto.offset);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
589 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
590 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
591 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
592
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8326
diff changeset
593 p = ngx_quic_parse_int(p, end, &f->u.crypto.length);
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
594 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
595 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
596 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
597
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8326
diff changeset
598 p = ngx_quic_read_bytes(p, end, f->u.crypto.length, &f->u.crypto.data);
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
599 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
600 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
601 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
602
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
603 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
604 "quic frame in: CRYPTO length: %uL off:%uL pp:%p",
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8326
diff changeset
605 f->u.crypto.length, f->u.crypto.offset,
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
606 f->u.crypto.data);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
607
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
608 #ifdef NGX_QUIC_DEBUG_FRAMES
8360
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
609 ngx_quic_hexdump(pkt->log, "quic CRYPTO frame",
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
610 f->u.crypto.data, f->u.crypto.length);
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
611 #endif
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
612 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
613
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
614 case NGX_QUIC_FT_PADDING:
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
615
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
616 while (p < end && *p == NGX_QUIC_FT_PADDING) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
617 p++;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
618 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
619
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
620 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
621
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
622 case NGX_QUIC_FT_ACK:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
623 case NGX_QUIC_FT_ACK_ECN:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
624
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
625 if (!((p = ngx_quic_parse_int(p, end, &f->u.ack.largest))
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
626 && (p = ngx_quic_parse_int(p, end, &f->u.ack.delay))
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
627 && (p = ngx_quic_parse_int(p, end, &f->u.ack.range_count))
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
628 && (p = ngx_quic_parse_int(p, end, &f->u.ack.first_range))))
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
629 {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
630 goto error;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
631 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
632
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
633 f->u.ack.ranges_start = p;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
634
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
635 /* process all ranges to get bounds, values are ignored */
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
636 for (i = 0; i < f->u.ack.range_count; i++) {
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
637
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
638 p = ngx_quic_parse_int(p, end, &varint);
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
639 if (p) {
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
640 p = ngx_quic_parse_int(p, end, &varint);
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
641 }
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
642
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
643 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
644 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
645 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
646 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
647
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
648 f->u.ack.ranges_end = p;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
649
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
650 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
651 "quic frame in ACK largest:%ui delay:%ui"
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
652 " count:%ui first:%ui", f->u.ack.largest,
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
653 f->u.ack.delay,
8264
c58bbe31e87d Fixed received ACK fields order in debug logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8262
diff changeset
654 f->u.ack.range_count,
c58bbe31e87d Fixed received ACK fields order in debug logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8262
diff changeset
655 f->u.ack.first_range);
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
656
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
657 if (f->type == NGX_QUIC_FT_ACK_ECN) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
658
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
659 if (!((p = ngx_quic_parse_int(p, end, &f->u.ack.ect0))
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
660 && (p = ngx_quic_parse_int(p, end, &f->u.ack.ect1))
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
661 && (p = ngx_quic_parse_int(p, end, &f->u.ack.ce))))
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
662 {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
663 goto error;
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
664 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
665
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
666 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
667 "quic ACK ECN counters: %ui %ui %ui",
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
668 f->u.ack.ect0, f->u.ack.ect1, f->u.ack.ce);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
669 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
670
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
671 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
672
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
673 case NGX_QUIC_FT_PING:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
674 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
675
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
676 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
677
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
678 p = ngx_quic_parse_int(p, end, &f->u.ncid.seqnum);
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
679 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
680 goto error;
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
681 }
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
682
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
683 p = ngx_quic_parse_int(p, end, &f->u.ncid.retire);
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
684 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
685 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
686 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
687
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
688 p = ngx_quic_read_uint8(p, end, &f->u.ncid.len);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
689 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
690 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
691 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
692
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
693 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: 8237
diff changeset
694 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
695 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
696 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
697
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
698 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: 8237
diff changeset
699 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
700 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
701 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
702
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
703 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
704 "quic frame in: NCID seq:%ui retire:%ui len:%ui",
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
705 f->u.ncid.seqnum, f->u.ncid.retire, f->u.ncid.len);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
706 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
707
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
708 case NGX_QUIC_FT_CONNECTION_CLOSE2:
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
709 /* fall through */
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
710
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
711 case NGX_QUIC_FT_CONNECTION_CLOSE:
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
712
8250
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
713 p = ngx_quic_parse_int(p, end, &f->u.close.error_code);
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
714 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
715 goto error;
8250
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
716 }
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
717
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
718 if (f->type == NGX_QUIC_FT_CONNECTION_CLOSE) {
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
719 p = ngx_quic_parse_int(p, end, &f->u.close.frame_type);
8256
0a18893299fe Fixed parsing NGX_QUIC_FT_CONNECTION_CLOSE.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8255
diff changeset
720 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
721 goto error;
8256
0a18893299fe Fixed parsing NGX_QUIC_FT_CONNECTION_CLOSE.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8255
diff changeset
722 }
8250
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
723 }
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
724
8254
856d5a2de258 Fixed build with macOS's long long abomination.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8251
diff changeset
725 p = ngx_quic_parse_int(p, end, &varint);
8250
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
726 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
727 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
728 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
729
8254
856d5a2de258 Fixed build with macOS's long long abomination.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8251
diff changeset
730 f->u.close.reason.len = varint;
856d5a2de258 Fixed build with macOS's long long abomination.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8251
diff changeset
731
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
732 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: 8237
diff changeset
733 &f->u.close.reason.data);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
734 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
735 goto error;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
736 }
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
737
8249
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
738 if (f->type == NGX_QUIC_FT_CONNECTION_CLOSE) {
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
739
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
740 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
741 "quic frame in CONNECTION_CLOSE"
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
742 " err:%s code:0x%xi type:0x%xi reason:'%V'",
8249
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
743 ngx_quic_error_text(f->u.close.error_code),
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
744 f->u.close.error_code, f->u.close.frame_type,
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
745 &f->u.close.reason);
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
746 } else {
3f4b407fa0b8 Added parsing of CONNECTION_CLOSE2 frame (0x1D).
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
747
8250
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
748 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
749 "quic frame in: CONNECTION_CLOSE2:"
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
750 " code:0x%xi reason:'%V'",
8250
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
751 f->u.close.error_code, &f->u.close.reason);
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
752 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
753
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
754 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
755
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
756 case NGX_QUIC_FT_STREAM0:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
757 case NGX_QUIC_FT_STREAM1:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
758 case NGX_QUIC_FT_STREAM2:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
759 case NGX_QUIC_FT_STREAM3:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
760 case NGX_QUIC_FT_STREAM4:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
761 case NGX_QUIC_FT_STREAM5:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
762 case NGX_QUIC_FT_STREAM6:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
763 case NGX_QUIC_FT_STREAM7:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
764
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
765 f->u.stream.type = f->type;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
766
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
767 f->u.stream.off = ngx_quic_stream_bit_off(f->type);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
768 f->u.stream.len = ngx_quic_stream_bit_len(f->type);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
769 f->u.stream.fin = ngx_quic_stream_bit_fin(f->type);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
770
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
771 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: 8237
diff changeset
772 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
773 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
774 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
775
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
776 if (f->type & 0x04) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
777 p = ngx_quic_parse_int(p, end, &f->u.stream.offset);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
778 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
779 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
780 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
781
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
782 } else {
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
783 f->u.stream.offset = 0;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
784 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
785
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
786 if (f->type & 0x02) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
787 p = ngx_quic_parse_int(p, end, &f->u.stream.length);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
788 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
789 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
790 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
791
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
792 } else {
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
793 f->u.stream.length = end - p; /* up to packet end */
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
794 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
795
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
796 p = ngx_quic_read_bytes(p, end, f->u.stream.length,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
797 &f->u.stream.data);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
798 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
799 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
800 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
801
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
802 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
803 "quic frame in: STREAM type:0x%xi id:0x%xi offset:0x%xi "
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
804 "len:0x%xi bits off:%d len:%d fin:%d",
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
805 f->type, f->u.stream.stream_id, f->u.stream.offset,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
806 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: 8237
diff changeset
807 f->u.stream.fin);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
808
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
809 #ifdef NGX_QUIC_DEBUG_FRAMES
8360
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
810 ngx_quic_hexdump(pkt->log, "quic STREAM frame",
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
811 f->u.stream.data, f->u.stream.length);
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
812 #endif
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
813 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
814
8237
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
815 case NGX_QUIC_FT_MAX_DATA:
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
816
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
817 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: 8237
diff changeset
818 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
819 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
820 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
821
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
822 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
823 "quic frame in: MAX_DATA max_data:%ui",
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
824 f->u.max_data.max_data);
8237
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
825 break;
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
826
8231
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
827 case NGX_QUIC_FT_RESET_STREAM:
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
828
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
829 if (!((p = ngx_quic_parse_int(p, end, &f->u.reset_stream.id))
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
830 && (p = ngx_quic_parse_int(p, end, &f->u.reset_stream.error_code))
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
831 && (p = ngx_quic_parse_int(p, end,
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
832 &f->u.reset_stream.final_size))))
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
833 {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
834 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
835 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
836
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
837 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
838 "quic frame in: RESET_STREAM"
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
839 " id:0x%xi error_code:0x%xi final_size:0x%xi",
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
840 f->u.reset_stream.id, f->u.reset_stream.error_code,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
841 f->u.reset_stream.final_size);
8231
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
842 break;
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
843
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
844 case NGX_QUIC_FT_STOP_SENDING:
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
845
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
846 p = ngx_quic_parse_int(p, end, &f->u.stop_sending.id);
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
847 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
848 goto error;
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
849 }
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
850
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
851 p = ngx_quic_parse_int(p, end, &f->u.stop_sending.error_code);
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
852 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
853 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
854 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
855
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
856 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
857 "quic frame in: STOP_SENDING id:0x%xi error_code:0x%xi",
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
858 f->u.stop_sending.id, f->u.stop_sending.error_code);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
859
8231
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
860 break;
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
861
8236
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
862 case NGX_QUIC_FT_STREAMS_BLOCKED:
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
863 case NGX_QUIC_FT_STREAMS_BLOCKED2:
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
864
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
865 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: 8237
diff changeset
866 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
867 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
868 }
8236
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
869
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
870 f->u.streams_blocked.bidi =
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
871 (f->type == NGX_QUIC_FT_STREAMS_BLOCKED) ? 1 : 0;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
872
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
873 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
874 "quic frame in: STREAMS_BLOCKED limit:%ui bidi:%d",
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
875 f->u.streams_blocked.limit,
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
876 f->u.streams_blocked.bidi);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
877
8236
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
878 break;
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
879
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
880 case NGX_QUIC_FT_NEW_TOKEN:
8273
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
881 /* TODO: implement */
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
882
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
883 ngx_log_error(NGX_LOG_ALERT, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
884 "quic unimplemented frame type 0x%xi in packet", f->type);
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
885
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
886 break;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
887
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
888 case NGX_QUIC_FT_MAX_STREAMS:
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
889 case NGX_QUIC_FT_MAX_STREAMS2:
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
890
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
891 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: 8256
diff changeset
892 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
893 goto error;
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
894 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
895
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
896 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: 8256
diff changeset
897
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
898 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
899 "quic frame in: MAX_STREAMS limit:%ui bidi:%d",
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
900 f->u.max_streams.limit,
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
901 f->u.max_streams.bidi);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
902 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
903
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
904 case NGX_QUIC_FT_MAX_STREAM_DATA:
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
905
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
906 p = ngx_quic_parse_int(p, end, &f->u.max_stream_data.id);
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
907 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
908 goto error;
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
909 }
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
910
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
911 p = ngx_quic_parse_int(p, end, &f->u.max_stream_data.limit);
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
912 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
913 goto error;
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
914 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
915
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
916 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
917 "quic frame in: MAX_STREAM_DATA id:%ui limit:%ui",
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
918 f->u.max_stream_data.id,
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
919 f->u.max_stream_data.limit);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
920 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
921
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
922 case NGX_QUIC_FT_DATA_BLOCKED:
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
923
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
924 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: 8256
diff changeset
925 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
926 goto error;
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
927 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
928
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
929 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
930 "quic frame in: DATA_BLOCKED limit:%ui",
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
931 f->u.data_blocked.limit);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
932 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
933
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
934 case NGX_QUIC_FT_STREAM_DATA_BLOCKED:
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
935
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
936 p = ngx_quic_parse_int(p, end, &f->u.stream_data_blocked.id);
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
937 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
938 goto error;
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
939 }
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
940
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
941 p = ngx_quic_parse_int(p, end, &f->u.stream_data_blocked.limit);
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
942 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
943 goto error;
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
944 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
945
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
946 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
947 "quic frame in: STREAM_DATA_BLOCKED"
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
948 " id:%ui limit:%ui",
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
949 f->u.stream_data_blocked.id,
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
950 f->u.stream_data_blocked.limit);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
951 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
952
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
953 case NGX_QUIC_FT_RETIRE_CONNECTION_ID:
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
954
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
955 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: 8256
diff changeset
956 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
957 goto error;
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
958 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
959
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
960 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
961 "quic frame in: RETIRE_CONNECTION_ID"
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
962 " sequence_number:%ui",
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
963 f->u.retire_cid.sequence_number);
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
964 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
965
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
966 case NGX_QUIC_FT_PATH_CHALLENGE:
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
967
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
968 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: 8256
diff changeset
969 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
970 goto error;
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
971 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
972
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
973 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
974 "quic frame in: PATH_CHALLENGE");
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
975
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
976 #ifdef NGX_QUIC_DEBUG_FRAMES
8360
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
977 ngx_quic_hexdump(pkt->log, "quic PATH_CHALLENGE frame data",
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
978 f->u.path_challenge.data, 8);
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
979 #endif
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
980 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
981
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
982 case NGX_QUIC_FT_PATH_RESPONSE:
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
983
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
984 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: 8256
diff changeset
985 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
986 goto error;
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
987 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
988
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
989 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
990 "quic frame in: PATH_RESPONSE");
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
991
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
992 #ifdef NGX_QUIC_DEBUG_FRAMES
8360
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
993 ngx_quic_hexdump(pkt->log, "quic PATH_RESPONSE frame data",
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
994 f->u.path_response.data, 8);
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
995 #endif
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
996 break;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
997
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
998 default:
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
999 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1000 "quic unknown frame type 0x%xi", f->type);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1001 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1002 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1003
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1004 return p - start;
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
1005
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1006 error:
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1007
8385
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 8384
diff changeset
1008 pkt->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 8384
diff changeset
1009
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1010 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1011 "quic failed to parse frame type 0x%xi", f->type);
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1012
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1013 return NGX_ERROR;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1014 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1015
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1016
8370
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1017 static ngx_int_t
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1018 ngx_quic_frame_allowed(ngx_quic_header_t *pkt, ngx_uint_t frame_type)
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1019 {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1020 uint8_t ptype;
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1021
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1022 /* frame permissions per packet: 4 bits: IH01: 12.4, Table 3 */
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1023 static uint8_t ngx_quic_frame_masks[] = {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1024 /* PADDING */ 0xF,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1025 /* PING */ 0xF,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1026 /* ACK */ 0xD,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1027 /* ACK_ECN */ 0xD,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1028 /* RESET_STREAM */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1029 /* STOP_SENDING */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1030 /* CRYPTO */ 0xD,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1031 /* NEW_TOKEN */ 0x1,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1032 /* STREAM0 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1033 /* STREAM1 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1034 /* STREAM2 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1035 /* STREAM3 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1036 /* STREAM4 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1037 /* STREAM5 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1038 /* STREAM6 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1039 /* STREAM7 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1040 /* MAX_DATA */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1041 /* MAX_STREAM_DATA */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1042 /* MAX_STREAMS */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1043 /* MAX_STREAMS2 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1044 /* DATA_BLOCKED */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1045 /* STREAM_DATA_BLOCKED */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1046 /* STREAMS_BLOCKED */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1047 /* STREAMS_BLOCKED2 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1048 /* NEW_CONNECTION_ID */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1049 /* RETIRE_CONNECTION_ID */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1050 /* PATH_CHALLENGE */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1051 /* PATH_RESPONSE */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1052 /* CONNECTION_CLOSE */ 0xD,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1053 /* CONNECTION_CLOSE2 */ 0x1,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1054 /* HANDSHAKE_DONE */ 0x0, /* only sent by server */
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1055 };
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1056
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1057 if (ngx_quic_long_pkt(pkt->flags)) {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1058
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1059 if (ngx_quic_pkt_in(pkt->flags)) {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1060 ptype = 8; /* initial */
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1061
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1062 } else if (ngx_quic_pkt_hs(pkt->flags)) {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1063 ptype = 4; /* handshake */
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1064
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1065 } else {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1066 ptype = 2; /* zero-rtt */
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1067 }
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1068
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1069 } else {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1070 ptype = 1; /* application data */
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1071 }
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1072
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1073 if (ptype & ngx_quic_frame_masks[frame_type]) {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1074 return NGX_OK;
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1075 }
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1076
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1077 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1078 "quic frame type 0x%xi is not "
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1079 "allowed in packet with flags 0x%xi",
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1080 frame_type, pkt->flags);
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1081
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1082 return NGX_DECLINED;
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1083 }
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1084
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1085
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1086 ssize_t
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1087 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: 8323
diff changeset
1088 uint64_t *gap, uint64_t *range)
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1089 {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1090 u_char *p;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1091
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1092 p = start;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1093
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1094 p = ngx_quic_parse_int(p, end, gap);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1095 if (p == NULL) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1096 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1097 "quic failed to parse ack frame gap");
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1098 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1099 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1100
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1101 p = ngx_quic_parse_int(p, end, range);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1102 if (p == NULL) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1103 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1104 "quic failed to parse ack frame range");
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1105 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1106 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1107
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1108 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1109 "quic ACK range: gap %ui range %ui", *gap, *range);
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1110
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1111 return p - start;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1112 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1113
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1114
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1115 ssize_t
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1116 ngx_quic_create_frame(u_char *p, ngx_quic_frame_t *f)
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1117 {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1118 /*
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1119 * QUIC-recovery, section 2:
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1120 *
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1121 * Ack-eliciting Frames: All frames other than ACK, PADDING, and
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1122 * CONNECTION_CLOSE are considered ack-eliciting.
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1123 */
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1124 f->need_ack = 1;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1125
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1126 switch (f->type) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1127 case NGX_QUIC_FT_ACK:
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1128 f->need_ack = 0;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1129 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
1130
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1131 case NGX_QUIC_FT_CRYPTO:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1132 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
1133
8273
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1134 case NGX_QUIC_FT_HANDSHAKE_DONE:
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1135 return ngx_quic_create_hs_done(p);
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1136
8384
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1137 case NGX_QUIC_FT_NEW_TOKEN:
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1138 return ngx_quic_create_new_token(p, &f->u.token);
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1139
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1140 case NGX_QUIC_FT_STREAM0:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1141 case NGX_QUIC_FT_STREAM1:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1142 case NGX_QUIC_FT_STREAM2:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1143 case NGX_QUIC_FT_STREAM3:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1144 case NGX_QUIC_FT_STREAM4:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1145 case NGX_QUIC_FT_STREAM5:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1146 case NGX_QUIC_FT_STREAM6:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1147 case NGX_QUIC_FT_STREAM7:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1148 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
1149
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1150 case NGX_QUIC_FT_CONNECTION_CLOSE:
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1151 f->need_ack = 0;
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1152 return ngx_quic_create_close(p, &f->u.close);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1153
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1154 case NGX_QUIC_FT_MAX_STREAMS:
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1155 return ngx_quic_create_max_streams(p, &f->u.max_streams);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1156
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1157 case NGX_QUIC_FT_MAX_STREAM_DATA:
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1158 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: 8264
diff changeset
1159
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1160 case NGX_QUIC_FT_MAX_DATA:
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1161 return ngx_quic_create_max_data(p, &f->u.max_data);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1162
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1163 default:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1164 /* BUG: unsupported frame type generated */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1165 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1166 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1167 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1168
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 static size_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1171 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
1172 {
8244
d60205f37f5a Fixed ACKs to packet numbers greater than 63.
Roman Arutyunyan <arut@nginx.com>
parents: 8243
diff changeset
1173 size_t len;
d60205f37f5a Fixed ACKs to packet numbers greater than 63.
Roman Arutyunyan <arut@nginx.com>
parents: 8243
diff changeset
1174 u_char *start;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1175
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1176 /* minimal ACK packet */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1177
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1178 if (p == NULL) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1179 len = ngx_quic_varint_len(NGX_QUIC_FT_ACK);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1180 len += ngx_quic_varint_len(ack->largest);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1181 len += ngx_quic_varint_len(0);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1182 len += ngx_quic_varint_len(0);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1183 len += ngx_quic_varint_len(ack->first_range);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1184
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1185 return len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1186 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1187
8244
d60205f37f5a Fixed ACKs to packet numbers greater than 63.
Roman Arutyunyan <arut@nginx.com>
parents: 8243
diff changeset
1188 start = p;
d60205f37f5a Fixed ACKs to packet numbers greater than 63.
Roman Arutyunyan <arut@nginx.com>
parents: 8243
diff changeset
1189
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1190 ngx_quic_build_int(&p, NGX_QUIC_FT_ACK);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1191 ngx_quic_build_int(&p, ack->largest);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1192 ngx_quic_build_int(&p, 0);
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1193 ngx_quic_build_int(&p, 0);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1194 ngx_quic_build_int(&p, ack->first_range);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1195
8244
d60205f37f5a Fixed ACKs to packet numbers greater than 63.
Roman Arutyunyan <arut@nginx.com>
parents: 8243
diff changeset
1196 return p - start;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1197 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1198
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1199
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1200 static size_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1201 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
1202 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1203 size_t len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1204 u_char *start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1205
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1206 if (p == NULL) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1207 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
1208 len += ngx_quic_varint_len(crypto->offset);
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8326
diff changeset
1209 len += ngx_quic_varint_len(crypto->length);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8326
diff changeset
1210 len += crypto->length;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1211
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1212 return len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1213 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1214
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1215 start = p;
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 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
1218 ngx_quic_build_int(&p, crypto->offset);
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8326
diff changeset
1219 ngx_quic_build_int(&p, crypto->length);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8326
diff changeset
1220 p = ngx_cpymem(p, crypto->data, crypto->length);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1221
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1222 return p - start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1223 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1224
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 static size_t
8273
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1227 ngx_quic_create_hs_done(u_char *p)
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1228 {
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1229 u_char *start;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1230
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1231 if (p == NULL) {
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1232 return ngx_quic_varint_len(NGX_QUIC_FT_HANDSHAKE_DONE);
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1233 }
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1234
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1235 start = p;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1236
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1237 ngx_quic_build_int(&p, NGX_QUIC_FT_HANDSHAKE_DONE);
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1238
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1239 return p - start;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1240 }
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1241
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1242
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1243 static size_t
8384
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1244 ngx_quic_create_new_token(u_char *p, ngx_quic_new_token_frame_t *token)
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1245 {
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1246 size_t len;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1247 u_char *start;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1248
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1249 if (p == NULL) {
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1250 len = ngx_quic_varint_len(NGX_QUIC_FT_NEW_TOKEN);
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1251 len += ngx_quic_varint_len(token->length);
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1252 len += token->length;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1253
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1254 return len;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1255 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1256
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1257 start = p;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1258
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1259 ngx_quic_build_int(&p, NGX_QUIC_FT_NEW_TOKEN);
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1260 ngx_quic_build_int(&p, token->length);
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1261 p = ngx_cpymem(p, token->data, token->length);
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1262
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1263 return p - start;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1264 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1265
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1266
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1267 static size_t
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1268 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
1269 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1270 size_t len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1271 u_char *start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1272
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1273 if (p == NULL) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1274 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
1275
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1276 if (sf->off) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1277 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
1278 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1279
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1280 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
1281
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1282 /* 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
1283 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
1284
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1285 len += sf->length;
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 return len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1288 }
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 start = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1291
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1292 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
1293 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
1294
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1295 if (sf->off) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1296 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
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 /* 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
1300 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
1301
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1302 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
1303
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1304 return p - start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1305 }
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1306
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1307
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1308 static size_t
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1309 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: 8244
diff changeset
1310 {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1311 size_t len;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1312 u_char *start;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1313 ngx_uint_t type;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1314
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1315 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: 8244
diff changeset
1316
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1317 if (p == NULL) {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1318 len = ngx_quic_varint_len(type);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1319 len += ngx_quic_varint_len(ms->limit);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1320 return len;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1321 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1322
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1323 start = p;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1324
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1325 ngx_quic_build_int(&p, type);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1326 ngx_quic_build_int(&p, ms->limit);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1327
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1328 return p - start;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1329 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1330
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1331
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1332 static ngx_int_t
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1333 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: 8257
diff changeset
1334 ngx_quic_tp_t *dst)
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1335 {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1336 uint64_t varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1337
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1338 switch (id) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1339 case NGX_QUIC_TP_ORIGINAL_CONNECTION_ID:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1340 case NGX_QUIC_TP_STATELESS_RESET_TOKEN:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1341 case NGX_QUIC_TP_PREFERRED_ADDRESS:
8358
2a6e91a1691d TODOs cleanup in transport.
Vladimir Homutov <vl@nginx.com>
parents: 8357
diff changeset
1342 /* TODO: implement */
8262
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1343 return NGX_DECLINED;
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1344 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1345
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1346 switch (id) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1347
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1348 case NGX_QUIC_TP_DISABLE_ACTIVE_MIGRATION:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1349 /* zero-length option */
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1350 if (end - p != 0) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1351 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1352 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1353 dst->disable_active_migration = 1;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1354 return NGX_OK;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1355
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1356 case NGX_QUIC_TP_MAX_IDLE_TIMEOUT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1357 case NGX_QUIC_TP_MAX_PACKET_SIZE:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1358 case NGX_QUIC_TP_INITIAL_MAX_DATA:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1359 case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1360 case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1361 case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_UNI:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1362 case NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1363 case NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1364 case NGX_QUIC_TP_ACK_DELAY_EXPONENT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1365 case NGX_QUIC_TP_MAX_ACK_DELAY:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1366 case NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1367
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1368 p = ngx_quic_parse_int(p, end, &varint);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1369 if (p == NULL) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1370 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1371 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1372 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1373
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1374 default:
8262
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1375 return NGX_DECLINED;
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1376 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1377
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1378 switch (id) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1379
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1380 case NGX_QUIC_TP_MAX_IDLE_TIMEOUT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1381 dst->max_idle_timeout = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1382 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1383
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1384 case NGX_QUIC_TP_MAX_PACKET_SIZE:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1385 dst->max_packet_size = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1386 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1387
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1388 case NGX_QUIC_TP_INITIAL_MAX_DATA:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1389 dst->initial_max_data = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1390 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1391
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1392 case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1393 dst->initial_max_stream_data_bidi_local = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1394 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1395
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1396 case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1397 dst->initial_max_stream_data_bidi_remote = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1398 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1399
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1400 case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_UNI:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1401 dst->initial_max_stream_data_uni = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1402 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1403
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1404 case NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1405 dst->initial_max_streams_bidi = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1406 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1407
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1408 case NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1409 dst->initial_max_streams_uni = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1410 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1411
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1412 case NGX_QUIC_TP_ACK_DELAY_EXPONENT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1413 dst->ack_delay_exponent = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1414 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1415
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1416 case NGX_QUIC_TP_MAX_ACK_DELAY:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1417 dst->max_ack_delay = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1418 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1419
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1420 case NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1421 dst->active_connection_id_limit = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1422 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1423
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1424 default:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1425 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1426 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1427
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1428 return NGX_OK;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1429 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1430
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1431
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1432 ngx_int_t
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1433 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: 8257
diff changeset
1434 ngx_log_t *log)
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1435 {
8356
42198f77ac85 Removed support of drafts older than currently latest 27.
Vladimir Homutov <vl@nginx.com>
parents: 8351
diff changeset
1436 uint64_t id, len;
8262
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1437 ngx_int_t rc;
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1438
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1439 while (p < end) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1440 p = ngx_quic_parse_int(p, end, &id);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1441 if (p == NULL) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1442 ngx_log_error(NGX_LOG_INFO, log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1443 "quic failed to parse transport param id");
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1444 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1445 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1446
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1447 p = ngx_quic_parse_int(p, end, &len);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1448 if (p == NULL) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1449 ngx_log_error(NGX_LOG_INFO, log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1450 "quic failed to parse"
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1451 " transport param id 0x%xi length", id);
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1452 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1453 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1454
8262
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1455 rc = ngx_quic_parse_transport_param(p, p + len, id, tp);
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1456
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1457 if (rc == NGX_ERROR) {
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1458 ngx_log_error(NGX_LOG_INFO, log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1459 "quic failed to parse"
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1460 " transport param id 0x%xi data", id);
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1461 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1462 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1463
8262
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1464 if (rc == NGX_DECLINED) {
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1465 ngx_log_error(NGX_LOG_INFO, log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1466 "quic unknown transport param id 0x%xi,skipped", id);
8262
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1467 }
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1468
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1469 p += len;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1470 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1471
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1472 if (p != end) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1473 ngx_log_error(NGX_LOG_INFO, log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1474 "quic trailing garbage in"
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1475 " transport parameters: %ui bytes",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1476 end - p);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1477 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1478 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1479
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1480 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1481 "quic transport parameters parsed ok");
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1482
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1483 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1484 "quic tp disable active migration: %ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1485 tp->disable_active_migration);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1486
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1487 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "quic tp idle_timeout: %ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1488 tp->max_idle_timeout);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1489
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1490 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "quic tp max_packet_size: %ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1491 tp->max_packet_size);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1492
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1493 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "quic tp max_data: %ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1494 tp->initial_max_data);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1495
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1496 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1497 "quic tp max_stream_data_bidi_local: %ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1498 tp->initial_max_stream_data_bidi_local);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1499
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1500 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1501 "quic tp max_stream_data_bidi_remote: %ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1502 tp->initial_max_stream_data_bidi_remote);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1503
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1504 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1505 "quic tp max_stream_data_uni: %ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1506 tp->initial_max_stream_data_uni);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1507
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1508 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1509 "quic tp initial_max_streams_bidi: %ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1510 tp->initial_max_streams_bidi);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1511
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1512 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1513 "quic tp initial_max_streams_uni: %ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1514 tp->initial_max_streams_uni);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1515
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1516 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1517 "quic tp ack_delay_exponent: %ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1518 tp->ack_delay_exponent);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1519
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1520 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "quic tp max_ack_delay: %ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1521 tp->max_ack_delay);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1522
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1523 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1524 "quic tp active_connection_id_limit: %ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1525 tp->active_connection_id_limit);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1526
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1527 return NGX_OK;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1528 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1529
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1530
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1531 static size_t
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1532 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: 8264
diff changeset
1533 {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1534 size_t len;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1535 u_char *start;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1536
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1537 if (p == NULL) {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1538 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: 8264
diff changeset
1539 len += ngx_quic_varint_len(ms->id);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1540 len += ngx_quic_varint_len(ms->limit);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1541 return len;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1542 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1543
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1544 start = p;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1545
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1546 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: 8264
diff changeset
1547 ngx_quic_build_int(&p, ms->id);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1548 ngx_quic_build_int(&p, ms->limit);
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1549
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1550 return p - start;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1551 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1552
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1553
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1554 static size_t
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1555 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: 8333
diff changeset
1556 {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1557 size_t len;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1558 u_char *start;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1559
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1560 if (p == NULL) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1561 len = ngx_quic_varint_len(NGX_QUIC_FT_MAX_DATA);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1562 len += ngx_quic_varint_len(md->max_data);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1563 return len;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1564 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1565
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1566 start = p;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1567
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1568 ngx_quic_build_int(&p, NGX_QUIC_FT_MAX_DATA);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1569 ngx_quic_build_int(&p, md->max_data);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1570
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1571 return p - start;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1572 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1573
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1574
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1575 ssize_t
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1576 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: 8245
diff changeset
1577 {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1578 u_char *p;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1579 size_t len;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1580
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1581 #define ngx_quic_tp_len(id, value) \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1582 ngx_quic_varint_len(id) \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1583 + ngx_quic_varint_len(value) \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1584 + ngx_quic_varint_len(ngx_quic_varint_len(value))
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1585
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1586 #define ngx_quic_tp_vint(id, value) \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1587 do { \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1588 ngx_quic_build_int(&p, id); \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1589 ngx_quic_build_int(&p, ngx_quic_varint_len(value)); \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1590 ngx_quic_build_int(&p, value); \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1591 } while (0)
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1592
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1593 p = pos;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1594
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1595 len = ngx_quic_tp_len(NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1596 tp->active_connection_id_limit);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1597
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1598 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: 8245
diff changeset
1599
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1600 len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1601 tp->initial_max_streams_uni);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1602
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1603 len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1604 tp->initial_max_streams_bidi);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1605
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1606 len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1607 tp->initial_max_stream_data_bidi_local);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1608
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1609 len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1610 tp->initial_max_stream_data_bidi_remote);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1611
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1612 len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_UNI,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1613 tp->initial_max_stream_data_uni);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1614
8277
50db7ce374b7 Advertise our max_idle_timeout in transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8275
diff changeset
1615 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: 8275
diff changeset
1616 tp->max_idle_timeout);
50db7ce374b7 Advertise our max_idle_timeout in transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8275
diff changeset
1617
8383
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
1618 if (tp->retry) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
1619 len += ngx_quic_varint_len(NGX_QUIC_TP_ORIGINAL_CONNECTION_ID);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
1620 len += ngx_quic_varint_len(tp->original_connection_id.len);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
1621 len += tp->original_connection_id.len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
1622 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
1623
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1624 if (pos == NULL) {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1625 return len;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1626 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1627
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1628 ngx_quic_tp_vint(NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1629 tp->active_connection_id_limit);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1630
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1631 ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_DATA,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1632 tp->initial_max_data);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1633
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1634 ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1635 tp->initial_max_streams_uni);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1636
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1637 ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1638 tp->initial_max_streams_bidi);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1639
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1640 ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1641 tp->initial_max_stream_data_bidi_local);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1642
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1643 ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1644 tp->initial_max_stream_data_bidi_remote);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1645
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1646 ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_UNI,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1647 tp->initial_max_stream_data_uni);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1648
8277
50db7ce374b7 Advertise our max_idle_timeout in transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8275
diff changeset
1649 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: 8275
diff changeset
1650 tp->max_idle_timeout);
50db7ce374b7 Advertise our max_idle_timeout in transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8275
diff changeset
1651
8383
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
1652 if (tp->retry) {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
1653 ngx_quic_build_int(&p, NGX_QUIC_TP_ORIGINAL_CONNECTION_ID);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
1654 ngx_quic_build_int(&p, tp->original_connection_id.len);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
1655 p = ngx_cpymem(p, tp->original_connection_id.data,
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
1656 tp->original_connection_id.len);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
1657 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
1658
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1659 return p - pos;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1660 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1661
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1662
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1663 static size_t
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1664 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: 8231
diff changeset
1665 {
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1666 size_t len;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1667 u_char *start;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1668
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1669 if (p == NULL) {
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1670 len = ngx_quic_varint_len(NGX_QUIC_FT_CONNECTION_CLOSE);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1671 len += ngx_quic_varint_len(cl->error_code);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1672 len += ngx_quic_varint_len(cl->frame_type);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1673 len += ngx_quic_varint_len(cl->reason.len);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1674 len += cl->reason.len;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1675
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1676 return len;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1677 }
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1678
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1679 start = p;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1680
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1681 ngx_quic_build_int(&p, NGX_QUIC_FT_CONNECTION_CLOSE);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1682 ngx_quic_build_int(&p, cl->error_code);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1683 ngx_quic_build_int(&p, cl->frame_type);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1684 ngx_quic_build_int(&p, cl->reason.len);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1685 p = ngx_cpymem(p, cl->reason.data, cl->reason.len);
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1686
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1687 return p - start;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1688 }