annotate src/event/quic/ngx_event_quic.c @ 8763:4117aa7fa38e quic

QUIC: connection migration. The patch adds proper transitions between multiple networking addresses that can be used by a single quic connection. New networking paths are validated using PATH_CHALLENGE/PATH_RESPONSE frames.
author Vladimir Homutov <vl@nginx.com>
date Thu, 29 Apr 2021 15:35:02 +0300
parents 46161c610919
children 901126931bd5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
2 /*
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
3 * Copyright (C) Nginx, Inc.
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
4 */
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
5
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
6
8171
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
7 #include <ngx_config.h>
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
8 #include <ngx_core.h>
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
9 #include <ngx_event.h>
8736
714e9af983de QUIC: separate header for ngx_quic_connection_t.
Vladimir Homutov <vl@nginx.com>
parents: 8735
diff changeset
10 #include <ngx_event_quic_connection.h>
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
11
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
12
8561
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8560
diff changeset
13 static ngx_quic_connection_t *ngx_quic_new_connection(ngx_connection_t *c,
8563
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
14 ngx_quic_conf_t *conf, ngx_quic_header_t *pkt);
8562
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
15 static ngx_int_t ngx_quic_process_stateless_reset(ngx_connection_t *c,
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
16 ngx_quic_header_t *pkt);
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
17 static void ngx_quic_input_handler(ngx_event_t *rev);
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
18
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
19 static ngx_int_t ngx_quic_close_quic(ngx_connection_t *c, ngx_int_t rc);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
20 static void ngx_quic_close_timer_handler(ngx_event_t *ev);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
21
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
22 static ngx_int_t ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b,
8563
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
23 ngx_quic_conf_t *conf);
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
24 static ngx_int_t ngx_quic_process_packet(ngx_connection_t *c,
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
25 ngx_quic_conf_t *conf, ngx_quic_header_t *pkt);
8687
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
26 static ngx_int_t ngx_quic_process_payload(ngx_connection_t *c,
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
27 ngx_quic_header_t *pkt);
8688
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
28 static ngx_int_t ngx_quic_check_csid(ngx_quic_connection_t *qc,
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
29 ngx_quic_header_t *pkt);
8687
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
30 static ngx_int_t ngx_quic_handle_frames(ngx_connection_t *c,
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
31 ngx_quic_header_t *pkt);
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents: 8750
diff changeset
32
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
33 static void ngx_quic_push_handler(ngx_event_t *ev);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
34
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
35
8674
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
36 static ngx_core_module_t ngx_quic_module_ctx = {
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
37 ngx_string("quic"),
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
38 NULL,
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
39 NULL
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
40 };
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
41
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
42
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
43 ngx_module_t ngx_quic_module = {
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
44 NGX_MODULE_V1,
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
45 &ngx_quic_module_ctx, /* module context */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
46 NULL, /* module directives */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
47 NGX_CORE_MODULE, /* module type */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
48 NULL, /* init master */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
49 NULL, /* init module */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
50 NULL, /* init process */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
51 NULL, /* init thread */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
52 NULL, /* exit thread */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
53 NULL, /* exit process */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
54 NULL, /* exit master */
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
55 NGX_MODULE_V1_PADDING
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
56 };
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
57
2c7f927f7999 QUIC: ngx_quic_module.
Vladimir Homutov <vl@nginx.com>
parents: 8673
diff changeset
58
8604
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8603
diff changeset
59 #if (NGX_DEBUG)
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8603
diff changeset
60
8751
bc910a5ec737 QUIC: separate files for output and ack related processing.
Vladimir Homutov <vl@nginx.com>
parents: 8750
diff changeset
61 void
8607
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
62 ngx_quic_connstate_dbg(ngx_connection_t *c)
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
63 {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
64 u_char *p, *last;
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
65 ngx_quic_connection_t *qc;
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
66 u_char buf[NGX_MAX_ERROR_STR];
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
67
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
68 p = buf;
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
69 last = p + sizeof(buf);
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
70
8629
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
71 qc = ngx_quic_get_connection(c);
8607
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
72
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
73 p = ngx_slprintf(p, last, "state:");
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
74
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
75 if (qc) {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
76
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
77 if (qc->error) {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
78 p = ngx_slprintf(p, last, "%s", qc->error_app ? " app" : "");
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
79 p = ngx_slprintf(p, last, " error:%ui", qc->error);
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
80
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
81 if (qc->error_reason) {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
82 p = ngx_slprintf(p, last, " \"%s\"", qc->error_reason);
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
83 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
84 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
85
8724
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
86 p = ngx_slprintf(p, last, "%s", qc->shutdown ? " shutdown" : "");
8607
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
87 p = ngx_slprintf(p, last, "%s", qc->closing ? " closing" : "");
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
88 p = ngx_slprintf(p, last, "%s", qc->draining ? " draining" : "");
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
89 p = ngx_slprintf(p, last, "%s", qc->key_phase ? " kp" : "");
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
90
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
91 } else {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
92 p = ngx_slprintf(p, last, " early");
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
93 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
94
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
95 if (c->read->timer_set) {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
96 p = ngx_slprintf(p, last,
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
97 qc && qc->send_timer_set ? " send:%M" : " read:%M",
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
98 c->read->timer.key - ngx_current_msec);
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
99 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
100
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
101 if (qc) {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
102
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
103 if (qc->push.timer_set) {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
104 p = ngx_slprintf(p, last, " push:%M",
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
105 qc->push.timer.key - ngx_current_msec);
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
106 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
107
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
108 if (qc->pto.timer_set) {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
109 p = ngx_slprintf(p, last, " pto:%M",
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
110 qc->pto.timer.key - ngx_current_msec);
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
111 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
112
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
113 if (qc->close.timer_set) {
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
114 p = ngx_slprintf(p, last, " close:%M",
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
115 qc->close.timer.key - ngx_current_msec);
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
116 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
117 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
118
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
119 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
120 "quic %*s", p - buf, buf);
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
121 }
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
122
8604
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8603
diff changeset
123 #endif
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8603
diff changeset
124
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8603
diff changeset
125
8753
46161c610919 QUIC: separate files for SSL library interfaces.
Vladimir Homutov <vl@nginx.com>
parents: 8752
diff changeset
126 ngx_int_t
8701
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
127 ngx_quic_apply_transport_params(ngx_connection_t *c, ngx_quic_tp_t *ctp)
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
128 {
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
129 ngx_str_t scid;
8701
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
130 ngx_quic_connection_t *qc;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
131
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
132 qc = ngx_quic_get_connection(c);
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
133
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
134 scid.data = qc->socket->cid->id;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
135 scid.len = qc->socket->cid->len;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
136
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
137 if (scid.len != ctp->initial_scid.len
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
138 || ngx_memcmp(scid.data, ctp->initial_scid.data, scid.len) != 0)
8701
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
139 {
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
140 ngx_log_error(NGX_LOG_INFO, c->log, 0,
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
141 "quic client initial_source_connection_id mismatch");
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
142 return NGX_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
143 }
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
144
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
145 if (ctp->max_udp_payload_size < NGX_QUIC_MIN_INITIAL_SIZE
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
146 || ctp->max_udp_payload_size > NGX_QUIC_MAX_UDP_PAYLOAD_SIZE)
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
147 {
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
148 qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
149 qc->error_reason = "invalid maximum packet size";
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
150
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
151 ngx_log_error(NGX_LOG_INFO, c->log, 0,
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
152 "quic maximum packet size is invalid");
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
153 return NGX_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
154
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
155 } else if (ctp->max_udp_payload_size > ngx_quic_max_udp_payload(c)) {
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
156 ctp->max_udp_payload_size = ngx_quic_max_udp_payload(c);
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
157 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
8702
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8701
diff changeset
158 "quic client maximum packet size truncated");
8701
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
159 }
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
160
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
161 if (ctp->active_connection_id_limit < 2) {
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
162 qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
163 qc->error_reason = "invalid active_connection_id_limit";
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
164
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
165 ngx_log_error(NGX_LOG_INFO, c->log, 0,
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
166 "quic active_connection_id_limit is invalid");
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
167 return NGX_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
168 }
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
169
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
170 if (ctp->ack_delay_exponent > 20) {
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
171 qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
172 qc->error_reason = "invalid ack_delay_exponent";
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
173
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
174 ngx_log_error(NGX_LOG_INFO, c->log, 0,
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
175 "quic ack_delay_exponent is invalid");
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
176 return NGX_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
177 }
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
178
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
179 if (ctp->max_ack_delay > 16384) {
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
180 qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
181 qc->error_reason = "invalid max_ack_delay";
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
182
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
183 ngx_log_error(NGX_LOG_INFO, c->log, 0,
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
184 "quic max_ack_delay is invalid");
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
185 return NGX_ERROR;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
186 }
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
187
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
188 if (ctp->max_idle_timeout > 0
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
189 && ctp->max_idle_timeout < qc->tp.max_idle_timeout)
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
190 {
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
191 qc->tp.max_idle_timeout = ctp->max_idle_timeout;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
192 }
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
193
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
194 qc->streams.server_max_streams_bidi = ctp->initial_max_streams_bidi;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
195 qc->streams.server_max_streams_uni = ctp->initial_max_streams_uni;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
196
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
197 ngx_memcpy(&qc->ctp, ctp, sizeof(ngx_quic_tp_t));
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
198
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
199 return NGX_OK;
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
200 }
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
201
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
202
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
203 void
8563
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
204 ngx_quic_run(ngx_connection_t *c, ngx_quic_conf_t *conf)
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
205 {
8629
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
206 ngx_int_t rc;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
207 ngx_quic_connection_t *qc;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
208
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
209 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic run");
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
210
8563
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
211 rc = ngx_quic_input(c, c->buffer, conf);
8536
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8535
diff changeset
212 if (rc != NGX_OK) {
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8535
diff changeset
213 ngx_quic_close_connection(c, rc == NGX_DECLINED ? NGX_DONE : NGX_ERROR);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
214 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
215 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
216
8629
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
217 qc = ngx_quic_get_connection(c);
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
218
8686
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8676
diff changeset
219 if (qc == NULL) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8676
diff changeset
220 ngx_quic_close_connection(c, NGX_DONE);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8676
diff changeset
221 return;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8676
diff changeset
222 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8676
diff changeset
223
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8676
diff changeset
224 ngx_add_timer(c->read, qc->tp.max_idle_timeout);
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8676
diff changeset
225 ngx_quic_connstate_dbg(c);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
226
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
227 c->read->handler = ngx_quic_input_handler;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
228
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
229 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
230 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
231
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
232
8561
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8560
diff changeset
233 static ngx_quic_connection_t *
8563
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
234 ngx_quic_new_connection(ngx_connection_t *c, ngx_quic_conf_t *conf,
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
235 ngx_quic_header_t *pkt)
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
236 {
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
237 ngx_uint_t i;
8265
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
238 ngx_quic_tp_t *ctp;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
239 ngx_quic_connection_t *qc;
8387
eebdda507ec3 Added tests for connection id lengths in initial packet.
Vladimir Homutov <vl@nginx.com>
parents: 8386
diff changeset
240
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
241 qc = ngx_pcalloc(c->pool, sizeof(ngx_quic_connection_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
242 if (qc == NULL) {
8561
b4ef79ef1c23 QUIC: refined the "c->quic->initialized" flag usage.
Vladimir Homutov <vl@nginx.com>
parents: 8560
diff changeset
243 return NULL;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
244 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
245
8621
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
246 qc->keys = ngx_quic_keys_new(c->pool);
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
247 if (qc->keys == NULL) {
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
248 return NULL;
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
249 }
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
250
8624
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8623
diff changeset
251 qc->version = pkt->version;
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8623
diff changeset
252
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
253 ngx_rbtree_init(&qc->streams.tree, &qc->streams.sentinel,
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
254 ngx_quic_rbtree_insert_stream);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
255
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
256 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
8331
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
257 ngx_queue_init(&qc->send_ctx[i].frames);
bda817d16cc2 Rename types and variables used for packet number space.
Vladimir Homutov <vl@nginx.com>
parents: 8328
diff changeset
258 ngx_queue_init(&qc->send_ctx[i].sent);
8598
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8597
diff changeset
259 qc->send_ctx[i].largest_pn = NGX_QUIC_UNSET_PN;
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8597
diff changeset
260 qc->send_ctx[i].largest_ack = NGX_QUIC_UNSET_PN;
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8597
diff changeset
261 qc->send_ctx[i].largest_range = NGX_QUIC_UNSET_PN;
85a550047eb5 QUIC: added macro for unset packet number.
Vladimir Homutov <vl@nginx.com>
parents: 8597
diff changeset
262 qc->send_ctx[i].pending_ack = NGX_QUIC_UNSET_PN;
8596
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8595
diff changeset
263 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8595
diff changeset
264
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8595
diff changeset
265 qc->send_ctx[0].level = ssl_encryption_initial;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8595
diff changeset
266 qc->send_ctx[1].level = ssl_encryption_handshake;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8595
diff changeset
267 qc->send_ctx[2].level = ssl_encryption_application;
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
268
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
269 for (i = 0; i < NGX_QUIC_ENCRYPTION_LAST; i++) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
270 ngx_queue_init(&qc->crypto[i].frames);
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
271 }
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
272
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
273 ngx_queue_init(&qc->free_frames);
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
274
8469
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 8458
diff changeset
275 qc->avg_rtt = NGX_QUIC_INITIAL_RTT;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 8458
diff changeset
276 qc->rttvar = NGX_QUIC_INITIAL_RTT / 2;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 8458
diff changeset
277 qc->min_rtt = NGX_TIMER_INFINITE;
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 8458
diff changeset
278
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 8458
diff changeset
279 /*
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 8458
diff changeset
280 * qc->latest_rtt = 0
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 8458
diff changeset
281 */
3b107aadc9f6 QUIC: added rtt estimation.
Vladimir Homutov <vl@nginx.com>
parents: 8458
diff changeset
282
8472
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 8471
diff changeset
283 qc->pto.log = c->log;
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 8471
diff changeset
284 qc->pto.data = c;
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 8471
diff changeset
285 qc->pto.handler = ngx_quic_pto_handler;
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 8471
diff changeset
286 qc->pto.cancelable = 1;
8308
e10b4c61420f Implemented retransmission and retransmit queue.
Vladimir Homutov <vl@nginx.com>
parents: 8307
diff changeset
287
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
288 qc->push.log = c->log;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
289 qc->push.data = c;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
290 qc->push.handler = ngx_quic_push_handler;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
291 qc->push.cancelable = 1;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
292
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
293 qc->path_validation.log = c->log;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
294 qc->path_validation.data = c;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
295 qc->path_validation.handler = ngx_quic_path_validation_handler;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
296 qc->path_validation.cancelable = 1;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
297
8481
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 8480
diff changeset
298 qc->conf = conf;
0d2b2664b41c QUIC: added "quic" listen parameter.
Roman Arutyunyan <arut@nginx.com>
parents: 8480
diff changeset
299 qc->tp = conf->tp;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
300
8265
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
301 ctp = &qc->ctp;
8701
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
302
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
303 /* defaults to be used before actual client parameters are received */
8436
9fe7875ce4bb QUIC: further limiting maximum QUIC packet size.
Vladimir Homutov <vl@nginx.com>
parents: 8435
diff changeset
304 ctp->max_udp_payload_size = ngx_quic_max_udp_payload(c);
8265
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
305 ctp->ack_delay_exponent = NGX_QUIC_DEFAULT_ACK_DELAY_EXPONENT;
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
306 ctp->max_ack_delay = NGX_QUIC_DEFAULT_MAX_ACK_DELAY;
8701
ba9e34c03968 QUIC: added check of client transport parameters.
Vladimir Homutov <vl@nginx.com>
parents: 8698
diff changeset
307 ctp->active_connection_id_limit = 2;
8265
d45325e90221 Limit output QUIC packets with client max_packet_size.
Roman Arutyunyan <arut@nginx.com>
parents: 8263
diff changeset
308
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
309 qc->streams.recv_max_data = qc->tp.initial_max_data;
8338
0f9e9786b90d Added primitive flow control mechanisms.
Vladimir Homutov <vl@nginx.com>
parents: 8337
diff changeset
310
8496
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
311 qc->streams.client_max_streams_uni = qc->tp.initial_max_streams_uni;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
312 qc->streams.client_max_streams_bidi = qc->tp.initial_max_streams_bidi;
c5324bb3a704 QUIC: limited the number of client-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8495
diff changeset
313
8415
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8413
diff changeset
314 qc->congestion.window = ngx_min(10 * qc->tp.max_udp_payload_size,
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8413
diff changeset
315 ngx_max(2 * qc->tp.max_udp_payload_size,
125cbfa77013 Renamed max_packet_size to max_udp_payload_size, from draft-28.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8413
diff changeset
316 14720));
8623
8550b91e8e35 QUIC: added proper logging of special values.
Vladimir Homutov <vl@nginx.com>
parents: 8622
diff changeset
317 qc->congestion.ssthresh = (size_t) -1;
8364
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
318 qc->congestion.recovery_start = ngx_current_msec;
eee307399229 QUIC basic congestion control.
Roman Arutyunyan <arut@nginx.com>
parents: 8363
diff changeset
319
8746
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
320 if (pkt->validated && pkt->retried) {
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
321 qc->tp.retry_scid.len = pkt->dcid.len;
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
322 qc->tp.retry_scid.data = ngx_pstrdup(c->pool, &pkt->dcid);
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
323 if (qc->tp.retry_scid.data == NULL) {
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
324 return NULL;
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
325 }
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
326 }
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
327
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
328 if (ngx_quic_keys_set_initial_secret(c->pool, qc->keys, &pkt->dcid,
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
329 qc->version)
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
330 != NGX_OK)
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
331 {
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
332 return NULL;
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
333 }
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
334
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
335 qc->validated = pkt->validated;
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
336
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
337 if (ngx_quic_open_sockets(c, qc, pkt) != NGX_OK) {
8746
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
338 return NULL;
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
339 }
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
340
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
341 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
342 "quic connection created");
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
343
8746
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
344 return qc;
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
345 }
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
346
0c628de2e2b7 QUIC: separate function for connection ids initialization.
Vladimir Homutov <vl@nginx.com>
parents: 8745
diff changeset
347
8694
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8693
diff changeset
348 static ngx_int_t
8562
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
349 ngx_quic_process_stateless_reset(ngx_connection_t *c, ngx_quic_header_t *pkt)
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
350 {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
351 u_char *tail, ch;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
352 ngx_uint_t i;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
353 ngx_queue_t *q;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
354 ngx_quic_client_id_t *cid;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
355 ngx_quic_connection_t *qc;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
356
8629
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
357 qc = ngx_quic_get_connection(c);
8562
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
358
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
359 /* A stateless reset uses an entire UDP datagram */
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
360 if (pkt->raw->start != pkt->data) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
361 return NGX_DECLINED;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
362 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
363
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
364 tail = pkt->raw->last - NGX_QUIC_SR_TOKEN_LEN;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
365
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
366 for (q = ngx_queue_head(&qc->client_ids);
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
367 q != ngx_queue_sentinel(&qc->client_ids);
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
368 q = ngx_queue_next(q))
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
369 {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
370 cid = ngx_queue_data(q, ngx_quic_client_id_t, queue);
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
371
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
372 if (cid->seqnum == 0) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
373 /* no stateless reset token in initial connection id */
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
374 continue;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
375 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
376
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
377 /* constant time comparison */
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
378
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
379 for (ch = 0, i = 0; i < NGX_QUIC_SR_TOKEN_LEN; i++) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
380 ch |= tail[i] ^ cid->sr_token[i];
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
381 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
382
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
383 if (ch == 0) {
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
384 return NGX_OK;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
385 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
386 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
387
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
388 return NGX_DECLINED;
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
389 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
390
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
391
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
392 static void
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
393 ngx_quic_input_handler(ngx_event_t *rev)
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
394 {
8545
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8541
diff changeset
395 ngx_int_t rc;
8730
90ae21799f67 QUIC: do not copy input data.
Roman Arutyunyan <arut@nginx.com>
parents: 8724
diff changeset
396 ngx_buf_t *b;
8271
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
397 ngx_connection_t *c;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
398 ngx_quic_connection_t *qc;
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
399
8576
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8575
diff changeset
400 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, 0, "quic input handler");
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8575
diff changeset
401
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
402 c = rev->data;
8629
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
403 qc = ngx_quic_get_connection(c);
8211
6bc18966b8c1 Stream "connection" read/write methods.
Vladimir Homutov <vl@nginx.com>
parents: 8209
diff changeset
404
8576
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8575
diff changeset
405 c->log->action = "handling quic input";
8212
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 8211
diff changeset
406
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
407 if (rev->timedout) {
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
408 ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
409 "quic client timed out");
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
410 ngx_quic_close_connection(c, NGX_DONE);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
411 return;
8212
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 8211
diff changeset
412 }
e3c0b19a3a8a Implemented ngx_quic_stream_send_chain() method.
Roman Arutyunyan <arut@nginx.com>
parents: 8211
diff changeset
413
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
414 if (c->close) {
8442
b9bce2c4fe33 Close QUIC connection with NO_ERROR on c->close.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8439
diff changeset
415 qc->error_reason = "graceful shutdown";
b9bce2c4fe33 Close QUIC connection with NO_ERROR on c->close.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8439
diff changeset
416 ngx_quic_close_connection(c, NGX_OK);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
417 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
418 }
8220
7ada2feeac18 Added processing of CONNECTION CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8218
diff changeset
419
8730
90ae21799f67 QUIC: do not copy input data.
Roman Arutyunyan <arut@nginx.com>
parents: 8724
diff changeset
420 if (!rev->ready) {
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
421 if (qc->closing) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
422 ngx_quic_close_connection(c, NGX_OK);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
423 }
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
424 return;
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
425 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
426
8734
c61fcdc1b8e3 UDP: extended datagram context.
Vladimir Homutov <vl@nginx.com>
parents: 8730
diff changeset
427 b = c->udp->dgram->buffer;
8730
90ae21799f67 QUIC: do not copy input data.
Roman Arutyunyan <arut@nginx.com>
parents: 8724
diff changeset
428
90ae21799f67 QUIC: do not copy input data.
Roman Arutyunyan <arut@nginx.com>
parents: 8724
diff changeset
429 rc = ngx_quic_input(c, b, NULL);
8545
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8541
diff changeset
430
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8541
diff changeset
431 if (rc == NGX_ERROR) {
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
432 ngx_quic_close_connection(c, NGX_ERROR);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
433 return;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
434 }
8271
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
435
8545
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8541
diff changeset
436 if (rc == NGX_DECLINED) {
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8541
diff changeset
437 return;
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8541
diff changeset
438 }
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8541
diff changeset
439
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8541
diff changeset
440 /* rc == NGX_OK */
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8541
diff changeset
441
8271
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
442 qc->send_timer_set = 0;
8e54a17dabee Respect QUIC max_idle_timeout.
Roman Arutyunyan <arut@nginx.com>
parents: 8270
diff changeset
443 ngx_add_timer(rev, qc->tp.max_idle_timeout);
8607
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
444
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
445 ngx_quic_connstate_dbg(c);
8199
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
446 }
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
447
1297dc83a6b9 Generic payload handler for quic packets.
Vladimir Homutov <vl@nginx.com>
parents: 8198
diff changeset
448
8736
714e9af983de QUIC: separate header for ngx_quic_connection_t.
Vladimir Homutov <vl@nginx.com>
parents: 8735
diff changeset
449 void
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
450 ngx_quic_close_connection(ngx_connection_t *c, ngx_int_t rc)
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
451 {
8629
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
452 ngx_pool_t *pool;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
453 ngx_quic_connection_t *qc;
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
454
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
455 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
456 "quic ngx_quic_close_connection rc:%i", rc);
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
457
8629
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
458 qc = ngx_quic_get_connection(c);
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
459
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
460 if (qc == NULL) {
8686
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8676
diff changeset
461 if (rc == NGX_ERROR) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8676
diff changeset
462 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
8702
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8701
diff changeset
463 "quic close connection early error");
8686
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8676
diff changeset
464 }
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
465
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
466 } else if (ngx_quic_close_quic(c, rc) == NGX_AGAIN) {
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
467 return;
8281
618a65de08b3 When closing a QUIC connection, wait for all streams to finish.
Roman Arutyunyan <arut@nginx.com>
parents: 8280
diff changeset
468 }
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
469
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
470 if (c->ssl) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
471 (void) ngx_ssl_shutdown(c);
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
472 }
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
473
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
474 if (c->read->timer_set) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
475 ngx_del_timer(c->read);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
476 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
477
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
478 #if (NGX_STAT_STUB)
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
479 (void) ngx_atomic_fetch_add(ngx_stat_active, -1);
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
480 #endif
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
481
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
482 c->destroyed = 1;
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
483
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
484 pool = c->pool;
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
485
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
486 ngx_close_connection(c);
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
487
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
488 ngx_destroy_pool(pool);
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
489 }
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
490
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
491
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
492 static ngx_int_t
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
493 ngx_quic_close_quic(ngx_connection_t *c, ngx_int_t rc)
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
494 {
8458
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
495 ngx_uint_t i;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
496 ngx_quic_send_ctx_t *ctx;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
497 ngx_quic_connection_t *qc;
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
498
8629
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
499 qc = ngx_quic_get_connection(c);
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
500
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
501 if (!qc->closing) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
502
8398
8bec0ac23cf9 Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents: 8397
diff changeset
503 /* drop packets from retransmit queues, no ack is expected */
8bec0ac23cf9 Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents: 8397
diff changeset
504 for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) {
8652
e9bd4305e68b QUIC: fixed send contexts cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8651
diff changeset
505 ngx_quic_free_frames(c, &qc->send_ctx[i].sent);
8398
8bec0ac23cf9 Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents: 8397
diff changeset
506 }
8bec0ac23cf9 Fixed retransmission of frames after closing connection.
Vladimir Homutov <vl@nginx.com>
parents: 8397
diff changeset
507
8400
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
508 if (rc == NGX_DONE) {
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
509
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
510 /*
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
511 * 10.2. Idle Timeout
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
512 *
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
513 * If the idle timeout is enabled by either peer, a connection is
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
514 * silently closed and its state is discarded when it remains idle
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
515 */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
516
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
517 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
518 "quic closing %s connection",
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
519 qc->draining ? "drained" : "idle");
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
520
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
521 } else {
8400
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
522
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
523 /*
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
524 * 10.3. Immediate Close
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
525 *
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
526 * An endpoint sends a CONNECTION_CLOSE frame (Section 19.19)
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
527 * to terminate the connection immediately.
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
528 */
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
529
8475
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8474
diff changeset
530 qc->error_level = c->ssl ? SSL_quic_read_level(c->ssl->connection)
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8474
diff changeset
531 : ssl_encryption_initial;
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8474
diff changeset
532
8400
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
533 if (rc == NGX_OK) {
8702
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8701
diff changeset
534 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8701
diff changeset
535 "quic immediate close drain:%d",
d4e02b3b734f QUIC: fixed indentation.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8701
diff changeset
536 qc->draining);
8400
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
537
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
538 qc->close.log = c->log;
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
539 qc->close.data = c;
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
540 qc->close.handler = ngx_quic_close_timer_handler;
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
541 qc->close.cancelable = 1;
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
542
8475
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8474
diff changeset
543 ctx = ngx_quic_get_send_ctx(qc, qc->error_level);
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8474
diff changeset
544
b276833111cf QUIC: implemented probe timeout (PTO) calculation.
Vladimir Homutov <vl@nginx.com>
parents: 8474
diff changeset
545 ngx_add_timer(&qc->close, 3 * ngx_quic_pto(c, ctx));
8400
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
546
8458
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
547 qc->error = NGX_QUIC_ERR_NO_ERROR;
8400
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
548
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
549 } else {
8458
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
550 if (qc->error == 0 && !qc->error_app) {
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
551 qc->error = NGX_QUIC_ERR_INTERNAL_ERROR;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
552 }
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
553
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
554 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
555 "quic immediate close due to %s error: %ui %s",
8458
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
556 qc->error_app ? "app " : "", qc->error,
8400
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
557 qc->error_reason ? qc->error_reason : "");
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
558 }
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
559
8458
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
560 (void) ngx_quic_send_cc(c);
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
561
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
562 if (qc->error_level == ssl_encryption_handshake) {
8400
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
563 /* for clients that might not have handshake keys */
8458
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
564 qc->error_level = ssl_encryption_initial;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
565 (void) ngx_quic_send_cc(c);
8400
d96ddef458cd Added sending of extra CONNECTION_CLOSE frames.
Vladimir Homutov <vl@nginx.com>
parents: 8399
diff changeset
566 }
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
567 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
568
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
569 qc->closing = 1;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
570 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
571
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
572 if (rc == NGX_ERROR && qc->close.timer_set) {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
573 /* do not wait for timer in case of fatal error */
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
574 ngx_del_timer(&qc->close);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
575 }
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
576
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
577 if (ngx_quic_close_streams(c, qc) == NGX_AGAIN) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
578 return NGX_AGAIN;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
579 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
580
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
581 if (qc->push.timer_set) {
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
582 ngx_del_timer(&qc->push);
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
583 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
584
8472
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 8471
diff changeset
585 if (qc->pto.timer_set) {
3b15732ac03f QUIC: renaming.
Vladimir Homutov <vl@nginx.com>
parents: 8471
diff changeset
586 ngx_del_timer(&qc->pto);
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
587 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
588
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
589 if (qc->path_validation.timer_set) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
590 ngx_del_timer(&qc->path_validation);
8434
ea4899591798 QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8433
diff changeset
591 }
ea4899591798 QUIC: Fixed connection cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8433
diff changeset
592
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
593 if (qc->push.posted) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
594 ngx_delete_posted_event(&qc->push);
8628
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8627
diff changeset
595 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8627
diff changeset
596
8553
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8546
diff changeset
597 if (qc->close.timer_set) {
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8546
diff changeset
598 return NGX_AGAIN;
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8546
diff changeset
599 }
dbcb9d0a3df1 QUIC: prevented posted push event while in the draining state.
Vladimir Homutov <vl@nginx.com>
parents: 8546
diff changeset
600
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
601 ngx_quic_close_sockets(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
602
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
603 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
604 "quic part of connection is terminated");
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
605
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
606 /* may be tested from SSL callback during SSL shutdown */
8629
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
607 c->udp = NULL;
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
608
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
609 return NGX_OK;
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
610 }
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
611
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
612
8458
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
613 void
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
614 ngx_quic_finalize_connection(ngx_connection_t *c, ngx_uint_t err,
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
615 const char *reason)
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
616 {
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
617 ngx_quic_connection_t *qc;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
618
8629
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
619 qc = ngx_quic_get_connection(c);
8458
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
620 qc->error = err;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
621 qc->error_reason = reason;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
622 qc->error_app = 1;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
623 qc->error_ftype = 0;
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
624
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
625 ngx_quic_close_connection(c, NGX_ERROR);
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
626 }
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
627
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
628
8724
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
629 void
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
630 ngx_quic_shutdown_connection(ngx_connection_t *c, ngx_uint_t err,
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
631 const char *reason)
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
632 {
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
633 ngx_quic_connection_t *qc;
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
634
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
635 qc = ngx_quic_get_connection(c);
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
636 qc->shutdown = 1;
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
637 qc->shutdown_code = err;
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
638 qc->shutdown_reason = reason;
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
639
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
640 ngx_quic_shutdown_quic(c);
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
641 }
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
642
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
643
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
644 static void
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
645 ngx_quic_close_timer_handler(ngx_event_t *ev)
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
646 {
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
647 ngx_connection_t *c;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
648
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
649 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic close timer");
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
650
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
651 c = ev->data;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
652 ngx_quic_close_connection(c, NGX_DONE);
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
653 }
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
654
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
655
8354
d11bc25fc4c3 Refactored ngx_quic_close_connection().
Vladimir Homutov <vl@nginx.com>
parents: 8350
diff changeset
656 static ngx_int_t
8563
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
657 ngx_quic_input(ngx_connection_t *c, ngx_buf_t *b, ngx_quic_conf_t *conf)
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
658 {
8687
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
659 u_char *p;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
660 ngx_int_t rc;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
661 ngx_uint_t good;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
662 ngx_quic_header_t pkt;
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
663
8545
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8541
diff changeset
664 good = 0;
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8541
diff changeset
665
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
666 p = b->pos;
8208
4ae9ac69ab93 HTTP/QUIC interface reworked.
Vladimir Homutov <vl@nginx.com>
parents: 8207
diff changeset
667
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
668 while (p < b->last) {
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
669
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
670 ngx_memzero(&pkt, sizeof(ngx_quic_header_t));
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
671 pkt.raw = b;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
672 pkt.data = p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
673 pkt.len = b->last - p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
674 pkt.log = c->log;
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
675 pkt.flags = p[0];
8559
a89a58c642ef QUIC: simplified packet header parsing.
Vladimir Homutov <vl@nginx.com>
parents: 8558
diff changeset
676 pkt.raw->pos++;
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
677
8563
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
678 rc = ngx_quic_process_packet(c, conf, &pkt);
8193
4355efde26d8 Added functions to decrypt long packets.
Vladimir Homutov <vl@nginx.com>
parents: 8192
diff changeset
679
8580
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8579
diff changeset
680 #if (NGX_DEBUG)
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8579
diff changeset
681 if (pkt.parsed) {
8607
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
682 ngx_log_debug5(NGX_LOG_DEBUG_EVENT, c->log, 0,
8609
f32740ddd484 QUIC: got rid of "pkt" abbreviation in logs.
Vladimir Homutov <vl@nginx.com>
parents: 8608
diff changeset
683 "quic packet %s done decr:%d pn:%L perr:%ui rc:%i",
8580
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8579
diff changeset
684 ngx_quic_level_name(pkt.level), pkt.decrypted,
8607
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
685 pkt.pn, pkt.error, rc);
8580
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8579
diff changeset
686 } else {
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8579
diff changeset
687 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
8609
f32740ddd484 QUIC: got rid of "pkt" abbreviation in logs.
Vladimir Homutov <vl@nginx.com>
parents: 8608
diff changeset
688 "quic packet done parse failed rc:%i", rc);
8580
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8579
diff changeset
689 }
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8579
diff changeset
690 #endif
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8579
diff changeset
691
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
692 if (rc == NGX_ERROR) {
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
693 return NGX_ERROR;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
694 }
8206
8d6ac639feac Added support of multiple QUIC packets in single datagram.
Vladimir Homutov <vl@nginx.com>
parents: 8205
diff changeset
695
8686
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8676
diff changeset
696 if (rc == NGX_DONE) {
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8676
diff changeset
697 /* stop further processing */
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8676
diff changeset
698 return NGX_DECLINED;
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8676
diff changeset
699 }
dffb66fb783b QUIC: stateless retry.
Vladimir Homutov <vl@nginx.com>
parents: 8676
diff changeset
700
8545
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8541
diff changeset
701 if (rc == NGX_OK) {
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8541
diff changeset
702 good = 1;
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8541
diff changeset
703 }
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8541
diff changeset
704
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
705 /* NGX_OK || NGX_DECLINED */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
706
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
707 /*
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
708 * we get NGX_DECLINED when there are no keys [yet] available
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
709 * to decrypt packet.
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
710 * Instead of queueing it, we ignore it and rely on the sender's
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
711 * retransmission:
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
712 *
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
713 * 12.2. Coalescing Packets:
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
714 *
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
715 * For example, if decryption fails (because the keys are
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
716 * not available or any other reason), the receiver MAY either
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
717 * discard or buffer the packet for later processing and MUST
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
718 * attempt to process the remaining packets.
8535
eb5aa85294e9 QUIC: discard unrecognized long packes.
Vladimir Homutov <vl@nginx.com>
parents: 8533
diff changeset
719 *
eb5aa85294e9 QUIC: discard unrecognized long packes.
Vladimir Homutov <vl@nginx.com>
parents: 8533
diff changeset
720 * We also skip packets that don't match connection state
eb5aa85294e9 QUIC: discard unrecognized long packes.
Vladimir Homutov <vl@nginx.com>
parents: 8533
diff changeset
721 * or cannot be parsed properly.
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
722 */
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
723
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
724 /* b->pos is at header end, adjust by actual packet length */
8558
0f37b4ef3cd9 QUIC: keep the entire packet size in pkt->len.
Roman Arutyunyan <arut@nginx.com>
parents: 8557
diff changeset
725 b->pos = pkt.data + pkt.len;
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
726
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
727 /* firefox workaround: skip zero padding at the end of quic packet */
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
728 while (b->pos < b->last && *(b->pos) == 0) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
729 b->pos++;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
730 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
731
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
732 p = b->pos;
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
733 }
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
734
8545
702f1d2581a4 QUIC: eliminated idle timeout restart for dropped packets.
Roman Arutyunyan <arut@nginx.com>
parents: 8541
diff changeset
735 return good ? NGX_OK : NGX_DECLINED;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
736 }
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
737
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
738
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
739 static ngx_int_t
8563
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
740 ngx_quic_process_packet(ngx_connection_t *c, ngx_quic_conf_t *conf,
bed310672f39 QUIC: moved ssl configuration pointer to quic configuration.
Vladimir Homutov <vl@nginx.com>
parents: 8562
diff changeset
741 ngx_quic_header_t *pkt)
8383
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8382
diff changeset
742 {
8536
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8535
diff changeset
743 ngx_int_t rc;
8383
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8382
diff changeset
744 ngx_quic_connection_t *qc;
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
745
8576
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8575
diff changeset
746 c->log->action = "parsing quic packet";
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8575
diff changeset
747
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
748 rc = ngx_quic_parse_packet(pkt);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
749
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
750 if (rc == NGX_DECLINED || rc == NGX_ERROR) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
751 return rc;
8383
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8382
diff changeset
752 }
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8382
diff changeset
753
8580
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8579
diff changeset
754 pkt->parsed = 1;
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8579
diff changeset
755
8576
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8575
diff changeset
756 c->log->action = "processing quic packet";
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8575
diff changeset
757
8651
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8642
diff changeset
758 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8642
diff changeset
759 "quic packet rx dcid len:%uz %xV",
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8642
diff changeset
760 pkt->dcid.len, &pkt->dcid);
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8642
diff changeset
761
8578
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8577
diff changeset
762 #if (NGX_DEBUG)
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8577
diff changeset
763 if (pkt->level != ssl_encryption_application) {
8651
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8642
diff changeset
764 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8642
diff changeset
765 "quic packet rx scid len:%uz %xV",
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8642
diff changeset
766 pkt->scid.len, &pkt->scid);
8578
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8577
diff changeset
767 }
8641
fe53def49945 QUIC: refactored long header parsing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8639
diff changeset
768
fe53def49945 QUIC: refactored long header parsing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8639
diff changeset
769 if (pkt->level == ssl_encryption_initial) {
8651
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8642
diff changeset
770 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
8694
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8693
diff changeset
771 "quic address validation token len:%uz %xV",
8651
dbad2d6d1898 QUIC: removed ngx_quic_hexdump() macro.
Vladimir Homutov <vl@nginx.com>
parents: 8642
diff changeset
772 pkt->token.len, &pkt->token);
8641
fe53def49945 QUIC: refactored long header parsing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8639
diff changeset
773 }
8578
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8577
diff changeset
774 #endif
52ad697f9d1c QUIC: enabled more key-related debug by default.
Vladimir Homutov <vl@nginx.com>
parents: 8577
diff changeset
775
8687
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
776 qc = ngx_quic_get_connection(c);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
777
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
778 if (qc) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
779
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
780 if (rc == NGX_ABORT) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
781 ngx_log_error(NGX_LOG_INFO, c->log, 0,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
782 "quic unsupported version: 0x%xD", pkt->version);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
783 return NGX_DECLINED;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
784 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
785
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
786 rc = ngx_quic_check_migration(c, pkt);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
787 if (rc != NGX_OK) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
788 return rc;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
789 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
790
8624
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8623
diff changeset
791 if (pkt->level != ssl_encryption_application) {
8688
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
792
8624
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8623
diff changeset
793 if (pkt->version != qc->version) {
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8623
diff changeset
794 ngx_log_error(NGX_LOG_INFO, c->log, 0,
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8623
diff changeset
795 "quic version mismatch: 0x%xD", pkt->version);
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8623
diff changeset
796 return NGX_DECLINED;
340cd26158fb QUIC: preparatory changes for multiple QUIC versions support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8623
diff changeset
797 }
8688
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
798
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
799 if (ngx_quic_check_csid(qc, pkt) != NGX_OK) {
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
800 return NGX_DECLINED;
8562
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
801 }
b31c02454539 QUIC: added stateless reset support.
Vladimir Homutov <vl@nginx.com>
parents: 8561
diff changeset
802
8688
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
803 } else {
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
804
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
805 if (ngx_quic_process_stateless_reset(c, pkt) == NGX_OK) {
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
806 ngx_log_error(NGX_LOG_INFO, c->log, 0,
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
807 "quic stateless reset packet detected");
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
808
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
809 qc->draining = 1;
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
810 ngx_quic_close_connection(c, NGX_OK);
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
811
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
812 return NGX_OK;
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
813 }
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
814 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
815
8687
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
816 return ngx_quic_process_payload(c, pkt);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
817 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
818
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
819 /* packet does not belong to a connection */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
820
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
821 if (rc == NGX_ABORT) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
822 return ngx_quic_negotiate_version(c, pkt);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
823 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
824
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
825 if (pkt->level == ssl_encryption_application) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
826 return ngx_quic_send_stateless_reset(c, conf, pkt);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
827 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
828
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
829 if (pkt->level != ssl_encryption_initial) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
830 return NGX_ERROR;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
831 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
832
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
833 c->log->action = "processing initial packet";
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
834
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
835 if (pkt->dcid.len < NGX_QUIC_CID_LEN_MIN) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
836 /* 7.2. Negotiating Connection IDs */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
837 ngx_log_error(NGX_LOG_INFO, c->log, 0,
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
838 "quic too short dcid in initial"
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
839 " packet: len:%i", pkt->dcid.len);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
840 return NGX_ERROR;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
841 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
842
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
843 /* process retry and initialize connection IDs */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
844
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
845 if (pkt->token.len) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
846
8694
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8693
diff changeset
847 rc = ngx_quic_validate_token(c, conf->av_token_key, pkt);
8687
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
848
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
849 if (rc == NGX_ERROR) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
850 /* internal error */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
851 return NGX_ERROR;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
852
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
853 } else if (rc == NGX_ABORT) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
854 /* token cannot be decrypted */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
855 return ngx_quic_send_early_cc(c, pkt,
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
856 NGX_QUIC_ERR_INVALID_TOKEN,
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
857 "cannot decrypt token");
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
858 } else if (rc == NGX_DECLINED) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
859 /* token is invalid */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
860
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
861 if (pkt->retried) {
8694
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8693
diff changeset
862 /* invalid address validation token */
8687
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
863 return ngx_quic_send_early_cc(c, pkt,
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
864 NGX_QUIC_ERR_INVALID_TOKEN,
8694
cef042935003 QUIC: the "quic_host_key" directive.
Vladimir Homutov <vl@nginx.com>
parents: 8693
diff changeset
865 "invalid address validation token");
8687
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
866 } else if (conf->retry) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
867 /* invalid NEW_TOKEN */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
868 return ngx_quic_send_retry(c, conf, pkt);
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
869 }
8687
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
870 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
871
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
872 /* NGX_OK */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
873
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
874 } else if (conf->retry) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
875 return ngx_quic_send_retry(c, conf, pkt);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
876
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
877 } else {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
878 pkt->odcid = pkt->dcid;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
879 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
880
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
881 if (ngx_terminate || ngx_exiting) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
882 if (conf->retry) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
883 return ngx_quic_send_retry(c, conf, pkt);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
884 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
885
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
886 return NGX_ERROR;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
887 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
888
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
889 c->log->action = "creating quic connection";
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
890
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
891 qc = ngx_quic_new_connection(c, conf, pkt);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
892 if (qc == NULL) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
893 return NGX_ERROR;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
894 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
895
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
896 return ngx_quic_process_payload(c, pkt);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
897 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
898
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
899
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
900 static ngx_int_t
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
901 ngx_quic_process_payload(ngx_connection_t *c, ngx_quic_header_t *pkt)
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
902 {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
903 ngx_int_t rc;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
904 ngx_quic_send_ctx_t *ctx;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
905 ngx_quic_connection_t *qc;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
906 static u_char buf[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE];
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
907
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
908 qc = ngx_quic_get_connection(c);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
909
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
910 qc->error = 0;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
911 qc->error_reason = 0;
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
912
8576
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8575
diff changeset
913 c->log->action = "decrypting packet";
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8575
diff changeset
914
8621
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
915 if (!ngx_quic_keys_available(qc->keys, pkt->level)) {
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
916 ngx_log_error(NGX_LOG_INFO, c->log, 0,
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
917 "quic no level %d keys yet, ignoring packet", pkt->level);
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
918 return NGX_DECLINED;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
919 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
920
8621
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
921 pkt->keys = qc->keys;
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
922 pkt->key_phase = qc->key_phase;
8383
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8382
diff changeset
923 pkt->plaintext = buf;
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8382
diff changeset
924
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8382
diff changeset
925 ctx = ngx_quic_get_send_ctx(qc, pkt->level);
7ea34e13937f Address validation using Retry packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8382
diff changeset
926
8621
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
927 rc = ngx_quic_decrypt(pkt, &ctx->largest_pn);
8536
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8535
diff changeset
928 if (rc != NGX_OK) {
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8535
diff changeset
929 qc->error = pkt->error;
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8535
diff changeset
930 qc->error_reason = "failed to decrypt packet";
c6b963de0c00 QUIC: pass return code from ngx_quic_decrypt() to the caller.
Vladimir Homutov <vl@nginx.com>
parents: 8535
diff changeset
931 return rc;
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
932 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
933
8580
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8579
diff changeset
934 pkt->decrypted = 1;
07971f870879 QUIC: added debug message with final packet processing status.
Vladimir Homutov <vl@nginx.com>
parents: 8579
diff changeset
935
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
936 if (ngx_quic_update_paths(c, pkt) != NGX_OK) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
937 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
938 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
939
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
940 if (c->ssl == NULL) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
941 if (ngx_quic_init_connection(c) != NGX_OK) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
942 return NGX_ERROR;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
943 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
944 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
945
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
946 if (pkt->level == ssl_encryption_handshake) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
947 /*
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
948 * 4.10.1. The successful use of Handshake packets indicates
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
949 * that no more Initial packets need to be exchanged
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
950 */
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
951 ngx_quic_discard_ctx(c, ssl_encryption_initial);
8611
e2086d8181fa QUIC: added push event afer the address was validated.
Vladimir Homutov <vl@nginx.com>
parents: 8610
diff changeset
952
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
953 if (qc->socket->path->state != NGX_QUIC_PATH_VALIDATED) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
954 qc->socket->path->state = NGX_QUIC_PATH_VALIDATED;
8629
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
955 ngx_post_event(&qc->push, &ngx_posted_events);
8611
e2086d8181fa QUIC: added push event afer the address was validated.
Vladimir Homutov <vl@nginx.com>
parents: 8610
diff changeset
956 }
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
957 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
958
8687
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
959 if (qc->closing) {
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
960 /*
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
961 * 10.1 Closing and Draining Connection States
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
962 * ... delayed or reordered packets are properly discarded.
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
963 *
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
964 * An endpoint retains only enough information to generate
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
965 * a packet containing a CONNECTION_CLOSE frame and to identify
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
966 * packets as belonging to the connection.
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
967 */
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
968
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
969 qc->error_level = pkt->level;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
970 qc->error = NGX_QUIC_ERR_NO_ERROR;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
971 qc->error_reason = "connection is closing, packet discarded";
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
972 qc->error_ftype = 0;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
973 qc->error_app = 0;
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
974
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
975 return ngx_quic_send_cc(c);
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
976 }
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
977
8603
c5ea341f705a QUIC: optimized acknowledgement generation.
Vladimir Homutov <vl@nginx.com>
parents: 8602
diff changeset
978 pkt->received = ngx_current_msec;
8574
1d4417e4f2d0 QUIC: fixed measuring ACK Delay against 0-RTT packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8573
diff changeset
979
8576
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8575
diff changeset
980 c->log->action = "handling payload";
eacca87c476e QUIC: updated c->log->action strings to reflect proper state.
Vladimir Homutov <vl@nginx.com>
parents: 8575
diff changeset
981
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
982 if (pkt->level != ssl_encryption_application) {
8687
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
983 return ngx_quic_handle_frames(c, pkt);
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
984 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
985
8621
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
986 if (!pkt->key_update) {
8687
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
987 return ngx_quic_handle_frames(c, pkt);
8621
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
988 }
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
989
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
990 /* switch keys and generate next on Key Phase change */
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
991
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
992 qc->key_phase ^= 1;
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
993 ngx_quic_keys_switch(c, qc->keys);
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
994
8687
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
995 rc = ngx_quic_handle_frames(c, pkt);
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
996 if (rc != NGX_OK) {
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
997 return rc;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
998 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
999
8621
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
1000 return ngx_quic_keys_update(c, qc->keys);
8223
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1001 }
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1002
61f9b873e2e7 Firefox fixes.
Vladimir Homutov <vl@nginx.com>
parents: 8222
diff changeset
1003
8753
46161c610919 QUIC: separate files for SSL library interfaces.
Vladimir Homutov <vl@nginx.com>
parents: 8752
diff changeset
1004 void
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
1005 ngx_quic_discard_ctx(ngx_connection_t *c, enum ssl_encryption_level_t level)
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1006 {
8507
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8506
diff changeset
1007 ngx_queue_t *q;
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8506
diff changeset
1008 ngx_quic_frame_t *f;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1009 ngx_quic_socket_t *qsock;
8339
aba84d9ab256 Parsing of truncated packet numbers.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8338
diff changeset
1010 ngx_quic_send_ctx_t *ctx;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1011 ngx_quic_connection_t *qc;
8263
1295b293d09a Connection states code cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8260
diff changeset
1012
8629
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
1013 qc = ngx_quic_get_connection(c);
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1014
8621
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
1015 if (!ngx_quic_keys_available(qc->keys, level)) {
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
1016 return;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
1017 }
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
1018
8621
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
1019 ngx_quic_keys_discard(qc->keys, level);
9c3be23ddbe7 QUIC: refactored key handling.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8620
diff changeset
1020
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
1021 qc->pto_count = 0;
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
1022
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
1023 ctx = ngx_quic_get_send_ctx(qc, level);
8507
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8506
diff changeset
1024
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8506
diff changeset
1025 while (!ngx_queue_empty(&ctx->sent)) {
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8506
diff changeset
1026 q = ngx_queue_head(&ctx->sent);
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8506
diff changeset
1027 ngx_queue_remove(q);
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8506
diff changeset
1028
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8506
diff changeset
1029 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8506
diff changeset
1030 ngx_quic_congestion_ack(c, f);
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8506
diff changeset
1031 ngx_quic_free_frame(c, f);
7f9938cbcd12 QUIC: fixed leak of bytes_in_flight on keys discard.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8506
diff changeset
1032 }
8596
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8595
diff changeset
1033
8612
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8611
diff changeset
1034 while (!ngx_queue_empty(&ctx->frames)) {
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8611
diff changeset
1035 q = ngx_queue_head(&ctx->frames);
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8611
diff changeset
1036 ngx_queue_remove(q);
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8611
diff changeset
1037
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8611
diff changeset
1038 f = ngx_queue_data(q, ngx_quic_frame_t, queue);
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8611
diff changeset
1039 ngx_quic_congestion_ack(c, f);
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8611
diff changeset
1040 ngx_quic_free_frame(c, f);
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8611
diff changeset
1041 }
b1676cd64dc9 QUIC: cleanup send context properly.
Vladimir Homutov <vl@nginx.com>
parents: 8611
diff changeset
1042
8628
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8627
diff changeset
1043 if (level == ssl_encryption_initial) {
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1044 /* close temporary listener with odcid */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1045 qsock = ngx_quic_find_socket(c, NGX_QUIC_UNSET_PN);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1046 if (qsock) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1047 ngx_quic_close_socket(c, qsock);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1048 }
8628
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8627
diff changeset
1049 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8627
diff changeset
1050
8596
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8595
diff changeset
1051 ctx->send_ack = 0;
8697
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8696
diff changeset
1052
faa3201ff351 QUIC: improved setting the lost timer.
Roman Arutyunyan <arut@nginx.com>
parents: 8696
diff changeset
1053 ngx_quic_set_lost_timer(c);
8304
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1054 }
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1055
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1056
90f94413177e TLS Early Data support.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8303
diff changeset
1057 static ngx_int_t
8688
a346905c359f QUIC: fixed stateless reset recognition and send.
Roman Arutyunyan <arut@nginx.com>
parents: 8687
diff changeset
1058 ngx_quic_check_csid(ngx_quic_connection_t *qc, ngx_quic_header_t *pkt)
8361
336d527ca031 Error messages cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8360
diff changeset
1059 {
8538
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1060 ngx_queue_t *q;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1061 ngx_quic_client_id_t *cid;
8381
6e100d8c138a Preserve original DCID and unbreak parsing 0-RTT packets.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8380
diff changeset
1062
8538
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1063 for (q = ngx_queue_head(&qc->client_ids);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1064 q != ngx_queue_sentinel(&qc->client_ids);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1065 q = ngx_queue_next(q))
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1066 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1067 cid = ngx_queue_data(q, ngx_quic_client_id_t, queue);
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1068
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1069 if (pkt->scid.len == cid->len
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1070 && ngx_memcmp(pkt->scid.data, cid->id, cid->len) == 0)
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1071 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1072 return NGX_OK;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1073 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1074 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1075
8560
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
1076 ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic unexpected quic scid");
d0d3fc0697a0 QUIC: packet processing refactoring.
Vladimir Homutov <vl@nginx.com>
parents: 8559
diff changeset
1077 return NGX_ERROR;
8182
b28ea685a56e Moved all QUIC code into ngx_event_quic.c
Vladimir Homutov <vl@nginx.com>
parents: 8180
diff changeset
1078 }
8171
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
1079
4daf03d2bd0a OpenSSL compatibility.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
1080
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1081 static ngx_int_t
8687
1c6343bd7933 QUIC: refactored packet processing.
Roman Arutyunyan <arut@nginx.com>
parents: 8686
diff changeset
1082 ngx_quic_handle_frames(ngx_connection_t *c, ngx_quic_header_t *pkt)
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1083 {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1084 u_char *end, *p;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1085 ssize_t len;
8657
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8656
diff changeset
1086 ngx_buf_t buf;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1087 ngx_uint_t do_close, nonprobing;
8657
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8656
diff changeset
1088 ngx_chain_t chain;
8367
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1089 ngx_quic_frame_t frame;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1090 ngx_quic_socket_t *qsock;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1091 ngx_quic_connection_t *qc;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1092
8629
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
1093 qc = ngx_quic_get_connection(c);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1094
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1095 p = pkt->payload.data;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1096 end = p + pkt->payload.len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1097
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1098 do_close = 0;
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1099 nonprobing = 0;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1100
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1101 while (p < end) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1102
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
1103 c->log->action = "parsing frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
1104
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1105 ngx_memzero(&frame, sizeof(ngx_quic_frame_t));
8657
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8656
diff changeset
1106 ngx_memzero(&buf, sizeof(ngx_buf_t));
8659
d9f673d18e9b QUIC: set the temporary flag for input frame buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8658
diff changeset
1107 buf.temporary = 1;
8657
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8656
diff changeset
1108
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8656
diff changeset
1109 chain.buf = &buf;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8656
diff changeset
1110 chain.next = NULL;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8656
diff changeset
1111 frame.data = &chain;
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8656
diff changeset
1112
8240
1f002206a59b Added boundaries checks into frame parser.
Vladimir Homutov <vl@nginx.com>
parents: 8239
diff changeset
1113 len = ngx_quic_parse_frame(pkt, p, end, &frame);
8251
c217a907ce42 Added checks for permitted frame types.
Vladimir Homutov <vl@nginx.com>
parents: 8247
diff changeset
1114
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1115 if (len < 0) {
8385
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 8384
diff changeset
1116 qc->error = pkt->error;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1117 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1118 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1119
8604
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8603
diff changeset
1120 ngx_quic_log_frame(c->log, &frame, 0);
b3d9e57d0f62 QUIC: single function for frame debug logging.
Vladimir Homutov <vl@nginx.com>
parents: 8603
diff changeset
1121
8275
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
1122 c->log->action = "handling frames";
19660929e8ff Logging cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8274
diff changeset
1123
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1124 p += len;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1125
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1126 switch (frame.type) {
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1127 /* probing frames */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1128 case NGX_QUIC_FT_PADDING:
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1129 case NGX_QUIC_FT_PATH_CHALLENGE:
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1130 case NGX_QUIC_FT_PATH_RESPONSE:
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1131 break;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1132
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1133 /* non-probing frames */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1134 default:
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1135 nonprobing = 1;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1136 break;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1137 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1138
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1139 switch (frame.type) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1140
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1141 case NGX_QUIC_FT_ACK:
8657
2dfc5ef29973 QUIC: introduced QUIC buffers.
Roman Arutyunyan <arut@nginx.com>
parents: 8656
diff changeset
1142 if (ngx_quic_handle_ack_frame(c, pkt, &frame) != NGX_OK) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1143 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1144 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1145
8367
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1146 continue;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1147
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1148 case NGX_QUIC_FT_PADDING:
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1149 /* no action required */
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1150 continue;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1151
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1152 case NGX_QUIC_FT_CONNECTION_CLOSE:
8458
e0f92f68e018 QUIC: Introduced ngx_quic_finalize_connection().
Roman Arutyunyan <arut@nginx.com>
parents: 8450
diff changeset
1153 case NGX_QUIC_FT_CONNECTION_CLOSE_APP:
8367
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1154 do_close = 1;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1155 continue;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1156 }
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1157
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1158 /* got there with ack-eliciting packet */
8596
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8595
diff changeset
1159 pkt->need_ack = 1;
8367
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1160
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1161 switch (frame.type) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1162
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1163 case NGX_QUIC_FT_CRYPTO:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1164
8333
167d32476737 Crypto buffer frames reordering.
Vladimir Homutov <vl@nginx.com>
parents: 8332
diff changeset
1165 if (ngx_quic_handle_crypto_frame(c, pkt, &frame) != NGX_OK) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1166 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1167 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1168
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1169 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1170
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1171 case NGX_QUIC_FT_PING:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1172 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1173
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1174 case NGX_QUIC_FT_STREAM0:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1175 case NGX_QUIC_FT_STREAM1:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1176 case NGX_QUIC_FT_STREAM2:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1177 case NGX_QUIC_FT_STREAM3:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1178 case NGX_QUIC_FT_STREAM4:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1179 case NGX_QUIC_FT_STREAM5:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1180 case NGX_QUIC_FT_STREAM6:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1181 case NGX_QUIC_FT_STREAM7:
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1182
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1183 if (ngx_quic_handle_stream_frame(c, pkt, &frame) != NGX_OK) {
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1184 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1185 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1186
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1187 break;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1188
8237
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
1189 case NGX_QUIC_FT_MAX_DATA:
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1190
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1191 if (ngx_quic_handle_max_data_frame(c, &frame.u.max_data) != NGX_OK)
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1192 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1193 return NGX_ERROR;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1194 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1195
8237
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
1196 break;
ff540f13d95d MAX_DATA frame parser/handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8236
diff changeset
1197
8236
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
1198 case NGX_QUIC_FT_STREAMS_BLOCKED:
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
1199 case NGX_QUIC_FT_STREAMS_BLOCKED2:
8245
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1200
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1201 if (ngx_quic_handle_streams_blocked_frame(c, pkt,
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1202 &frame.u.streams_blocked)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1203 != NGX_OK)
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1204 {
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1205 return NGX_ERROR;
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1206 }
a14afe21e692 Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan <arut@nginx.com>
parents: 8241
diff changeset
1207
8236
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
1208 break;
d3b26c3bea22 Added parsing of STREAMS BLOCKED frames.
Vladimir Homutov <vl@nginx.com>
parents: 8235
diff changeset
1209
8266
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1210 case NGX_QUIC_FT_STREAM_DATA_BLOCKED:
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1211
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1212 if (ngx_quic_handle_stream_data_blocked_frame(c, pkt,
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1213 &frame.u.stream_data_blocked)
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1214 != NGX_OK)
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1215 {
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1216 return NGX_ERROR;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1217 }
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1218
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1219 break;
f92e583fc256 Better flow control and buffering for QUIC streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8265
diff changeset
1220
8365
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1221 case NGX_QUIC_FT_MAX_STREAM_DATA:
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1222
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1223 if (ngx_quic_handle_max_stream_data_frame(c, pkt,
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1224 &frame.u.max_stream_data)
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1225 != NGX_OK)
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1226 {
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1227 return NGX_ERROR;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1228 }
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1229
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1230 break;
fab75acb1f72 Respect MAX_DATA and MAX_STREAM_DATA from QUIC client.
Roman Arutyunyan <arut@nginx.com>
parents: 8364
diff changeset
1231
8428
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1232 case NGX_QUIC_FT_RESET_STREAM:
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1233
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1234 if (ngx_quic_handle_reset_stream_frame(c, pkt,
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1235 &frame.u.reset_stream)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1236 != NGX_OK)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1237 {
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1238 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1239 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1240
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1241 break;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1242
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1243 case NGX_QUIC_FT_STOP_SENDING:
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1244
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1245 if (ngx_quic_handle_stop_sending_frame(c, pkt,
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1246 &frame.u.stop_sending)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1247 != NGX_OK)
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1248 {
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1249 return NGX_ERROR;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1250 }
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1251
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1252 break;
953cf44708b0 Stream ID handling in RESET_STREAM and STOP_SENDING frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8427
diff changeset
1253
8495
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8486
diff changeset
1254 case NGX_QUIC_FT_MAX_STREAMS:
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8486
diff changeset
1255 case NGX_QUIC_FT_MAX_STREAMS2:
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8486
diff changeset
1256
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8486
diff changeset
1257 if (ngx_quic_handle_max_streams_frame(c, pkt, &frame.u.max_streams)
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8486
diff changeset
1258 != NGX_OK)
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8486
diff changeset
1259 {
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8486
diff changeset
1260 return NGX_ERROR;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8486
diff changeset
1261 }
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8486
diff changeset
1262
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8486
diff changeset
1263 break;
455a8536eaa7 QUIC: limited the number of server-initiated streams.
Roman Arutyunyan <arut@nginx.com>
parents: 8486
diff changeset
1264
8531
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8530
diff changeset
1265 case NGX_QUIC_FT_PATH_CHALLENGE:
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8530
diff changeset
1266
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8530
diff changeset
1267 if (ngx_quic_handle_path_challenge_frame(c, pkt,
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8530
diff changeset
1268 &frame.u.path_challenge)
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8530
diff changeset
1269 != NGX_OK)
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8530
diff changeset
1270 {
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8530
diff changeset
1271 return NGX_ERROR;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8530
diff changeset
1272 }
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8530
diff changeset
1273
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8530
diff changeset
1274 break;
4ff2a0b747d1 QUIC: handle PATH_CHALLENGE frame.
Roman Arutyunyan <arut@nginx.com>
parents: 8530
diff changeset
1275
8737
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8736
diff changeset
1276 case NGX_QUIC_FT_PATH_RESPONSE:
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8736
diff changeset
1277
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8736
diff changeset
1278 if (ngx_quic_handle_path_response_frame(c, pkt,
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8736
diff changeset
1279 &frame.u.path_response)
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8736
diff changeset
1280 != NGX_OK)
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8736
diff changeset
1281 {
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8736
diff changeset
1282 return NGX_ERROR;
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8736
diff changeset
1283 }
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8736
diff changeset
1284
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8736
diff changeset
1285 break;
76f476ce4d31 QUIC: distinct files for connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8736
diff changeset
1286
8325
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1287 case NGX_QUIC_FT_NEW_CONNECTION_ID:
8538
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1288
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1289 if (ngx_quic_handle_new_connection_id_frame(c, pkt, &frame.u.ncid)
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1290 != NGX_OK)
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1291 {
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1292 return NGX_ERROR;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1293 }
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1294
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1295 break;
3afaaaa930ab QUIC: added support for multiple connection IDs.
Vladimir Homutov <vl@nginx.com>
parents: 8536
diff changeset
1296
8325
9b9d592c0da3 Ignore non-yet-implemented frames.
Vladimir Homutov <vl@nginx.com>
parents: 8322
diff changeset
1297 case NGX_QUIC_FT_RETIRE_CONNECTION_ID:
8628
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8627
diff changeset
1298
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8627
diff changeset
1299 if (ngx_quic_handle_retire_connection_id_frame(c, pkt,
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8627
diff changeset
1300 &frame.u.retire_cid)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8627
diff changeset
1301 != NGX_OK)
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8627
diff changeset
1302 {
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8627
diff changeset
1303 return NGX_ERROR;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8627
diff changeset
1304 }
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8627
diff changeset
1305
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8627
diff changeset
1306 break;
45db1b5c1706 QUIC: connection multiplexing per port.
Roman Arutyunyan <arut@nginx.com>
parents: 8627
diff changeset
1307
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1308 default:
8346
4e4485793418 Added MAX_STREAM_DATA stub handler.
Vladimir Homutov <vl@nginx.com>
parents: 8345
diff changeset
1309 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1310 "quic missing frame handler");
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1311 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1312 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1313 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1314
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1315 if (p != end) {
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1316 ngx_log_error(NGX_LOG_INFO, c->log, 0,
8605
eed49b83e18f QUIC: revised value separators in debug and error messages.
Vladimir Homutov <vl@nginx.com>
parents: 8604
diff changeset
1317 "quic trailing garbage in payload:%ui bytes", end - p);
8385
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 8384
diff changeset
1318
fb7422074258 Added generation of CC frames with error on connection termination.
Vladimir Homutov <vl@nginx.com>
parents: 8384
diff changeset
1319 qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR;
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1320 return NGX_ERROR;
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1321 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1322
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1323 if (do_close) {
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1324 qc->draining = 1;
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1325 ngx_quic_close_connection(c, NGX_OK);
8225
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1326 }
714a19dba6af Style and handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8224
diff changeset
1327
8763
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1328 qsock = ngx_quic_get_socket(c);
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1329
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1330 if (qsock != qc->socket) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1331
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1332 if (qsock->path != qc->socket->path && nonprobing) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1333 /*
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1334 * An endpoint can migrate a connection to a new local
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1335 * address by sending packets containing non-probing frames
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1336 * from that address.
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1337 */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1338 if (ngx_quic_handle_migration(c, pkt) != NGX_OK) {
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1339 return NGX_ERROR;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1340 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1341 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1342 /*
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1343 * else: packet arrived via non-default socket;
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1344 * no reason to change active path
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1345 */
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1346 }
4117aa7fa38e QUIC: connection migration.
Vladimir Homutov <vl@nginx.com>
parents: 8753
diff changeset
1347
8596
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8595
diff changeset
1348 if (ngx_quic_ack_packet(c, pkt) != NGX_OK) {
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8595
diff changeset
1349 return NGX_ERROR;
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8595
diff changeset
1350 }
38c7dd720774 QUIC: added ACK frame range support.
Vladimir Homutov <vl@nginx.com>
parents: 8595
diff changeset
1351
8367
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1352 return NGX_OK;
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1353 }
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1354
c10e7d48aa85 Factored out sending ACK from payload handler.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8365
diff changeset
1355
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
1356 static void
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
1357 ngx_quic_push_handler(ngx_event_t *ev)
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
1358 {
8334
72d20158c814 Added reordering support for STREAM frames.
Vladimir Homutov <vl@nginx.com>
parents: 8333
diff changeset
1359 ngx_connection_t *c;
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
1360
8359
2f900ae486bc Debug cleanup.
Vladimir Homutov <vl@nginx.com>
parents: 8356
diff changeset
1361 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic push timer");
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
1362
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
1363 c = ev->data;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
1364
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
1365 if (ngx_quic_output(c) != NGX_OK) {
8355
ad3a6f069498 Added proper handling of connection close phases.
Vladimir Homutov <vl@nginx.com>
parents: 8354
diff changeset
1366 ngx_quic_close_connection(c, NGX_ERROR);
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
1367 return;
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
1368 }
8607
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
1369
21b7dac9de3b QUIC: added connection state debug to event handlers.
Vladimir Homutov <vl@nginx.com>
parents: 8606
diff changeset
1370 ngx_quic_connstate_dbg(c);
8309
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
1371 }
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
1372
7ea2c68735f9 Output buffering.
Vladimir Homutov <vl@nginx.com>
parents: 8308
diff changeset
1373
8750
41807e581de9 QUIC: separate files for stream related processing.
Vladimir Homutov <vl@nginx.com>
parents: 8749
diff changeset
1374 void
8724
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1375 ngx_quic_shutdown_quic(ngx_connection_t *c)
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1376 {
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1377 ngx_rbtree_t *tree;
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1378 ngx_rbtree_node_t *node;
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1379 ngx_quic_stream_t *qs;
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1380 ngx_quic_connection_t *qc;
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1381
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1382 qc = ngx_quic_get_connection(c);
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1383
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1384 if (qc->closing) {
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1385 return;
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1386 }
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1387
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1388 tree = &qc->streams.tree;
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1389
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1390 if (tree->root != tree->sentinel) {
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1391 for (node = ngx_rbtree_min(tree->root, tree->sentinel);
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1392 node;
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1393 node = ngx_rbtree_next(tree, node))
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1394 {
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1395 qs = (ngx_quic_stream_t *) node;
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1396
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1397 if (!qs->cancelable) {
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1398 return;
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1399 }
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1400 }
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1401 }
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1402
fc64ab301bad QUIC: connection shutdown.
Roman Arutyunyan <arut@nginx.com>
parents: 8717
diff changeset
1403 ngx_quic_finalize_connection(c, qc->shutdown_code, qc->shutdown_reason);
8239
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1404 }
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1405
5ad7bffd3850 Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan <arut@nginx.com>
parents: 8237
diff changeset
1406
8626
e0947c952d43 QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8625
diff changeset
1407 uint32_t
e0947c952d43 QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8625
diff changeset
1408 ngx_quic_version(ngx_connection_t *c)
e0947c952d43 QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8625
diff changeset
1409 {
8629
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
1410 uint32_t version;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
1411 ngx_quic_connection_t *qc;
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
1412
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
1413 qc = ngx_quic_get_connection(c);
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
1414
feec2cc762f6 QUIC: got rid of the c->quic field.
Roman Arutyunyan <arut@nginx.com>
parents: 8628
diff changeset
1415 version = qc->version;
8626
e0947c952d43 QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8625
diff changeset
1416
e0947c952d43 QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8625
diff changeset
1417 return (version & 0xff000000) == 0xff000000 ? version & 0xff : version;
e0947c952d43 QUIC: multiple versions support in ALPN.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8625
diff changeset
1418 }