annotate src/event/ngx_event_quic_transport.c @ 8634:831d1960826f quic

QUIC: generate default stateless reset token key. Previously, if quic_stateless_reset_token_key was empty or unspecified, initial stateless reset token was not generated. However subsequent tokens were generated with empty key, which resulted in error with certain SSL libraries, for example OpenSSL. Now a random 32-byte stateless reset token key is generated if none is specified in the configuration. As a result, stateless reset tokens are now generated for all server ids.
author Roman Arutyunyan <arut@nginx.com>
date Wed, 11 Nov 2020 21:08:48 +0000
parents 45db1b5c1706
children ad7ca043edf5
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>
8486
d0ac4449a07f QUIC: fixed bulding perl module by reducing header pollution.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8478
diff changeset
10 #include <ngx_event_quic_transport.h>
8224
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
8628
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
13 #define NGX_QUIC_LONG_DCID_LEN_OFFSET 5
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
14 #define NGX_QUIC_LONG_DCID_OFFSET 6
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
15 #define NGX_QUIC_SHORT_DCID_OFFSET 1
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
16
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
17
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
18 #if (NGX_HAVE_NONALIGNED)
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 #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
21 #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
22
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
23 #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
24 #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
25
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
26 #else
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
27
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
28 #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
29 #define ngx_quic_parse_uint32(p) \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
30 ((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
31
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
32 #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
33 ((p)[0] = (u_char) ((s) >> 8), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
34 (p)[1] = (u_char) (s), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
35 (p) + sizeof(uint16_t))
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
36
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37 #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
38 ((p)[0] = (u_char) ((s) >> 24), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
39 (p)[1] = (u_char) ((s) >> 16), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
40 (p)[2] = (u_char) ((s) >> 8), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
41 (p)[3] = (u_char) (s), \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
42 (p) + sizeof(uint32_t))
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
43
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
44 #endif
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
45
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
46 #define ngx_quic_write_uint24(p, s) \
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
47 ((p)[0] = (u_char) ((s) >> 16), \
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
48 (p)[1] = (u_char) ((s) >> 8), \
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
49 (p)[2] = (u_char) (s), \
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
50 (p) + 3)
8224
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_write_uint16_aligned(p, s) \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53 (*(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
54
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55 #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
56 (*(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
57
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
58 #define ngx_quic_varint_len(value) \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
59 ((value) <= 63 ? 1 \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
60 : ((uint32_t) value) <= 16383 ? 2 \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
61 : ((uint64_t) value) <= 1073741823 ? 4 \
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
62 : 8)
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
63
8625
4416b7ab0a27 QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8624
diff changeset
64 #define NGX_QUIC_VERSION(c) (0xff000000 + (c))
4416b7ab0a27 QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8624
diff changeset
65
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
66
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
67 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
68 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
69
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
70 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
71 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
72 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
73 u_char **out);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
74 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
75 u_char *dst);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
76
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
77 static ngx_int_t ngx_quic_parse_long_header(ngx_quic_header_t *pkt);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
78 static ngx_int_t ngx_quic_parse_short_header(ngx_quic_header_t *pkt,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
79 size_t dcid_len);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
80 static ngx_int_t ngx_quic_parse_initial_header(ngx_quic_header_t *pkt);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
81 static ngx_int_t ngx_quic_parse_handshake_header(ngx_quic_header_t *pkt);
8624
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
82 static ngx_int_t ngx_quic_supported_version(uint32_t version);
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
83
8370
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
84 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
85 ngx_uint_t frame_type);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
86 static size_t ngx_quic_create_ack(u_char *p, ngx_quic_ack_frame_t *ack);
8528
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
87 static size_t ngx_quic_create_stop_sending(u_char *p,
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
88 ngx_quic_stop_sending_frame_t *ss);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
89 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
90 ngx_quic_crypto_frame_t *crypto);
8273
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
91 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
92 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
93 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
94 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
95 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
96 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
97 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
98 ngx_quic_max_stream_data_frame_t *ms);
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
99 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
100 ngx_quic_max_data_frame_t *md);
8531
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
101 static size_t ngx_quic_create_path_response(u_char *p,
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
102 ngx_quic_path_challenge_frame_t *pc);
8628
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
103 static size_t ngx_quic_create_new_connection_id(u_char *p,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
104 ngx_quic_new_conn_id_frame_t *rcid);
8538
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
105 static size_t ngx_quic_create_retire_connection_id(u_char *p,
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
106 ngx_quic_retire_cid_frame_t *rcid);
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
107 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
108
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
109 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
110 uint16_t id, ngx_quic_tp_t *dst);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
111
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
112
8522
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
113 uint32_t ngx_quic_versions[] = {
8625
4416b7ab0a27 QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8624
diff changeset
114 #if (NGX_QUIC_DRAFT_VERSION >= 29)
4416b7ab0a27 QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8624
diff changeset
115 /* pretend we support all versions in range draft-29..v1 */
4416b7ab0a27 QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8624
diff changeset
116 NGX_QUIC_VERSION(29),
4416b7ab0a27 QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8624
diff changeset
117 NGX_QUIC_VERSION(30),
4416b7ab0a27 QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8624
diff changeset
118 NGX_QUIC_VERSION(31),
4416b7ab0a27 QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8624
diff changeset
119 NGX_QUIC_VERSION(32),
4416b7ab0a27 QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8624
diff changeset
120 /* QUICv1 */
4416b7ab0a27 QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8624
diff changeset
121 0x00000001
4416b7ab0a27 QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8624
diff changeset
122 #else
4416b7ab0a27 QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8624
diff changeset
123 NGX_QUIC_VERSION(NGX_QUIC_DRAFT_VERSION)
4416b7ab0a27 QUIC: multiple versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8624
diff changeset
124 #endif
8522
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
125 };
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
126
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
127 #define NGX_QUIC_NVERSIONS \
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
128 (sizeof(ngx_quic_versions) / sizeof(ngx_quic_versions[0]))
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
129
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
130
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131 /* literal errors indexed by corresponding value */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
132 static char *ngx_quic_errors[] = {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133 "NO_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134 "INTERNAL_ERROR",
8440
f9592e804834 QUIC error SERVER_BUSY renamed to CONNECTION_REFUSED in draft-29.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8426
diff changeset
135 "CONNECTION_REFUSED",
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136 "FLOW_CONTROL_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137 "STREAM_LIMIT_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
138 "STREAM_STATE_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
139 "FINAL_SIZE_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140 "FRAME_ENCODING_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
141 "TRANSPORT_PARAMETER_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
142 "CONNECTION_ID_LIMIT_ERROR",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
143 "PROTOCOL_VIOLATION",
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
144 "INVALID_TOKEN",
8426
6ea2f1daedb5 Introduced connection error APPLICATION_ERROR from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8425
diff changeset
145 "APPLICATION_ERROR",
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
146 "CRYPTO_BUFFER_EXCEEDED",
8444
769d8bdeffb0 Define KEY_UPDATE_ERROR from quic-tls-24.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8440
diff changeset
147 "KEY_UPDATE_ERROR",
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
148 };
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
149
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
150
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
151 static ngx_inline u_char *
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
152 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
153 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
154 u_char *p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
155 uint64_t value;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
156 ngx_uint_t len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
157
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
158 if (pos >= end) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
159 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
160 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
161
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
162 p = pos;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163 len = 1 << ((*p & 0xc0) >> 6);
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
164
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
165 value = *p++ & 0x3f;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
166
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
167 if ((size_t)(end - p) < (len - 1)) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
168 return NULL;
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
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
171 while (--len) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
172 value = (value << 8) + *p++;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
174
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
175 *out = value;
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 return p;
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
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 static ngx_inline u_char *
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
182 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
183 {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
184 if ((size_t)(end - pos) < 1) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
185 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
186 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
187
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
188 *value = *pos;
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 return pos + 1;
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
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
193
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
194 static ngx_inline u_char *
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
195 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
196 {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
197 if ((size_t)(end - pos) < sizeof(uint32_t)) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
198 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
199 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
200
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
201 *value = ngx_quic_parse_uint32(pos);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
202
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
203 return pos + sizeof(uint32_t);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
204 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
205
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
206
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
207 static ngx_inline u_char *
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
208 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
209 {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
210 if ((size_t)(end - pos) < len) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
211 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
212 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
213
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
214 *out = pos;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
215
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
216 return pos + len;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
217 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
218
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
219
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
220 static u_char *
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
221 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
222 {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
223 if ((size_t)(end - pos) < len) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
224 return NULL;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
225 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
226
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
227 ngx_memcpy(dst, pos, len);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
228
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
229 return pos + len;
8224
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
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 static void
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234 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
235 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236 u_char *p;
8351
dd84c9cef75b Improved ngx_quic_build_int() code and readability.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8344
diff changeset
237 ngx_uint_t bits, len;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
239 p = *pos;
8351
dd84c9cef75b Improved ngx_quic_build_int() code and readability.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8344
diff changeset
240 bits = 0;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
241
8351
dd84c9cef75b Improved ngx_quic_build_int() code and readability.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8344
diff changeset
242 while (value >> ((8 << bits) - 2)) {
dd84c9cef75b Improved ngx_quic_build_int() code and readability.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8344
diff changeset
243 bits++;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
245
8351
dd84c9cef75b Improved ngx_quic_build_int() code and readability.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8344
diff changeset
246 len = (1 << bits);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
247
8351
dd84c9cef75b Improved ngx_quic_build_int() code and readability.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8344
diff changeset
248 while (len--) {
dd84c9cef75b Improved ngx_quic_build_int() code and readability.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8344
diff changeset
249 *p++ = value >> (len * 8);
8224
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
8351
dd84c9cef75b Improved ngx_quic_build_int() code and readability.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8344
diff changeset
252 **pos |= bits << 6;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
253 *pos = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
254 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
255
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
256
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
257 u_char *
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
258 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
259 {
8447
97adb87f149b Get rid of hardcoded numbers used for quic handshake errors.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8444
diff changeset
260 if (error_code >= NGX_QUIC_ERR_CRYPTO_ERROR) {
97adb87f149b Get rid of hardcoded numbers used for quic handshake errors.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8444
diff changeset
261 return (u_char *) "handshake error";
97adb87f149b Get rid of hardcoded numbers used for quic handshake errors.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8444
diff changeset
262 }
8342
76e8ec502c69 Fixed error descriptions.
Vladimir Homutov <vl@nginx.com>
parents: 8338
diff changeset
263
76e8ec502c69 Fixed error descriptions.
Vladimir Homutov <vl@nginx.com>
parents: 8338
diff changeset
264 if (error_code >= NGX_QUIC_ERR_LAST) {
76e8ec502c69 Fixed error descriptions.
Vladimir Homutov <vl@nginx.com>
parents: 8338
diff changeset
265 return (u_char *) "unknown error";
76e8ec502c69 Fixed error descriptions.
Vladimir Homutov <vl@nginx.com>
parents: 8338
diff changeset
266 }
76e8ec502c69 Fixed error descriptions.
Vladimir Homutov <vl@nginx.com>
parents: 8338
diff changeset
267
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
268 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
269 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272 ngx_int_t
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
273 ngx_quic_parse_packet(ngx_quic_header_t *pkt)
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
274 {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
275 if (!ngx_quic_long_pkt(pkt->flags)) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
276 pkt->level = ssl_encryption_application;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
277
8569
a6784cf32c13 QUIC: fixed handling of incorrect packets.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
278 if (ngx_quic_parse_short_header(pkt, NGX_QUIC_SERVER_CID_LEN) != NGX_OK)
a6784cf32c13 QUIC: fixed handling of incorrect packets.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
279 {
a6784cf32c13 QUIC: fixed handling of incorrect packets.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
280 return NGX_DECLINED;
a6784cf32c13 QUIC: fixed handling of incorrect packets.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
281 }
a6784cf32c13 QUIC: fixed handling of incorrect packets.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
282
a6784cf32c13 QUIC: fixed handling of incorrect packets.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
283 return NGX_OK;
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
284 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
285
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
286 if (ngx_quic_parse_long_header(pkt) != NGX_OK) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
287 return NGX_DECLINED;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
288 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
289
8624
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
290 if (!ngx_quic_supported_version(pkt->version)) {
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
291 return NGX_ABORT;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
292 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
293
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
294 if (ngx_quic_pkt_in(pkt->flags)) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
295
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
296 if (pkt->len < NGX_QUIC_MIN_INITIAL_SIZE) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
297 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
298 "quic UDP datagram is too small for initial packet");
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
299 return NGX_DECLINED;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
300 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
301
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
302 pkt->level = ssl_encryption_initial;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
303
8569
a6784cf32c13 QUIC: fixed handling of incorrect packets.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
304 if (ngx_quic_parse_initial_header(pkt) != NGX_OK) {
a6784cf32c13 QUIC: fixed handling of incorrect packets.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
305 return NGX_DECLINED;
a6784cf32c13 QUIC: fixed handling of incorrect packets.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
306 }
a6784cf32c13 QUIC: fixed handling of incorrect packets.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
307
a6784cf32c13 QUIC: fixed handling of incorrect packets.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
308 return NGX_OK;
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
309 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
310
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
311 if (ngx_quic_pkt_hs(pkt->flags)) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
312 pkt->level = ssl_encryption_handshake;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
313
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
314 } else if (ngx_quic_pkt_zrtt(pkt->flags)) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
315 pkt->level = ssl_encryption_early_data;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
316
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
317 } else {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
318 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
319 "quic unknown long packet type");
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
320 return NGX_DECLINED;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
321 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
322
8569
a6784cf32c13 QUIC: fixed handling of incorrect packets.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
323 if (ngx_quic_parse_handshake_header(pkt) != NGX_OK) {
a6784cf32c13 QUIC: fixed handling of incorrect packets.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
324 return NGX_DECLINED;
a6784cf32c13 QUIC: fixed handling of incorrect packets.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
325 }
a6784cf32c13 QUIC: fixed handling of incorrect packets.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
326
a6784cf32c13 QUIC: fixed handling of incorrect packets.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
327 return NGX_OK;
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
328 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
329
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
330
8628
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
331 ngx_int_t
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
332 ngx_quic_get_packet_dcid(ngx_log_t *log, u_char *data, size_t n,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
333 ngx_str_t *dcid)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
334 {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
335 size_t len, offset;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
336
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
337 if (n == 0) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
338 goto failed;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
339 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
340
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
341 if (ngx_quic_long_pkt(*data)) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
342 if (n < NGX_QUIC_LONG_DCID_LEN_OFFSET + 1) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
343 goto failed;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
344 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
345
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
346 len = data[NGX_QUIC_LONG_DCID_LEN_OFFSET];
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
347 offset = NGX_QUIC_LONG_DCID_OFFSET;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
348
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
349 } else {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
350 len = NGX_QUIC_SERVER_CID_LEN;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
351 offset = NGX_QUIC_SHORT_DCID_OFFSET;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
352 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
353
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
354 if (n < len + offset) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
355 goto failed;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
356 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
357
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
358 dcid->len = len;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
359 dcid->data = &data[offset];
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
360
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
361 return NGX_OK;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
362
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
363 failed:
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
364
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
365 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, log, 0, "quic malformed packet");
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
366
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
367 return NGX_ERROR;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
368 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
369
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
370
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
371 static ngx_int_t
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
372 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
373 {
8522
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
374 u_char *p, *end;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
375 uint8_t idlen;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
376
8559
a89a58c642ef QUIC: simplified packet header parsing.
Vladimir Homutov <vl@nginx.com>
parents: 8558
diff changeset
377 p = pkt->raw->pos;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
378 end = pkt->data + pkt->len;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
379
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
380 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
381 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
382 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
383 "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
384 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
385 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
386
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
387 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8609
f32740ddd484 QUIC: got rid of "pkt" abbreviation in logs.
Vladimir Homutov <vl@nginx.com>
parents: 8608
diff changeset
388 "quic packet rx long flags:%xd version:%xD",
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
389 pkt->flags, pkt->version);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
390
8386
81f85c479d7e Discard packets without fixed bit or reserved bits set.
Vladimir Homutov <vl@nginx.com>
parents: 8385
diff changeset
391 if (!(pkt->flags & NGX_QUIC_PKT_FIXED_BIT)) {
81f85c479d7e Discard packets without fixed bit or reserved bits set.
Vladimir Homutov <vl@nginx.com>
parents: 8385
diff changeset
392 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic fixed bit is not set");
8533
62b58f0a4711 QUIC: discard incorrect packets instead of closing the connection.
Vladimir Homutov <vl@nginx.com>
parents: 8531
diff changeset
393 return NGX_ERROR;
8386
81f85c479d7e Discard packets without fixed bit or reserved bits set.
Vladimir Homutov <vl@nginx.com>
parents: 8385
diff changeset
394 }
81f85c479d7e Discard packets without fixed bit or reserved bits set.
Vladimir Homutov <vl@nginx.com>
parents: 8385
diff changeset
395
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
396 p = ngx_quic_read_uint8(p, end, &idlen);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
397 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
398 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
399 "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
400 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
401 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
402
8387
eebdda507ec3 Added tests for connection id lengths in initial packet.
Vladimir Homutov <vl@nginx.com>
parents: 8386
diff changeset
403 if (idlen > NGX_QUIC_CID_LEN_MAX) {
eebdda507ec3 Added tests for connection id lengths in initial packet.
Vladimir Homutov <vl@nginx.com>
parents: 8386
diff changeset
404 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
eebdda507ec3 Added tests for connection id lengths in initial packet.
Vladimir Homutov <vl@nginx.com>
parents: 8386
diff changeset
405 "quic packet dcid is too long");
eebdda507ec3 Added tests for connection id lengths in initial packet.
Vladimir Homutov <vl@nginx.com>
parents: 8386
diff changeset
406 return NGX_ERROR;
eebdda507ec3 Added tests for connection id lengths in initial packet.
Vladimir Homutov <vl@nginx.com>
parents: 8386
diff changeset
407 }
eebdda507ec3 Added tests for connection id lengths in initial packet.
Vladimir Homutov <vl@nginx.com>
parents: 8386
diff changeset
408
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
409 pkt->dcid.len = idlen;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
410
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
411 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
412 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
413 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
414 "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
415 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
416 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
417
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
418 p = ngx_quic_read_uint8(p, end, &idlen);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
419 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
420 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
421 "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
422 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
423 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
424
8387
eebdda507ec3 Added tests for connection id lengths in initial packet.
Vladimir Homutov <vl@nginx.com>
parents: 8386
diff changeset
425 if (idlen > NGX_QUIC_CID_LEN_MAX) {
eebdda507ec3 Added tests for connection id lengths in initial packet.
Vladimir Homutov <vl@nginx.com>
parents: 8386
diff changeset
426 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
eebdda507ec3 Added tests for connection id lengths in initial packet.
Vladimir Homutov <vl@nginx.com>
parents: 8386
diff changeset
427 "quic packet scid is too long");
eebdda507ec3 Added tests for connection id lengths in initial packet.
Vladimir Homutov <vl@nginx.com>
parents: 8386
diff changeset
428 return NGX_ERROR;
eebdda507ec3 Added tests for connection id lengths in initial packet.
Vladimir Homutov <vl@nginx.com>
parents: 8386
diff changeset
429 }
eebdda507ec3 Added tests for connection id lengths in initial packet.
Vladimir Homutov <vl@nginx.com>
parents: 8386
diff changeset
430
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
431 pkt->scid.len = idlen;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
432
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
433 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
434 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
435 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
436 "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
437 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
438 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
439
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
440 pkt->raw->pos = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
441
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
442 return NGX_OK;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
443 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
444
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 size_t
8522
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
447 ngx_quic_create_version_negotiation(ngx_quic_header_t *pkt, u_char *out)
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
448 {
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
449 u_char *p, *start;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
450 ngx_uint_t i;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
451
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
452 p = start = out;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
453
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
454 *p++ = pkt->flags;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
455
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
456 /*
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
457 * The Version field of a Version Negotiation packet
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
458 * MUST be set to 0x00000000
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
459 */
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
460 p = ngx_quic_write_uint32(p, 0);
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
461
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
462 *p++ = pkt->dcid.len;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
463 p = ngx_cpymem(p, pkt->dcid.data, pkt->dcid.len);
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
464
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
465 *p++ = pkt->scid.len;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
466 p = ngx_cpymem(p, pkt->scid.data, pkt->scid.len);
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
467
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
468 for (i = 0; i < NGX_QUIC_NVERSIONS; i++) {
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
469 p = ngx_quic_write_uint32(p, ngx_quic_versions[i]);
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
470 }
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
471
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
472 return p - start;
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
473 }
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
474
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
475
fc89d02bdca2 QUIC: added version negotiation support.
Vladimir Homutov <vl@nginx.com>
parents: 8499
diff changeset
476 size_t
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
477 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
478 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
479 {
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
480 u_char *p, *start;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
481
8594
ee06a813756c QUIC: teach how to compute only the length of created QUIC headers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8593
diff changeset
482 if (out == NULL) {
ee06a813756c QUIC: teach how to compute only the length of created QUIC headers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8593
diff changeset
483 return 5 + 2 + pkt->dcid.len + pkt->scid.len
ee06a813756c QUIC: teach how to compute only the length of created QUIC headers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8593
diff changeset
484 + ngx_quic_varint_len(pkt_len + pkt->num_len) + pkt->num_len
ee06a813756c QUIC: teach how to compute only the length of created QUIC headers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8593
diff changeset
485 + (pkt->level == ssl_encryption_initial ? 1 : 0);
ee06a813756c QUIC: teach how to compute only the length of created QUIC headers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8593
diff changeset
486 }
ee06a813756c QUIC: teach how to compute only the length of created QUIC headers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8593
diff changeset
487
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
488 p = start = out;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
489
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
490 *p++ = pkt->flags;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
491
8624
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
492 p = ngx_quic_write_uint32(p, pkt->version);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
493
8344
e0abe17a2878 Removed source/destination swap from the function creating header.
Vladimir Homutov <vl@nginx.com>
parents: 8342
diff changeset
494 *p++ = pkt->dcid.len;
e0abe17a2878 Removed source/destination swap from the function creating header.
Vladimir Homutov <vl@nginx.com>
parents: 8342
diff changeset
495 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
496
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
497 *p++ = pkt->scid.len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
498 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
499
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
500 if (pkt->level == ssl_encryption_initial) {
8593
d8a0bb1e85bf QUIC: simplified ngx_quic_create_long_header().
Sergey Kandaurov <pluknet@nginx.com>
parents: 8589
diff changeset
501 ngx_quic_build_int(&p, 0);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
502 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
503
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
504 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
505
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
506 *pnp = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
507
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
508 switch (pkt->num_len) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
509 case 1:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
510 *p++ = pkt->trunc;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
511 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
512 case 2:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
513 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
514 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
515 case 3:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
516 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
517 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
518 case 4:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
519 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
520 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
521 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
522
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
523 return p - start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
524 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
525
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
526
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
527 size_t
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
528 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
529 size_t pkt_len, u_char **pnp)
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
530 {
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
531 u_char *p, *start;
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
532
8594
ee06a813756c QUIC: teach how to compute only the length of created QUIC headers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8593
diff changeset
533 if (out == NULL) {
ee06a813756c QUIC: teach how to compute only the length of created QUIC headers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8593
diff changeset
534 return 1 + pkt->dcid.len + pkt->num_len;
ee06a813756c QUIC: teach how to compute only the length of created QUIC headers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8593
diff changeset
535 }
ee06a813756c QUIC: teach how to compute only the length of created QUIC headers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8593
diff changeset
536
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
537 p = start = out;
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
538
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
539 *p++ = pkt->flags;
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
540
8344
e0abe17a2878 Removed source/destination swap from the function creating header.
Vladimir Homutov <vl@nginx.com>
parents: 8342
diff changeset
541 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
542
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
543 *pnp = p;
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
544
8315
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
545 switch (pkt->num_len) {
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
546 case 1:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
547 *p++ = pkt->trunc;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
548 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
549 case 2:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
550 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
551 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
552 case 3:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
553 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
554 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
555 case 4:
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
556 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
557 break;
fdda518d10ba Proper handling of packet number in header.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
558 }
8285
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
559
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
560 return p - start;
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
561 }
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
562
f85749b60e58 Removed memory allocations from encryption code.
Vladimir Homutov <vl@nginx.com>
parents: 8277
diff changeset
563
8383
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
564 size_t
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
565 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
566 u_char **start)
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
567 {
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
568 u_char *p;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
569
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
570 p = out;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
571
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
572 *p++ = pkt->odcid.len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
573 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
574
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
575 *start = p;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
576
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
577 *p++ = 0xff;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
578
8624
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
579 p = ngx_quic_write_uint32(p, pkt->version);
8383
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
580
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
581 *p++ = pkt->dcid.len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
582 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
583
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
584 *p++ = pkt->scid.len;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
585 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
586
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
587 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
588
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
589 return p - out;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
590 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
591
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
592
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
593 static ngx_int_t
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
594 ngx_quic_parse_short_header(ngx_quic_header_t *pkt, size_t dcid_len)
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
595 {
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
596 u_char *p, *end;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
597
8559
a89a58c642ef QUIC: simplified packet header parsing.
Vladimir Homutov <vl@nginx.com>
parents: 8558
diff changeset
598 p = pkt->raw->pos;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
599 end = pkt->data + pkt->len;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
600
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
601 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8609
f32740ddd484 QUIC: got rid of "pkt" abbreviation in logs.
Vladimir Homutov <vl@nginx.com>
parents: 8608
diff changeset
602 "quic packet rx short flags:%xd", pkt->flags);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
603
8386
81f85c479d7e Discard packets without fixed bit or reserved bits set.
Vladimir Homutov <vl@nginx.com>
parents: 8385
diff changeset
604 if (!(pkt->flags & NGX_QUIC_PKT_FIXED_BIT)) {
81f85c479d7e Discard packets without fixed bit or reserved bits set.
Vladimir Homutov <vl@nginx.com>
parents: 8385
diff changeset
605 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic fixed bit is not set");
8533
62b58f0a4711 QUIC: discard incorrect packets instead of closing the connection.
Vladimir Homutov <vl@nginx.com>
parents: 8531
diff changeset
606 return NGX_ERROR;
8386
81f85c479d7e Discard packets without fixed bit or reserved bits set.
Vladimir Homutov <vl@nginx.com>
parents: 8385
diff changeset
607 }
81f85c479d7e Discard packets without fixed bit or reserved bits set.
Vladimir Homutov <vl@nginx.com>
parents: 8385
diff changeset
608
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
609 pkt->dcid.len = dcid_len;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
610
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
611 p = ngx_quic_read_bytes(p, end, dcid_len, &pkt->dcid.data);
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
612 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
613 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
614 "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
615 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
616 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
617
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
618 pkt->raw->pos = p;
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 return NGX_OK;
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
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
623
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
624 static ngx_int_t
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
625 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
626 {
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
627 u_char *p, *end;
8242
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
628 uint64_t varint;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
629
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
630 p = pkt->raw->pos;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
631
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
632 end = pkt->raw->last;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
633
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
634 pkt->log->action = "parsing quic initial header";
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
635
8242
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
636 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
637 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
638 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
639 "quic failed to parse token length");
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
640 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
641 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
642
8242
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
643 pkt->token.len = varint;
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
644
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
645 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
646 if (p == NULL) {
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
647 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
648 "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
649 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
650 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
651
8242
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
652 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
653 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
654 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
655 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
656 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
657
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
658 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8609
f32740ddd484 QUIC: got rid of "pkt" abbreviation in logs.
Vladimir Homutov <vl@nginx.com>
parents: 8608
diff changeset
659 "quic packet rx initial len:%uL", varint);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
660
8242
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
661 if (varint > (uint64_t) ((pkt->data + pkt->len) - p)) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
662 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
663 "quic truncated initial packet");
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
664 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
665 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
666
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
667 pkt->raw->pos = p;
8558
0f37b4ef3cd9 QUIC: keep the entire packet size in pkt->len.
Roman Arutyunyan <arut@nginx.com>
parents: 8542
diff changeset
668 pkt->len = p + varint - pkt->data;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
669
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
670 #ifdef NGX_QUIC_DEBUG_PACKETS
8360
f175006124d0 Cleaned up hexdumps in debug output.
Vladimir Homutov <vl@nginx.com>
parents: 8359
diff changeset
671 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
672 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
673 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
674 #endif
8224
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 return NGX_OK;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
677 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
678
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
679
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
680 static ngx_int_t
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
681 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
682 {
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
683 u_char *p, *end;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
684 uint64_t plen;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
685
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
686 p = pkt->raw->pos;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
687 end = pkt->raw->last;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
688
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
689 pkt->log->action = "parsing quic handshake header";
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
690
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
691 p = ngx_quic_parse_int(p, end, &plen);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
692 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
693 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
694 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
695 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
696
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
697 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8609
f32740ddd484 QUIC: got rid of "pkt" abbreviation in logs.
Vladimir Homutov <vl@nginx.com>
parents: 8608
diff changeset
698 "quic packet rx handshake len:%uL", plen);
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
699
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
700 if (plen > (uint64_t)((pkt->data + pkt->len) - p)) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
701 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
702 "quic truncated handshake packet");
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
703 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
704 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
705
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
706 pkt->raw->pos = p;
8558
0f37b4ef3cd9 QUIC: keep the entire packet size in pkt->len.
Roman Arutyunyan <arut@nginx.com>
parents: 8542
diff changeset
707 pkt->len = p + plen - pkt->data;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
708
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
709 return NGX_OK;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
710 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
711
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
712
8624
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
713 static ngx_int_t
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
714 ngx_quic_supported_version(uint32_t version)
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
715 {
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
716 ngx_uint_t i;
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
717
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
718 for (i = 0; i < NGX_QUIC_NVERSIONS; i++) {
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
719 if (ngx_quic_versions[i] == version) {
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
720 return 1;
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
721 }
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
722 }
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
723
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
724 return 0;
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
725 }
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
726
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8613
diff changeset
727
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
728 #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
729 #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
730 #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
731
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
732 ssize_t
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
733 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
734 ngx_quic_frame_t *f)
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
735 {
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
736 u_char *p;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
737 uint64_t varint;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
738 ngx_uint_t i;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
739
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
740 p = start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
741
8242
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
742 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
743 if (p == NULL) {
8385
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 8384
diff changeset
744 pkt->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
745 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
746 "quic failed to obtain quic frame type");
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
747 return NGX_ERROR;
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
748 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
749
8242
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
750 f->type = varint;
83a78cca8bce Fixed build.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8241
diff changeset
751
8370
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
752 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
753 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
754 return NGX_ERROR;
8370
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
755 }
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
756
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
757 switch (f->type) {
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
758
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
759 case NGX_QUIC_FT_CRYPTO:
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
760
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
761 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
762 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
763 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
764 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
765
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8326
diff changeset
766 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
767 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
768 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
769 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
770
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8326
diff changeset
771 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
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
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
776 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
777
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
778 case NGX_QUIC_FT_PADDING:
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
779
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
780 while (p < end && *p == NGX_QUIC_FT_PADDING) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
781 p++;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
782 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
783
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
784 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
785
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
786 case NGX_QUIC_FT_ACK:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
787 case NGX_QUIC_FT_ACK_ECN:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
788
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
789 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
790 && (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
791 && (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
792 && (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
793 {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
794 goto error;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
795 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
796
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
797 f->u.ack.ranges_start = p;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
798
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
799 /* process all ranges to get bounds, values are ignored */
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
800 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
801
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
802 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
803 if (p) {
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
804 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
805 }
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
806
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
807 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
808 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
809 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
810 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
811
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
812 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
813
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
814 if (f->type == NGX_QUIC_FT_ACK_ECN) {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
815
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
816 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
817 && (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
818 && (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
819 {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
820 goto error;
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
821 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
822
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
823 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
824 "quic ACK ECN counters ect0:%uL ect1:%uL ce:%uL",
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
825 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
826 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
827
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
828 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
829
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
830 case NGX_QUIC_FT_PING:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
831 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
832
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
833 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
834
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
835 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
836 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
837 goto error;
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
838 }
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
839
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
840 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
841 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
842 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
843 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
844
8538
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
845 if (f->u.ncid.retire > f->u.ncid.seqnum) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
846 goto error;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
847 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
848
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
849 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
850 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
851 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
852 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
853
8538
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
854 if (f->u.ncid.len < 1 || f->u.ncid.len > NGX_QUIC_CID_LEN_MAX) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
855 goto error;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
856 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
857
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
858 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
859 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
860 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
861 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
862
8562
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8560
diff changeset
863 p = ngx_quic_copy_bytes(p, end, NGX_QUIC_SR_TOKEN_LEN, f->u.ncid.srt);
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
864 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
865 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
866 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
867
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
868 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
869
8537
88676e7f4449 QUIC: style.
Vladimir Homutov <vl@nginx.com>
parents: 8533
diff changeset
870 case NGX_QUIC_FT_RETIRE_CONNECTION_ID:
88676e7f4449 QUIC: style.
Vladimir Homutov <vl@nginx.com>
parents: 8533
diff changeset
871
88676e7f4449 QUIC: style.
Vladimir Homutov <vl@nginx.com>
parents: 8533
diff changeset
872 p = ngx_quic_parse_int(p, end, &f->u.retire_cid.sequence_number);
88676e7f4449 QUIC: style.
Vladimir Homutov <vl@nginx.com>
parents: 8533
diff changeset
873 if (p == NULL) {
88676e7f4449 QUIC: style.
Vladimir Homutov <vl@nginx.com>
parents: 8533
diff changeset
874 goto error;
88676e7f4449 QUIC: style.
Vladimir Homutov <vl@nginx.com>
parents: 8533
diff changeset
875 }
88676e7f4449 QUIC: style.
Vladimir Homutov <vl@nginx.com>
parents: 8533
diff changeset
876
88676e7f4449 QUIC: style.
Vladimir Homutov <vl@nginx.com>
parents: 8533
diff changeset
877 break;
88676e7f4449 QUIC: style.
Vladimir Homutov <vl@nginx.com>
parents: 8533
diff changeset
878
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
879 case NGX_QUIC_FT_CONNECTION_CLOSE:
8458
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
880 case NGX_QUIC_FT_CONNECTION_CLOSE_APP:
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
881
8250
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
882 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
883 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
884 goto error;
8250
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
885 }
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
886
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
887 if (f->type == NGX_QUIC_FT_CONNECTION_CLOSE) {
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
888 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
889 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
890 goto error;
8256
0a18893299fe Fixed parsing NGX_QUIC_FT_CONNECTION_CLOSE.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8255
diff changeset
891 }
8250
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
892 }
8f9cb6d66662 Fixed parsing of CONNECTION CLOSE2 frames.
Vladimir Homutov <vl@nginx.com>
parents: 8249
diff changeset
893
8254
856d5a2de258 Fixed build with macOS's long long abomination.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8251
diff changeset
894 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
895 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
896 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
897 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
898
8254
856d5a2de258 Fixed build with macOS's long long abomination.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8251
diff changeset
899 f->u.close.reason.len = varint;
856d5a2de258 Fixed build with macOS's long long abomination.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8251
diff changeset
900
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
901 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
902 &f->u.close.reason.data);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
903 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
904 goto error;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
905 }
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
906
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
907 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
908
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
909 case NGX_QUIC_FT_STREAM0:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
910 case NGX_QUIC_FT_STREAM1:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
911 case NGX_QUIC_FT_STREAM2:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
912 case NGX_QUIC_FT_STREAM3:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
913 case NGX_QUIC_FT_STREAM4:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
914 case NGX_QUIC_FT_STREAM5:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
915 case NGX_QUIC_FT_STREAM6:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
916 case NGX_QUIC_FT_STREAM7:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
917
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
918 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
919
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
920 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
921 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
922 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
923
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
924 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
925 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
926 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
927 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
928
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
929 if (f->type & 0x04) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
930 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
931 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
932 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
933 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
934
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
935 } else {
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
936 f->u.stream.offset = 0;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
937 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
938
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
939 if (f->type & 0x02) {
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
940 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
941 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
942 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
943 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
944
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
945 } else {
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
946 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
947 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
948
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
949 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
950 &f->u.stream.data);
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
951 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
952 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
953 }
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
954
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
955 #ifdef NGX_QUIC_DEBUG_FRAMES
8604
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8596
diff changeset
956 ngx_quic_hexdump(pkt->log, "quic STREAM frame",
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8596
diff changeset
957 f->u.stream.data, f->u.stream.length);
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
958 #endif
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
959 break;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
960
8237
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
961 case NGX_QUIC_FT_MAX_DATA:
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
962
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
963 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
964 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
965 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
966 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
967
8237
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
968 break;
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
969
8231
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
970 case NGX_QUIC_FT_RESET_STREAM:
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
971
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
972 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
973 && (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
974 && (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
975 &f->u.reset_stream.final_size))))
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
976 {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
977 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
978 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
979
8231
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
980 break;
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
981
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
982 case NGX_QUIC_FT_STOP_SENDING:
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
983
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
984 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
985 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
986 goto error;
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
987 }
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
988
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
989 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
990 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
991 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
992 }
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
993
8231
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
994 break;
78540e2160d0 Added parsing of RESET_STREAM and STOP_SENDING frames
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
995
8236
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
996 case NGX_QUIC_FT_STREAMS_BLOCKED:
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
997 case NGX_QUIC_FT_STREAMS_BLOCKED2:
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
998
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
999 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
1000 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1001 goto error;
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
1002 }
8236
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
1003
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
1004 f->u.streams_blocked.bidi =
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8237
diff changeset
1005 (f->type == NGX_QUIC_FT_STREAMS_BLOCKED) ? 1 : 0;
8236
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
1006 break;
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
1007
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
1008 case NGX_QUIC_FT_MAX_STREAMS:
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
1009 case NGX_QUIC_FT_MAX_STREAMS2:
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1010
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1011 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
1012 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1013 goto error;
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1014 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1015
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1016 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
1017
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1018 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1019
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
1020 case NGX_QUIC_FT_MAX_STREAM_DATA:
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1021
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1022 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
1023 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1024 goto error;
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1025 }
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1026
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1027 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
1028 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1029 goto error;
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1030 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1031
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1032 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1033
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
1034 case NGX_QUIC_FT_DATA_BLOCKED:
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1035
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1036 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
1037 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1038 goto error;
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1039 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1040
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1041 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1042
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
1043 case NGX_QUIC_FT_STREAM_DATA_BLOCKED:
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1044
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1045 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
1046 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1047 goto error;
8357
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1048 }
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1049
05b8dd5d9f7e Retired the ngx_quic_parse_int_multi() function.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1050 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
1051 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1052 goto error;
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1053 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1054
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1055 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1056
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
1057 case NGX_QUIC_FT_PATH_CHALLENGE:
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1058
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1059 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
1060 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1061 goto error;
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1062 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1063
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1064 break;
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1065
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
1066 case NGX_QUIC_FT_PATH_RESPONSE:
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
1067
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1068 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
1069 if (p == NULL) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1070 goto error;
8257
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1071 }
085fd6e68367 Implemented parsing of remaining frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8256
diff changeset
1072
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
1073 break;
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
1074
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1075 default:
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8273
diff changeset
1076 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1077 "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
1078 return NGX_ERROR;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1079 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1080
8604
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8596
diff changeset
1081 f->level = pkt->level;
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8596
diff changeset
1082
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1083 return p - start;
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8250
diff changeset
1084
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1085 error:
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1086
8385
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 8384
diff changeset
1087 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
1088
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1089 ngx_log_error(NGX_LOG_INFO, pkt->log, 0,
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1090 "quic failed to parse frame type:0x%xi", f->type);
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1091
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1092 return NGX_ERROR;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1093 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1094
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1095
8370
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1096 static ngx_int_t
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1097 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
1098 {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1099 uint8_t ptype;
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1100
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1101 /* 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
1102 static uint8_t ngx_quic_frame_masks[] = {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1103 /* PADDING */ 0xF,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1104 /* PING */ 0xF,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1105 /* ACK */ 0xD,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1106 /* ACK_ECN */ 0xD,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1107 /* RESET_STREAM */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1108 /* STOP_SENDING */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1109 /* CRYPTO */ 0xD,
8424
c70446e3d771 Treat receipt of NEW_TOKEN as connection error PROTOCOL_VIOLATION.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8422
diff changeset
1110 /* NEW_TOKEN */ 0x0, /* only sent by server */
8370
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1111 /* STREAM0 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1112 /* STREAM1 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1113 /* STREAM2 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1114 /* STREAM3 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1115 /* STREAM4 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1116 /* STREAM5 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1117 /* STREAM6 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1118 /* STREAM7 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1119 /* MAX_DATA */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1120 /* MAX_STREAM_DATA */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1121 /* MAX_STREAMS */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1122 /* MAX_STREAMS2 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1123 /* DATA_BLOCKED */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1124 /* STREAM_DATA_BLOCKED */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1125 /* STREAMS_BLOCKED */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1126 /* STREAMS_BLOCKED2 */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1127 /* NEW_CONNECTION_ID */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1128 /* RETIRE_CONNECTION_ID */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1129 /* PATH_CHALLENGE */ 0x3,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1130 /* PATH_RESPONSE */ 0x3,
8425
3e38dad3a163 Receipt of CONNECTION_CLOSE in 0-RTT is permitted in draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8424
diff changeset
1131 #if (NGX_QUIC_DRAFT_VERSION >= 28)
3e38dad3a163 Receipt of CONNECTION_CLOSE in 0-RTT is permitted in draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8424
diff changeset
1132 /* CONNECTION_CLOSE */ 0xF,
3e38dad3a163 Receipt of CONNECTION_CLOSE in 0-RTT is permitted in draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8424
diff changeset
1133 /* CONNECTION_CLOSE2 */ 0x3,
3e38dad3a163 Receipt of CONNECTION_CLOSE in 0-RTT is permitted in draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8424
diff changeset
1134 #else
8370
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1135 /* CONNECTION_CLOSE */ 0xD,
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1136 /* CONNECTION_CLOSE2 */ 0x1,
8425
3e38dad3a163 Receipt of CONNECTION_CLOSE in 0-RTT is permitted in draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8424
diff changeset
1137 #endif
8370
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1138 /* HANDSHAKE_DONE */ 0x0, /* only sent by server */
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1139 };
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1140
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1141 if (ngx_quic_long_pkt(pkt->flags)) {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1142
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1143 if (ngx_quic_pkt_in(pkt->flags)) {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1144 ptype = 8; /* initial */
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1145
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1146 } 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
1147 ptype = 4; /* handshake */
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1148
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1149 } else {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1150 ptype = 2; /* zero-rtt */
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1151 }
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1152
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1153 } else {
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1154 ptype = 1; /* application data */
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1155 }
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1156
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1157 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
1158 return NGX_OK;
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1159 }
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1160
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1161 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
1162 "quic frame type 0x%xi is not "
8478
d2f716e668e8 Fixed format specifiers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8470
diff changeset
1163 "allowed in packet with flags 0x%xd",
8370
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1164 frame_type, pkt->flags);
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1165
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1166 return NGX_DECLINED;
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1167 }
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1168
262396242352 Reworked macros for parsing/assembling packet types.
Vladimir Homutov <vl@nginx.com>
parents: 8361
diff changeset
1169
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1170 ssize_t
8604
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8596
diff changeset
1171 ngx_quic_parse_ack_range(ngx_log_t *log, u_char *start, u_char *end,
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1172 uint64_t *gap, uint64_t *range)
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1173 {
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1174 u_char *p;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1175
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1176 p = start;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1177
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1178 p = ngx_quic_parse_int(p, end, gap);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1179 if (p == NULL) {
8604
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8596
diff changeset
1180 ngx_log_error(NGX_LOG_INFO, log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1181 "quic failed to parse ack frame gap");
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1182 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1183 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1184
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1185 p = ngx_quic_parse_int(p, end, range);
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1186 if (p == NULL) {
8604
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8596
diff changeset
1187 ngx_log_error(NGX_LOG_INFO, log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1188 "quic failed to parse ack frame range");
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1189 return NGX_ERROR;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1190 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1191
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1192 return p - start;
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1193 }
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1194
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1195
8613
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1196 size_t
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1197 ngx_quic_create_ack_range(u_char *p, uint64_t gap, uint64_t range)
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1198 {
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1199 size_t len;
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1200 u_char *start;
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1201
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1202 if (p == NULL) {
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1203 len = ngx_quic_varint_len(gap);
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1204 len += ngx_quic_varint_len(range);
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1205 return len;
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1206 }
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1207
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1208 start = p;
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1209
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1210 ngx_quic_build_int(&p, gap);
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1211 ngx_quic_build_int(&p, range);
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1212
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1213 return p - start;
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1214 }
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1215
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1216
8326
1cdd53532309 ACK ranges processing.
Vladimir Homutov <vl@nginx.com>
parents: 8323
diff changeset
1217 ssize_t
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1218 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
1219 {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1220 /*
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1221 * QUIC-recovery, section 2:
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1222 *
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1223 * 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
1224 * CONNECTION_CLOSE are considered ack-eliciting.
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1225 */
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1226 f->need_ack = 1;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1227
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1228 switch (f->type) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1229 case NGX_QUIC_FT_ACK:
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1230 f->need_ack = 0;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1231 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
1232
8528
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1233 case NGX_QUIC_FT_STOP_SENDING:
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1234 return ngx_quic_create_stop_sending(p, &f->u.stop_sending);
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1235
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1236 case NGX_QUIC_FT_CRYPTO:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1237 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
1238
8273
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1239 case NGX_QUIC_FT_HANDSHAKE_DONE:
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1240 return ngx_quic_create_hs_done(p);
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1241
8384
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1242 case NGX_QUIC_FT_NEW_TOKEN:
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1243 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
1244
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1245 case NGX_QUIC_FT_STREAM0:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1246 case NGX_QUIC_FT_STREAM1:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1247 case NGX_QUIC_FT_STREAM2:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1248 case NGX_QUIC_FT_STREAM3:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1249 case NGX_QUIC_FT_STREAM4:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1250 case NGX_QUIC_FT_STREAM5:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1251 case NGX_QUIC_FT_STREAM6:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1252 case NGX_QUIC_FT_STREAM7:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1253 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
1254
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1255 case NGX_QUIC_FT_CONNECTION_CLOSE:
8458
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1256 case NGX_QUIC_FT_CONNECTION_CLOSE_APP:
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1257 f->need_ack = 0;
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1258 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
1259
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1260 case NGX_QUIC_FT_MAX_STREAMS:
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1261 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
1262
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1263 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
1264 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
1265
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1266 case NGX_QUIC_FT_MAX_DATA:
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1267 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
1268
8531
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1269 case NGX_QUIC_FT_PATH_RESPONSE:
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1270 return ngx_quic_create_path_response(p, &f->u.path_response);
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1271
8628
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1272 case NGX_QUIC_FT_NEW_CONNECTION_ID:
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1273 return ngx_quic_create_new_connection_id(p, &f->u.ncid);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1274
8538
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1275 case NGX_QUIC_FT_RETIRE_CONNECTION_ID:
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1276 return ngx_quic_create_retire_connection_id(p, &f->u.retire_cid);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1277
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1278 default:
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1279 /* BUG: unsupported frame type generated */
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1280 return NGX_ERROR;
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 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1283
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 static size_t
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1286 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
1287 {
8613
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1288 size_t len;
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1289 u_char *start;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1290
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1291 if (p == NULL) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1292 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
1293 len += ngx_quic_varint_len(ack->largest);
8470
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 8458
diff changeset
1294 len += ngx_quic_varint_len(ack->delay);
8596
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8594
diff changeset
1295 len += ngx_quic_varint_len(ack->range_count);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1296 len += ngx_quic_varint_len(ack->first_range);
8613
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1297 len += ack->ranges_end - ack->ranges_start;
8596
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8594
diff changeset
1298
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1299 return len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1300 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1301
8244
d60205f37f5a Fixed ACKs to packet numbers greater than 63.
Roman Arutyunyan <arut@nginx.com>
parents: 8243
diff changeset
1302 start = p;
d60205f37f5a Fixed ACKs to packet numbers greater than 63.
Roman Arutyunyan <arut@nginx.com>
parents: 8243
diff changeset
1303
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1304 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
1305 ngx_quic_build_int(&p, ack->largest);
8470
0d1ad81dd65c QUIC: delay field of an ACK frame is now calculated.
Vladimir Homutov <vl@nginx.com>
parents: 8458
diff changeset
1306 ngx_quic_build_int(&p, ack->delay);
8596
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8594
diff changeset
1307 ngx_quic_build_int(&p, ack->range_count);
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
1308 ngx_quic_build_int(&p, ack->first_range);
8613
867c189f875d QUIC: unified range format for rx and tx ACK frames.
Roman Arutyunyan <arut@nginx.com>
parents: 8609
diff changeset
1309 p = ngx_cpymem(p, ack->ranges_start, ack->ranges_end - ack->ranges_start);
8596
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8594
diff changeset
1310
8244
d60205f37f5a Fixed ACKs to packet numbers greater than 63.
Roman Arutyunyan <arut@nginx.com>
parents: 8243
diff changeset
1311 return p - start;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1312 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1313
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1314
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1315 static size_t
8528
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1316 ngx_quic_create_stop_sending(u_char *p, ngx_quic_stop_sending_frame_t *ss)
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1317 {
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1318 size_t len;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1319 u_char *start;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1320
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1321 if (p == NULL) {
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1322 len = ngx_quic_varint_len(NGX_QUIC_FT_STOP_SENDING);
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1323 len += ngx_quic_varint_len(ss->id);
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1324 len += ngx_quic_varint_len(ss->error_code);
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1325 return len;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1326 }
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1327
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1328 start = p;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1329
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1330 ngx_quic_build_int(&p, NGX_QUIC_FT_STOP_SENDING);
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1331 ngx_quic_build_int(&p, ss->id);
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1332 ngx_quic_build_int(&p, ss->error_code);
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1333
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1334 return p - start;
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1335 }
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1336
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1337
97da6521657c QUIC: send STOP_SENDING on stream closure.
Roman Arutyunyan <arut@nginx.com>
parents: 8525
diff changeset
1338 static size_t
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1339 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
1340 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1341 size_t len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1342 u_char *start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1343
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1344 if (p == NULL) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1345 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
1346 len += ngx_quic_varint_len(crypto->offset);
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8326
diff changeset
1347 len += ngx_quic_varint_len(crypto->length);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8326
diff changeset
1348 len += crypto->length;
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1349
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1350 return len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1351 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1352
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1353 start = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1354
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1355 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
1356 ngx_quic_build_int(&p, crypto->offset);
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8326
diff changeset
1357 ngx_quic_build_int(&p, crypto->length);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8326
diff changeset
1358 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
1359
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1360 return p - start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1361 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1362
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1363
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1364 static size_t
8273
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1365 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
1366 {
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1367 u_char *start;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1368
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1369 if (p == NULL) {
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1370 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
1371 }
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1372
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1373 start = p;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1374
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1375 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
1376
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1377 return p - start;
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1378 }
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1379
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1380
cb75f194f1f0 Implemented sending HANDSHAKE_DONE frame after handshake.
Vladimir Homutov <vl@nginx.com>
parents: 8269
diff changeset
1381 static size_t
8384
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1382 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
1383 {
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1384 size_t len;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1385 u_char *start;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1386
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1387 if (p == NULL) {
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1388 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
1389 len += ngx_quic_varint_len(token->length);
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1390 len += token->length;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1391
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1392 return len;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1393 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1394
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1395 start = p;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1396
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1397 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
1398 ngx_quic_build_int(&p, token->length);
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1399 p = ngx_cpymem(p, token->data, token->length);
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1400
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1401 return p - start;
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1402 }
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1403
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1404
52d0c4832570 Address validation using NEW_TOKEN frame.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8383
diff changeset
1405 static size_t
8224
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1406 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
1407 {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1408 size_t len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1409 u_char *start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1410
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1411 if (p == NULL) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1412 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
1413
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1414 if (sf->off) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1415 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
1416 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1417
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1418 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
1419
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1420 /* 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
1421 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
1422
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1423 len += sf->length;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1424
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1425 return len;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1426 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1427
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1428 start = p;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1429
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1430 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
1431 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
1432
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1433 if (sf->off) {
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1434 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
1435 }
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1436
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1437 /* 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
1438 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
1439
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1440 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
1441
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1442 return p - start;
ae35ccba7aa6 Extracted transport part of the code into separate file.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1443 }
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1444
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1445
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1446 static size_t
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1447 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
1448 {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1449 size_t len;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1450 u_char *start;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1451 ngx_uint_t type;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1452
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1453 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
1454
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1455 if (p == NULL) {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1456 len = ngx_quic_varint_len(type);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1457 len += ngx_quic_varint_len(ms->limit);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1458 return len;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1459 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1460
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1461 start = p;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1462
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1463 ngx_quic_build_int(&p, type);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1464 ngx_quic_build_int(&p, ms->limit);
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1465
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1466 return p - start;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1467 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1468
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1469
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1470 static ngx_int_t
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1471 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
1472 ngx_quic_tp_t *dst)
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1473 {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1474 uint64_t varint;
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1475 ngx_str_t str;
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1476
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1477 varint = 0;
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1478 ngx_str_null(&str);
8260
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 switch (id) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1481
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1482 case NGX_QUIC_TP_DISABLE_ACTIVE_MIGRATION:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1483 /* zero-length option */
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1484 if (end - p != 0) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1485 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1486 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1487 dst->disable_active_migration = 1;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1488 return NGX_OK;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1489
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1490 case NGX_QUIC_TP_MAX_IDLE_TIMEOUT:
8415
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8414
diff changeset
1491 case NGX_QUIC_TP_MAX_UDP_PAYLOAD_SIZE:
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1492 case NGX_QUIC_TP_INITIAL_MAX_DATA:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1493 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
1494 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
1495 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
1496 case NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1497 case NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1498 case NGX_QUIC_TP_ACK_DELAY_EXPONENT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1499 case NGX_QUIC_TP_MAX_ACK_DELAY:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1500 case NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1501
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1502 p = ngx_quic_parse_int(p, end, &varint);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1503 if (p == NULL) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1504 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1505 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1506 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1507
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1508 case NGX_QUIC_TP_INITIAL_SCID:
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1509
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1510 str.len = end - p;
8582
b95aa1cb8f98 QUIC: fixed dead store assignment.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8569
diff changeset
1511 str.data = p;
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1512 break;
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1513
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1514 default:
8262
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1515 return NGX_DECLINED;
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1516 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1517
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1518 switch (id) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1519
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1520 case NGX_QUIC_TP_MAX_IDLE_TIMEOUT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1521 dst->max_idle_timeout = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1522 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1523
8415
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8414
diff changeset
1524 case NGX_QUIC_TP_MAX_UDP_PAYLOAD_SIZE:
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8414
diff changeset
1525 dst->max_udp_payload_size = varint;
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1526 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1527
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1528 case NGX_QUIC_TP_INITIAL_MAX_DATA:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1529 dst->initial_max_data = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1530 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1531
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1532 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
1533 dst->initial_max_stream_data_bidi_local = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1534 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1535
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1536 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
1537 dst->initial_max_stream_data_bidi_remote = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1538 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1539
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1540 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
1541 dst->initial_max_stream_data_uni = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1542 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1543
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1544 case NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1545 dst->initial_max_streams_bidi = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1546 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1547
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1548 case NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1549 dst->initial_max_streams_uni = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1550 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1551
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1552 case NGX_QUIC_TP_ACK_DELAY_EXPONENT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1553 dst->ack_delay_exponent = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1554 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1555
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1556 case NGX_QUIC_TP_MAX_ACK_DELAY:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1557 dst->max_ack_delay = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1558 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1559
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1560 case NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1561 dst->active_connection_id_limit = varint;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1562 break;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1563
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1564 case NGX_QUIC_TP_INITIAL_SCID:
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1565 dst->initial_scid = str;
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1566 break;
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1567
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1568 default:
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1569 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1570 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1571
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1572 return NGX_OK;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1573 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1574
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1575
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1576 ngx_int_t
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1577 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
1578 ngx_log_t *log)
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1579 {
8356
42198f77ac85 Removed support of drafts older than currently latest 27.
Vladimir Homutov <vl@nginx.com>
parents: 8351
diff changeset
1580 uint64_t id, len;
8262
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1581 ngx_int_t rc;
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1582
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1583 while (p < end) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1584 p = ngx_quic_parse_int(p, end, &id);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1585 if (p == NULL) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1586 ngx_log_error(NGX_LOG_INFO, log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1587 "quic failed to parse transport param id");
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1588 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1589 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1590
8414
49a98760afd2 Rejected forbidden transport parameters with TRANSPORT_PARAMETER_ERROR.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8391
diff changeset
1591 switch (id) {
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1592 case NGX_QUIC_TP_ORIGINAL_DCID:
8414
49a98760afd2 Rejected forbidden transport parameters with TRANSPORT_PARAMETER_ERROR.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8391
diff changeset
1593 case NGX_QUIC_TP_PREFERRED_ADDRESS:
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1594 case NGX_QUIC_TP_RETRY_SCID:
8562
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8560
diff changeset
1595 case NGX_QUIC_TP_SR_TOKEN:
8414
49a98760afd2 Rejected forbidden transport parameters with TRANSPORT_PARAMETER_ERROR.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8391
diff changeset
1596 ngx_log_error(NGX_LOG_INFO, log, 0,
49a98760afd2 Rejected forbidden transport parameters with TRANSPORT_PARAMETER_ERROR.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8391
diff changeset
1597 "quic client sent forbidden transport param"
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1598 " id:0x%xL", id);
8414
49a98760afd2 Rejected forbidden transport parameters with TRANSPORT_PARAMETER_ERROR.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8391
diff changeset
1599 return NGX_ERROR;
49a98760afd2 Rejected forbidden transport parameters with TRANSPORT_PARAMETER_ERROR.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8391
diff changeset
1600 }
49a98760afd2 Rejected forbidden transport parameters with TRANSPORT_PARAMETER_ERROR.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8391
diff changeset
1601
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1602 p = ngx_quic_parse_int(p, end, &len);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1603 if (p == NULL) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1604 ngx_log_error(NGX_LOG_INFO, log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1605 "quic failed to parse"
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1606 " transport param id:0x%xL length", id);
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1607 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1608 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1609
8262
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1610 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
1611
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1612 if (rc == NGX_ERROR) {
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1613 ngx_log_error(NGX_LOG_INFO, log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1614 "quic failed to parse"
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1615 " transport param id:0x%xL data", id);
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1616 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1617 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1618
8262
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1619 if (rc == NGX_DECLINED) {
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1620 ngx_log_error(NGX_LOG_INFO, log, 0,
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1621 "quic unknown transport param id:0x%xL, skipped", id);
8262
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1622 }
66f59c67adf4 Skip unknown transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8261
diff changeset
1623
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1624 p += len;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1625 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1626
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1627 if (p != end) {
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1628 ngx_log_error(NGX_LOG_INFO, log, 0,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1629 "quic trailing garbage in"
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1630 " transport parameters: bytes:%ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1631 end - p);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1632 return NGX_ERROR;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1633 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1634
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1635 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1636 "quic transport parameters parsed ok");
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1637
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1638 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1639 "quic tp disable active migration: %ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1640 tp->disable_active_migration);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1641
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1642 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
1643 tp->max_idle_timeout);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1644
8415
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8414
diff changeset
1645 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1646 "quic tp max_udp_payload_size:%ui",
8415
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8414
diff changeset
1647 tp->max_udp_payload_size);
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1648
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1649 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
1650 tp->initial_max_data);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1651
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1652 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1653 "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
1654 tp->initial_max_stream_data_bidi_local);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1655
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1656 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1657 "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
1658 tp->initial_max_stream_data_bidi_remote);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1659
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1660 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1661 "quic tp max_stream_data_uni:%ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1662 tp->initial_max_stream_data_uni);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1663
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1664 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1665 "quic tp initial_max_streams_bidi:%ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1666 tp->initial_max_streams_bidi);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1667
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1668 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1669 "quic tp initial_max_streams_uni:%ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1670 tp->initial_max_streams_uni);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1671
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8358
diff changeset
1672 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1673 "quic tp ack_delay_exponent:%ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1674 tp->ack_delay_exponent);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1675
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1676 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
1677 tp->max_ack_delay);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1678
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1679 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1680 "quic tp active_connection_id_limit:%ui",
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1681 tp->active_connection_id_limit);
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1682
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1683 #if (NGX_QUIC_DRAFT_VERSION >= 28)
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1684 ngx_quic_hexdump(log, "quic tp initial_source_connection_id:",
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1685 tp->initial_scid.data, tp->initial_scid.len);
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1686 #endif
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1687
8260
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1688 return NGX_OK;
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1689 }
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1690
f388c0ad3477 Added processing of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8257
diff changeset
1691
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1692 static size_t
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1693 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
1694 {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1695 size_t len;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1696 u_char *start;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1697
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1698 if (p == NULL) {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1699 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
1700 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
1701 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
1702 return len;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1703 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1704
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1705 start = p;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1706
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1707 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
1708 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
1709 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
1710
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1711 return p - start;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1712 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1713
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8264
diff changeset
1714
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1715 static size_t
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1716 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
1717 {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1718 size_t len;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1719 u_char *start;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1720
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1721 if (p == NULL) {
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1722 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
1723 len += ngx_quic_varint_len(md->max_data);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1724 return len;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1725 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1726
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1727 start = p;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1728
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1729 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
1730 ngx_quic_build_int(&p, md->max_data);
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1731
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1732 return p - start;
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1733 }
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1734
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1735
8531
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1736 static size_t
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1737 ngx_quic_create_path_response(u_char *p, ngx_quic_path_challenge_frame_t *pc)
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1738 {
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1739 size_t len;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1740 u_char *start;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1741
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1742 if (p == NULL) {
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1743 len = ngx_quic_varint_len(NGX_QUIC_FT_PATH_RESPONSE);
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1744 len += sizeof(pc->data);
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1745 return len;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1746 }
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1747
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1748 start = p;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1749
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1750 ngx_quic_build_int(&p, NGX_QUIC_FT_PATH_RESPONSE);
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1751 p = ngx_cpymem(p, &pc->data, sizeof(pc->data));
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1752
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1753 return p - start;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1754 }
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1755
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8528
diff changeset
1756
8538
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1757 static size_t
8628
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1758 ngx_quic_create_new_connection_id(u_char *p, ngx_quic_new_conn_id_frame_t *ncid)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1759 {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1760 size_t len;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1761 u_char *start;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1762
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1763 if (p == NULL) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1764 len = ngx_quic_varint_len(NGX_QUIC_FT_NEW_CONNECTION_ID);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1765 len += ngx_quic_varint_len(ncid->seqnum);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1766 len += ngx_quic_varint_len(ncid->retire);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1767 len++;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1768 len += ncid->len;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1769 len += NGX_QUIC_SR_TOKEN_LEN;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1770 return len;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1771 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1772
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1773 start = p;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1774
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1775 ngx_quic_build_int(&p, NGX_QUIC_FT_NEW_CONNECTION_ID);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1776 ngx_quic_build_int(&p, ncid->seqnum);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1777 ngx_quic_build_int(&p, ncid->retire);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1778 *p++ = ncid->len;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1779 p = ngx_cpymem(p, ncid->cid, ncid->len);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1780 p = ngx_cpymem(p, ncid->srt, NGX_QUIC_SR_TOKEN_LEN);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1781
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1782 return p - start;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1783 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1784
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1785
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1786 static size_t
8538
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1787 ngx_quic_create_retire_connection_id(u_char *p,
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1788 ngx_quic_retire_cid_frame_t *rcid)
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1789 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1790 size_t len;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1791 u_char *start;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1792
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1793 if (p == NULL) {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1794 len = ngx_quic_varint_len(NGX_QUIC_FT_RETIRE_CONNECTION_ID);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1795 len += ngx_quic_varint_len(rcid->sequence_number);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1796 return len;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1797 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1798
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1799 start = p;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1800
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1801 ngx_quic_build_int(&p, NGX_QUIC_FT_RETIRE_CONNECTION_ID);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1802 ngx_quic_build_int(&p, rcid->sequence_number);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1803
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1804 return p - start;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1805 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1806
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8537
diff changeset
1807
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1808 ssize_t
8422
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8421
diff changeset
1809 ngx_quic_create_transport_params(u_char *pos, u_char *end, ngx_quic_tp_t *tp,
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8421
diff changeset
1810 size_t *clen)
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1811 {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1812 u_char *p;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1813 size_t len;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1814
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1815 #define ngx_quic_tp_len(id, value) \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1816 ngx_quic_varint_len(id) \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1817 + ngx_quic_varint_len(value) \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1818 + ngx_quic_varint_len(ngx_quic_varint_len(value))
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1819
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1820 #define ngx_quic_tp_vint(id, value) \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1821 do { \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1822 ngx_quic_build_int(&p, id); \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1823 ngx_quic_build_int(&p, ngx_quic_varint_len(value)); \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1824 ngx_quic_build_int(&p, value); \
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1825 } while (0)
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1826
8416
78e362f0b081 Introduced macros for building length-value transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8415
diff changeset
1827 #define ngx_quic_tp_strlen(id, value) \
78e362f0b081 Introduced macros for building length-value transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8415
diff changeset
1828 ngx_quic_varint_len(id) \
78e362f0b081 Introduced macros for building length-value transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8415
diff changeset
1829 + ngx_quic_varint_len(value.len) \
78e362f0b081 Introduced macros for building length-value transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8415
diff changeset
1830 + value.len
78e362f0b081 Introduced macros for building length-value transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8415
diff changeset
1831
78e362f0b081 Introduced macros for building length-value transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8415
diff changeset
1832 #define ngx_quic_tp_str(id, value) \
78e362f0b081 Introduced macros for building length-value transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8415
diff changeset
1833 do { \
78e362f0b081 Introduced macros for building length-value transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8415
diff changeset
1834 ngx_quic_build_int(&p, id); \
78e362f0b081 Introduced macros for building length-value transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8415
diff changeset
1835 ngx_quic_build_int(&p, value.len); \
78e362f0b081 Introduced macros for building length-value transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8415
diff changeset
1836 p = ngx_cpymem(p, value.data, value.len); \
78e362f0b081 Introduced macros for building length-value transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8415
diff changeset
1837 } while (0)
78e362f0b081 Introduced macros for building length-value transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8415
diff changeset
1838
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1839 p = pos;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1840
8422
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8421
diff changeset
1841 len = ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_DATA, tp->initial_max_data);
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1842
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1843 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
1844 tp->initial_max_streams_uni);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1845
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1846 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
1847 tp->initial_max_streams_bidi);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1848
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1849 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
1850 tp->initial_max_stream_data_bidi_local);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1851
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1852 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
1853 tp->initial_max_stream_data_bidi_remote);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1854
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1855 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
1856 tp->initial_max_stream_data_uni);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1857
8277
50db7ce374b7 Advertise our max_idle_timeout in transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8275
diff changeset
1858 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
1859 tp->max_idle_timeout);
50db7ce374b7 Advertise our max_idle_timeout in transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8275
diff changeset
1860
8422
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8421
diff changeset
1861 if (clen) {
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8421
diff changeset
1862 *clen = len;
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8421
diff changeset
1863 }
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8421
diff changeset
1864
8628
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1865 if (tp->disable_active_migration) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1866 len += ngx_quic_varint_len(NGX_QUIC_TP_DISABLE_ACTIVE_MIGRATION);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1867 len += ngx_quic_varint_len(0);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1868 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1869
8422
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8421
diff changeset
1870 len += ngx_quic_tp_len(NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT,
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8421
diff changeset
1871 tp->active_connection_id_limit);
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8421
diff changeset
1872
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1873 #if (NGX_QUIC_DRAFT_VERSION >= 28)
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1874 len += ngx_quic_tp_strlen(NGX_QUIC_TP_ORIGINAL_DCID, tp->original_dcid);
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1875 len += ngx_quic_tp_strlen(NGX_QUIC_TP_INITIAL_SCID, tp->initial_scid);
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1876
8421
c206233d9c29 Fixed transport parameters on a new connection with a valid token.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8417
diff changeset
1877 if (tp->retry_scid.len) {
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1878 len += ngx_quic_tp_strlen(NGX_QUIC_TP_RETRY_SCID, tp->retry_scid);
8421
c206233d9c29 Fixed transport parameters on a new connection with a valid token.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8417
diff changeset
1879 }
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1880 #else
8421
c206233d9c29 Fixed transport parameters on a new connection with a valid token.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8417
diff changeset
1881 if (tp->original_dcid.len) {
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1882 len += ngx_quic_tp_strlen(NGX_QUIC_TP_ORIGINAL_DCID, tp->original_dcid);
8421
c206233d9c29 Fixed transport parameters on a new connection with a valid token.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8417
diff changeset
1883 }
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1884 #endif
8383
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
1885
8634
831d1960826f QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
1886 len += ngx_quic_varint_len(NGX_QUIC_TP_SR_TOKEN);
831d1960826f QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
1887 len += ngx_quic_varint_len(NGX_QUIC_SR_TOKEN_LEN);
831d1960826f QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
1888 len += NGX_QUIC_SR_TOKEN_LEN;
8562
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8560
diff changeset
1889
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1890 if (pos == NULL) {
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1891 return len;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1892 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1893
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1894 ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_DATA,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1895 tp->initial_max_data);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1896
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1897 ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1898 tp->initial_max_streams_uni);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1899
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1900 ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI,
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1901 tp->initial_max_streams_bidi);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1902
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1903 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
1904 tp->initial_max_stream_data_bidi_local);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1905
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1906 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
1907 tp->initial_max_stream_data_bidi_remote);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1908
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1909 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
1910 tp->initial_max_stream_data_uni);
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1911
8277
50db7ce374b7 Advertise our max_idle_timeout in transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8275
diff changeset
1912 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
1913 tp->max_idle_timeout);
50db7ce374b7 Advertise our max_idle_timeout in transport parameters.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8275
diff changeset
1914
8628
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1915 if (tp->disable_active_migration) {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1916 ngx_quic_build_int(&p, NGX_QUIC_TP_DISABLE_ACTIVE_MIGRATION);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1917 ngx_quic_build_int(&p, 0);
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1918 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8625
diff changeset
1919
8422
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8421
diff changeset
1920 ngx_quic_tp_vint(NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT,
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8421
diff changeset
1921 tp->active_connection_id_limit);
90b02ff6b003 Compatibility with BoringSSL master branch.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8421
diff changeset
1922
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1923 #if (NGX_QUIC_DRAFT_VERSION >= 28)
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1924 ngx_quic_tp_str(NGX_QUIC_TP_ORIGINAL_DCID, tp->original_dcid);
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1925 ngx_quic_tp_str(NGX_QUIC_TP_INITIAL_SCID, tp->initial_scid);
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1926
8421
c206233d9c29 Fixed transport parameters on a new connection with a valid token.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8417
diff changeset
1927 if (tp->retry_scid.len) {
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1928 ngx_quic_tp_str(NGX_QUIC_TP_RETRY_SCID, tp->retry_scid);
8421
c206233d9c29 Fixed transport parameters on a new connection with a valid token.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8417
diff changeset
1929 }
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1930 #else
8421
c206233d9c29 Fixed transport parameters on a new connection with a valid token.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8417
diff changeset
1931 if (tp->original_dcid.len) {
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1932 ngx_quic_tp_str(NGX_QUIC_TP_ORIGINAL_DCID, tp->original_dcid);
8421
c206233d9c29 Fixed transport parameters on a new connection with a valid token.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8417
diff changeset
1933 }
8417
6633f17044eb QUIC draft-28 transport parameters support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8416
diff changeset
1934 #endif
8383
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8370
diff changeset
1935
8634
831d1960826f QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
1936 ngx_quic_build_int(&p, NGX_QUIC_TP_SR_TOKEN);
831d1960826f QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
1937 ngx_quic_build_int(&p, NGX_QUIC_SR_TOKEN_LEN);
831d1960826f QUIC: generate default stateless reset token key.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
1938 p = ngx_cpymem(p, tp->sr_token, NGX_QUIC_SR_TOKEN_LEN);
8562
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8560
diff changeset
1939
8247
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1940 return p - pos;
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1941 }
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1942
e9891e8ee975 Configurable transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8245
diff changeset
1943
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8244
diff changeset
1944 static size_t
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1945 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
1946 {
8458
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1947 size_t len;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1948 u_char *start;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1949 ngx_uint_t type;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1950
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1951 type = cl->app ? NGX_QUIC_FT_CONNECTION_CLOSE_APP
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1952 : NGX_QUIC_FT_CONNECTION_CLOSE;
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1953
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1954 if (p == NULL) {
8458
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1955 len = ngx_quic_varint_len(type);
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1956 len += ngx_quic_varint_len(cl->error_code);
8458
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1957
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1958 if (!cl->app) {
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1959 len += ngx_quic_varint_len(cl->frame_type);
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1960 }
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1961
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1962 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
1963 len += cl->reason.len;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1964
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1965 return len;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1966 }
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1967
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1968 start = p;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1969
8458
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1970 ngx_quic_build_int(&p, type);
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1971 ngx_quic_build_int(&p, cl->error_code);
8458
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1972
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1973 if (!cl->app) {
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1974 ngx_quic_build_int(&p, cl->frame_type);
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1975 }
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8447
diff changeset
1976
8235
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1977 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
1978 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
1979
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1980 return p - start;
552d6868091b Implemented send_alert callback, CONNECTION_CLOSE writer.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8231
diff changeset
1981 }